CSS元素和文本垂直居中

div居中

1、使用绝对定位和负外边距让块级元素垂直居中

要点:必须提前知道被居中块级元素的尺寸,否则无法准确实现垂直居中。

<div id="box">
    <div id="child">我是测试DIV</div>
</div>

CSS代码:

#box {
    width: 300px;
    height: 300px;
    background: #ddd;
    position: relative;
}
#child {
    width: 150px;
    height: 100px;
    background: orange;
    position: absolute;
    top: 50%;
    margin: -50px 0 0 0;    /*top设为50%,margin-top设置为负的容器的高度/2*/
    line-height: 100px;         /*单行文字,line-height值等于div的高度,使文字垂直居中*/
}

或者如下:

#box {
    width: 300px;
    height: 300px;
    background: #ddd;
    position: relative;
}
#child {
  width: 50%;
    height: 30%;
    background: pink;
    position: absolute;
    top: 50%;
    margin: -15% 0 0 0;  /*margin的取值也可以是百分比,这时这个值规定了该元素基于父元素尺寸的百分比,可以根据实际的使用场景来决定是用具体的数值还是用百分比*/
}

2、使用绝对定位和transform让块级元素垂直居中

要点:不必提前知道被居中元素的尺寸了,因为transform中translate偏移的百分比就是相对于元素自身的尺寸而言的。

CSS代码:

#box {
    width: 300px;
    height: 300px;
    background: #ddd;
    position: relative;
}
#child {
    background: #93BC49;
    position: absolute;
    top: 50%;
    transform: translate(0, -50%);
}
3、绝对定位结合margin: auto让块级元素垂直居中

要点:

  1. 把要垂直居中的元素相对于父元素绝对定位,top和bottom设为相等的值(这里设成了0,也可以设为99999px或者-99999px无论什么,只要两者相等就行)。
  2. 再将要居中元素的margin设为auto,这样便可以实现垂直居中了。
  3. 被居中元素的宽高也可以不设置,但不设置的话就必须是图片这种自身就包含尺寸的元素,否则无法实现。

css代码:

#box {
    width: 300px;
    height: 300px;
    background: #ddd;
    position: relative;
}
#child {
    width: 200px;
    height: 100px;
    background: #A1CCFE;
    position: absolute;
    top: 0;
    bottom: 0;
    margin: auto;
    line-height: 100px;
}

4、使用padding实现子元素的垂直居中

要点:给父元素设置相等的上下内边距,则子元素自然是垂直居中的,当然这时候父元素是不能设置高度的,要让它自动被填充起来,除非设置了一个正好等于上内边距+子元素高度+下内边距的值,否则无法精确的垂直居中。

#box {
    width: 300px;
    background: #ddd;
    padding: 100px 0;
}
#child {
    width: 200px;
    height: 100px;
    background: #F7A750;
    line-height: 50px;
}

5、设置第三方基准

要点:首先设置一个高度等于父元素高度一半的第三方基准元素,那么此时该基准元素的底边线自然就是父元素纵向上的中分线,做完这些之后再给要垂直居中的元素设置一个margin-top,值的大小是它自身高度的一半取负,则实现垂直居中。

<div id="box">
    <div id="base"></div>
    <div id="child">测试测试测试!!</div>
</div>

CSS代码:

#box {
    width: 300px;
    height: 300px;
    background: #ddd;
}
#base {
    height: 50%;
    background: #AF9BD3;
}
#child {
    height: 100px;
    background: rgba(131, 224, 245, 0.6);
    margin-top: -50px;
    line-height: 50px;
}

 6、flex布局使块级元素垂直居中

 要点:元素可以通过将父元素设置display:flex;将其指定为flex布局的容器,指定好了容器之后再为其添加align-items属性,该属性定义项目在交叉轴(这里是纵向轴)上的对齐方式,可能的取值有五个,分别如下:

  flex-start::交叉轴的起点对齐;
  flex-end:交叉轴的终点对齐;
  center:交叉轴的中点对齐;
  baseline:项目第一行文字的基线对齐;
  stretch(该值是默认值):如果项目没有设置高度或者设为了auto,那么将占满整个容器的高度。

具体flex布局在此。

<div id="box">
    <div id="child">我是测试DIV</div>
</div>

CSS代码:

#box {
    width: 300px;
    height: 300px;
    background: #ddd;
    display: flex;
    align-items: center;
}
#child {
    width: 300px;
    height: 100px;
    background: #8194AA;
    line-height: 100px;
}

7、第二种使用flex实现块级元素垂直居中

要点:首先给父元素设置display:flex,设置好之后改变主轴的方向flex-direction: column,该属性可能的取值有四个,分别如下:

  row(该值为默认值):主轴为水平方向,起点在左端;
  row-reverse:主轴为水平方向,起点在右端;
  column:主轴为垂直方向,起点在上沿;
  column-reverse:主轴为垂直方向,起点在下沿。
justify-content属性定义了项目在主轴上的对齐方式,可能的取值有五个,分别如下(不过具体的对齐方式与主轴的方向有关,以下的值都是假设主轴为从左到右的):
  flex-start(该值是默认值):左对齐;
  flex-end:右对齐;
  center:居中对齐;
  space-between:两端对齐,各个项目之间的间隔均相等;
  space-around:各个项目两侧的间隔相等。
具体flex布局在此。
css代码:
#box {
    width: 300px;
    height: 300px;
    background: #ddd;
    display: flex;
    flex-direction: column;
    justify-content: center;
}
#child {
    width: 300px;
    height: 100px;
    background: #08BC67;
    line-height: 100px;
}

8、使用 line-height 和 vertical-align 对图片进行垂直居中

<div id="box">
    <img src="duncan.jpeg">
</div>

css代码:

#box{
    width: 300px;
    height: 300px;
    background: #ddd;
    line-height: 300px;
}
#box img {
    vertical-align: middle;
}

9、结合表格和vertical-align属性

要点:将div转变成table-cell显示,然后通过vertical-align: middle;再设置其子元素垂直居中,子元素的高度可以动态改变,当outer里没有足够空间时,middle不会被截断。

<div id="outer">
        <div id="middle">
            测试测试测试!!!
        </div>          
</div>

CSS代码:

#outer{
    background-color: #13CDF4;
    width: 300px;
    height: 200px;
    display: table-cell; 
    vertical-align: middle;
}
#middle{ 
    background-color: #E41627;
    width: 100px;
    height: 100px;
    margin: 0 auto;
}

文本居中

1、单行文本

要点:只需要将文本行高(line-height)和所在区域高度(height)设为一致即可

<div id="div1">
        这是单行文本垂直居中
</div>

 

CSS代码:

#div1{
    width: 300px;
    height: 100px;
    margin: 50px auto;
    border: 1px solid red;
    line-height: 100px; /*设置line-height与父级元素的height相等*/
    text-align: center; /*设置文本水平居中*/
    overflow: hidden; /*防止内容超出容器或者产生自动换行*/
}

2、使用flex布局

<div id="box">测试测试测试!!</div>

CSS代码:

#box {
    width: 300px;
    height: 300px;
    background: #ddd;
    display: flex;
    align-items: center;
}

3、多行文本垂直居中

(1)父级元素高度不固定,随着内容变化

  要点:父级高度不固定的时,高度只能通过内部文本来撑开。这样,我们可以通过设置内填充(padding)的值来使文本看起来垂直居中,只需设置padding-top和padding-bottom的值相等。

<div id="div1">
    这是多行文本垂直居中,这是多行文本垂直居中,这是多行文本垂直居中,这是多行文本垂直居中。
</div>

CSS代码:

        #div1{
            width: 300px;
            margin: 50px auto;
            border: 1px solid red;
            padding: 50px 20px;      /*设置padding-top和padding-bottom的值相等*/
            text-align: center; /*设置文本水平居中*/
        }

(2)父级元素高度固定

       要点:css中的vertical-align属性只对拥有valign特性的元素才生效,结合display: table,可以使得div模拟table属性。因此我们可以设置父级div的display属性:display: table;然后再添加一个div包含文本内容,设置其display:table-cellvertical-align:middle

    <div id="outer">
        <div id="middle">
            这是固定高度多行文本垂直居中,这是固定高度多行文本垂直居中,这是固定高度多行文本垂直居中,这是固定高度多行文本垂直居中。
        </div>
    </div>

CSS代码:

#outer{
            width: 400px;
            height: 200px;
            margin: 50px auto;
            border: 1px solid red;
            display: table;
}
#middle{ 
            display:table-cell; 
            vertical-align:middle;  
            text-align: center; /*设置文本水平居中*/  
            width:100%;   
}

但是在IE7中显示效果如下:

这是因为IE7及以下的版本并不能很好的支持display:table和display:table-cell属性,当然,如果你不考虑IE7以下的版本的浏览器,上述方法是可以实现垂直居中。如果把IE7及以下版本考虑进去,我们可以通过用到CSS hack的知识来设置针对不同浏览器的属性。

要点:使用position定位来解决

    <div id="outer">
        <div id="middle">
            <div id="content">
                这是固定高度多行文本垂直居中(兼容IE7),这是固定高度多行文本垂直居中(兼容IE7),这是固定高度多行文本垂直居中(兼容IE7),这是固定高度多行文本垂直居中(兼容IE7)。
            </div>
        </div>
    </div>

CSS代码:

        #outer{
            width: 400px;
            height: 200px;
            margin: 50px auto;
            border: 1px solid red;
            display: table;
            *position:relative;  /*兼容IE7及以下版本*/
        }
        #middle{ 
            display:table-cell; 
            vertical-align:middle;  
            text-align: center; /*设置文本水平居中*/  
            width:100%;
            *position:absolute;   /*兼容IE7及以下版本*/
            *top:50%;   /*兼容IE7及以下版本,令middle相对于outer向下50%*/
        }
        #content {  
           *position:relative;  /*兼容IE7及以下版本 */
           *top:-50%;   /*兼容IE7及以下版本,令content相对于middle向上50%,这样content就会相对于outer居中*/
        }
posted @ 2018-03-05 16:21  L_mj  阅读(387)  评论(0编辑  收藏  举报