css 布局以及 trick 总结
一、两栏布局
1、左定宽(例如 200px),右自适应
(1)浮动布局
html
<div id="left">Left sidebar</div>
<div id="content">Main Content</div>
css
* {
margin: 0;
padding: 0;
}
#left {
float: left;
width: 200px;
background-color: green;
}
#content {
background-color: orange;
margin-left: 200px;/*==等于左边栏宽度==*/
}
(2)浮动和负边距
html
<div id="left">
Left Sidebar
</div>
<div id="content">
<div id="contentInner">
Main Content
</div>
</div>
css
*{
margin: 0;
padding: 0;
}
#left {
background-color: green;
float: left;
width: 200px;
margin-right: -100%;
}
#content {
float: left;
width: 100%;
}
#contentInner {
margin-left: 200px;/*==等于左边栏宽度值==*/
background-color: orange;
}
2、左不定宽,右自适应
(1)float + BFC
原理:BFC 区域,不会与浮动元素重叠。
html
<div class="left">
left
</div>
<div class="right">
right
</div>
css
.left{
float: left;
width: 100px;
margin-right: 20px; //形成20px的间隔
background-color: green;
}
.right{
overflow: hidden; <!-- 通过设置overflow:hidden来触发BFC特性,也可以使用*zoom: 1 -->
background-color: yellow;
}
(2)flex 布局
html
<div class="parent">
<div class="left">
<p>left</p>
</div>
<div class="right">
<p>right</p>
</div>
</div>
css
.parent{
display: flex;
}
.left{
margin-right: 20px;
}
.right{
flex: 1;
}
.left p{
width: 200px;
}
3、两列等高布局
(1) float + 内外边距正负值
原理:background 会填充内边距 padding,而不会填充外边距 margin。margin 具有坍塌性,可以设置负值。父容器设置 overflow 属性为 hidden 产生 BFC,一方面消除 float 带来的影响,另一方面将超出容器的部分隐藏。
html
<div class="box">
<div class="left">Left</div>
<div class="right">Right</div>
</div>
css
.box {
overflow: hidden;
}
.box > div {
/**
* padding-bottom 设置比较大的正值。
* margin-bottom 设置绝对值大的负值。
**/
padding-bottom: 10000px;
margin-bottom: -10000px;
float:left;
width:50%;
word-break: break-all;
}
.left {
background-color: greenyellow;
}
.right {
background-color: yellowgreen;
}
二、三栏布局、中间自适应
1、流体布局
html
<div class="container">
<div class="left"></div>
<div class="right"></div>
<div class="main"></div>
</div>
css
.left {
float: left;
height: 200px;
width: 100px;
background-color: red;
}
.right {
width: 200px;
height: 200px;
background-color: blue;
float: right;
}
.main {
margin-left: 120px;
margin-right: 220px;
height: 200px;
background-color: green;
}
2、float + BFC(参考两栏布局的 float + BFC)
3、双飞翼布局
html
<div class="content">
<div class="main"></div>
</div>
<div class="left"></div>
<div class="right"></div>
css
.content {
float: left;
width: 100%;
}
.main {
height: 200px;
margin-left: 110px;
margin-right: 220px;
background-color: green;
}
.left {
float: left;
height: 200px;
width: 100px;
margin-left: -100%;
background-color: red;
}
.right {
width: 200px;
height: 200px;
float: right;
margin-left: -200px;
background-color: blue;
}
4、圣杯布局
html
<div class="container">
<div class="main"></div>
<div class="left"></div>
<div class="right"></div>
</div>
css
.container {
margin-left: 120px;
margin-right: 220px;
}
.main {
float: left;
width: 100%;
height: 300px;
background-color: red;
}
.left {
float: left;
width: 100px;
height: 300px;
margin-left: -100%;
position: relative;
left: -120px;
background-color: blue;
}
.right {
float: left;
width: 200px;
height: 300px;
margin-left: -200px;
position: relative;
right: -220px;
background-color: green;
}
三、垂直居中
1、父元素高度确定的行内元素
line-height = height
2、未知父元素高度和自身高度
parentElement{
position:relative;
}
childElement{
position: absolute;
top: 50%;
transform: translateY(-50%);
}
3、已知自身宽高
(1)
.div {
position:absolute;
width:200px;
height:200px;
top:50%;
left:50%;
margin-top:-100px;
margin-left:-100px;
}
(2)
.div {
position:absolute;
width:140px;
height:140px;
top:0;
right:0;
bottom:0;
left:0;
margin:auto;
}
4、flex 布局
parentElement{
display:flex;/*Flex布局*/
display: -webkit-flex; /* Safari */
align-items:center;/*指定垂直居中*/
}