前端經(jīng)典網(wǎng)頁布局的實現(xiàn)方案你了解多少?

前端開發(fā)薪铜,離不開日常的網(wǎng)頁結(jié)構(gòu)布局众弓,現(xiàn)下有很多第三方的組件庫,也自帶著很多布局的方案隔箍,例如Ant Design中就擁有一套自己的Grid 24柵格系統(tǒng)Layout布局谓娃,方便我們進行網(wǎng)頁排版。

接下來蜒滩,我們從前端技術(shù)角度上滨达,去分析一下3種經(jīng)典布局的實現(xiàn)方案。

首先俯艰,我們列出一些比較常規(guī)的布局:

  • 圣杯布局
  • 雙飛翼布局
  • 多列等分布局

1. 圣杯布局

圣杯布局: 左右兩欄的寬度固定不變捡遍,中間那一欄寬度自適應(yīng),且中間盒子的內(nèi)容優(yōu)先渲染竹握。

最早的圣杯布局的實現(xiàn)方案是:利用浮動和負邊距來實現(xiàn)画株。

父級元素設(shè)置左右的 padding,三列均設(shè)置向左浮動,中間一列放在最前面谓传,寬度設(shè)置為父級元素的寬度蜈项,因此后面兩列都被擠到了下一行,通過設(shè)置 margin 負值將其移動到上一行续挟,再利用相對定位紧卒,定位到兩邊。

圣杯布局的優(yōu)缺點:

  • 優(yōu)點:不需要額外的DOM結(jié)構(gòu)诗祸,中間欄放在文檔流前面是優(yōu)先渲染
  • 缺點:特殊情況下跑芳,當(dāng)中間盒子寬度小于左盒子的時候 就會發(fā)生布局混亂

我們可以通過3種技術(shù)方案來實現(xiàn)圣杯布局的布局效果,分別是float直颅、float優(yōu)化博个、Flex

實現(xiàn)代碼:

HTML結(jié)構(gòu):

<div class="main">
    <!--   如果是圣杯布局的原始方案,此處的center盒子要放在最前面 -->
  <div class="center"></div>
   <div class="left"></div>
  <div class="right"></div>
</div>
  • 實現(xiàn)方案1:float+position+負邊距
.main {
    height: 200px;
    /* 外層大盒子設(shè)置左右的padding际乘,給兩側(cè)小盒子預(yù)留出位置 */
    padding: 0 200px;
}
.center, .left, .right {
    /* 三個盒子統(tǒng)一左浮動 */
    float: left;
}

/* 注意坡倔,在HTML結(jié)構(gòu)中,center盒子一定要位于left和right盒子之前 */
.center {
    /* 中間盒子占據(jù)父盒子寬度的100% */
    width: 100%;
    height: 100%;
    background: lightgreen;           
}

.left {
    width: 200px;
    height: 100%;
    background: lightseagreen;

    /* left被center盒子擠到了下方脖含,設(shè)置margin負值會讓三個盒子在一行上顯示 */
    margin-left: -100%;

    /* 通過定位負值讓left盒子位于main盒子預(yù)留出的padding的位置 */
    position: relative;
    left: -200px;
}

.right {
    width: 200px;
    height: 100%;
    background: lightskyblue;
    /* right被center盒子擠到了下方罪塔,設(shè)置margin負值會讓三個盒子在一行上顯示 */
    margin-left: -200px;

    /* 通過定位負值讓right盒子位于main盒子預(yù)留出的padding的位置 */
    position: relative;
    right: -200px; 
}
  • 實現(xiàn)方案2:float優(yōu)化
.main {
    width: 100%;
    height: 100px;
}

.left {
    width: 200px;
    height: 100%;
    background: lightcoral;
    /*  左盒子左浮動  */
    float: left;
}

.right {
    width: 200px;
    height: 100%;
    background: lightgreen;
    /* 右盒子右浮動 */
    float: right;
}

.center {
    height: 100%;
    background: lightsalmon;
    /* 中間盒子左浮動 */
    float: left;
    /* 中間盒子使用css的calc()去自動計算寬度,思想為:父盒子寬度100% - (左盒子 + 右盒子) */
    /* 注意:如果網(wǎng)頁中在意極致加載速度等優(yōu)化效率時养葵,盡量不要大量使用calc()函數(shù)  */
    width: calc(100% - 400px);
}
  • 實現(xiàn)方案3:Flex
.main {
    width: 100%;
    height: 100px;
    /*  父盒子轉(zhuǎn)為flex彈性盒子  */
    display: flex;
    /*  子元素居中  */
    justify-content: center;
    align-items: center;
}

.left {
    width: 200px;
    height: 100%;
    background: lightcoral;
}

.right {
    width: 200px;
    height: 100%;
    background: lightgreen;
}

.center {
    height: 100%;
    background: lightsalmon;
    /*  中間盒子占據(jù)剩下的全部空間  */
    flex: 1;
}

當(dāng)然征堪,實現(xiàn)圣杯布局的效果,還可以使用其它的方案关拒,比如Grid布局方式佃蚜,只要能夠?qū)崿F(xiàn)其圣杯布局的效果,用什么方式均可以着绊。


2. 雙飛翼布局

概念:雙飛翼布局最早是淘寶團隊提出的谐算,是針對圣杯局部優(yōu)化的解決方案。主要是優(yōu)化了圣杯布局中開啟定位的問題

雙飛翼布局的實現(xiàn)归露,本質(zhì)上也是利用了浮動和外邊距負值的思想洲脂。

雙飛翼布局與圣杯布局的不同之處在于,圣杯布局的左中右三列容器剧包,中間center盒子多了一個子容器恐锦,通過控制center中子容器的margin空出左右兩列的寬度。

<body>
  <div class="main">
    <div class="center">
      <div class="inner"></div>
    </div>
    <div class="left"></div>
    <div class="right"></div>
  </div>
</body>
.main {
    height: 200px;
}

.center,
.left,
.right {
    /* 三個盒子統(tǒng)一左浮動 */
    float: left;
}

.center {
    /* 中間大盒子占據(jù)父盒子寬度的100% */
    width: 100%;
    height: 100%;
    background: lightgreen;
}

.center .inner {
    height: 100%;
    /* 預(yù)留出左右兩個盒子的空間 */
    margin: 0 200px;
    background: lightcoral;
}

.left {
    width: 200px;
    height: 100%;
    background: lightseagreen;

    /* left被center盒子擠到了下方疆液,設(shè)置margin負值會讓三個盒子在一行上顯示 */
    margin-left: -100%;
}

.right {
    width: 200px;
    height: 100%;
    background: lightskyblue;
    /* right被center盒子擠到了下方一铅,設(shè)置margin負值會讓三個盒子在一行上顯示 */
    margin-left: -200px;
}

3. Flex實現(xiàn)多列等分布局

關(guān)鍵點:列數(shù)可自由控制(無固定寬度)

 <div class="main">
    <div class="item"></div>
    <div class="item"></div>
    <div class="item"></div>
    <div class="item"></div>
    <div class="item"></div>
    <div class="item"></div>
    <div class="item"></div>
    <div class="item"></div>
    <div class="item"></div>
    <div class="item"></div>
    <div class="item"></div>
</div>
.main {
    width: 100%;
    display: flex;
    /* 設(shè)置換行 */
    flex-wrap: wrap;
    /* 用來設(shè)置網(wǎng)格行與列之間的間隙,是row-gap(行間隙)和column-gap(列間隙)的簡寫形式 */
    gap: 20px;
}
.main .item {
    height: 200px;
    /* 關(guān)鍵點在于子盒子寬度的計算上 */
    /* flex: 0 0 calc((父元素寬度 - 列之間的寬度*(列數(shù)-1)) / 列數(shù)); */
    flex: 0 0 calc((100% - 20px * 3) / 4);
    background: lightskyblue;
}

以上3中布局,是我們開發(fā)中經(jīng)常見到的布局方式堕油,每種布局方式潘飘,都不僅限于一種技術(shù)來實現(xiàn)肮之,可以是FloatPosition,也可以是Flex卜录,還可以是Grid局骤,甚至有的開發(fā)者對Boostrap很熟悉,也是一種實現(xiàn)方式暴凑。

個人認為,每種技術(shù)方案的使用赘来,都有其優(yōu)缺點现喳,或考慮兼容性,或考慮性能犬辰,選擇適合當(dāng)下項目的內(nèi)容嗦篱,適當(dāng)做取舍,才是最關(guān)鍵的幌缝。

關(guān)注我灸促,下期我們一起探討GridFlex的不同之處。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末涵卵,一起剝皮案震驚了整個濱河市浴栽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌轿偎,老刑警劉巖典鸡,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異坏晦,居然都是意外死亡萝玷,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門昆婿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來球碉,“玉大人,你說我怎么就攤上這事仓蛆≌龆” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵多律,是天一觀的道長痴突。 經(jīng)常有香客問我,道長狼荞,這世上最難降的妖魔是什么辽装? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮相味,結(jié)果婚禮上拾积,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好拓巧,可當(dāng)我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布斯碌。 她就那樣靜靜地躺著,像睡著了一般肛度。 火紅的嫁衣襯著肌膚如雪傻唾。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天承耿,我揣著相機與錄音冠骄,去河邊找鬼。 笑死加袋,一個胖子當(dāng)著我的面吹牛凛辣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播职烧,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼扁誓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蚀之?” 一聲冷哼從身側(cè)響起蝗敢,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎恬总,沒想到半個月后前普,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體裁良,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡景殷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了充石。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贱纠。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡峻厚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谆焊,到底是詐尸還是另有隱情惠桃,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布辖试,位于F島的核電站辜王,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏罐孝。R本人自食惡果不足惜呐馆,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望莲兢。 院中可真熱鬧汹来,春花似錦续膳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至摔桦,卻和暖如春社付,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背邻耕。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工瘦穆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赊豌。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像绵咱,于是被迫代替她去往敵國和親碘饼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容