前端面試重點之——多列布局

在頁面開發(fā)中,當(dāng)我們拿到設(shè)計師給出的UI圖后,首先考慮的就是布局問題,而多列布局會是我們碰到最多的布局問題,個人就匯總了開發(fā)中常見多列布局問題的解決方法。一般,按列數(shù)分的可以分為兩列布局,三列布局,多列布局,其中布局方法中的原理都有類似之處。

目錄

一、定寬+自適應(yīng)兩列布局

二、兩列定寬,一列自適應(yīng)布局

三、左邊不定寬,右邊自適應(yīng)布局

四、多列不定寬,一列自適應(yīng)

五、等寬布局解決方案

六、等高布局解決方案

(文中Css代碼中顏色需自行添加)

一、定寬+自適應(yīng)兩列布局

<div class="parent">
    <div class="left"><p>left</p></div>
    <div class="right"><p>right</p></div>
</div>
  • 需求:實現(xiàn)左側(cè)100px,右側(cè)自適應(yīng),且間距20px


    image-20190623235624776.png

方法一:左側(cè)浮動,右側(cè)寬度通過margin調(diào)整

.left {
    float: left;
    width: 100px;
}
.right {
    margin-left: 120px; //相差的20px是左右之間的間距
}

方法二:左側(cè)浮動,右側(cè)BFC

.left {
    float: left;
    width: 100px;
    margin-right: 20px;
}
.right {
    overflow: hidden;
}

方法三:table

單元格默認會等寬,但是table-layout: fixed能夠讓table元素布局優(yōu)先,。

.parent {
    display: table;
    width: 100%;
    table-layout: fixed;
}
.left, .right {
    display: table-cell;
}
.left {
    width: 100px;
    padding-right: 20px;
}

方法四:flex

.parent {
    display: flex;
}
.left {
    width: 100px;
    margin-right: 20px;
}
.right {
    flex: 1
}

方法五:css3 calc()計算屬性

.left {
    display: inline-block;
    width: 100px;
    margin-right: 20px;
}
.right {
    display: inline-block;
    width: calc(100% - 120px);
}

二、兩列定寬,一列自適應(yīng)布局

多列布局用到的屬性原理基本都一樣,上面的方法也同樣適用于此。

<div class="parent">
   <div class="left"><p>left</p></div>
   <div class="center"><p>center</p></div>
   <div class="right"><p>right</p></div>
</div>
image-20190623235324720.png
  • 需求1:left和center定寬100px,right自適應(yīng)。

  • 需求2:left和right定寬100px,center自適應(yīng)。

需求1使用的方法跟上面有相同之處,不做贅述。重點以需求2為例說明。

方法一:父元素相對布局,子元素絕對布局

.parent {
    position: relative;
}
.left{
    position: absolute;
    left: 0px;
    top: 0px;
    width: 100px;
}
.right {
    position: absolute;
    right: 0px;
    top: 0px;
    width: 100px;
}
.center {
    margin: 0 120px;
}

方法二:flex布局

.parent {
    display: flex;
}
.left, .right {
    width: 100px;
}
.left {
    margin-right: 20px;
}
.right {
    margin-left: 20px;
}
.center {
    flex: 1;
}

方法三:雙飛翼布局

雙飛翼布局需要將center塊提前,并且需要在center的內(nèi)嵌包裹塊,方便設(shè)置間距,注意在設(shè)置center寬度為100%的時候,要將center的盒模型轉(zhuǎn)換為IE盒模型,這樣它的寬度就包含了padding。

<div class="parent">
    <div class="center">
        <div class="content">
            <p>center</p>
        </div>
    </div>
    <div class="left"><p>left</p></div>
    <div class="right"><p>right</p></div>
</div>
.center, .left, .right {
    float: left;
}
.left {
    width: 100px;
    margin-left: -100%;
}
.right {
    width: 100px;
    margin-left: -100px;
}
.center {
    box-sizing: border-box;
    width: 100%;
    padding-left: 120px;
    padding-right: 120px;
}
.content {
    height: 100%;
}

三、左邊不定寬,右邊自適應(yīng)布局

<div class="parent">
   <div class="left"><p>left</p></div>
   <div class="right"><p>right</p></div>
</div>
image-20190624233637505.png
  • 需求:左側(cè)不定寬,右側(cè)自適應(yīng),間距20px。

方法一:float + overflow

.left {
    float: left;
    margin-right: 20px;
}
.right {
    overflow: hidden;
}

方法二:table布局

由內(nèi)容決定寬度,不由布局決定寬度,取消table-layout:fixed的作用

.parent {
    display: table;
    width: 100%;
}
.left, .right {
    display: table-cell;
}
.left {
    width: 0.1% //取最小寬度,實際寬度由內(nèi)容決定
    padding-right: 20px;
}

方法三:flex

.parent {
    diaplay: flex;
}
.left {
    margin-right: 20px;
}
.right {
    flex: 1;
}

四、多列不定寬,一列自適應(yīng)

同 **三、左邊不定寬,右邊自適應(yīng)布局 ** 方法相同。

五、等寬布局解決方案

<div class="parent">
    <div class="column"><p>column1</p></div>
    <div class="column"><p>column2</p></div>
    <div class="column"><p>column3</p></div>
    <div class="column"><p>column4</p></div>
</div>
image-20190624235549824.png
  • 需求:多列等寬,并保留20px間距。

方法一:margin + float

此時需要考慮多個間距的問題,缺點:需要提前知道有多少列計算好每列寬度占比+間距,具體就是讓父元素多擁有20px的寬度。

.parent {
    margin-left: -20px;
}
.column {
    float: left;
    width: 25%;
    padding-left: 20px;
    box-sizing: border-box;
}

方法二:table

此時需要在parent元素外層再添加一層盒子parent-layout,并設(shè)置寬度使得寬度再增加20px。

<div class="parent-layout">
    <div class="parent">
        <div class="column"><p>column1</p></div>
        <div class="column"><p>column2</p></div>
        <div class="column"><p>column3</p></div>
        <div class="column"><p>column4</p></div>
    </div>
</div>
.parent-layout {
    margin-left: -20px;
}
.parent {
    display: table;
    width: 100%;
    table-layout: fixed;
}
.column {
    display: table-cell;
    padding-left: 20px;
}

方法三:flex

.parent {
    display: flex;
}
.column {
    flex: 1;
}
.column + .column {
    margin-left: 20px;
}

六、等高布局解決方案

除了解決分欄的問題之外,我們同時需要解決分列后等高布局的解決方法:

方法一:table

利用table單元格本身具有等高特性

.parent {
    display: table;
    width: 100%;
    table-layout: fixed;
}
.left, .right  {
    display: table-cell;
}
.left {
    widht: 100px;
    border-right: 20px solid transparent;
    background-clip: padding-box; //由于是border-box,需要把背景顏色去掉
}

方法二:flex

.parent {
    display: flex;
}
.left {
    width: 100px;
    margin-right: 20px;
}
.right {
    flex: 1;
}

方法三:float

偽等高

.left, .right  {
    flex: left;
    width: 100%;
    margin-right: 20px;
}
.right {
    overflow: hidden;
}
.left, .right {
    padding-bottom:9999px;
    margin-bottom: -9999px;
}
.parent {
    overflow: hidden;
}

(文中樣式代碼中的背景顏色可自行添加)

說明:

  1. BFC(塊級格式上下文),可以實現(xiàn)和浮動元素共存,且不會遮擋浮動元素,通過overflow:hidden,
    作用:避免邊距折疊,不被浮動元素遮蓋。且BFC能夠?qū)?nèi)容元素浮動清除,避免高度塌陷。

喜歡那就點個贊吧??

(完)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容