博客 / 詳情

返回

使用flex佈局解決經典佈局中overflow必須設置高度才能滾動問題

本文旨在解決經典佈局方案中,左側/頂部/麪包屑/菜單欄收縮,主頁面無法跟隨變化,右側內容界面需要設置高度才能滾動問題。(主頁面內容全自動)

如下圖: 若要實現下圖所示,我們都會使用 “定位” 方式實現。當頂部高度變化,就需要我們調整內容高度。左側欄變化就需要調整右側寬度等。

image.png

如今: 我們可以使用flex方法實現這種佈局方案,且無需使用定位方式,所有佈局都是一邊調整,另一邊跟着一起變動,無需通過任何js實現, 更不需要設置高度。話不多説直接上代碼:

以下代碼直接新建一個html文件,粘貼進去就可以看到實際效果。

<!DOCTYPE html>
<html lang="zh">

<head>
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1,user-scalable=no">
  <meta charset="UTF-8">
  <title>經典佈局</title>
</head>
<!-- 
  本文重點:
  flex-shrink為0表示不會被壓縮,配合上height為0,flex為1一起就表示永遠會佔滿剩下的區域,不會超出也不會被壓縮
 -->
<style>
  body,
  html {
    margin: 0;
    box-sizing: border-box;
  }

  .container {
    height: 100vh;
    width: 100vw;
    display: flex;
    /* 垂直佈局 */
    flex-direction: column;
  }

  .header {
    height: 50px;
    width: 100%;
    background: #929292;
  }

  .context {
    flex: 1;
    /* 第一種: 設置flex-shrink為0,設置height為0 */
    /* 第二種: 設置overflow: scroll */
    flex-shrink: 0;
    height: 0;
    /*overflow: scroll;*/
    width: 100%;
    display: flex;
  }

  .aside {
    height: 100%;
    width: 200px;
    overflow: auto;
  }

  .menu {
    height: 100px;
    background: #ccc;
    border: 5px solid #ddd;
  }

  .main {
    flex: 1;
    /* 方式一 設置flex-shrink為0,設置width為0 */
    /* 方式二 設置overflow: scroll */
    flex-shrink: 0;
    width: 0;
    /*overflow: scroll;*/
    display: flex;
    flex-direction: column;
  }

  .breadcrumb {
    height: 50px;
    padding: 10px 50px;
  }

  .myapp {
    flex: 1;
    overflow: auto;
  }

  .page {
    width: 2000px;
    height: 2000px;
    padding: 10px;
    border: 5px dashed gray;
  }
</style>

<body>
  <div class="container">
    <div class="header">頂部菜單</div>
    <div class="context">
      <div class="aside">
        <div class="menu">菜單1</div>
        <div class="menu">菜單2</div>
        <div class="menu">菜單3</div>
        <div class="menu">菜單4</div>
        <div class="menu">菜單5</div>
        <div class="menu">菜單6</div>
      </div>
      <div class="main">
        <div class="breadcrumb">麪包屑/標題欄</div>
        <div class="myapp">
          <div class="page">可隨意拖動的內容區域</div>
        </div>
      </div>
    </div>
  </div>
</body>

</html>

上面的佈局方案主要是要理解flex-shrink為0表示不會被壓縮,配合上height為0,flex為1一起就表示永遠會佔滿剩下的區域,不會超出也不會被壓縮。這樣不用使用定位方式可以輕鬆實現這種佈局,當然也可以用在移動端,例如現在的餓了麼,美團外賣等這種類型的佈局,直接可以通過上面代碼實現。

知識點:
flex: 1; 它其實是一個縮寫,等價於flex: 1 1 0%; 即:

flex-grow : 1;
flex-shrink : 1;
flex-basis : 0%;
  • flex-grow 表示當有剩餘空間的時候,分配給項目的比例
  • flex-shrink 表示空間不足的時候,項目縮小的比例
  • flex-basis 表示分配空間之前,項目佔據主軸的空間
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.