淺談css實現單行多列布局的幾種方式


背景

上周三參加了一場前端面試,面試過程中被面試官問到如何通過css實現單行多列布局,當時沒多想直接脫口而出了flexbox和grid布局。實際上,除了這兩種方式以外,也存在其它可選方法。下面我想簡單地就這個話題展開一下。

大體來說,實現該需求可以通過以下幾種方式:

  1. 使用grid布局

一種瀏覽器內置的網格布局,通過該布局方式可以實現以前只能通過復雜的css框架實現的布局方式1, 5。

具體實現如下:

html

<div class="container row">
      <div class="columns">
        <div id="col1">
            <p>Col1</p>
            <p>Lorem ipsum</p>
            <p>Lorem ipsum</p>
        </div>
        <div id="col2">
            <p>Col2</p>
        </div>
        <div id="col3">
            <p>Col3</p>
        </div>
        <div id="col4">
            <p>Col4</p>
        </div>
        <div id="col5">
            <p>Col3</p>
        </div>
    </div>
</div>

css

div.container {
    width: 100%;
}

div.container > .columns { 
    display: grid;
    grid-row: 1 3;
    grid-column: 1 5;
    grid-template-rows: repeat(3, 33.33%);
    grid-template-columns: repeat(5, 20%);
}

  1. 使用flexbox布局

與grid布局不同,flexbox是一種一維布局,它的作用范圍僅僅限於某一行或某一列。flexbox是一種實用且靈活的布局方式,它的出現解決了之前使用定位+浮動布局難以簡單實現的一些布局樣式2。

具體實現如下:

html

<div class="container row">
      <div class="columns">
        <div id="col1">
            <p>Col1</p>
            <p>Lorem ipsum</p>
            <p>Lorem ipsum</p>
        </div>
        <div id="col2">
            <p>Col2</p>
        </div>
        <div id="col3">
            <p>Col3</p>
        </div>
        <div id="col4">
            <p>Col4</p>
        </div>
        <div id="col5">
            <p>Col3</p>
        </div>
    </div>
</div>

css

div.container {
    width: 100%;
}

div.columns {
    display: flex;
    justify-content: center;
    align-items: center;
    flex-direction: row;
}

.columns > div { 
    display: inline-block;
    margin: 100px;
    margin-top: 10px;
}
  1. 使用column屬性

column系列屬性是屬於css多列布局特性的帶來的一組全新屬性,可以通過這些屬性來制定元素中列的個數,列的間距、每列的內容按照什么方式流動等等3, 4。

具體實現如下:

html

<div class="container row">
      <div class="columns">
        <div id="col1">
            <p>Col1</p>
            <p>Lorem ipsum</p>
            <p>Lorem ipsum</p>
        </div>
        <div id="col2">
            <p>Col2</p>
        </div>
        <div id="col3">
            <p>Col3</p>
        </div>
        <div id="col4">
            <p>Col4</p>
        </div>
        <div id="col5">
            <p>Col3</p>
        </div>
    </div>
</div>

css

.container > .columns { 
    -moz-columns: auto 5; /* For compatibility with mozilla browsers */
    columns: auto 5;
    -moz-column-rule: 2px solid gray;
    column-rule: 2px solid gray;
    -moz-column-gap: 100px;
    column-gap: 100px;
}

.columns > div {
    column-count: 1;
}
  1. 使用表格
    通過html的表格元素,也可以實現多列布局,可以與其他屬性相結合實現水平垂直居中。

具體實現如下:

html

        <div>
            <table id="tb">
                <tr>
                    <td><p>Cols</p></td>
                    <td><p>Cols</p></td>
                    <td><p>Cols</p></td>
                </tr>
            </table>
        </div>

css

#tb {
    position: relative;
    width: 100%;
    float: left;
    clear: both; /* 添加該屬性后,元素不會與先前的浮動元素重疊,實現獨立排列 */
    display: block;
    width: 505px;
    border: 1px solid black;
}

#tb tr > td {
    padding-left: 50px;
    padding-right: 50px;
    border: 1px solid black;
}
  1. 使用相對定位 + 浮動屬性

在flexbox與grid布局出現以前最常用的多列布局實現方式,存在一定局限性,相對前兩者缺少靈活性,比較難以實現一些特殊的布局樣式

具體實現如下:

html

<div class="container row">
      <div class="columns">
        <div id="col1">
            <p>Col1</p>
            <p>Lorem ipsum</p>
            <p>Lorem ipsum</p>
        </div>
        <div id="col2">
            <p>Col2</p>
        </div>
        <div id="col3">
            <p>Col3</p>
        </div>
        <div id="col4">
            <p>Col4</p>
        </div>
        <div id="col5">
            <p>Col3</p>
        </div>
    </div>
</div>

css

.row { 
    width: 100%;
    height: 500px;
    margin-left: -15px;
    margin-right: -15px;
} 

.columns { 
    position: relative;
    float: left;
    padding-left: 15px;
    padding-right: 15px;
    background-color: red;
    margin-left: 15px;
    margin-right: 15px;
} 

.columns > div {
    width: 200px;
    height: 300px;
}

引用來源

  1. CSS Grid 網格布局教程 - 阮一峰的網絡日志,於2020年12月11日訪問
  2. MDN - flexbox, 於2020年12月11日訪問
  3. CSS 多列布局,於2020年12月11日訪問
  4. CSS Multiple Columns,於2020年12月11日訪問
  5. CSS Grid Layout Module,於2020年12月11日訪問


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM