如何垂直对齐div中的元素?

Abd*_*bdu 722 html css vertical-alignment

我有一个div有两个图像和一个h1.所有这些都需要在div内垂直对齐,彼此相邻.

其中一个图像需要absolute放在div中.

在所有常见浏览器上工作所需的CSS是什么?

<div id="header">
    <img src=".." ></img>
    <h1>testing...</h1>
    <img src="..."></img>
</div>
Run Code Online (Sandbox Code Playgroud)

Kon*_*lph 872

哇,这个问题很受欢迎.这是基于对vertical-align房产的误解.这篇优秀的文章解释了它:

vertical-alignGavin Kistner 理解或"如何(不)垂直居中".

"如何以CSS为中心"是一个很棒的网络工具,它有助于为不同的情况找到必要的CSS居中属性.


简而言之(并防止链接腐烂):

  • 内联元素(以及内联元素)可以在其上下文中垂直对齐vertical-align: middle.但是,"context"不是整个父容器的高度,而是它们所在的文本行的高度.jsfiddle示例
  • 对于块元素,垂直对齐更难,并且在很大程度上取决于具体情况:
    • 如果内部元件可以有一个固定的高度,可以使自己的立场absolute,并指定其height,margin-toptop位置.jsfiddle的例子
    • 如果居中元素由一条线组成 并且 其父高度是固定的,则可以简单地设置容器line-height以填充其高度.根据我的经验,这种方法非常通用.jsfiddle的例子
    • ......还有更多这样的特殊情况.

  • "有效"解决方案的问题(所以不是`vertical-align:middle`)是你必须指定一个固定的高度._Responsive Web Design_不太可能. (126认同)
  • 这也适用于`inline-block`和`table-cell`元素.如果您遇到此问题,请尝试调整容器元素的"line-height"(即上下文),因为它用于`vertical-align`行框计算. (8认同)
  • 这个工具(howtocenterincsss.com)非常棒,因为它在我现有的 CSS 中开箱即用!那是超级罕见的。还记得以前,您必须从某些示例(有时甚至是示例 HTML)复制整个样式表,然后逐个删除和重命名元素,直到它是我需要的为止。本网站的情况并非如此! (4认同)
  • https://css-tricks.com/centering-css-complete-guide/ &lt;--这里提供了一些不错的选择,但我发现自己大部分时间都在使用 table/table-cell 解决方案 (2认同)
  • @koks der drache:“howtocenterincss.com”,而不是“howtocenterincsss.com” (2认同)

E. *_*ano 149

现在Flexbox支持正在增加,应用于包含元素的CSS将垂直居中包含的项:

.container {        
    display: flex;
    align-items: center;
}
Run Code Online (Sandbox Code Playgroud)

如果您还需要定位Explorer 10和旧的(<4.4)Android浏览器,请使用带前缀的版本:

.container {
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;

    -ms-flex-align: center;
    -webkit-align-items: center;
    -webkit-box-align: center;

    align-items: center;
}
Run Code Online (Sandbox Code Playgroud)

  • 有用的 [Flexbox 上的 CSS 技巧指南](https://css-tricks.com/snippets/css/a-guide-to-flexbox/) 然后查看 `align-items` 部分 (3认同)
  • @YazidErman 这个解决方案依赖于 Flexbox,所以不,只有 IE 10 及以上支持或任何其他现代浏览器 http://caniuse.com/#search=flexbox Flexbox 在支持的地方很棒,但并不是到处都有。显示表格和表格单元格可能确实是最好的解决方案,容器只需要是表格,居中的元素是用显示表格单元格包裹的元素,然后可以像其他一些答案指出的那样居中。 (2认同)

小智 109

我使用了这个非常简单的代码:

HTML:

<div class="ext-box">
    <div class="int-box">
        <h2>Some txt</h2>
        <p>bla bla bla</p>
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

CSS:

div.ext-box { display: table; width:100%;}
div.int-box { display: table-cell; vertical-align: middle; }
Run Code Online (Sandbox Code Playgroud)

显然,无论你使用a .class还是an #id,结果都不会改变.

  • 这是所有九种对齐方式的完整示例(上中下和左中右):https://jsfiddle.net/webMac/0swk9hk5 (2认同)

小智 46

它对我有用:

.vcontainer {
    min-height: 10em;
    display: table-cell;
    vertical-align: middle;
}
Run Code Online (Sandbox Code Playgroud)

  • 所以它不再是"阻止"元素? (8认同)
  • 然后,如果你想与`margin:0 auto`水平对齐,那么由于`display:table-cell`它将无法工作 (7认同)

Sam*_*ghe 35

 .outer {
   display: flex;
   align-items: center; 
   justify-content: center;
 }
Run Code Online (Sandbox Code Playgroud)

  • 我认为这个解决方案是最快最容易理解的.也许是因为我没有足够的耐心去理解选定的答案.Flexbox所有的东西! (7认同)
  • 添加 `justify-content: center` 修复了我缺乏水平居中的问题 (3认同)

abe*_*ier 21

我朋友的一项技巧:

HTML:

<div style="height:100px; border:1px solid;">
    <p style="border:1px dotted;">I'm vertically centered.</p>
</div>
Run Code Online (Sandbox Code Playgroud)

CSS:

div:before {content:" "; display:inline-block; height:100%; vertical-align:middle;}
div p {display:inline-block;}
Run Code Online (Sandbox Code Playgroud)

DEMO在这里


Bla*_*nic 18

要将块元素定位到中心(在IE9及以上版本中工作),需要一个包装器div:

.vcontainer {
  position: relative;
  top: 50%;
  transform: translateY(-50%);
  -webkit-transform: translateY(-50%);
}
Run Code Online (Sandbox Code Playgroud)

  • 由于将元素放置在“半像素”上,此方法可能会导致元素模糊。对此的解决方案是设置元素的透视图。变换:透视(1px)translateY(-50%); (3认同)

Sho*_*og9 16

所有这些都需要在div中垂直对齐

对齐怎么样?图像的顶部与文本顶部对齐?

其中一个图像需要在div中绝对定位.

相对于DIV绝对定位?也许你可以勾勒出你正在寻找的东西......?

fd描述了绝对定位的步骤,以及调整H1元素的显示,使图像与其内嵌.为此,我将添加您可以使用vertical-align样式对齐图像:

#header h1 { display: inline; }
#header img { vertical-align: middle; }
Run Code Online (Sandbox Code Playgroud)

...这会将标题和图像放在一起,顶边对齐.存在其他对齐选项; 看文档.您可能还会发现删除DIV并在H1元素内移动图像是有益的- 这为容器提供了语义值,并且无需调整以下内容的显示H1:

<h1 id=header">
   <img src=".." ></img>
   testing...
   <img src="..."></img>
</h1>
Run Code Online (Sandbox Code Playgroud)


小智 15

使用这个公式,它将始终没有裂缝:

#outer {height: 400px; overflow: hidden; position: relative;}
#outer[id] {display: table; position: static;}

#middle {position: absolute; top: 50%;} /* For explorer only*/
#middle[id] {display: table-cell; vertical-align: middle; width: 100%;}

#inner {position: relative; top: -50%} /* For explorer only */
/* Optional: #inner[id] {position: static;} */
Run Code Online (Sandbox Code Playgroud)
<div id="outer">
  <div id="middle">
    <div id="inner">
      any text
      any height
      any content, for example generated from DB
      everything is vertically centered
    </div>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

  • 我从来没有在css中看到过这种选择器"#outer [id]".该怎么办?如果我会上课而不是身份怎么办? (2认同)

Sha*_*bob 12

几乎所有方法都需要指定高度,但通常我们没有任何高度.
所以这里有一个CSS3 3线技巧,不需要知道高度.

.element {
    position: relative;
    top: 50%;
    transform: translateY(-50%);
}
Run Code Online (Sandbox Code Playgroud)

甚至在IE9中也支持它.

及其供应商前缀:

.element {
    position: relative;
    top: 50%;
    -webkit-transform: translateY(-50%);
    -ms-transform: translateY(-50%);
    transform: translateY(-50%);
}
Run Code Online (Sandbox Code Playgroud)

资料来源:http://zerosixthree.se/vertical-align-anything-with-just-3-lines-of-css/


joa*_*16v 10

我的诀窍是在div中放入一个包含1行和1列的表,设置100%的宽度和高度,以及属性vertical-align:middle.

<div>

    <table style="width:100%; height:100%;">
        <tr>
            <td style="vertical-align:middle;">
                BUTTON TEXT
            </td>
        </tr>
    </table>

</div>
Run Code Online (Sandbox Code Playgroud)

小提琴:http: //jsfiddle.net/joan16v/sbq​​jnn9q/

  • 这似乎是避免大量头痛的最好方法.我仍然很困惑为什么CSS没有垂直对齐标准. (7认同)

Was*_*siF 7

有两种方法可以将元素垂直和水平对齐

  1. 引导程序4
  2. CSS3

在此处输入图片说明

1. Bootstrap 4.3.X

用于垂直对齐: d-flex align-items-center

用于水平对齐: d-flex justify-content-center

.container {
    height: 180px;
    width:100%;
}
Run Code Online (Sandbox Code Playgroud)
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" 
rel="stylesheet"/>

<div class="d-flex align-items-center justify-content-center bg-info container">
  <div class="bg-light p-2">I am in Center</div>
</div>
Run Code Online (Sandbox Code Playgroud)

2. CSS3

.container {
    display: flex;
    align-items: center;
    justify-content: center;
    background-color: #17a2b8;
    height: 180px;
    width:100%;
}

.child {
  background-color: #f8f9fa;
  padding: 0.5rem;
}
Run Code Online (Sandbox Code Playgroud)
<div class="container">
  <div class="child">I am in Center</div>
</div>
Run Code Online (Sandbox Code Playgroud)

  • Bootstrap 并不神奇。它受到影响每个人的完全相同的 CSS 限制。它只是对平均值隐藏了它的作用。用户。 (2认同)

Den*_*Don 7

使用display flex,首先需要包装要对齐的项目的容器:

<div class="outdiv">
    <div class="indiv">
        <span>test1</span>
        <span>test2</span>
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

然后应用以下 CSS 内容来包装我的示例中的divoutdiv :

<div class="outdiv">
    <div class="indiv">
        <span>test1</span>
        <span>test2</span>
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)


akh*_*hid 7

在父div中制作中心子div的三种方法

  • 绝对定位法
  • 弹性盒方法
  • 转换/翻译方法

在此处输入图片说明

演示

/* First way */
.parent1 {
  background: darkcyan;
   width: 200px;
   height: 200px;
   position: relative;
}
.child1 {
  background: white;
  height: 30px;
  width: 30px;
  position: absolute;
  top: 50%;
  left: 50%;
  margin: -15px;
}

/* Second way */
.parent2 {
  display: flex;
  justify-content: center;
  align-items: center;
  background: darkcyan;
  height: 200px;
  width: 200px;
}
.child2 {
  background: white;
  height: 30px;
  width: 30px;
}

/* Third way */
.parent3 {
  position: relative;
  height: 200px;
  width: 200px;
  background: darkcyan;
}
.child3 {
  background: white;
  height: 30px;
  width: 30px;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}
Run Code Online (Sandbox Code Playgroud)
<div class="parent1">
  <div class="child1"></div>
</div>
<hr />

<div class="parent2">
  <div class="child2"></div>
</div>
<hr />

<div class="parent3">
  <div class="child3"></div>
</div>
Run Code Online (Sandbox Code Playgroud)


Hen*_*ijn 5

使用CSS垂直居中,您可以让外部容器像表格一样,而内容像表格单元格一样。在这种格式中,您的对象将保持居中。:)

我在 JSFiddle 中嵌套了多个对象作为示例,但核心思想是这样的:

超文本标记语言

<div class="circle">
  <div class="content">
    Some text
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

CSS

<div class="circle">
  <div class="content">
    Some text
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

多个对象示例:

超文本标记语言

<div class="container">
  <div class="content">

    <div class="centerhoriz">

      <div class="circle">
        <div class="content">
          Some text
        </div><!-- content -->
      </div><!-- circle -->

      <div class="square">
        <div class="content">
          <div id="smallcircle"></div>
        </div><!-- content -->
      </div><!-- square -->

    </div><!-- center-horiz -->

  </div><!-- content -->
</div><!-- container -->
Run Code Online (Sandbox Code Playgroud)

CSS

.circle {
  /* Act as a table so we can center vertically its child */
  display: table;
  /* Set dimensions */
  height: 200px;
  width: 200px;
  /* Horizontal center text */
  text-align: center;
  /* Create a red circle */
  border-radius: 100%;
  background: red;
}

.content {
  /* Act as a table cell */
  display: table-cell;
  /* And now we can vertically center! */
  vertical-align: middle;
  /* Some basic markup */
  font-size: 30px;
  font-weight: bold;
  color: white;
}
Run Code Online (Sandbox Code Playgroud)

结果

结果

https://jsfiddle.net/martjemeyer/ybs032uc/1/