兩列布局大概是最經典的一種網頁布局方式了,本博客就是采用的這種布局。兩列布局中,以主列(main)是自適應寬度,子列(sidebar)是固定寬度的情形最為常見。
今天就來好好探討一下如何實現這種定寬+自適應的兩列布局。
1. absolute + margin 方式
首先想到的是利用 absolute + margin 的方式實現。先看看代碼:
<p class="container"> <p class="sidebar">子列</p> <p class="main">主列</p> </p>
.container { position: relative; } .sidebar { position: absolute; top: 0; left: 0; width: 200px; height: 300px; background-color: rgba(255, 0, 0, .5); } .main { height: 300px; margin-left: 210px; background-color: rgba(0, 255, 0, .5); }
該方式利用 position 讓 sidebar 列脫離文檔流,然后通過 main 列的 margin-left 移除被 sidebar 列覆蓋的部分。如此,我們就實現了定寬 + 自適應的兩列布局。
(1)列順序調整
在不修改 HTML 的情況下,只需簡單修改 CSS,我們可以讓左右兩列順序互換,來看代碼:
.sidebar { position: absolute; top: 0; rightright: 0; } .main { margin-right: 210px; }
(2)主內容列優先顯示
讓我們考慮的更完美一點,可不可以把 main 列放 sidebar 列 的前面,使主要內容優先加載渲染? Let us try!
<p class="container"> <p class="main">主列</p> <p class="sidebar">子列</p> </p>
做上面的簡單調整即可,CSS不需要任何修改!
(3)問題所在
雖然這種方式的優點很多,但是卻存在一個致命缺點。因為 sidebar 列脫離了文檔流,當 sidebar 列比 main 列高時會覆蓋后面的布局:問題demo。
如果在 container 容器上 添加 overflow:hidden 就會使 sidebar 溢出部分被裁減。在這種布局方式下,這個問題確實沒有有效的解決辦法。
2. float + margin 方式
然后想到的就是 float + margin 來實現兩列布局,首先實現左欄定寬,主內容自適應的兩欄布局。代碼如下:
<p class="sidebar">子列</p> <p class="main">主列</p>
.sidebar { float: left; width: 200px; height: 300px; background-color: rgba(255, 0, 0, .5); } .main { height: 300px; margin-left: 210px; background-color: rgba(0, 255, 0, .5); }
這種實現方式比較簡單,首先把子列浮動到左邊,然后在主列上設置 margin-left 為子列留出顯示空間即可。
那么,這種方式支不支持調換列的位置呢?當然可以。CSS代碼如下:
.sidebar { float: rightright; width: 200px; height: 300px; background-color: rgba(255, 0, 0, .5); } .main { height: 300px; margin-right: 210px; background-color: rgba(0, 255, 0, .5); }
問題所在:
看起來 float + margin 方式是個好辦法,然而我們前面提到過的主列在前優先顯示的優化卻不能實現。
3. float + 負margin 方式
廢話不多說,直接上代碼:
<p class="main-wrapper"> <p class="main">主列</p> </p> <p class="sidebar">子列</p>
.main-wrapper { float: left; width: 100%; } .main { height: 100px; margin-left: 210px; background-color: rgba(255, 0, 0, .5); } .sidebar { float: left; width: 200px; height: 100px; margin-left: -100%; background-color: rgba(0, 255, 0, .5); }
大家應該都看出來了,這就是雙飛翼布局,主列優先顯示。實現的過程如下:
首先浮動 main 列和 sidebar 列,然后通過 負margin 正確定位 sidebar 列。
把 main 列嵌套在一個 p 里,該 p 的寬度值設為100%。
最后通過設置 main 列的 margin-left 消除被 sidebar 覆蓋的部分即可。
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com