CSS頁面布局總結(jié)

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;
}

兼容性存在問題
解決方案的思路

  1. 了解css元素屬性、值、特性
  2. 分析需求,分解問題

多列布局

定寬 + 自適應(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>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補...
    _Yfling閱讀 13,801評論 1 92
  • 各種純css圖標(biāo) CSS3可以實現(xiàn)很多漂亮的圖形,我收集了32種圖形,在下面列出。直接用CSS3畫出這些圖形,要比...
    劍殘閱讀 9,688評論 0 8
  • 從電影院出來的時候我的眼睛又脹又紅,衣兜里已經(jīng)塞滿了一大團濕潤的紙巾。是的,看的那部電影是《一條狗的使命》。 在電...
    阿吃呢閱讀 454評論 0 0
  • 清涼月光閱讀 224評論 0 3
  • 第6章 4大基本原則復(fù)習(xí) 有關(guān)設(shè)計(同時也是有關(guān)生活)的一個更一般的指導(dǎo)原則是:不要畏畏縮縮。●不要害怕在設(shè)計(或...
    whybask閱讀 376評論 0 0