单个块级元素垂直居中
<div id="parent">
<div id="son"></div>
</div>
#parent{
display: table-cell;
vertical-align: middle;
}
设置tabl-cell的元素,宽度和高度的值设置百分比无效,需要给它的父元素设置display: table; 才生效;table-cell不感知margin,在父元素上设置table-row等属性,也会使其不感知height;设置float或position会对默认布局造成破坏,可以考虑为之增加一个父div定义float等属性;内容溢出时会自动撑开父元素
#parent{ height: 150px; position: relative; /*父相*/ } #son{ position: absolute; /*子绝*/ top: 50%; /*父元素高度一半,这里等同于top:75px;*/ transform: translateY(-50%); /*自身高度一半,这里等同于margin-top:-25px;*/ height: 50px; } /*优缺点 - 优点:使用margin-top兼容性好;不管是块级还是行内元素都可以实现 - 缺点:代码较多;脱离文档流;使用margin-top需要知道高度值;使用transform兼容性不好(ie9+)*/ 或 /*原理:当top、bottom为0时,margin-top&bottom会无限延伸占满空间并且平分*/ #parent{position: relative;} #son{ position: absolute; margin: auto 0; top: 0; bottom: 0; height: 50px; } /*优缺点 - 优点:简单;兼容性较好(ie8+) - 缺点:脱离文档流*/ 作者:sweet_KK 链接:https://juejin.im/post/5aa252ac518825558001d5de 来源:掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
水平垂直居中分各种元素不同方法;
#parent{ height: 150px; line-height: 150px; /*行高的值与height相等*/ text-align: center; font-size: 0; /*消除幽灵空白节点的bug*/ } #son{ /*display: inline-block;*/ /*如果是块级元素需改为行内或行内块级才生效*/ vertical-align: middle; } 作者:sweet_KK 链接:https://juejin.im/post/5aa252ac518825558001d5de 来源:掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
定位
#parent{ position: relative; } #son{ position: absolute; top: 50%; left: 50%; /*定宽高时等同于margin-left:负自身宽度一半;margin-top:负自身高度一半;*/ transform: translate(-50%,-50%); } 作者:sweet_KK 链接:https://juejin.im/post/5aa252ac518825558001d5de 来源:掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
绝对居中
#parent{ position: relative; } #son{ position: absolute; margin: auto; width: 100px; height: 50px; top: 0; bottom: 0; left: 0; right: 0; }
- 优点:无需关注宽高;兼容性较好(ie8+)
- 缺点:代码较多;脱离文档流
布局相关:
利用flex布局实现左侧固定右侧自适应的布局
<body> <div id="parent"> <div id="left">左列定宽</div> <div id="right">右列自适应</div> </div> </body>
#parent{ width: 100%; height: 500px; display: flex; } #left { width: 100px; background-color: #f00; } #right { flex: 1; /*均分了父元素剩余空间*/ background-color: #0f0; }
2绝对定位实现
#parent{ position: relative; /*子绝父相*/ } #left { position: absolute; top: 0; left: 0; background-color: #f00; width: 100px; height: 500px; } #right { position: absolute; top: 0; left: 100px; /*值大于等于#left的宽度*/ right: 0; background-color: #0f0; height: 500px; }
三列布局
两列定宽一列自适应
优先考虑flex布局
<body> <div id="parent"> <div id="left">左列定宽</div> <div id="center">中间定宽</div> <div id="right">右列自适应</div> </div> </body>
#parent { height: 500px; display: flex; } #left { margin-right: 10px; /*间距*/ width: 100px; background-color: #f00; } #center { margin-right: 10px; /*间距*/ width: 200px; background-color: #eeff2b; } #right { flex: 1; /*均分#parent剩余的部分达到自适应*/ background-color: #0f0; }
双飞翼布局:左右两侧定宽中间自适应
<!--中间栏需要放在前面--> <div id="parent"> <div id="center"> <div id="center_inbox">中间自适应</div> <hr> <!--方便观察原理--> </div> <div id="left">左列定宽</div> <div id="right">右列定宽</div> </div>
#parent { height: 500px; display: flex; } #left { width: 100px; background-color: #f00; } #center { flex: 1; /*均分#parent剩余的部分*/ background-color: #eeff2b; } #right { width: 200px; background-color: #0f0; }
#parent { position: relative; /*子绝父相*/ } #left { position: absolute; top: 0; left: 0; width: 100px; height: 500px; background-color: #f00; } #center { height: 500px; margin-left: 100px; /*大于等于#left的宽度,或者给#parent添加同样大小的padding-left*/ margin-right: 200px; /*大于等于#right的宽度,或者给#parent添加同样大小的padding-right*/ background-color: #eeff2b; } #right { position: absolute; top: 0; right: 0; width: 200px; height: 500px; background-color: #0f0; }