当前位置:Gxlcms > css > CSS如何实现九宫格?CSS实现九宫格的四种方式介绍

CSS如何实现九宫格?CSS实现九宫格的四种方式介绍

时间:2021-07-01 10:21:17 帮助过:71人阅读

本篇文章给大家带来的内容是关于CSS如何实现九宫格?CSS实现九宫格的四种方式介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

实现效果

效果如下,就是一个九宫格,点击九宫格中的任意一个小方块,其边框变成红色。

index.png

实现方法

我自己一共总结了4种方法来实现这个效果,前三种方法是大同小异,只有第四种表格布局比较特殊。下面我直接给出每一种布局方式相关的样式和DOM结构的源码。

1. float布局

  1. <style>
  2. .float{
  3. margin: 50px; //为了和页面中的其他块拉开距离
  4. height: 300px;
  5. width: 300px;
  6. }
  7. .float > li{
  8. box-sizing: border-box;
  9. float:left;
  10. width: 100px;
  11. height: 100px;
  12. margin-left: -4px;
  13. margin-top: -4px;
  14. line-height: 100px;
  15. text-align: center;
  16. list-style: none;
  17. border:4px solid #ccc;
  18. }
  19. .float > li:hover{
  20. border-color: red;
  21. position: relative;
  22. }
  23. </style>
  24. <ul class="float">
  25. <li>1</li>
  26. <li>2</li>
  27. <li>3</li>
  28. <li>4</li>
  29. <li>5</li>
  30. <li>6</li>
  31. <li>7</li>
  32. <li>8</li>
  33. <li>9</li>
  34. </ul>

float布局实现这个9宫格没什么好讲的,关键点在于对li子项设置margin-left:-4px;margin-top:-4px;这样就可以使相邻子块间的边框发生重叠,你可以不设置这个负的margin来看看效果,你会体会更深。整个CSS中我认为最精髓的地方在于hover的样式,给li子项设置了position:relative;。这个地方的精髓在于,对元素设置了relative后,其将脱离文档流,同时其层叠等级会比普通文档流高,就会使其内容覆盖在普通文档流之上,那么它被覆盖的border就会显示出来,同时遮挡住相邻元素的border。这个设置真的很精髓,后面两种方法和该方法差不多,我就不做过多讲解了。

2. flex布局

  1. <style>
  2. .flex{
  3. display: flex;
  4. width: 300px;
  5. /*height: 300px;*/
  6. margin: 50px;
  7. flex-wrap: wrap;
  8. /*align-content: flex-start; */
  9. box-sizing: border-box;
  10. }
  11. .flex > li{
  12. box-sizing: border-box;
  13. height: 100px;
  14. width: 100px;
  15. margin-left: -4px;
  16. margin-top: -4px;
  17. line-height: 100px;
  18. text-align: center;
  19. list-style: none;
  20. border: 4px solid #ccc;
  21. }
  22. .flex > li:hover{
  23. border-color:red;
  24. position: relative;
  25. /*z-index:2;*/
  26. }
  27. </style>
  28. <ul class="flex">
  29. <li>1</li>
  30. <li>2</li>
  31. <li>3</li>
  32. <li>4</li>
  33. <li>flex</li>
  34. <li>6</li>
  35. <li>7</li>
  36. <li>8</li>
  37. <li>9</li>
  38. </ul>

使用flex布局时,有一点需要注意,那就是不要给父容器ul.flex设置高度,如果你设置了高度,那么在垂直方向上子项的margin负值设置将会失效,具体原因我也不知道。如果你设置了高度后,还希望垂直方向的margin值生效,那么你就给ul.flex添加一个algin-content:flex-start;属性即可。这个具体为啥会这样,我也不是很明白,希望有理解的兄弟在评论区指导一下。该flex布局中,也可以在hover时添加z-index:2;来提高叠加等级。

3. grid布局

  1. <style>
  2. .grid{
  3. margin: 50px;
  4. height: 300px;
  5. width: 300px;
  6. display: grid;
  7. grid-template-rows: 100px 100px 100px;
  8. grid-template-columns: 100px 100px 100px;
  9. box-sizing: border-box;
  10. }
  11. .grid > li{
  12. margin-top: -4px;
  13. margin-left: -4px;
  14. box-sizing: border-box;
  15. list-style: none;
  16. line-height: 100px;
  17. text-align: center;
  18. border: 4px solid #ccc;
  19. }
  20. .grid > li:hover{
  21. border-color: red;
  22. position: relative;
  23. /*z-index:2;*/
  24. }
  25. </style>
  26. <ul class="grid">
  27. <li>1</li>
  28. <li>2</li>
  29. <li>3</li>
  30. <li>4</li>
  31. <li>grid</li>
  32. <li>6</li>
  33. <li>7</li>
  34. <li>8</li>
  35. <li>9</li>
  36. </ul>

这里有一个地方需要注意,就是不要再给li子项设置宽度和高度。该grid布局中,也可以在hover时添加z-index:2;来提高叠加等级。

4. table布局

  1. <style>
  2. .table{
  3. margin-top: 100px;
  4. width: 300px;
  5. height: 300px;
  6. text-align: center;
  7. border: 4px solid #ccc;
  8. border-collapse: collapse;
  9. box-sizing: border-box;
  10. }
  11. .table td{
  12. /*height: 100px;*/
  13. width: 100px;
  14. vertical-align: middle;
  15. border: 4px solid #ccc;
  16. text-align: center;
  17. box-sizing: border-box;
  18. line-height: 100px;
  19. }
  20. .table td:hover{
  21. border-color: red;
  22. position: absolute;
  23. width: 94px;
  24. height: 100px;
  25. margin-top: -4px;
  26. margin-left: -4px;
  27. box-sizing: content-box;
  28. }
  29. </style>
  30. <table class="table">
  31. <tr>
  32. <td>1</td>
  33. <td>2</td>
  34. <td>3</td>
  35. </tr>
  36. <tr>
  37. <td>1</td>
  38. <td>table</td>
  39. <td>3</td>
  40. </tr>
  41. <tr>
  42. <td>1</td>
  43. <td>2</td>
  44. <td>3</td>
  45. </tr>
  46. </table>

使用table布局时,有以下几点需要注意:

1、line-height的设置值需要与height的值保持一致。因为对于表格中的一行来说,它的高度取决于该行最大的单元格的高度或者行高,line-height与height不一致会导致该列中的边框溢出单元格。

2、要想使某个单元格的边框覆盖其他单元格的边框,必须给单元格设置position:absolute;而不是relative。

3、margin-left的设置值是border-width的1.5倍,这个是我在chrome下的测试结果,具体原因我也不清楚,希望有老铁评论区解答一下。

以上就是CSS如何实现九宫格?CSS实现九宫格的四种方式介绍的详细内容,更多请关注Gxl网其它相关文章!

人气教程排行