CSS實(shí)現(xiàn)三欄布局的四種方法

1. 什么是三欄布局
常見的一種頁(yè)面布局方式,將頁(yè)面分為左欄、中欄和右欄
左右兩側(cè)的盒子寬度固定,中間的盒子會(huì)隨屏幕自適應(yīng)
一般中間放主體內(nèi)容,左右兩邊放輔助內(nèi)容
2. 如何實(shí)現(xiàn)三欄布局
2.1 彈性布局
將最外層盒子設(shè)為彈性布局,左右兩邊的盒子固定寬度200px
將中間的盒子flex
設(shè)為1
這樣中間盒子的寬度就能一直得到全部寬度減去左右盒子的寬度,這個(gè)寬度會(huì)隨著窗口的大小而變化
<style> *{ margin: 0; padding: 0; } div{ height: 200px; } .container{ display: flex; } .left,.right{ width: 200px; background: #66a4bd; } .middle{ flex: 1; background: gray; } </style> <div class="container"> <div class="left">left</div> <div class="middle">middle</div> <div class="right">right</div> </div>
缺點(diǎn):先加載左邊容器的,左右兩邊往往是輔助內(nèi)容,這樣用戶體驗(yàn)不好
為了優(yōu)化這個(gè)問題,就出現(xiàn)了經(jīng)典的 圣杯 和 雙飛翼 布局,它們的目的就是為了在HTML結(jié)構(gòu)上,中間欄在最前面保證了最先渲染中間提升性能
2.2 grid布局
左右兩邊的寬度固定,將剩余的空間給中間的主體部分
要用到grid-template-columns
:定義網(wǎng)格的列大小和數(shù)量
<style> .wrap { height: 200px; display: grid; grid-template-columns: 200px 1fr 200px; } .left { width: 200px; height: 100%; background-color: aqua; } .content { width: 100%; height: 100%; background-color: cadetblue; flex: 1; } .right { width: 200px; height: 100%; background-color: bisque; } </style> <div class="wrap"> <div class="left">left</div> <div class="content">content</div> <div class="right">right</div> </div>
2.3 圣杯布局
先加載主體內(nèi)容,增加用戶體驗(yàn)
實(shí)現(xiàn)原理: float
+ margin
負(fù)值 + position: relative
要保證中間欄最先加載,那就要把middle容器寫在前面
<body> <div class="container"> <div class="middle">middle</div> <div class="left">left</div> <div class="right">right</div> </div> </body>
給父容器添加`padding:0 200px,騰開位置
middle中間容器設(shè)置width:100%
,此時(shí)的寬度繼承了父容器的100%
并給三個(gè)子容器都設(shè)置float: left
,都向左浮動(dòng),去到同一行
頁(yè)面效果:第一行位置放不下,左右兩個(gè)容器被擠到了第二行,按道理來(lái)說(shuō)它們應(yīng)該是在第一行兩塊紅色區(qū)域位置的
給左右容器相對(duì)定位,讓它們相對(duì)自己原本文檔流的位置進(jìn)行定位
.left{ width: 200px; background: #76d1ea; position: relative; margin-left: -100%; //向左挪動(dòng)父容器寬度的100% left: -200px; //再向左挪動(dòng)自身的200寬度 }
此時(shí)right
接替了left
原本的位置,同理,這時(shí)候只需要給right
設(shè)置:margin-right: -200px;
,就可以實(shí)現(xiàn)三欄布局了
有一個(gè)問題就是:
- 有一個(gè)最小寬度,當(dāng)頁(yè)面小于最小寬度時(shí)布局就會(huì)亂掉
- 由于設(shè)置了相對(duì)定位,所以當(dāng)left原來(lái)的位置和right的位置產(chǎn)生重疊時(shí),由于浮動(dòng)的原因一行放不下就會(huì)換行
- 所以布局就被打亂了,使用雙飛翼布局就可以避免這個(gè)問題
<style> *{ margin: 0; padding: 0; } .container{ height: 100px; padding: 0 200px; } .middle, .left, .right{ height: 100%; float: left; } .middle{ width: 100%; background: gray; } .left{ width: 200px; background: #76d1ea; position: relative; margin-left: -100%; left: -200px; } .right{ width: 200px; background: #76d1ea; position: relative; margin-right: -200px; } </style> <div class="container"> <div class="middle">middle</div> <div class="left">left</div> <div class="right">right</div> </div>
2.4 雙飛翼布局
先把HTML結(jié)構(gòu)稍微改造一下,在middle容器里面多用了個(gè)inner
容器
<div class="container"> <div class="middle"> <div class="inner">middle</div> </div> <div class="left">left</div> <div class="right">right</div> </div>
已經(jīng)設(shè)置了middle的width:100%
,這時(shí)候我們只需要設(shè)置inner
容器為padding:0 200px
,我們要的效果同樣是把左右兩個(gè)容器擺放到對(duì)應(yīng)的紅框位置
left、middle、right
同樣使用浮動(dòng)
left設(shè)置margin-left:-100%
(父容器的整個(gè)寬度)
right設(shè)置margin-left:-200px
這樣便實(shí)現(xiàn)了三欄布局的效果,連定位都不使用,且當(dāng)頁(yè)面過(guò)小時(shí),布局不會(huì)亂
<style> *{ margin: 0; padding: 0; } .container{ height: 100px; } .middle, .left, .right{ float: left; height: 100%; } .middle{ width: 100%; background: gray; } .inner{ height: 100%; padding: 0 200px; } .left{ width: 200px; background: pink; margin-left: -100%; } .right{ width: 200px; background: pink; margin-left: -200px; } </style> <div class="container"> <div class="middle"> <div class="inner">middle</div> </div> <div class="left">left</div> <div class="right">right</div> </div>
兩個(gè)布局結(jié)構(gòu)上不同:
相同:讓三列浮動(dòng),通過(guò)負(fù)外邊距形成三列布局
不同:在于如何處理中間主列的位置
圣杯布局:利用父容器的左、右內(nèi)邊距 + 兩個(gè)列的相對(duì)定位
雙飛翼布局:把主列嵌套在一個(gè)新的父級(jí)塊中,并利用主列的左、右外邊距進(jìn)行布局調(diào)整
以上就是CSS實(shí)現(xiàn)三欄布局的四種方法的詳細(xì)內(nèi)容,更多關(guān)于CSS三欄布局的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
CSS實(shí)現(xiàn)三欄布局中間一欄自適應(yīng)且隨文字大小變化寬度的示例代碼
這篇文章主要介紹了CSS實(shí)現(xiàn)三欄布局中間一欄自適應(yīng)且隨文字大小變化寬度的示例代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需2020-06-02- 這篇文章主要介紹了CSS經(jīng)典三欄布局方案(6種方法)的相關(guān)資料,詳細(xì)的介紹了6種三欄布局的方法,具有一定的參考價(jià)值,有興趣的可以了解一下2017-12-01
- 本篇文章主要介紹了淺談CSS三欄布局的N種實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-18
- 可能有人不理解三欄布局是什么,其實(shí)三欄布局頁(yè)面分為左中右三部分,然后對(duì)中間一部分做自適應(yīng)的一種布局方式,下面這篇文章就給大家詳細(xì)介紹了CSS實(shí)現(xiàn)三欄布局的四種方法2017-01-24
css實(shí)現(xiàn)兩欄布局,左側(cè)固定寬,右側(cè)自適應(yīng)的多種方法
今天通過(guò)7種方法給大家介紹css實(shí)現(xiàn)兩欄布局,左側(cè)固定寬,右側(cè)自適應(yīng)效果,每種方法通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2021-08-04淺談CSS 多欄布局(Multi-Columns Layout)
這篇文章主要介紹了淺談CSS 多欄布局(Multi-Columns Layout)的相關(guān)資料,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-09-20- 左中右分欄在頁(yè)面布局中非常實(shí)用也很常見,符合大眾的瀏覽習(xí)慣,那么如何輕松簡(jiǎn)單實(shí)現(xiàn)呢?下面有個(gè)不錯(cuò)的示例,感興趣的朋友可以參考下2013-10-28