HTML5使用純CSS實現“按比例平分”整個垂直空間


HTML5使用純CSS實現“按比例平分”整個垂直空間

需求

需要實現頭部固定在"屏幕"上方+中部滾動+底部固定在"屏幕"下方的頁面布局樣式。

類似以下效果:css布局——底部固定,內容足夠多時其位置隨內容而變,始終在最底部_網絡_wj1224_的博客-CSDN博客

可惜上面網址給出的是固定高度的解決方案.不符合要求.

要求

1. 必須使用純CSS

假如使用JS根據布局動態計算的話,也是可以的.

通過獲取頭部和底部的布局高度,再用屏幕高度減去即可得到中部的高度即可.

中部固定高度=屏幕高度 - 頭部高度 - 底部高度

2. 不能使用Table布局

因為在UNI-APP項目中,暫不考慮使用HTML別的特定元素來實現布局

3. 不能寫死元素的高度

方便適配不同的手機屏幕高度,假如寫死高度,則兼容性不佳.

解決方案

有效方案2: display: flex + overflow: auto;+ height:100%;

代碼如下

<html>
<head>
</head>
</head>
<body style="display: flex; flex-direction: column;height:100%">
  <div>我始終顯示在屏幕頂部</div>
  <div style="flex: 1;overflow: auto;">
    <ol>
      <li>我是長長的內容;需要支持滾動;占剩余空間的比例為1份</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><li></li><li></li><li></li><li></li>
    </ol>
  </div>
  <div style="flex: 5;overflow: auto;">
    <ol>
      <li>我是長長的內容;需要支持滾動;占剩余空間的比例為5份</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><li></li><li></li><li></li><li></li>
    </ol>
  </div>
  <div >我始終顯示在屏幕底部</div>
</body>
</html>

缺點: 當全局各種元素的Margin和Padding沒有重置為0的話,會出現3個滾動條.最外圍Body級多了一個滾動條,導致某些情況下不夠完美. 有效方案1則沒有這個問題.

有效方案1: display: flex + overflow: auto;+ position:fixed;

代碼如下

<html>
<head>
</head>
</head>
<body style="display: flex; flex-direction: column;position:fixed; top:0;left: 0;right: 0;bottom: 0;">
  <div>我始終顯示在屏幕頂部</div>
  <div style="flex: 1;overflow: auto;">
    <ol>
      <li>我是長長的內容;需要支持滾動;占剩余空間的比例為1份</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><li></li><li></li><li></li><li></li>
    </ol>
  </div>
  <div style="flex: 5;overflow: auto;">
    <ol>
      <li>我是長長的內容;需要支持滾動;占剩余空間的比例為5份</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><li></li><li></li><li></li><li></li>
    </ol>
  </div>
  <div >我始終顯示在屏幕底部</div>
</body>
</html>

垂直平分的方案:display: flex+flex

此方案中部內容少時,底部顯示在屏幕底部,內容多時,底部跟隨文檔滾動,顯示在文檔末尾.

當中部內容於其分配所得的剩余空間時,頭部和底部能正常待在所預期的位置上.

<html>
<head>
</head>
</head>
<body style="display: flex; flex-direction: column;">
  <div>我現在顯示在屏幕頂部</div>
  <div style="flex: 1;overflow: auto;">
    <ol>
      <li>我是短短的內容;</li>
    </ol>
  </div>
  </div>
  <div >我現在顯示在屏幕底部</div>
</body>
</html>

可是當中部內容於其分配所得的剩余空間時,子元素的高度會撐爆父容器的高度,而不是“固定”為其一開始“分配所得的剩余空間”

<html>
<head>
</head>
</head>
<body style="display: flex; flex-direction: column;">
  <div>我現在顯示在文檔的頂部,會隨文檔滾動</div>
  <div style="flex: 1;overflow: auto;">
    <ol>
      <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></li><li></li><li></li><li></li><li></li>
    </ol>
  </div>
  </div>
  <div >我現在顯示在文檔的底部,會隨文檔滾動;</div>
</body>
</html>

參考資料

  1. css實現頁面底部固定在屏幕最下方,內容占滿屏后緊跟其后的兩種方法_JavaScript_想飛的豬的博客-CSDN博客

    1. /* 因為是遮罩效果所以要fixed */
    2. ​ position: fixed;
    3. /* 沒有這個就不能滾動了 */
    4. ​ overflow: auto;
  2. 利用 flex 實現寬度自適應布局 · Issue #14 · shaozj/blog

    flex-shrink: 0; 表示 flex 元素超出容器時,寬度不壓縮,這樣就能撐開元素的寬度,使得出現滾動條。

  3. flex布局中,保持內容不超出容器的解決辦法_JavaScript_Alex_Zhao 的博客-CSDN博客

    如果不設置寬度,.content可以被子節點無限撐開;

    即給 content 設置了 flex 為 1 的時候,它會動態的獲得父容器的剩余寬度,且不會被自己的子元素把內容撐開。

  4. CSS - 定位屬性position使用詳解(static、relative、fixed、absolute)

    (1)fixed 生成絕對定位的元素,該元素相對於瀏覽器窗口進行定位。

    (2)固定定位的元素不會隨瀏覽器窗口的滾動條滾動而變化,也不會受文檔流動影響,而是始終位於瀏覽器窗口內視圖的某個位置。

  5. 記錄一個父級div不能被子級內容撐開的解決方法,父級div沒有高度的解決方法。_網絡_lihang199的博客-CSDN博客

    flex布局中div不被撐開的情況可能是初始化的 flex-shrink 值為1,即空間不足自動擠壓,設置值為0,即可撐開div

  6. flex子元素溢出_dearMengJJ的博客-CSDN博客

    原理:彈性布局中的元素是有伸展和收縮自身的能力的。

  7. flex:1,min-width: 0 保證內容不超出父盒子_JavaScript_LiuJingye123的博客-CSDN博客

    如果沒有設置min-width,當內容大於剩余盒子寬度時會超出父盒子,設置min-width保證內容局限在父盒子內

  8. 前端:頁面內容不夠,始終把footer固定在底部_JavaScript_前端小白菜-CSDN博客

    1. 絕對定位
    2. margin負值

    以上兩種方法要求footer高度固定。


免責聲明!

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



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