首頁  >  文章  >  web前端  >  聊聊利用CSS實現九宮格佈局的幾種方法!

聊聊利用CSS實現九宮格佈局的幾種方法!

青灯夜游
青灯夜游轉載
2022-01-25 10:46:028488瀏覽

這篇文章跟大家分享利用CSS實現九宮格佈局的幾種方法,並介紹一下nth-of-type 與 nth-child 的區別,希望對大家有所幫助!

聊聊利用CSS實現九宮格佈局的幾種方法!

最近幾天刷面常看見一題,「九宮格佈局」。自己嘗試用幾種辦法實現了九宮格佈局,發現這裡面涉及了挺多的 css 知識,記錄一下。

我覺得這篇文章講得很好,大家可以去參考一下大佬如何寫邊框九宮格! # 千萬別小瞧九宮格 一道題目就能讓候選人原形畢露!

九宮格實作

以下幾種實作方法都可自適應

聊聊利用CSS實現九宮格佈局的幾種方法!

基本版面和樣式

<div class="box">
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
        <li>5</li>
        <li>6</li>
        <li>7</li>
        <li>8</li>
        <li>9</li>
    </ul>
</div>
.box {
    background: #e4f7fd61;
    border: 2px solid #0786ada1;
    border-radius: 8px;
}

ul {
    padding: 0; 
    margin: 0;
}

.box li {
    list-style: none;
    text-align: center;
    line-height: 200px;
    background: skyblue;
    border-radius: 8px;
    font-size: 20px;
    color: black;
}

實作一:flex

#使用flex 佈局實作需要注意一個點,就是需要用flex-wrap 屬性來使其換行。

.box {
    width: 100%;
    overflow: hidden;
}

ul {
    width: 100%;
    height: 100%;
    display: flex;
    flex-wrap: wrap;
}

.box li {
    width: 30%;
    height: 30%;
    margin-right: 5%;
    margin-bottom: 5%;
}

.box li:nth-of-type(3n) {
    margin-right: 0;
}

.box li:nth-of-type(n+7) {
    margin-bottom: 0;
}

實作二:float

#使用float 來實作需要注意一個點,浮動會造成浮動崩塌,因此可以設定overflow: hidden;box 設為BFC 來解決浮動崩塌。

.box {
    width: 100%;
    overflow: hidden;
}

ul {
    width: 100%;
    height: 100%;
}

.box li {
    width: 30%;
    height: 30%;
    margin-right: 5%;
    margin-bottom: 5%;
    float: left;
}

.box li:nth-of-type(3n) {
    margin-right: 0;
}

.box li:nth-of-type(n+7) {
    margin-bottom: 0;
}

實作三:grid

聊聊利用CSS實現九宮格佈局的幾種方法!

#
<div class="grid">
    <div>1</div>
    <div>2</div>
    <div>3</div>
    <div>4</div>
    <div>5</div>
    <div>6</div>
    <div>7</div>
    <div>8</div>
    <div>9</div>
</div>
box {
    background: #e4f7fd61;
    border: 2px solid #0786ada1;
    border-radius: 8px;
}

.grid {
    display: grid;
    width: 100%;
    grid-template-rows: repeat(3, 1fr);
    grid-template-columns: repeat(3, 1fr);
    grid-gap: 5%;
    grid-auto-flow: row;
}

.grid>div {
    list-style: none;
    text-align: center;
    line-height: 200px;
    background: skyblue;
    border-radius: 8px;
    font-size: 20px;
    color: black;
}

實作四:table

使用表格來實作會存在一些缺陷,table 儲存格之間的間隔是使用border-spacing 屬性來實現的,且不支援百分比的形式,而且單元格四周都有類似margin 的外邊距的效果。

聊聊利用CSS實現九宮格佈局的幾種方法!

<div class="box">
    <ul>
        <li>
            <div>1</div>
            <div>2</div>
            <div>3</div>
        </li>
        <li>
            <div>4</div>
            <div>5</div>
            <div>6</div>
        </li>
        <li>
            <div>7</div>
            <div>8</div>
            <div>9</div>
        </li>
    </ul>
</div>
.box {
    width: 100%;
    overflow: hidden;
}

ul {
    width: 100%;
    height: 100%;
    display: table;
    border-spacing: 10px;
}

.box li {
    display: table-row;
}

.box li div {
    display: table-cell;
    text-align: center;
    border-radius: 10px;
}

nth-of-type 與nth-child 的差異

上面實作九宮格佈局我用到了nth-of-type 這個屬性來實作最後一列的margin-right: 0 和最後一行的margin-bottom: 0。然後我記得 css 還有一個 nth-child 屬性,這裡順便記錄一下這兩者的差異。

nth-of-type

#MDN::nth-of-type(n) 這個偽類別是針對具有一組兄弟節點的標籤, 用n 來篩選出在一組兄弟節點的位置。

聊聊利用CSS實現九宮格佈局的幾種方法!

聊聊利用CSS實現九宮格佈局的幾種方法!

從上圖可以看出,因為nth-of-type 他是目前元素的兄弟元素的第n個,所以p:nth-of-type(4)是第四個p 元素,也就是無論往中間加入什麼元素,都只能是目前標籤元素的第n個元素被選擇。

nth-child

MDN::nth-child(an b)這個偽類先找到所有目前元素的兄弟元素,然後按照位置先後順序從1開始排序,選擇的結果為CSS偽類:nth-child括號中表達式(an b)匹配到的元素集合(n=0, 1,2,3...)

nth-child 是目前元素的兄弟元素的第n個目前元素,即所有兄弟元素排序後的第n個目前標籤元素

聊聊利用CSS實現九宮格佈局的幾種方法!

聊聊利用CSS實現九宮格佈局的幾種方法!

從上圖可以看出,nth-child 是目前元素的所有兄弟元素排序後的第n個目前標籤元素,所以p:nth-child(4) 取得是處於排在第4 位元的 p 元素。若處於第4位的是其他標籤元素,則獲取不到,如下圖所示:

聊聊利用CSS實現九宮格佈局的幾種方法!

#最後

#歡迎大家在評論區一起交流,一起進步!

(學習影片分享:css影片教學

以上是聊聊利用CSS實現九宮格佈局的幾種方法!的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:juejin.cn。如有侵權,請聯絡admin@php.cn刪除