看到微博和朋友圈都實現了圖片九宮格,曾經有次面試也問到了九宮格這個問題,當時想到的是先固定每個單元格的寬高,然后進行浮動。今天想折騰一下,實現自適應父元素寬度的布局。這次我只寫了四種方式去實現九宮格,算上inline-block的話就是五種了。
首先要注意的是九宮格容器是寬高相等的正方形,並且是自適應的,這里關鍵是實現寬高相等,有些人想到了相對視口寬度 vw,但是它是相對於屏幕可見寬度來設置的,並且會忽略滾動條的寬度,所以這是不可行的。這里我用一種變通方法,看代碼…
FlexBox
HTML 結構如下:
1 |
<div class="square"> |
抽取公共樣式:
1 |
.square{ |
使用Flex的一個好處是不用再擔心高度塌陷的問題,而且還可以輕松實現子元素橫向豎向甚至按比例伸縮擴展的布局。
1 |
.flex{ |
Grid
對於網格布局來說,grid 比 flex 更為方便,代碼量更少,可以處理更為復雜的結構。
1 |
<div class="square"> |
1 |
.grid{ |
更多:CSS Grid布局指南
Float
浮動實現九宮格就不多說了,原理同上。
1 |
<div class="square"> |
1 |
.float::after{ |
除了浮動,這里 li 也可以使用display: inline-block;實現同樣的效果,不過要注意HTML代碼非壓縮情況下行塊級元素之間會出現默認間隔,不同瀏覽器下表現還不一樣,這時可以給父級元素設置font-size: 0;
Table
1 |
<div class="square"> |
1 |
.table{ |
說下用表格實現九宮格有哪些瑕疵:
- 最后一行最后一列的單元格寬高與前面的不一致,雖然相差不大,但是還是有差異的;
- 與前面的兩種方法不同,table 單元格之間的間隔是利用
border-spacing屬性實現的,且不支持百分比,單元格四周都有類似margin的外邊距效果,如下圖。
分析
綜上來看,個人認為 FlexBox 適合用於移動端,PC端 IE10 以下不支持;Grid網格布局比較方便,但是規范還未成熟,主流瀏覽器廠商尚未推廣,不推薦使用在項目中;浮動和行塊級式聲明可以兼容到IE6,移動端和PC端支持的都不錯;Table 因為實現有瑕疵所以不推薦使用。





