CSS兩列布局實(shí)現(xiàn)方式總結(jié)

兩列布局大概是最經(jīng)典的一種網(wǎng)頁(yè)布局方式了,本博客就是采用的這種布局。兩列布局中,以主列(main)是自適應(yīng)寬度,子列(sidebar)是固定寬度的情形最為常見(jiàn)。
今天就來(lái)好好探討一下如何實(shí)現(xiàn)這種定寬+自適應(yīng)的兩列布局。
1. absolute + margin 方式
首先想到的是利用 absolute + margin 的方式實(shí)現(xiàn)。先看看代碼:
- <div class="container">
- <div class="sidebar">子列</div>
- <div class="main">主列</div>
- </div>
- .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 列脫離文檔流,然后通過(guò) main 列的 margin-left 移除被 sidebar 列覆蓋的部分。如此,我們就實(shí)現(xiàn)了定寬 + 自適應(yīng)的兩列布局。
(1)列順序調(diào)整
在不修改 HTML 的情況下,只需簡(jiǎn)單修改 CSS,我們可以讓左右兩列順序互換,來(lái)看代碼:
- .sidebar {
- position: absolute;
- top: 0;
- rightright: 0;
- }
- .main {
- margin-right: 210px;
- }
(2)主內(nèi)容列優(yōu)先顯示
讓我們考慮的更完美一點(diǎn),可不可以把 main 列放 sidebar 列 的前面,使主要內(nèi)容優(yōu)先加載渲染? Let us try!
- <div class="container">
- <div class="main">主列</div>
- <div class="sidebar">子列</div>
- </div>
做上面的簡(jiǎn)單調(diào)整即可,CSS不需要任何修改!
(3)問(wèn)題所在
雖然這種方式的優(yōu)點(diǎn)很多,但是卻存在一個(gè)致命缺點(diǎn)。因?yàn)?sidebar 列脫離了文檔流,當(dāng) sidebar 列比 main 列高時(shí)會(huì)覆蓋后面的布局:?jiǎn)栴}demo。
如果在 container 容器上 添加 overflow:hidden 就會(huì)使 sidebar 溢出部分被裁減。在這種布局方式下,這個(gè)問(wèn)題確實(shí)沒(méi)有有效的解決辦法。
2. float + margin 方式
然后想到的就是 float + margin 來(lái)實(shí)現(xiàn)兩列布局,首先實(shí)現(xiàn)左欄定寬,主內(nèi)容自適應(yīng)的兩欄布局。代碼如下:
- <div class="sidebar">子列</div>
- <div class="main">主列</div>
- .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);
- }
這種實(shí)現(xiàn)方式比較簡(jiǎn)單,首先把子列浮動(dòng)到左邊,然后在主列上設(shè)置 margin-left 為子列留出顯示空間即可。
那么,這種方式支不支持調(diào)換列的位置呢?當(dāng)然可以。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);
- }
問(wèn)題所在:
看起來(lái) float + margin 方式是個(gè)好辦法,然而我們前面提到過(guò)的主列在前優(yōu)先顯示的優(yōu)化卻不能實(shí)現(xiàn)。
3. float + 負(fù)margin 方式
廢話不多說(shuō),直接上代碼:
- <div class="main-wrapper">
- <div class="main">主列</div>
- </div>
- <div class="sidebar">子列</div>
- .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);
- }
大家應(yīng)該都看出來(lái)了,這就是雙飛翼布局,主列優(yōu)先顯示。實(shí)現(xiàn)的過(guò)程如下:
首先浮動(dòng) main 列和 sidebar 列,然后通過(guò) 負(fù)margin 正確定位 sidebar 列。
把 main 列嵌套在一個(gè) div 里,該 div 的寬度值設(shè)為100%。
最后通過(guò)設(shè)置 main 列的 margin-left 消除被 sidebar 覆蓋的部分即可。
相關(guān)文章
- 這篇文章主要介紹了一文匯總 CSS 兩列布局和三列布局的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小2020-06-28
CSS實(shí)現(xiàn)頁(yè)面兩列布局與三列布局的方法示例
這篇文章主要介紹了CSS實(shí)現(xiàn)頁(yè)面兩列布局與三列布局的方法示例,包括寬度與高度的自適應(yīng)的示例,需要的朋友可以參考下2016-06-23橫向兩列布局(左列固定,右列自適應(yīng))的4種CSS實(shí)現(xiàn)方式
這篇文章主要介紹了橫向兩列布局,即左列固定,右列自適應(yīng)的4種CSS實(shí)現(xiàn)方式,感興趣的小伙伴們可以參考一下2016-04-27學(xué)習(xí)DIV+CSS網(wǎng)頁(yè)布局之兩列布局
學(xué)習(xí)DIV+CSS網(wǎng)頁(yè)布局中的兩列布局,本文為大家分享的是DIV+CSS網(wǎng)頁(yè)布局教程的第二篇,感興趣的小伙伴們可以參考一下2016-03-15- CSS三列布局走出HTML布局陰影,兩端固定寬度,中間自適應(yīng)結(jié)構(gòu),下面有個(gè)不錯(cuò)的示例,大家可以參考下2014-02-27
- CSS兩列布局,右側(cè)固定,左側(cè)自適應(yīng)寬度.2009-11-25
- 在CSS面試題中經(jīng)常會(huì)遇到CSS兩列布局的問(wèn)題,下面給大家分享CSS兩列布局的實(shí)現(xiàn)方式,每種方法給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-07-27