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%); }
要点:
- 把要垂直居中的元素相对于父元素绝对定位,top和bottom设为相等的值(这里设成了0,也可以设为99999px或者-99999px无论什么,只要两者相等就行)。
- 再将要居中元素的margin设为auto,这样便可以实现垂直居中了。
- 被居中元素的宽高也可以不设置,但不设置的话就必须是图片这种自身就包含尺寸的元素,否则无法实现。
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布局在此。
<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,该属性可能的取值有四个,分别如下:
#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-cell
和vertical-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居中*/ }