CSS中心显示内联块?


207

我在这里有一个有效的代码:http : //jsfiddle.net/WVm5d/(您可能需要将结果窗口放大以查看居中对齐效果)

代码工作正常,但我不喜欢这样display: table;。这是使包装类对齐中心的唯一方法。我认为,如果有一种使用display: block;或的方式会更好display: inline-block;。是否可以用其他方法解决对齐中心?

对我来说,在容器中添加一个固定的不是一个选择。

如果将来JS Fiddle链接损坏,我还将在这里粘贴我的代码:

body {
    background: #bbb;
}

.wrap {
    background: #aaa;
    margin: 0 auto;
    display: table;
    overflow: hidden;
}

.sidebar {
    width: 200px;
    float: left;
    background: #eee;
}

.container {
    margin: 0 auto;
    background: #ddd;
    display: block;
    float: left;
    padding: 5px;
}

.box {
    background: #eee;
    border: 1px solid #ccc;
    padding: 10px;
    margin: 5px;
    float: left;
}

.box:nth-child(3n+1) {
    clear: left;
}
<div class="wrap">
    <div class="sidebar">
        Sidebar
    </div>
    <div class="container">
        <div class="box">
            Height1
        </div>
        <div class="box">
            Height2<br />
            Height2
        </div>
        <div class="box">
            Height3<br />
            Height3<br />
            Height3
        </div>
        <div class="box">
            Height1
        </div>
        <div class="box">
            Height2<br />
            Height2
        </div>
        <div class="box">
            Height3<br />
            Height3<br />
            Height3
        </div>
    </div>
    <div class="sidebar">
        Sidebar
    </div>
</div>

Answers:


79

可接受的解决方案对我而言不起作用,因为我需要一个子元素display: inline-block在100%宽度的父级中水平和垂直居中。

我使用了Flexbox的justify-contentalign-items属性,分别允许您将元素水平和垂直居中。通过将两者都设置center为父元素,子元素(甚至多个元素!)将完美地位于中间。

此解决方案不需要固定的宽度,这对我来说不合适,因为我的按钮文本会更改。

这是CodePen演示和以下相关代码的片段:

.parent {
  display: flex;
  justify-content: center;
  align-items: center;
}

.child {
  display: inline-block;
}
<div class="parent">
  <a class="child" href="#0">Button</a>
</div>


1
这个问题是在Flexbox之前创建的,但是现在这种方法更好,因此,我接受了它作为答案。
延斯·托内尔18'Mar 19'18

@JensTörnell在这种情况下可以使用内联块是无用的,可以将其删除
Temani Afif '18

这比使用文本对齐中心好得多。该实现只是将以文本为中心的内容泄漏给所有子组件。不要这样
追踪

265

试试这个。我添加text-align: center到身体并display:inline-block包裹,然后删除了display: table

body {
    background: #bbb;
    text-align: center;
}

.wrap {
    background: #aaa;
    margin: 0 auto;
    display: inline-block;
    overflow: hidden;
}

27
当显示为内联块时,@ zack divs像文本一样工作。您也可以white-space: nowrap;在它们上使用类似的东西。
2014年

5
如果我不希望所有放置在body文本中心的元素该怎么办?对我来说,这听起来像是一个巨大的杀伤力
phil294

4
@Blauhirn,只需将一个块包装器环绕inline-block元素,然后设置css属性text-align:center;即可。他以身体标签为例。
Arsalan Sheikh's

71

如果具有<div>with text-align:center;,则其中的任何文本将相对于该容器元素的宽度居中。inline-block为此,元素被视为文本,因此它们也将居中。


2
display:inline元素怎么样?我测试了它是否无法按预期的方式运行
geckob

11

您也可以通过定位来实现,将父div设置为相对,子div设置为绝对。

.wrapper {
      position: relative;
  }
.childDiv {
      position: absolute;
      left: 50%;
      transform: translateX(-50%);
  }

1

您无需使用“ display:table”。边距:0自动居中尝试不起作用的原因是,您未指定宽度。

这将正常工作:

.wrap {
    background: #aaa;
    margin: 0 auto;
    width: some width in pixels since it's the container;
}

您无需指定display:block,因为该div默认情况下会被阻止。您也可能会丢失溢出:隐藏。


1

与@vijayscode的答案类似,这将使inline-block元素水平居中(但也无需修改其父代的样式):

  display: inline-block;
  position: relative;
  left: 50%; // Move the element to the left by 50% of the container's width
  transform: translateX(-50%); // Calculates 50% of the element's width and moves it by that amount across the X-axis to the left


-6

很棒的文章,我发现最适合我的是将大小增加%

.wrap {
margin-top:5%;
margin-bottom:5%;
height:100%;
display:block;}

-9

只需使用:

line-height:50px

将“ 50px”替换为与div相同的高度。


1
请具体说明添加位置line-height
Marcel Gwerder

最初的问题是关于水平居中,如使用所示text-align: center;。调整行高是垂直居中的一种解决方案,尽管对于行内块来说不是一个非常可靠的解决方案。
cdaddr 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.