display:設(shè)置元素的顯示方式
display:block(塊級元素)
默認(rèn)為父元素寬高,可設(shè)置寬高
相對前序換行顯示,其后續(xù)也為換行顯示
默認(rèn)display:block元素 --div, p, h1-h6, form...
應(yīng)用:水平居中
margin:0 auto;
display:inline
默認(rèn)寬度為內(nèi)容寬度,不可設(shè)置寬高
inline元素之間為同行顯示,元素內(nèi)部可換行
默認(rèn)display:inline元素 -- span, a, label, cite, em,...
display:inline-block
默認(rèn)為內(nèi)容寬高,可設(shè)置寬高
同行顯示
inline-block元素如果超過邊界將整行換行
默認(rèn)display:inline-block元素 -- input, textarea, select, button,...
應(yīng)用:居中導(dǎo)航
text-align:center;
a{display:inline-block;
width:**px;
height: **px;
display:none
設(shè)置元素不顯示
visibility:hidden ---只是隱藏看不到但元素依然占據(jù)位置
position:設(shè)置定位方式
top,right,bottom,left,z-index--設(shè)置位置
(x,y)的定位方式要考慮元素的寬高等
.sample{
top: 30px;
left: 30px;
bottom: 30px;
right:30px;
}
同時設(shè)置top、bottom,使得元素?fù)伍_
z-index:設(shè)置元素在z軸上的位置,存在棧的概念
在未設(shè)置位置時按照文檔流排序
position:static 靜態(tài)
position:relative
主要應(yīng)用于作為絕對定位元素的參照物
元素仍在文檔流中(即按照文檔流的順序進行排列)
參照物為元素本身
.sample{
position:relative;
top:20px; //改變了元素z軸上的層級
left:-30px;
}
position: absolute
默認(rèn)寬度為內(nèi)容寬度,脫離文檔流(相當(dāng)于上浮)
參照物是第一個定位祖先/根元素
輪播頭圖
.is{
position:relative;
}
.is.title{
position: absolute;
}
.is.controls{
position:absolute;
}
position:fixed
默認(rèn)為內(nèi)容寬度,元素脫離文檔流,參照物為視窗,不隨滾動條滾動而滾動
固定頂欄布局
padding-top: **px;
}
.top{
position: fixed;
}
遮罩布局
.mask{
position:fixed;
top:0;
widht:%100;
z-index:999;
}
三行自適應(yīng)布局
.head{
position:absoulte;
}
.body{
position:absolute;
top:100px;
bottom:100px;
right:0;
}
.foot{
position:absolute;
bottom: 0;
left: 0;
width:%100;
height:**px;
}
float
默認(rèn)寬度為內(nèi)容寬度,向指定方向一直移動,float的元素在同一文檔流中,半脫離文檔流
對后續(xù)元素,脫離文檔流;對后續(xù)內(nèi)容,在文檔流
float:right
clear :both| left| right| none| inherit
應(yīng)用于浮動元素的后續(xù)元素清除浮動影響
應(yīng)用于塊級元素
清除浮動:
- 增加空白元素(不常用)
- clearfix
.clearfix:after{
content: ".";
display: block;
clear: both;
height: 0;
overflow: hidden;
visibility: hidden;
}
<div class="sb clearfix">
</div>
- 用空白元素
.cb{
clear: both;
height: 0;
overflow: hidden;
visibility: hidden;
}
<div>
<br class="cb">
</div>
- 兩列布局
<div class="body clearfix">
<div class="side">side</div>
<div class="main">main</div>
</div>
.side{
float: right;
}
.main{
float: left;
}
.clearfix: after{
content: ".";
display: block;
height: 0;
overflow: hidden;
visibility: hidden;
}
flex(彈性布局)
創(chuàng)建flex container
display:flex;
flex item(彈性元素)
在彈性容器文檔流中的子元素
float是在文檔流中的元素
flex-direction:row | row-reverse | column | column-reverese
設(shè)置排列方向
flex-wrap: nowrap | wrap | wrap-reverse |
設(shè)置換行方式,默認(rèn)為不換行
flex-flow: <'flex-direction'> || <'flex-wrap'>
order
初始值為0,是一個相對的值,按照從小到大方式排列
彈性
flex-basis
flex-basis: main-size | <width>
設(shè)置flex item的初始寬 / 高
flex-grow
flex-grow: <number>
inital: 0
flex-grow設(shè)置元素所能分配到的空余空間的比例
彈性布局的元素width = flex-basis + flex-grow/sum(flex-grow) * remain
flex-shrink
flex-shrink :<number>
inital: 1
flex -shrink 設(shè)置的元素把負(fù)的空間按照一定比例平攤
width = flex-basis + flex-shrink/sum(flex-shrink) *remain
flex
flex: <'flex-grow> || <'flex-shrink'> || <'flex-basis'>
inital: 0 1 main-size
對齊
justify-content
justify-content: flex-start | flex-end | center | space-between | space-around
align-items
align-items: flex-strat | flex-end | center|baseline | stretch
類似vertical-align
設(shè)置在容器上
align-self
align-self: auto | flex-start | flex-end | center | baseline | stretch
設(shè)置單個flex item在cross-axis方向上對齊方式
align-content
align-content: flex-start | flex-end | center | space-between | space-around | stretch
設(shè)置cross-axis方向行對齊方式,可應(yīng)用于多行
三行兩列自適應(yīng)布局
body{
display: flex;
flex-flow:: column;
}
.head, .foot{
height: 100px;
}
.body{
flex:1;
display: flex;
}
side{
width: 200px;
}
.main{
flex:1;
}
<div class="head">head </body>
<div class="body">
<div class="side">side</div
<div class="main">main</div>
</div>
<div class="foot">foot</div>
水平居中
-
inline-block + text-align
.child{
display: inline-block;
}
.parent{
text-align: center;
}
<div class="parent">
<div class="child"> DEMO</div>
</div>
兼容性良好,甚至可以兼容IE6、7,但會使child內(nèi)部文字也為center,需要額外代碼修復(fù)text-align帶來的問題
-
tabel + margin
.child{
display: table;
margin: 0 auto;
}
<div class="parent">
<div class="child"> DEMO</div>
</div>
只對child設(shè)置不用管parent
-
absolute + transform
.parent{
position: relative;
}
.child{
position: absolute;
left: 50%;
transform: translate(-50%);
}
<div class="parent">
<div class="child"> DEMO</div>
</div>
child元素不會對其他元素產(chǎn)生影響,但是對IE6、7、8兼容性不好
-
flex +justify-content
flex-item在默認(rèn)情況下寬度是內(nèi)容寬度
.parent{
display: flex;
justify-content: center;
}
<div class="parent">
<div class="child"> DEMO</div>
</div>
或者為
.parent{
display: flex;
}
.child{
margin: 0 auto;
}
flex在低版本瀏覽器中不支持
垂直居中
父子容器高度不定
-
table-cell +vertical-align
.parent{
display: table-cell;
vertical-align: middle;
}
<div class="parent">
<div class="child"> DEMO</div>
</div>
兼容性好
-
absolute + transform
.parent{
position: relative;
}
.child{
position: absolute;
top: 50%;
}
<div class="parent">
<div class="child"> DEMO</div>
</div>
兼容性不好。可能要給不同的瀏覽器加上不同的私有前綴
-
flex + align-items
.parent{
display: flex;
align-items: center;
}
<div class="parent">
<div class="child"> DEMO</div>
</div>
只有高版本瀏覽器可以用
居中
父子容器高度未知
-
inline-block + text-align+ table-cell +vertical-align
.parent{
text-align: center;
display: table-cell;
vertical-align: middle;
}
.child{
display: inline-block;
}
<div class="parent">
<div class="child"> DEMO</div>
</div>
兼容性高,將table-cell換成table結(jié)構(gòu),inline-block不支持可以換成display-inline + zoom:1
-
absolute+ transform
.parent{
position: relative;
}
.child{
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%,-50%);
}
<div class="parent">
<div class="child"> DEMO</div>
</div>
child不會對其他元素產(chǎn)生影響,但存在兼容問題
- flex+ justify-content + align-items
.parent{
display: felx;
justify-content: center;
align-items: center;
}
兼容性存在問題
解決方案的思路
- 了解css元素屬性、值、特性
- 分析需求,分解問題
多列布局
定寬 + 自適應(yīng)
-
float + margin
.left{
float: left;
width: 100px;
}
.right{
margin-left: 120px;
}
<div class="parent">
<div class="left">
<p> left</p>
</div>
<div class="right">
<p></p>
</div>
</div>
在IE6中會產(chǎn)生3像素的bug
-
float+ margin + (fix)
.left{
float: left;
width: 100px;
position: relative;
}
.right-fix{
float: right;
width: 100%;
margin-left: -100%;
}
.right{
margin-left: 120px;
}
<div class="parent">
<div class="left">
<p> left</p>
</div>
<div class="right-fix">
<div class="right">
<p></p>
</div>
</div>
</div>
不會有三像素問題,兼容性好,但結(jié)構(gòu)多
-
float + overflow
.left{
float: left;
width: 100px;
margin-right: 20px;
}
.right{
overflow: hidden;
}
<div class="parent">
<div class="left">
<p> left</p>
</div>
<div class="right">
<p></p>
</div>
</div>
-
table
.parent{
display: table;
width: 100%;
table-layout: fixed;
}
.left, .right{
display: table-cell;
}
.left{
width: 100px;
padding-right: 20px;
}
<div class="parent">
<div class="left">
<p> left</p>
</div>
<div class="right">
<p></p>
</div>
</div>
table-layout可以加速渲染
-
flex
.parent{
display: flex;
}
.left{
width:100px;
margin-right: 20px;
}
.right{
flex: 1;
}
<div class="parent">
<div class="left">
<p> left</p>
</div>
<div class="right">
<p></p>
</div>
</div>
性能可能存在問題,flex多應(yīng)用于小范圍布局
兩列定寬一列自適應(yīng)
.left,.center{
flaot: left;
width: 100px;
margin-right: 20px;
}
.right{
overflow: hidden;
}
<div class="parent">
<div class="left">
<p> left</p>
</div>
<div class="center">center
</div>
<div class="right">
<p></p>
</div>
</div>
等分布局
.parent{
margin-left:-20px;
}
.column{
float:left;
width: 25%;
padding-left: 20px;
box-sizing: border-box;
}
<div class="parent">
<div class="column"> 1</div>
<div class="column"> 1</div>
<div class="column"> 1</div>
<div class="column"> 1</div>
</div>
兼容性比較好,但是當(dāng)列數(shù)發(fā)生變化是要修改width
-
table
.parent-fix{
margin-left: -20px;
}
.parent{
display: table;
width: 100%;
table-layout: fixed;
}
.column{
display: table-cell;
padding-left: 20px;
}
<div class="parent-fix">
<div class="parent">
<div class="column"> 1</div>
<div class="column"> 1</div>
<div class="column"> 1</div>
<div class="column"> 1</div>
</div>
</div>
table-layout布局優(yōu)先加速渲染加速布局,當(dāng)table-layout:flex,單元格沒有設(shè)置寬度,單元格就是平分的
-
flex
display: flex;
}
.column{
flex: 1;
}
.column+.cloumn{
margin-left:20px;
}
<div class="parent">
<div class="column"> 1</div>
<div class="column"> 1</div>
<div class="column"> 1</div>
<div class="column"> 1</div>
</div>
等高布局
-
table
.parent{
display: table;
width: 100%;
table-layout: fixed;
}
.left, .right{
display: table-cell;
}
.left{
width: 100px;
padding-right: 20px;
}
<div class="parent">
<div class="left">
<p> left</p>
</div>
<div class="right">
<p></p>
</div>
</div>
-
flex
.parent{
display: flex;
}
.left{
width:100px;
margin-right: 20px;
}
.right{
flex: 1;
}
<div class="parent">
<div class="left">
<p> left</p>
</div>
<div class="right">
<p></p>
</div>
</div>
-
float
.paren{
overflow: hidden;
}
.left, .right{
padding-bottom: 9999px;
margin-bottom:-9999px;
}
.left{
float:left;
width: 100px;
margin-right: 20px;
}
.right{
overflow: hidden;
}
<div class="parent">
<div class="left">
<p> left</p>
</div>
<div class="right">
<p></p>
</div>
</div>
只是偽等高,此處只是把left的背景看起來和right一樣高
全屏布局
-
position
html,body,.paernt{
height: 100%;
overfollow: hidden;
}
.top{
position: absolute;
top: 0;
left: 0;
right: 0;
height:100px;
}
.left{
position: absolute;
top: 100px;
left: 0;
width: 200px;
bottom: 50px;
}
.right{
position: absolute;
overflow: auto;
left: 200px;
right: 0;
top: 100px;
bottom: 50px;
}
.bottom{
position: absolute;
left: 0;
right: 0;
bottom: 0;
height: 50px;
}
.right.inner{
min-height: 1000px;
}
<div class="parent">
<div class="top"> top </div>
<div class="left "> left</div>
<div class="right">
<div class="inner">inner</div>
</div>
<div class="bottom"> bottom</div>
</div>
轉(zhuǎn)換成百分比,將px換為百分比
html,body,.paernt{
height: 100%;
overfollow: hidden;
}
.top{
position: absolute;
top: 0;
left: 0;
right: 0;
height:10%;
}
.left{
position: absolute;
top: 10%;
left: 0;
width: 20%
bottom: 5%;
}
.right{
position: absolute;
overflow: auto;
left: 20%;
right: 0;
top: 10%;
bottom: 5%;
}
.bottom{
position: absolute;
left: 0;
right: 0;
bottom: 0;
height: 5%;
}
.right.inner{
min-height: 1000px;
}
<div class="parent">
<div class="top"> top </div>
<div class="left "> left</div>
<div class="right">
<div class="inner">inner</div>
</div>
<div class="bottom"> bottom</div>
</div>
兼容性:不支持IE6
-
flex
.parent{
height: 100%;
overflow: hidden;
}
.parent{
display: flex;
flex-direction: column;
.top{
height: 100px;
}
.bottom{
height: 50px;
}
.middle{
flex: 1;
display: flex;
}
.left{
width: 20px;
}
.right{
flex: 1;
overflow: auto;
}
.right.inner{
min-height: 1000px;
}
<div class="parent">
<div class="top"> top </div>
<div class="middle ">
<div class="left">left</div>
<div class="right">
<div class="inner">inner</div>
</div>
</div>
<div class="bottom"> bottom</div>
</div>
兼容性:IE9以下都不兼容
全部自適應(yīng)布局
-
flex
.parent{
height: 100%;
overflow: hidden;
}
.parent{
display: flex;
flex-direction: column;
.top{
}
.bottom{
}
.middle{
flex: 1;
display: flex;
}
.left{
}
.right{
flex: 1;
overflow: auto;
}
.right.inner{
min-height: 1000px;
}
<div class="parent">
<div class="top"> top </div>
<div class="middle ">
<div class="left">left</div>
<div class="right">
<div class="inner">inner</div>
</div>
</div>
<div class="bottom"> bottom</div>
</div>