垂直居中是一个历史悠久的大问题,要作到兼容全部浏览器少不了要花点时间,网上也流传了不少解决方案,但没发现比我如今用的方案更完美,至少在个人项目是如此。css
项目中要用到垂直居中而碰到兼容性问题的,通常都是如下几种状况:html
换行文字垂直居中css3
图片垂直居中web
以上都是在固定宽高的容器里垂直居中,否则的话
margin
,padding
即可实现。浏览器
解决垂直居中无非就从几个方面入手布局
利用行高等于容器高度字体
模拟表格单元格特性网站
定位布局spa
css3
的display:box
code
/* 换行文字垂直居中 */ .vc-font1 { border: 1px solid black; width: 200px; height: 200px; display: table-cell; vertical-align: middle; text-align: center; } /* 兼容IE六、7 */ *+html .vc-font1 { height: auto; min-height: 200px; } .vc-font1 .vc-fix { *position: relative; *top: 50%; *left: 50%; *width: 100%; } .vc-font1 .vc-inner { *position: relative; *top: -50%; *left: -50%; } <div class="vc-font1"> <div class="vc-fix"><span class="vc-inner">换行文字垂直居中,兼容全部浏览器</span></div> </div>
当文字高度超出容器时,识别table-cell的浏览器容器会自适应,此时容器的height属性至关于min-height,为了达到全部浏览器效果一致,容器的height还要Hack一下。
缺点:增长了多余的标签
vertical-align:middle
来实现.vc-font2 { border: 1px solid black; width: 200px; height: 200px; text-align: center; overflow: hidden; } .vc-font2 .vc-inner { display: inline-block; vertical-align: middle; } .vc-font2 .vc-fix { display: inline-block; width: 0; height: 100%; line-height: 100%; vertical-align: middle; visibility: hidden; } <div class="vc-font2"> <span class="vc-inner">换行文字垂直居中,兼容全部浏览器</span><span class="vc-fix"><!-- 此标签不能换行 --></span> </div>
vc-inner
和vc-fix
必须是行内元素,vc-inner
加上vc-fix
的宽度不能超过容器宽度,行内块换行时会多出空隙(容器font-size: 0
可去除,但这里不适用),因此这两个标签不能换行。
缺点:增长了多余的标签(硬伤),标签不能换行且必须是行内元素。
前面提到的换行文字垂直居中的方法对于固定宽高图片垂直居中也是适用的
.vc-img1 { border: 1px solid black; width: 200px; height: 200px; position: relative; } .vc-img1 img { width: 100px; height: 100px; position: absolute; top: 50%; left: 50%; margin: -50px 0 0 -50px; } <div class="vc-img1"> <img src="http://fpoimg.com/50x50" /> </div>
既然已经肯定了图片的宽高,毫无疑问使用这种方法就没有兼容性的问题出现了
缺点:图片宽高必须固定,以便计算图片margin
的负值。
.vc-img2 { border: 1px solid black; width: 200px; height: 200px; line-height: 200px; _font-size: 200px; text-align: center; } .vc-img2 img { width: 100px; height: 100px; vertical-align: middle; } /*hack for ie7 字体要设置多大,自个慢慢调整*/ *+html .vc-img2 { font-size: 180px; } <div class="vc-img2"> <img src="http://fpoimg.com/50x50" /> </div>
我觉得设置了行高等于容器高度就完事了,依然仍是碰到了问题,IE6不买帐没效果,IE7也闹别扭,在标签同一行状况下失效。
这里顺便推荐一个很好用的占位图网站,好奇的童鞋猛戳连接吧 :)
缺点:感受这样写不爽
这个方法很简单,就是在方法4的基础上改一下图片的宽高改为max-width,max-height,代码以下:
.vc-img3 { border: 1px solid black; width: 200px; height: 200px; line-height: 200px; text-align: center; } .vc-img3 img { max-width: 150px; max-height: 150px; vertical-align: middle; } /*hack for ie7 字体要设置多大,自个慢慢调整*/ *+html .vc-img3 { font-size: 180px; }
很明显这是不兼容IE6,要兼容IE6恐怕就要写JS。对此,我只想说,让IE6见鬼去吧!
CSS3
的display:box
最后给出一种高端大气上档次的方法。
.vc-css3 { border: 1px solid black; width: 200px; height: 200px; text-align: center; display: -webkit-box; -webkit-box-align: center; -webkit-box-pack: center; display: -moz-box; -moz-box-align: center; -moz-box-pack: center; display: -o-box; -o-box-align: center; -o-box-pack: center; display: -ms-box; -ms-box-align: center; -ms-box-pack: center; display: box; box-align: center; box-pack: center; } .vc-css3 img { width: 100px; height: 100px; } <div class="vc-css3"> <img src="http://fpoimg.com/50x50" /> <br>想居中就居中,爽啊! </div>
很完美有木有?若是IE能支持的话,又是该死的IE...