css布局 - 常規上中下分左右布局的一百種實現方法(更新中...)


一、 上中下左固定 - fixed+margin

概括:如圖,此種布局就是頂部、底部和左側固定不動,只有中間右側超出可滾動。

html:

<header>我是頭部position: fixed;z-index: 9;</header>
    <section class="flexModal fixedLeft">
      <nav>
        <ul>
          <li>section.flexModal nav ul>li*5</li>
          <li>欄目一</li>
          <li>欄目二</li>
          <li class="active">欄目三</li>
          <li>欄目四</li>
          <li>欄目五</li>
        </ul>
      </nav>
      <article>
        <h3>
          內容區域 section.flexModal articel
        </h3>
        <p>
          section{
            padding: 60px 0;
          }
        </p>
        <p> 
          section.flexModal{
            display: flex;
          }
        </p>
        <p> 
          section.flexModal nav{
            width: 200px;
          }
        </p>
        <p> 
          section.flexModal article{
            flex: 1;
          }
        </p>
      </article>
    </section>
    <footer>底部版權同頭部 position: fixed;z-index: 9;</footer>

css:

body,ul,li{
  /* position: relative; */
  margin: 0;
  padding: 0;
  font-family: 'Gill Sans', 'Gill Sans MT', Calibri, 'Trebuchet MS', sans-serif;
  list-style: none;
}
header,footer{
  position: fixed;
  z-index: 9;
  width: 100%;
  height: 60px;
  font-size: 24px;
  color: #333;
  font-weight: bold;
  text-align: center;
  line-height: 60px;
  background: #77d677;
}
footer{
  bottom: 0;
}
section{
  padding: 60px 0;
}
nav{
  background: #93f393;
  color: #333;
}
nav li{
  padding: 10px 20px;
}
nav li.active{
  background: #77d677;
}
article{
  padding: 20px;
  font-size: 24px;
  text-align: center;
  background: #d9ffd9;
  height: 2500px;
}
/* default */
section.default nav{
  position: absolute;
  top: 60px;
  bottom: 60px;
  /* float: left;
  height: 100%; */
  width: 200px;
}
section.default nav li{
  padding: 10px 20px;
}
section.default nav li.active{
  background: #77d677;
}
section.default article{
  padding-left: 220px;
}
/* flexModal */
section.flexModal{
  display: flex;
}
section.flexModal nav{
  width: 200px;
}
section.flexModal article{
  flex: 1;
}

/* fixedLeft */
section.fixedLeft nav{
  position: fixed;
  top: 60px;
  bottom: 60px;
}
section.fixedLeft article{
  margin-left: 200px;  
}

關鍵點:

上下部分就是普通處理,fixed固定布局

position: fixed;

 

中間利用上下padding,留出上下部分的位置。

左側nav欄目,要固定也要用fixed。不過固定定位的元素要想高度百分百,可以使用top+bottom對應方位值的拉伸效果:

section.fixedLeft nav {
    position: fixed;
    top: 60px;
    bottom: 60px;
}

之所以top:60;bottom:60;是因為header和footer的高度均為60px;

 

這里,section的flex布局可以不存在,因為右邊內容區域使用margin-left邊距值留出了左側nav的位置,作為block布局流體自適應占滿右側剩余空間:

section.fixedLeft article {
    margin-left: 200px;
}

 

總結:

  1. fixed固定定位
  2. top+bottom方位值拉伸
  3. margin邊距

  

二、上中下 左不固定 - flex

概括:如圖,此種布局大致同第一幅,頂部、底部固定不動,只有整個中間區域可滾動,包括左側菜單欄。

html :

<header>我是頭部position: fixed;z-index: 9;</header>
    <section class="flexModal">
      <nav>
        <ul>
          <li>section.flexModal nav ul>li*5</li>
          <li>欄目一</li>
          <li>欄目二</li>
          <li class="active">欄目三</li>
          <li>欄目四</li>
          <li>欄目五</li>
        </ul>
      </nav>
      <article>
        <h3>
          內容區域 section.flexModal articel
        </h3>
        <p>
          section{
            padding: 60px 0;
          }
        </p>
        <p> 
          section.flexModal{
            display: flex;
          }
        </p>
        <p> 
          section.flexModal nav{
            width: 200px;
          }
        </p>
        <p> 
          section.flexModal article{
            flex: 1;
          }
        </p>
      </article>
    </section>
    <footer>底部版權同頭部 position: fixed;z-index: 9;</footer>

css:

body,ul,li{
  /* position: relative; */
  margin: 0;
  padding: 0;
  font-family: 'Gill Sans', 'Gill Sans MT', Calibri, 'Trebuchet MS', sans-serif;
  list-style: none;
}
header,footer{
  position: fixed;
  z-index: 9;
  width: 100%;
  height: 60px;
  font-size: 24px;
  color: #333;
  font-weight: bold;
  text-align: center;
  line-height: 60px;
  background: #77d677;
}
footer{
  bottom: 0;
}
section{
  padding: 60px 0;
}
nav{
  background: #93f393;
  color: #333;
}
nav li{
  padding: 10px 20px;
}
nav li.active{
  background: #77d677;
}
article{
  padding: 20px;
  font-size: 24px;
  text-align: center;
  background: #d9ffd9;
  height: 2500px;
}
/* default */
section.default nav{
  position: absolute;
  top: 60px;
  bottom: 60px;
  /* float: left;
  height: 100%; */
  width: 200px;
}
section.default nav li{
  padding: 10px 20px;
}
section.default nav li.active{
  background: #77d677;
}
section.default article{
  padding-left: 220px;
}
/* flexModal */
section.flexModal{
  display: flex;
}
section.flexModal nav{
  width: 200px;
}
section.flexModal article{
  flex: 1;
}

關鍵點:

上中下同第一個,不再贅述。

這里唯一不同的是左側菜單欄要同內容區域一同滾動:

去掉fixed固定定位即可。

同時,要想右側全部展開,即占滿出nav部分的右側全部空間,可以使用flex布局:

父元素section:

section.flexModal {
    display: flex;
}

 

右側內容:

section.flexModal article {
    flex: 1;
}

或者其他兩列布局的方式,比如浮動、margin負邊距實現。

具體實現方法同三列布局的各種方法原理一致。鏈接:CSS-三欄響應式布局(左右固寬,中間自適應)的五種方法

總結:

fixed固定定位

flex布局

 

三、上下固定的上中下單頁布局 - flex實現

概括:常見的三欄單頁布局。

html:

<body  class="container">
    <header>我是頭部</header>
    <article>我是中間文章主體部位</article>
    <footer>我是尾部</footer>
</body>

css:

    body{
      color: #333;
      font-weight: 600;
      font-size: 16px;
      font-family: Verdana, Geneva, Tahoma, sans-serif;
      text-align: center;
    }
    header,footer{
      line-height: 66px;
      background: lightgreen;
    }
    article{
      padding: 20px;
    }
    /* 父元素設置flex,然后布局方向為主軸從上到下,那么header和footer就會在最上邊和最下邊 */
    html,body{
      height: 100%;
      margin: 0;
      /* 不設置100%,高度撐不開 */
    }
    .container{
      display: flex;
      display: -webkit-box;
      display: -webkit-flex;
      flex-direction: column;
      -ms-flex-direction: column;
    }
    article{
      flex: 1;
    }

關鍵點:

上中下要有一個外部盒子包裹。這里偷懶使用了body:

body{
     display: flex;
      display: -webkit-box;
      display: -webkit-flex;
      flex-direction: column;
      -ms-flex-direction: column;
}

 上下設置自己的具體高度即可:

因為是單行,所以偷懶只用了line-height。

header,footer{
      line-height: 66px;
}

 中間內容區域瓜分剩余空間:

article {
    flex: 1;
}

 總結:

  flex布局

  垂直方向

 

 

四、上下固定中間分左右的單頁布局 - flex實現,嵌套使用

在第三的基礎上,中間還想分成左右兩份,結合第二中section也flex的實現,就有了四。

hah

很明顯,露怯了。。。

當我給artical賦了1000px的高度時,出現了bug就是上翻會露怯,底部跟隨而上。

所以,這種只適合不超出一屏的情況。

html:

    <header>我是頭部</header>
    <section>
      <nav>
        <ul>
          <li>導航一</li>
          <li>導航二</li>
          <li>導航三</li>
          <li>導航四</li>
        </ul>
      </nav>
      <article>我是中間文章主體部位</article>
    </section>
    <footer>我是尾部</footer>

css:

body{
      color: #333;
      font-weight: 600;
      font-size: 16px;
      font-family: Verdana, Geneva, Tahoma, sans-serif;
      text-align: center;
    }
    header,footer{
      line-height: 66px;
      background: lightgreen;
    }
    article{
      padding: 20px;
    }
    nav{
      background: green;
      color: #fff;
      padding: 20px;
    }
    ul,li{
      list-style: none;
      margin: 0;
      padding: 0;
      margin-bottom: 20px;
    }
    /* 父元素設置flex,然后布局方向為主軸從上到下,那么header和footer就會在最上邊和最下邊 */
    html,body{
      height: 100%;
      margin: 0;
      /* 不設置100%,高度撐不開 */
    }
    .container{
      display: flex;
      display: -webkit-box;
      display: -webkit-flex;
      flex-direction: column;
      -ms-flex-direction: column;
    }
    section{
      
      flex: 1;
      display: flex;
    }
    nav{
      width: 200px;
    }
    article{
      flex: 1;
      height: 3000px;//bug就是上翻會露怯,這種只適合不超出一屏的情況
    }

關鍵點:

上中下要有一個外部盒子包裹。這里偷懶使用了body:

    .container{
      display: flex;
      display: -webkit-box;
      display: -webkit-flex;
      flex-direction: column;
      -ms-flex-direction: column;
    }

 

父元素設置flex,然后布局方向為主軸從上到下,那么header和footer就會在最上邊和最下邊。

他們只需要設置自己的具體高度即可:

因為是單行,所以偷懶只用了line-height。

header, footer {
    line-height: 66px;
    background: lightgreen;
}

 

中間內容區域瓜分剩余空間:

section {
    flex: 1;
}

 

但是,中間現在又分了nav和article兩部分,需要兩列布局,我還是使用flex實現:

先在section加一句display

section {
    flex: 1;
    display: flex;
}

 

nav因為只需要固定的寬度:

nav {
    width: 200px;
}

 

右側內容占據nav以外的剩余區域即可:

article{
      flex: 1;
}

 

總結:

  flex 套 flex

 

五、上下固定中間分左右的單頁布局 - absolute實現

跟第四的效果一樣,只是換魔鬼的兒子absolute來實現:

html :

  <header>頭部</header>
  <section>
    <aside>側邊欄</aside>
    <article>
      內容區域
    </article>
  </section>
  <footer>尾部</footer>

css :

    html,
    body {
      height: 100%;
    }
    body {
      margin: 0;
    }
    header,
    footer {
      position: absolute;
      line-height: 48px;
      left: 0;
      right: 0;
      z-index: 1;
      color: aquamarine;
      text-align: center;
      background: #333;
    }

    footer {
      bottom: 0;
    }

    aside {
      position: absolute;
      top: 0;
      bottom: 0;
      left: 0;
      padding: 68px 0;
      width: 280px;
      text-align: center;
      background: #eee;
    }

    article {
      position: absolute;
      left: 280px;/*如果側邊欄有寬度*/
      right: 0;
      top: 0;
      bottom: 0;
      padding: 68px 20px;
      overflow: auto;/*超出滾動顯示*/
      background: #f5f5f5;
    }

  

關鍵點:

把整個body當作relative父元素外框

上下結構是上下絕對定位:

header, footer {
    position: absolute;
    line-height: 48px;
    left: 0;
    right: 0;
    z-index: 1;
    color: aquamarine;
    text-align: center;
    background: #333;
}

 

footer {
    bottom: 0;
}

 

中間的左、右結構同時使用absolute定位,並用top、bottom拉伸加持。這樣可以使他們的高度100%絕對占據元素的高度。

    position: absolute;
    top: 0;
    bottom: 0;

 

然后左右的結構布局使用left和寬度配合

比如左邊aside直接

    left: 0;
    width: 280px;

右邊article用left躲過左邊的寬度:

    left: 280px;

最后,左右再分別使用padding空出header和footer的位置

padding: 68px 20px;

(用top+bottom對應數值也可以)

 position: absolute;
 top:60px;
 bottom: 60px;

 

總結:

  absolute + 方位值

  適合單頁布局

 

六、上下固定中間滾動的移動單頁結構- fixed定位實現

html:

<header>頭部</header>
  <section>
    <ul>
      <li>遇到這種布局,通常想到用fixed固定頂部和尾部,然后中間的有個和頂部尾部同值的上下padding,好讓內容撐開與上下的距離。但是這種布局會有bug。</li>
      <li>我是列表項</li>
      <li>我是列表項</li>
      <li>我是列表項</li>
      <li>我是列表項</li>
      <li>我是列表項</li>
      <li>我是列表項</li>
      <li>我是列表項</li>
      <li>我是列表項</li>
      <li>我是列表項我是列表項我是列表項我是列表項</li>
      <li>我是列表項</li>
      <li>我是列表項</li>
      <li>我是列表項</li>
      <li>我是列表項</li>
      <li>我是列表項</li>
      <li>我是列表項</li>
      <li>我是列表項</li>
      <li>我是列表項</li>
    </ul>
  </section>
  <footer>底部</footer>

css:

html,
    body {
      height: 100%;
    }
    body,ul {
      margin: 0;
    }
    header,
    footer {
      position: fixed;
      line-height: 48px;
      left: 0;
      right: 0;
      z-index: 1;
      color: aquamarine;
      text-align: center;
      background: #333;
    }
    header{
      top: 0;
    }
    footer {
      bottom: 0;
    }
    section{
      padding: 68px 0;
      /* position: absolute;
      top: 48px;
      right: 0;
      bottom: 48px;
      left: 0; 
      width: 100%;*/
      overflow: auto;
      background: #eee;
    }
    li{
      padding: 10px;
    }

關鍵點:

header上固定定位

position: fixed;
top: 0;

footer下固定定位

position:fixed;
bottom: 0;

上下均通過line-height實現固定高度,使用left+right橫向拉伸實現寬度100%效果:

    line-height: 48px;
    left: 0;
    right: 0;

中間不定位。只是padding上下留出header和footer的高度占位,且overflow:hidden

    padding: 68px 0;
    overflow: auto;

總結:

  上下 fixed

  中間 padding+overflow

 

七、上下固定中間滾動的移動單頁結構- absolute定位實現

html:

<header>頭部</header>
  <section>
    <ul>
      <li>遇到這種布局,通常想到用fixed固定頂部和尾部,然后中間的有個和頂部尾部同值的上下padding,好讓內容撐開與上下的距離。但是這種布局會有bug。</li>
      <li>我是列表項</li>
      <li>我是列表項</li>
      <li>我是列表項</li>
      <li>我是列表項</li>
      <li>我是列表項</li>
      <li>我是列表項</li>
      <li>我是列表項</li>
      <li>我是列表項</li>
      <li>我是列表項我是列表項我是列表項我是列表項</li>
      <li>我是列表項</li>
      <li>我是列表項</li>
      <li>我是列表項</li>
      <li>我是列表項</li>
      <li>我是列表項</li>
      <li>我是列表項</li>
      <li>我是列表項</li>
      <li>我是列表項</li>
    </ul>
  </section>
  <footer>底部</footer>

css:

html,
    body {
      height: 100%;
    }
    body,ul {
      margin: 0;
    }
    header,
    footer {
      position: absolute;
      line-height: 48px;
      left: 0;
      right: 0;
      z-index: 1;
      color: aquamarine;
      text-align: center;
      background: #333;
    }
    header{
      top: 0;
    }
    footer {
      bottom: 0;
    }
    section{
      padding: 20px;
      position: absolute;
      top: 48px;
      right: 0;
      bottom: 48px;
      left: 0;
      overflow: auto;
    }
    li{
      padding: 10px 0;
    }

關鍵點:

header上絕對定位

position: absolute;
top: 0;

footer下絕對定位

position:absolute;
bottom: 0;

上下均通過line-height實現固定高度,使用left+right橫向拉伸實現寬度100%效果:

    line-height: 48px;
    left: 0;
    right: 0;

中間絕對定位。

position: absolute;

左右方位值水平放向拉伸實現寬度100%效果:

    right: 0;
    left: 0;

中間的上、下方位值留出header、footer的高度占位值:

    top: 48px;
    bottom: 48px;

超出會出現滾動條,不超出就沒有滾動條:

overflow:auto

總結:

  全屏三大塊元素均使用absolute布局。

 

平時遇到這種布局,通常想到用fixed固定頂部和尾部,然后中間的有個和頂部尾部同值的上下padding,好讓內容撐開與上下的距離。但是這種布局會有bug。

 如果中間內容不小心設置了過高的高度超出視圖,會讓底部跟隨中間向上滑動。

全屏使用absolute布局是個很好的方法。

 

八、上下固定分左右自適應布局 - Grid網格布局實現

html:

1 <div class="wrapper">
2     <div class="header">header</div>
3     <div class="container">
4       <div class="nav">nav</div>
5       <div class="cont">cont</div>
6     </div>
7     <div class="footer">footer</div>
8   </div>

 

css:

 1 .wrapper{
 2     display: grid;
 3     grid-template-columns: 30% 70%;
 4     grid-template-rows: 100px 600px 50px;
 5   }
 6   .container{
 7     display: grid;
 8     grid-template-columns: 30% 70%;
 9     grid-template-rows: 100%;
10   }
11   .footer,.header,.container{
12     grid-column: 1 / 4;
13     background: lightgreen;
14     text-align: center;
15     line-height: 50px;
16   }
17   .nav{
18     grid-column: 1 / 2;
19     grid-row: 1 / 2;
20     background: sandybrown;
21   }
22   .cont{
23     grid-column: 2 / 4;
24     grid-row: 1 / 2;
25     background: salmon;
26   }

 

注:案例代碼只為了簡單的實現效果,沒有兼容處理和代碼優化。

具體用法和原理講解見grid知識點講解篇。Grid

 

 

 

另一篇:CSS-三欄響應式布局(左右固寬,中間自適應)的五種方法

2018-09-10 13:11:39


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM