html - img垂直居中 - 垂直居中flex




我如何垂直居中文本与CSS? (20)

我有一个包含文本的div元素,我想将此div的内容垂直居中对齐。

这是我的div风格:

#box {
  height: 170px;
  width: 270px;
  background: #000;
  font-size: 48px;
  color: #FFF;
  text-align: center;
}
<div id="box">
  Lorem ipsum dolor sit
</div>

做这个的最好方式是什么?


满足您所有的垂直对齐需求!

声明这个Mixin:

@mixin vertical-align($position: relative) {
  position: $position;
  top: 50%;
  -webkit-transform: translateY(-50%);
  -ms-transform: translateY(-50%);
  transform: translateY(-50%);
}

然后将它包含在你的元素中:

.element{
    @include vertical-align();
}

灵活的方法

div {
  width: 250px;
  min-height: 50px;
  line-height: 50px;
  text-align: center;
  border: 1px solid #123456;
  margin-bottom:5px;
}
span {
  display: inline-block;
  vertical-align: middle;
  line-height: normal;
}
<div>
  <span>Lorem ipsum dolor sit amet, consectetur adipiscing elit.<br />
    Lorem ipsum dolor sit amet, consectetur adipiscing elit.<br />
    Lorem ipsum dolor sit amet, consectetur adipiscing elit.</span>
</div>
<div>
  <span>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</span>
</div>
<div>
  <span>Lorem ipsum dolor sit amet.</span>
</div>
<div>


一个非常简单和最强大的解决方案,垂直对齐中心:

.outer-div {
  height: 200px;
  width: 200px;
  text-align: center;
  border: 1px solid #000;
}

.inner {
  position: relative;
  top: 50%;
  transform: translateY(-50%);
  color: red;
}
<div class="outer-div">
  <span class="inner">No data available</span>
</div>


以下代码将div放在屏幕中间,无论屏幕大小或div大小如何:

.center-screen {
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  text-align: center;
  min-height: 100vh;
}
 <html>
 <head>
 </head>
 <body>
 <div class="center-screen">
 I'm in the center
 </div>
 </body>
 </html>

here查看更多关于flex细节。


你可以尝试这种基本的方法:

div {
  height: 90px;
  line-height: 90px;
  text-align: center;
  border: 2px dashed #f69c55;
}
<div>
  Hello World!
</div>

它只适用于单行文本,因为我们将行的高度设置为与包含框元素相同的高度。

更通用的方法

这是垂直对齐文本的另一种方式。 该解决方案可以用于单行和多行文本,但仍需要一个固定高度的容器:

div {
  height: 200px;
  line-height: 200px;
  text-align: center;
  border: 2px dashed #f69c55;
}
span {
  display: inline-block;
  vertical-align: middle;
  line-height: normal;
}
<div>
  <span>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Haec et tu ita posuisti, et verba vestra sunt. Non enim iam stirpis bonum quaeret, sed animalis. </span>
</div>

CSS只是设置<div>大小,通过设置<div>的行高等于其高度,垂直居中对齐<span> ,并使<span>成为vertical-align: middle的内联块。 然后它将<span>的行高设置回正常,因此其内容将在块内自然流动。

模拟表格显示

这是另一个选项,它可能不支持不支持display: tabledisplay: table-cell (基本上只是Internet Explorer 7)的旧浏览器 。 使用CSS我们模拟表格行为(因为表格支持垂直对齐),HTML与第二个例子相同:

div {
  display: table;
  height: 100px;
  width: 100%;
  text-align: center;
  border: 2px dashed #f69c55;
}
span {
  display: table-cell;
  vertical-align: middle;
}
<div>
  <span>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</span>
</div>

使用绝对定位

这项技术使用绝对定位的元素设置顶部,底部,左侧和右侧为0.它在Smashing Magazine, CSS中的绝对水平和垂直居中的文章中有更详细的描述。


其他方式:

不要设置divheight属性,而是使用padding:来实现效果。 与行高一样,它只适用于有一行文字的情况。 虽然这样,如果你有更多的内容,文本仍然会居中,但是div本身会稍微大一些。

所以,而不是与:

div {
  height:120px;
  line-height: 120px;
}

你可以说:

div {
   padding: 60px 0; //Maybe 60 minus font-size divided by two, if you want to be  exact
}

这会将div的顶部和底部padding设置为60px ,并将左侧和右侧padding设置为零,使div 120px(加上字体的高度)变高,并将文本垂直居中放置在div中。


在CSS3中引入的Flexbox是解决方案:

section {
    display: flex;
    display: -webkit-flex;
    height: 200px;
    width: 50%;
    margin: auto;
    border-radius: 20px;
    border: 5px solid black;
    background-color: yellow;
}

p {
    text-align: center;
    margin: auto; /* Important */
    font-family: Calibri;
}
<section>
    <p>
        I'm center!<br/>
        Flexboxes are great!
    </p>
</section>

注意 :如果要将文本居中,请将上面标记为重要的行替换为以下行之一:

1)仅垂直:

margin: auto 0;

2)只有水平方向:

margin: 0 auto;

如果你不关心它的小视觉3d效果,将它设置在button而不是div

#box
{
  height: 120px;
  width: 300px;
  background: #000;
  font-size: 48px;
  font-style: oblique;
  color: #FFF;
}
<button Id="box" disabled>
  Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</button>


尝试此解决方案

.EXTENDER {
    position: absolute;
    top: 0px;
    left: 0px;
    bottom: 0px;
    right: 0px;
    width: 100%;
    height: 100%;
    overflow-y: hidden;
    overflow-x: hidden;
}

.PADDER-CENTER {
    width: 100%;
    height: 100%;
    display: -webkit-box;
    display: -moz-box;
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;
    -webkit-box-pack: center;
    -moz-box-pack: center;
    -ms-flex-pack: center;
    -webkit-justify-content: center;
    justify-content: center;
    -webkit-box-align: center;
    -moz-box-align: center;
    -ms-flex-align: center;
    -webkit-align-items: center;
    align-items: center;
}
<div class="EXTENDER">
  <div class="PADDER-CENTER">
    <div contentEditable="true">Edit this text...</div>
  </div>
</div>

使用CSS +构建。


尝试transform属性:

 #box {
  height: 90px;
  width: 270px;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}
 <div Id="box">
    Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>


您可以使用下面的代码片段作为参考。 它对我来说就像是一种魅力:

<!DOCTYPE html>
    <html lang="de">
        <head>
            <title>Vertically Center Text</title>
            <style>
                html, body {
                    height: 100%;
                    margin: 0;
                    padding: 0;
                    width: 100%;
                }
                body {
                    display: table;
                }
                .centered-text {
                    text-align: center;
                    display: table-cell;
                    vertical-align: middle;
                }
            </style>
        </head>
        <body style="background:#3cedd5">
        <div class="centered-text">
          <h1>Yes It's My landing Page</h1>
    	  <h2>Under Construction, Coming Soon !!!</h2>
        </div>
        </body>
    </html>

上面的代码片段的输出如下:

源代码信用: codepuran.com/web-designing/… codepuran.com/web-designing/…


您可以通过添加以下一段CSS代码轻松完成此操作:

display: table-cell;
vertical-align: middle;

这意味着你的CSS最终看起来像:

#box {
  height: 90px;
  width: 270px;
  background: #000;
  font-size: 48px;
  font-style: oblique;
  color: #FFF;
  text-align: center;
  margin-top: 20px;
  margin-left: 5px;
  display: table-cell;
  vertical-align: middle;
}
<div id="box">
  Some text
</div>


我不确定是否有人走过writing-mode路线,但我认为它能够干净地解决问题并得到广泛的支持

.vertical {
  //border: 1px solid green;
  writing-mode: vertical-lr;
  text-align: center;
  height: 100%;
  width: 100%;
}
.horizontal {
  //border: 1px solid blue;
  display: inline-block;
  writing-mode: horizontal-tb;
  width: 100%;
  text-align: center;
}
.content {
  text-align: left;
  display: inline-block;
  border: 1px solid #e0e0e0;
  padding: .5em 1em;
  border-radius: 1em;
}
<div class="vertical">
  <div class="horizontal">
    <div class="content">
      I'm centered in the vertical and horizontal thing
    </div>
  </div>
</div>

当然,这将适用于您需要的任何尺寸(除了家长的100%)。 如果您取消注释边界线,则可以帮助您熟悉自己。

JSFiddle演示让你小提琴。

Caniuse支持 :85.22%+ 6.26%= 91.48% (即使IE在!)


我只想从@michielvoo扩展答案,以释放对线高和呼吸高度的需求。 它基本上就是这样的简化版本:

div {
  width: 250px;
  /* height: 100px;
  line-height: 100px; */
  text-align: center;
  border: 1px solid #123456;
  background-color: #bbbbff;
  padding: 10px;
  margin: 10px;
}

span {
  display: inline-block;
  vertical-align: middle;
  line-height: normal;
}
<div>
  <span>All grown-ups were once children... but only few of them remember it</span>
</div>

<div>
  <span>And now here is my secret, a very simple secret: It is only with the heart that one can see rightly; what is essential is invisible to the eye.</span>
</div>

注意:注释掉部分css是封闭div fixed-height需要的。


我需要一排可点击的大象,垂直居中,但没有使用表格来解决某些Internet Explorer 9的怪异问题。

我最终找到了最好的CSS(满足我的需求),并且在Firefox,Chrome和Internet Explorer 11中表现出色。可悲的是,Internet Explorer 9仍在嘲笑我......

div {
  border: 1px dotted blue;
  display: inline;
  line-height: 100px;
  height: 100px;
}

span {
  border: 1px solid red;
  display: inline-block;
  line-height: normal;
  vertical-align: middle;
}

.out {
  border: 3px solid silver;
  display: inline-block;
}
<div class="out" onclick="alert(1)">
  <div> <span><img src="http://www.birdfolk.co.uk/littleredsolo.png"/></span> </div>
  <div> <span>A lovely clickable option.</span> </div>
</div>

<div class="out" onclick="alert(2)">
  <div> <span><img src="http://www.birdfolk.co.uk/bang2/Ship01.png"/></span> </div>
  <div> <span>Something charming to click on.</span> </div>
</div>

显然你不需要边界,但他们可以帮助你看到它的工作原理。


所有功劳归于这个链接的拥有者@SebastianEkströmLink; 请通过这个。 在action codepen看到它。 通过阅读上面的文章,我也创建了一个演示小提琴

只需要三行CSS(不包括供应商前缀),我们可以在变换的帮助下完成:即使我们不知道它的高度,translateY也会垂直居中。

CSS属性转换通常用于旋转和缩放元素,但通过translateY函数,我们现在可以垂直对齐元素。 通常这必须通过绝对定位或设置线条高度来完成,但这些要求您要么知道元素的高度,要么只能处理单行文本等。

所以,为了做到这一点,我们写道:

.element {
    position: relative;
    top: 50%;
    transform: translateY(-50%);
} 

这就是你需要的。 这是一种类似于绝对位置方法的技术,但有利的一点是,我们不必在父元素或位置属性上设置任何高度。 即使在Internet Explorer 9中,它也可以直接使用!

为了使它更简单,我们可以把它作为一个mixin与它的供应商前缀一起编写。


简单而通用的方式是(如michielvoo表格方式):

[ctrv]{
    display:table !important;
}

[ctrv] > *{ /* adressing direct discendents */
      display:table-cell;
      vertical-align: middle;
      // text-align: center; /* optional */
}

在父标签上使用此属性(或同等类)即使对许多孩子也可以对齐:

<parent ctrv>  <ch1/>  <ch2/>   </parent>

解决方案被接受为答案是完美的使用line-height与div的高度相同,但是当文本被包装或两行时,此解决方案不能很好地工作。

如果文本被包装或者在div内的多行上,请尝试使用这一项。

#box
{
  display: table-cell;
  vertical-align: middle;
}

有关更多参考,请参阅:


.box {  
  width: 100%;
  background: #000;
  font-size: 48px;
  color: #FFF;
  text-align: center;
}

.height {
  line-height: 170px;
  height: 170px;
}

.transform { 
  height: 170px;
  position: relative;
}

.transform p {
  margin: 0;
  position: absolute;
  top: 50%;
  left: 50%;
  -ms-transform: translate(-50%, -50%);
  transform: translate(-50%, -50%);
}
<h4>Using Height</h4>
<div class="box height">
  Lorem ipsum dolor sit
</div>

<hr />

<h4>Using Transform</h4>
<div class="box transform">
  <p>Lorem ipsum dolor sit</p>
</div>


<!DOCTYPE html>
<html>
  <head>
    <style>
      .main{
        height:450px;
        background:#f8f8f8;
        display: -ms-flexbox;
        display: -webkit-flex;
        display: flex;
        -ms-flex-align: center;
        -webkit-box-align: center;
        align-items: center;
        justify-content: center;
        width: 100%;
      }
    </style>
  </head>
  <body>
    <div class="main">
      <h1>Hello</h1>
    </div>
  </body>
</html>




vertical-alignment