第一种单行垂直居中(line-height)
如果一个容器中只有一行文字,对它实现居中相对比较简单,我们只需要设置它的实际高度height和所在行的高度line-height相等即可,例如
.div-box{height:50px; line-height: 50px; width:100px; overflow: hidden; border:1px solid; }
垂直居中
代码很简,其中使用overflow:hidden的设置是为了防止内容超出容器或者产生自动换行。如果想让文本水平也居中的话,只要添加text-align:center就行了。
第二种多行文本垂直居中(display:table)
CSS中的vertical-align属性只会对拥有valign特性的(X)HTML标签起作用,但是在CSS中还有一个display属性能够模拟<table>,采用display-table将div以表格形式显示,然后就可使用vertical-align的property属性了。
.div-box{ height:200px; display:table; border: 1px solid #f00;}.div-box .div1{vertical-align: middle; display: table-cell;}
文本垂直居中文本垂直居中
值得注意的是display:table和display:table-cell,前者必须设置在父元素上,后者必须设置在子元素上,因此在设置文本垂直居中时,要为文本多添加一个div。这个方法很不错,但是不幸的是Internet Explorer 6r(甚至 IE8 beta) 并不能正确地理解display:table和display:table-cell,因此这种方法在Internet Explorer 6及以下的版本中是无效的。
第三种position+margin
这是采用绝对定位div的一种方法,把top设成50%,将需要居中的文本的margin-top设为自身高度的一半,这就要保证需要居中的文本的高度,如果是不确定的可以采用js动态获取高度设置margin-top亦可以达到同样的效果。
.div-box{ position: relative;width: 30%; height: 30%; border: 1px solid #f00;}.div-box .div1{position:absolute; top:50%;left: 50%;margin-left: -5px; margin-right: -5px; width: 10px; height: 10px; background: #f00;}
第四种还是position+margin
这个方法使用了一个position:absolute,有固定宽度和高度的div。这个div 被设置为margin:auto;top:0;bottom:0 。但是因为它有固定高度,其实并不能和上下都间距为 0,因此margin:auto;会使它居中。
.div1{position: absolute; margin: auto; top: 0;bottom: 0px;width: 100px;background: #f00;height: 100px;}
如果想要水平居中也是一样将left和right都设置为0。
第五种采用变形(transform)
这个方法不仅能实现文本垂直居中,还支持文本高度的可变性,内容块定义transform: translate(-50%,-50%)必须带上浏览器厂商的前缀,还要加上top: 50%; left: 50%;
.div-box{ position:relative; width: 50%;height: 50%; border:1px solid #f00;}.div-box .div1{ height:100px; width:100px; position: absolute; background: #F00;left: 50%;top: 50%;transform :translate(-50%,-50%);-webkit-transform: translate(-50%,-50%);-moz-transform: translate(-50%,-50%);}
文本垂直居中文本垂直居中
第六种行内块元素(Inline-Block)
很受欢迎的一种居中实现方式,基本思想是使用display: inline-block, vertical-align: middle和一个伪元素让内容块处于容器中央。这个概念的解释可以参考CSS-Tricks上的文章《》
.div-box{ text-align: center; overflow: auto; border:1px solid ; height: 500px; }.div-box:after{content: ''; height: 100%; margin-left: -0.25em; /* To offset spacing. May vary by font */ }.div-box:after,.div-box .div1{ display: inline-block; vertical-align: middle; }.div-box .div1{max-width: 99%; }
如果内容块宽度大于容器宽度,比如放了一个很长的文本,但内容块宽度设置最大不能超过容器的100%减去0.25em,否则使用伪元素:after内容块会被挤到容器顶部,使用:before内容块会向下偏移100%。如果你的内容块需要占据尽可能多的水平空间,可以使用max-width: 99%;(针对较大的容器)或max-width: calc(100% -0.25em)(取决于支持的浏览器和容器宽度)。
第七种采用css3新属性Flexbox
。Flexbox是CSS3新增属性,设计初衷是为了解决像垂直居中这样的常见布局问题。相关的文章如《》。
.div-box{display:display: flex; -ms-flex;display: -webkit-flex;align-items: center;-ms-flex-align: center;-webkit-align-items: center;-webkit-box-align: center;align-items: center;justify-content:center;border:1px solid ; height: 500px; }.div-box .div1{width:50px; height:50px; border:1px solid;}
其中align-items属性定义flex子项在flex容器的当前行的侧轴(纵轴)方向上的对齐方式,实现垂直居中,justify-content 用于设置或检索弹性盒子元素在主轴(横轴)方向上的对齐方式,实现水平居中;