在前端面试的时候我们经常会被问道怎样使一个元素在页面垂直居中呢,这也是一个老生常谈的问题了。
解决的方法基本都是使用定位来实现
div{display: fixed;left: 50%;top: 50%;width: 200px;height: 200px;margin-left: -100px;margin-top: -100px;}
但是面试官可能还会问如果不使用定位,那你你会怎么做呢?也许会蒙了,也许会随便说但实现不了,这里我给大家分享另外一种垂直居中的方法。
display:table;看例子
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Vertical centering in valid CSS</title>
<style type="text/css">
*{margin: 0;padding: 0;}
body,html{height: 100%; }
#outer {height: 100%;width: 100%;display: table;}
#box{display: table-cell;vertical-align:middle;}
#div{width: 500px;height: 300px;margin: 0 auto;background: #eee;} </style>
</head>
<body>
<div id="outer">
<div id="box">
<div id="div"></div>
</div>
</div>
</body>
</html>
你可以给HTML元素指定与表格相关的display属性值,使得它们像表格元素那样渲染。以下是这些可用的display属性值:
- table
- 使该元素按table样式渲染
- table-row
- 使该元素按tr样式渲染
- table-cell
- 使该元素按td样式渲染
- table-row-group
- 使该元素按tbody样式渲染
- table-header-group
- 使该元素按thead样式渲染
- table-footer-group
- 使该元素按tfoot样式渲染
- table-caption
- 使该元素按caption样式渲染
- table-column
- 使该元素按col样式渲染
- table-column-group
- 使该元素按colgroup样式渲染
-
创建匿名表格元素的规则
-
这些匿名的盒对象不是用魔术变出来的,它们也不会自动往你的HTML源码中添加新的标签。为了完全发挥出匿名表格元素的优势,你最好能够对创建它们的规则有所了解。如果布局中调用了匿名元素,浏览器将会根据需要创建一个匿名的盒对象并将它的CSS display属性设置为table、table-row或table-cell中的一个。
如果某个元素已经被设置为“display:table-cell;”,而它的父节点(包含它的容器)没有被设置为“display:table-row;”属性,那么浏览器将会创建一个被设置为“display:table-row;”的匿名盒对象来嵌套它。并且与之相邻的属性为“display: table-cell;”的兄弟节点也都会被这个匿名盒对象所包含,直到碰到一个没有被设置为“display: table-cell;”的元素而结束这一行。以下是相关的代码样例:<div class=”cell”>CELL A</div>
<div class=”cell”>CELL B</div>
<div class=”cell”>CELL C</div>
<div>Not a cell</div>上面的三个类名为“cell”的div元素均被设置为“display:table-cell;”,它们将会像一个单行表格的三个单元格一样并列排布。最后一个div元素则不会被包含在这一表格行当中,因为它没有被设置成“display:table-cell;”。
如果某个元素被设置为“display:table-row;”,而它的父节点没有被设置为“display:table;”(或者“display:table-row-group;”),浏览器将会创建一个被设置为“display:table;”的匿名盒对象来嵌套它,与之相邻的属性为“display: table-row;”的兄弟节点也都会被包含其中。同样,如果某个元素被设置为“display:table-row;”,但它的内部却缺少“display:table-cell;”的元素,那么一个匿名的table-cell将会被创建,用来包含该table-row中的所有元素。