点这个连接能够直接看到效果:http://www.zhouyangyang.com/c...css
这是公用样式html
.outer { width: 150px; height: 200px; background: pink; border: 1px solid pink; } .inner { background: #77BFCD; }
1,负margin
父元素position relative,子元素position absolute,top 50%,margin-top 为负的元素height/2。
缺点:子元素高度固定的时候才能用,并且计算麻烦。css3
<style type="text/css"> .outer1 { position: relative; } .inner1 { position: absolute; top: 50%; margin-top: -40px; height: 80px; } </style> <div class="outer outer1"> <div class="inner inner1"> <p>first line</p> <p>second line</p> </div> </div>
2,css3 calc()
跟上面没啥区别,也是要子元素高度固定,手动除以2。
不过能够少写一行margin-top。浏览器
<style type="text/css"> .outer2 { position: relative; } .inner2 { position: absolute; top: calc(50% - 40px); height: 80px; } </style> <div class="outer outer2"> <div class="inner inner2"> <p>first line</p> <p>second line</p> </div> </div>
3,translateY
百分比形式的margin-top是相对于元素包含块的宽度的,因此上面的方法都要手动除以2。
而 translateX translateY 的百分比是相对于元素自身的宽高,这个方法能够用于子元素高度不肯定时,并且不用手动除以2,比上面几个方便了不少。
有些浏览器下,transform后若是宽高的像素点不是整数,显示会模糊,能够用transform-style:preserve-3d修复。布局
<style type="text/css"> .outer3 { position: relative; } .inner3 { position: absolute; top: 50%; transform: translateY(-50%); } </style> <div class="outer outer3"> <div class="inner inner3"> <p>first line</p> <p>second line</p> </div> </div>
4,margin auto,top right left bottom 全为0
能够实现上下左右居中,超级方便,这也是我在项目里用得最多的。不过这个只能在元素设置了宽高的时候用。3d
<style type="text/css"> .outer4 { position: relative; } .inner4 { position: absolute; top: 0; right: 0; bottom: 0; left: 0; margin: auto; width: 100px; height: 80px; } </style> <div class="outer outer4"> <div class="inner inner4"> <p>first line</p> <p>second line</p> </div> </div>
上面是基于绝对定位的解决方案,还有其余的。
5,表格布局
父元素display table-cell,virticl-align middle,子元素display table。code
<style type="text/css"> .outer5 { display: table-cell; vertical-align: middle; } .inner5 { display: table; } </style> <div class="outer outer5"> <div class="inner inner5"> <p>first line</p> <p>second line</p> </div> </div>
6,行内块方法
将子元素设置display:inline-block,vetical-align:middle,父元素行高等于高度,
缺点是只能用在父元素高度固定的条件下。orm
<style type="text/css"> .outer6 { line-height: 200px; } .inner6 { display: inline-block; vertical-align: middle; height: 80px; line-height: 1; } </style> <div class="outer outer6"> <div class="inner inner6"> <p>first line</p> <p>second line</p> </div> </div>
7,另外一种行内块方法
给父元素一个:before伪子元素,让这个伪元素height:100%,而后让这个伪子元素和真正的子元素都display:inline-block vetical-align:middle。htm
<style type="text/css"> .outer7:before { content: ''; display: inline-block; height: 100%; vertical-align: middle; } .inner7 { display: inline-block; vertical-align: middle; } </style> <div class="outer outer7"> <div class="inner inner7"> <p>first line</p> <p>second line</p> </div> </div>