您的位置:首页 > 技术中心 > 前端框架 >

聊聊利用CSS实现九宫格布局的几种方法!

时间:2022-02-23 17:35

本篇文章给大家分享利用CSS实现九宫格布局的几种方法,并介绍一下nth-of-type 与 nth-child 的区别,希望对大家有所帮助!

最近几天刷面经常看见一道题,“九宫格布局”。自己尝试用几种办法实现了九宫格布局,发现这里面涉及了挺多的 css 知识,记录一下。

我觉得这篇文章讲得很好,大家可以去参考一下大佬如何写边框九宫格!# 千万别小瞧九宫格 一道题就能让候选人原形毕露!

九宫格实现

下面几种实现方法都可自适应

1.png

基本布局和样式

  1. <div class="box">
  2. <ul>
  3. <li>1</li>
  4. <li>2</li>
  5. <li>3</li>
  6. <li>4</li>
  7. <li>5</li>
  8. <li>6</li>
  9. <li>7</li>
  10. <li>8</li>
  11. <li>9</li>
  12. </ul>
  13. </div>
  1. .box {
  2. background: #e4f7fd61;
  3. border: 2px solid #0786ada1;
  4. border-radius: 8px;
  5. }
  6. ul {
  7. padding: 0;
  8. margin: 0;
  9. }
  10. .box li {
  11. list-style: none;
  12. text-align: center;
  13. line-height: 200px;
  14. background: skyblue;
  15. border-radius: 8px;
  16. font-size: 20px;
  17. color: black;
  18. }

实现一:flex

使用 flex 布局实现需要注意一个点,就是需要用 flex-wrap 属性来使其换行。

  1. .box {
  2. width: 100%;
  3. overflow: hidden;
  4. }
  5. ul {
  6. width: 100%;
  7. height: 100%;
  8. display: flex;
  9. flex-wrap: wrap;
  10. }
  11. .box li {
  12. width: 30%;
  13. height: 30%;
  14. margin-right: 5%;
  15. margin-bottom: 5%;
  16. }
  17. .box li:nth-of-type(3n) {
  18. margin-right: 0;
  19. }
  20. .box li:nth-of-type(n+7) {
  21. margin-bottom: 0;
  22. }

实现二:float

使用 float 来实现需要注意一个点,浮动会造成浮动崩塌,因此可以设置 overflow: hidden;box 设置成 BFC 来解决浮动崩塌。

  1. .box {
  2. width: 100%;
  3. overflow: hidden;
  4. }
  5. ul {
  6. width: 100%;
  7. height: 100%;
  8. }
  9. .box li {
  10. width: 30%;
  11. height: 30%;
  12. margin-right: 5%;
  13. margin-bottom: 5%;
  14. float: left;
  15. }
  16. .box li:nth-of-type(3n) {
  17. margin-right: 0;
  18. }
  19. .box li:nth-of-type(n+7) {
  20. margin-bottom: 0;
  21. }

实现三:grid

2.png

  1. <div class="grid">
  2. <div>1</div>
  3. <div>2</div>
  4. <div>3</div>
  5. <div>4</div>
  6. <div>5</div>
  7. <div>6</div>
  8. <div>7</div>
  9. <div>8</div>
  10. <div>9</div>
  11. </div>
  1. box {
  2. background: #e4f7fd61;
  3. border: 2px solid #0786ada1;
  4. border-radius: 8px;
  5. }
  6. .grid {
  7. display: grid;
  8. width: 100%;
  9. grid-template-rows: repeat(3, 1fr);
  10. grid-template-columns: repeat(3, 1fr);
  11. grid-gap: 5%;
  12. grid-auto-flow: row;
  13. }
  14. .grid>div {
  15. list-style: none;
  16. text-align: center;
  17. line-height: 200px;
  18. background: skyblue;
  19. border-radius: 8px;
  20. font-size: 20px;
  21. color: black;
  22. }

实现四:table

使用表格来实现会存在一些缺陷,table 单元格之间的间隔是使用 border-spacing 属性来实现的,且不支持百分比的形式,而且单元格四周都有类似于 margin 的外边距的效果。

3.png

  1. <div class="box">
  2. <ul>
  3. <li>
  4. <div>1</div>
  5. <div>2</div>
  6. <div>3</div>
  7. </li>
  8. <li>
  9. <div>4</div>
  10. <div>5</div>
  11. <div>6</div>
  12. </li>
  13. <li>
  14. <div>7</div>
  15. <div>8</div>
  16. <div>9</div>
  17. </li>
  18. </ul>
  19. </div>
  1. .box {
  2. width: 100%;
  3. overflow: hidden;
  4. }
  5. ul {
  6. width: 100%;
  7. height: 100%;
  8. display: table;
  9. border-spacing: 10px;
  10. }
  11. .box li {
  12. display: table-row;
  13. }
  14. .box li div {
  15. display: table-cell;
  16. text-align: center;
  17. border-radius: 10px;
  18. }

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 来筛选出在一组兄弟节点的位置。

4.png

5.png

从上图可以看出,因为 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个当前标签元素

6.png

7.png

从上图可以看出,nth-child 是当前元素的所有兄弟元素排序后的第n个当前标签元素,所以 p:nth-child(4) 取得是处于排在第4 位的 p 元素。若当处于第4位的是其他标签元素,则获取不到,如下图所示:

8.png

最后

欢迎大家在评论区一起交流,一起进步!

(学习视频分享:css视频教程)

以上就是聊聊利用CSS实现九宫格布局的几种方法!的详细内容,更多请关注gxlsystem.com其它相关文章!

本类排行

今日推荐

热门手游