1. 程式人生 > 其它 >CSS佈局之等分佈局與等高佈局

CSS佈局之等分佈局與等高佈局

技術標籤:玩轉CSS佈局csscss3flex前端網頁設計

等分佈局

  • 等分佈局就是指一行被分為若干列,每一列的寬度是相同的值;
    方法一:float 屬性實現等分佈局效果
    給各個元素設定浮動和寬度
 {
  float: left;
  width: 25%; //寬度用百分比等分
  //給每個元素設定浮動-- 子元素浮動  -  導致父元素的高度塌陷
}

清除浮動

 1.固定的高度  height   固定寫死(不推薦)

2.父元素加overflow:hidden  => BFC 特點: 把浮動的高度給計算進去
    優點:程式碼簡潔
    缺點:內容增多的時候容易造成不會自動換行導致內容被隱藏掉,無法顯示要溢位的元素。

3.clear:both 清除浮動 => 加在浮動子元素的末尾   <div style="clear:both"></div>
    優點:通俗易懂,方便
    缺點:新增無意義標籤,語義化差

4.利用偽元素::after    =》 clearfix 公用類名  =  直接在html中進行呼叫 (最常用)
               .clearfix::after
{ content: ''; display: block; clear: both; } 父級呼叫<div id="parent" class="clearfix"> 優點:符合閉合浮動思想,結構語義化正確 缺點:ie6-7不支援偽元素:after,使用zoom:1觸發hasLayout. 5.使用before和after雙偽元素清除浮動 .clearfix:after,.clearfix:before
{ content: ""; display: table; } .clearfix:after{ clear: both; } .clearfix{ *zoom: 1; } <div class="fahter clearfix"> <div class="big">big</div> <div class="small">small</div> </div> <div class="footer"
></div> 優點:程式碼更簡潔 缺點:用zoom:1觸發hasLayout. 推薦使用

2.display 屬性的值有關 table 實現等分佈局效果;

給父元素新增 display:table;
給子元素新增 display: table-cell;

3.flex 屬性實現等分佈局效果;

  • 父元素設定 display: flex;
  • 子元素設定 flex:1;

4.Grid 屬性實現等分佈局效果;

等分佈局間距處理
方法一:利用浮動+手動計算寬度
考慮用 padding 和 border 來設定間隙
怪異盒模型 :box-sizing: border-box;
盒子模型box-sizing:

  • content-box: width 寬度 = width + padding-left/right + border-left/right
  • border-box: width 寬度 = width(padding+border 計算進去了)
  • margin 不影響盒子模型的大小 = > 間距 / 位置移動

具體步驟(四個盒子等分相互之間有間隙):

  • 1.給四個盒子設定
    {
    width: 25%;
    float: left;
    border-left:10px solid #fff;
    box-sizing: border-box;
    }
  • 2.給父盒子設定 margin-left:-10px;把第一個盒子的左間距隱藏起來
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>等分佈局解決方法1-修改版-border邊框線</title>
    <style>
      * {
        margin: 0;
        padding: 0;
      }

      .parent-fix {
        overflow: hidden;
      }

      #parent {
        height: 300px;
        /* 整體往左邊進行移動  - 間距隱藏起來 */
        margin-left: -10px;
      }

      .col1,
      .col2,
      .col3,
      .col4 {
        height: 300px;
        width: 25%;
        float: left;
        border-left: 10px solid #fff;
        box-sizing: border-box;
      }
      .col1 {
        background-color: hotpink;
      }

      .col2 {
        background-color: lightblue;
      }

      .col3 {
        background-color: green;
      }

      .col4 {
        background-color: yellow;
      }
    </style>
  </head>

  <body>
    <div class="parent-fix">
      <!-- 作為父級容器 -->
      <div id="parent" class="clearfix">
        <div class="col1"></div>
        <div class="col2"></div>
        <div class="col3"></div>
        <div class="col4"></div>
      </div>
    </div>
  </body>
</html>
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>等分佈局解決方法1-修改版- padding內填充</title>
    <style>
      * {
        margin: 0;
        padding: 0;
      }

      .parent-fix {
        overflow: hidden;
      }

      #parent {
        height: 300px;
        margin-left: -10px;
      }

      .col1,
      .col2,
      .col3,
      .col4 {
        height: 300px;
        width: 25%;
        float: left;
        padding-left: 10px;
        /* padding已經計算在了25%
         padding是內容的一個部分,所以看不到,可以在他的父元素裡面巢狀一個子元素,背景顏色加到子元素身上
       */
        box-sizing: border-box;
      }

      .col1 .inner {
        height: 300px;
        background-color: hotpink;
      }

      .col2 .inner {
        height: 300px;
        background-color: lightblue;
      }

      .col3 .inner {
        height: 300px;
        background-color: green;
      }

      .col4 .inner {
        height: 300px;
        background-color: yellow;
      }
    </style>
  </head>

  <body>
    <div class="parent-fix">
      <!-- 作為父級容器 -->
      <div id="parent" class="clearfix">
        <div class="col1">
          <div class="inner"></div>
        </div>
        <div class="col2">
          <div class="inner"></div>
        </div>
        <div class="col3">
          <div class="inner"></div>
        </div>
        <div class="col4">
          <div class="inner"></div>
        </div>
      </div>
    </div>
  </body>
</html>

用 table 實現等分佈局加間隙

  • 1.父元素設定 display: table;子元素設定 display: table-cell;
  • 2.給子元素設定 padding-left: 20px;並內嵌一個盒子,將子元素的顏色加到內嵌的盒子裡面。
  • 3.給所有的盒子外面巢狀一個大盒子,並給其設定 margin-left: -20px;
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>等分佈局解決方法2-table+table-cell</title>
    <style>
      * {
        margin: 0;
        padding: 0;
      }

      #parent {
        width: 100%;
        /* table */
        display: table;
      }
      .parentWrap {
        margin-left: -20px;
      }
      .inner {
        height: 600px;
      }

      .col1,
      .col2,
      .col3,
      .col4 {
        /* td */
        display: table-cell;
        height: 300px;
        padding-left: 20px;
      }

      .col1 .inner {
        background-color: hotpink;
      }

      .col2 .inner {
        background-color: lightblue;
      }

      .col3 .inner {
        background-color: green;
      }

      .col4 .inner {
        background-color: yellow;
      }
    </style>
  </head>

  <body>
    <!-- 作為父級容器 -->
    <div class="parentWrap">
      <div id="parent">
        <div class="col1">
          <div class="inner"></div>
        </div>
        <div class="col2"><div class="inner"></div></div>
        <div class="col3"><div class="inner"></div></div>
        <div class="col4"><div class="inner"></div></div>
      </div>
    </div>
  </body>
</html>

用 flex 實現有間隙的等分佈局

  • 1.父元素設定 display: flex;子元素設定 flex: 1;
  • 2.給子元素設定 padding-left: 20px;並內嵌一個盒子,將子元素的顏色加到內嵌的盒子裡面。
  • 3.給父元素設定 margin-left: -20px;並刪除其 width: 100%;
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>等分佈局解決方法3-flex</title>
    <style>
      * {
        margin: 0;
        padding: 0;
      }

      #parent {
        //width: 100%;
        /* 子元素排列   =  水平排列 */
        display: flex;
        margin-left: -20px;
      }

      .col1,
      .col2,
      .col3,
      .col4 {
        height: 300px;
        /* 四個容器  佔1等份  1/4  = 100%/ 4 */
        flex: 1;
        padding-left: 20px;
      }
      .inner {
        height: 300px;
      }
      .col1 .inner {
        background-color: hotpink;
      }

      .col2 .inner {
        background-color: lightblue;
      }

      .col3 .inner {
        background-color: green;
      }

      .col4 .inner {
        background-color: yellow;
      }
    </style>
  </head>

  <body>
    <!-- 作為父級容器 -->
    <div id="parent">
      <div class="col1"><div class="inner"></div></div>
      <div class="col2"><div class="inner"></div></div>
      <div class="col3"><div class="inner"></div></div>
      <div class="col4"><div class="inner"></div></div>
    </div>
  </body>
</html>

等高分局

等高佈局就是一行被劃分成若干列,每一列的高度是相同的值;

display 屬性的值有關 table 實現

  • 父元素設定 display: table;
  • 子元素設定 display: table-cell;

padding + margin 屬性實現等高佈局效果

  • 給子元素設定足夠大的內填充和外間距
    padding-bottom:9999px;
    margin-bottom:-9999px;