常見CSS布局

CSS頁(yè)面布局技術(shù)允許我們拾取網(wǎng)頁(yè)中的元素,并且控制它們相對(duì)正常布局流、周邊元素、父容器或者主視口/窗口的位置。

正常布局流

正常布局流,即我們所說的文檔流,是原生的、未經(jīng)人為刻意控制的瀏覽器默認(rèn)的HTML布局排版方式。
“霸道”的塊級(jí)元素,從上往下,另起一行;“溫柔”的內(nèi)聯(lián)元素(最常見的文字),從左到右依次緊挨著排布。一個(gè)元素的性格是“霸道”或是“溫柔”,通常出生時(shí)便已確定,但我們可以刻意地通過display屬性的設(shè)置來“調(diào)教”它的性格,亦霸道(display:block),亦溫柔(display:inline),亦或霸道兼溫柔(diaplsy:inline-block)。

浮動(dòng)

通常元素默認(rèn)是不浮動(dòng)的,即浮動(dòng)屬性為none。使用浮動(dòng)的“調(diào)教”后,我們便能讓兩個(gè)塊級(jí)元素從默認(rèn)的垂直布局變?yōu)樗讲季帧?br> 注意:子元素設(shè)置float屬性后,通常需要在其父元素設(shè)置清除浮動(dòng)的樣式,即在父元素添加一個(gè).clearfix的類,樣式為

.clearfix::after{
   content: '';
   display: block;
   clear: both;
}

這樣,如果那個(gè)元素需要清除浮動(dòng),直接多加一個(gè).clearfix的類名即可,一勞永逸。這里利用的偽元素的一些特性。

左右布局

1. 簡(jiǎn)單的左右布局

HTML代碼

<body>
   <div class="father clearfix">
     <div class="left">我在左</div>
     <div class="right">我在右</div>
   </div>
</body>

CSS樣式

.father{
  border:1px solid black;
}
.left{
  background:red;
  width:40%;
  float:left;
}
.right{
  background:yellow;
  width:40%;
  float:right;
}
.clearfix::after{
  content:'';
  display:block;
  clear:both;
}

效果


如果父元素沒有添加.clearfix類,則會(huì)出現(xiàn)父元素沒有高度的bug,如圖

2. 左側(cè)固定,右側(cè)自適應(yīng)布局(float + margin)
2.1 左側(cè)左浮動(dòng),右側(cè)設(shè)置margin-left

html代碼

<body>
  <div class="left"></div>
  <div class="main"></div>
</body>

CSS代碼

.left{
  width:200px;
  height:100px;
  background:#abcdef;
  float:left;
}
.main{
  height:100px;
  background:#777;
  margin-left:200px;
}
2.2 利用浮動(dòng)和負(fù)外邊距來進(jìn)行左邊固定右邊自適應(yīng)的布局,與上面有些許不同,可以仔細(xì)琢磨下兩這有何區(qū)別

html

<body>
  <div class="left"></div>
  <div class="wrap">
    <div class="main"></div>
  </div>
</body>

CSS

.left{
  width:200px;   
  height:100px;
  background:#abcdef;
  float:left;
  margin-right:- 200px;  /*如果不設(shè)置負(fù)右外邊距,.warp會(huì)被擠到下一行;設(shè)置多大呢?絕對(duì)值大于等于左邊欄目寬度即可*/
}
.wrap{
  width:100%;
  height:100px;
  background:#777;
}
.main{
  margin-left:200px;   /*等于左邊欄的寬度*/
  background:orange;
  height:100px;
}

效果


這里第二部分用了一個(gè)div進(jìn)行包裹,如果不是很好理解,可以粘貼代碼到js.bin看看效果,然后打開開發(fā)者工具進(jìn)行調(diào)試。

左中右布局

左中右布局的實(shí)現(xiàn)由很多種,大體可分為傳統(tǒng)的浮動(dòng)+margin絕對(duì)定位+margin,現(xiàn)代比較“潮”的flex彈性盒子布局,以及科技含量更高的Grid布局

  1. 浮動(dòng)+margin
  2. 絕對(duì)定位+margin
  3. flex彈性盒子
  4. Grid柵格

浮動(dòng)+margin

左欄左浮動(dòng),右欄右浮動(dòng),主體直接放后面,就實(shí)現(xiàn)了自適應(yīng)三欄布局。
這種布局需要注意主體main標(biāo)簽必須放在最后,左右隨意,一定要注意div書寫的順序。

html代碼

<body>
<div id="left"></div>
<div id="right"></div>
<div id="main"></div>
</body>

CSS代碼

html,body{
  margin:0; 
  height:100%;
}
#main{
  height:100%; 
  margin:0 210px; 
  background:#ffe6b8;
}
#left,#right{
  width:200px; 
  height:100%;
  background:#a0b3d6;
}
#left{
  float:left;
}
#right{
  float:right;
}

效果


浮動(dòng)+margin負(fù)值法

首先,中間的主體要使用雙層標(biāo)簽。外層div寬度100%顯示,并且浮動(dòng),內(nèi)層div為真正的主體內(nèi)容,含有左右210像素的margin值。左欄與右欄都是采用margin負(fù)值定位的,左欄左浮動(dòng),margin-left為-100%,由于前面的div寬度100%與瀏覽器,所以這里的-100% margin值正好使左欄div定位到了頁(yè)面的左側(cè);右側(cè)欄也是左浮動(dòng),其margin-left也是負(fù)值,大小為其本身的寬度即200像素。
html

<body>
 <div id="main">
    <div id="body"></div>
 </div>
 <div id="left"></div>
 <div id="right"></div>
</body>

CSS

html,body{margin:0; height:100%;}
#main{width:100%; height:100%; float:left;}
#body{margin:0 210px; background:#ffe6b8; height:100%;}
#left,#right{width:200px; height:100%; float:left; background:#a0b3d6;}
#left{margin-left:-100%;}   /*本來在屏幕外,通過負(fù)外邊距想坐移了一個(gè)屏幕的寬度*/
#right{margin-left:-200px;} /*同上,本來自屏幕外,向左移了自身寬度的長(zhǎng)度*/

這種方法較難理解,推薦動(dòng)手利用開發(fā)者工具調(diào)試調(diào)試。

絕對(duì)定位+margin

左右兩欄采用絕對(duì)定位,分別固定于頁(yè)面的左右兩側(cè),中間的主體欄用左右margin值撐開距離。于是實(shí)現(xiàn)了三欄自適應(yīng)布局。div順序沒有要求。

html

<body>
<div id="left"></div>
<div id="right"></div>
<div id="main"></div>
</body>

CSS

html,body{
margin:0; 
height:100%;
}
#left,#right{
position:absolute; 
top:0;
width:200px;
height:100%;
}
#left{
left:0; 
background:#a0b3d6;
}
#right{
right:0; 
background:#a0b3d6;
}
#main{
margin:0 210px; 
background:#ffe6b8; 
height:100%;
}

在用絕對(duì)定位時(shí),通常會(huì)在其父元素使用相對(duì)定位,即position:absoluteposition:relative是成對(duì)出現(xiàn)的,兩者相輔相成。

flex布局

給父元素(Flex容器)設(shè)置 display:flex;子元素(Flex項(xiàng)目)會(huì)默認(rèn)排成一行,通過設(shè)置容器或項(xiàng)目的各種屬性來改變項(xiàng)目布局的方式。

.father{
  display: flex;
  justify-content:space-between;
}
來自網(wǎng)絡(luò)

flex參考資料:
flex-MDN
Flex彈性布局

參考博文:張?chǎng)涡?/a>

友情鏈接更多精彩內(nèi)容