CSS九宫格的4种实现
⽂章⽬录
实现效果
效果如下,就是⼀个九宫格,点击九宫格中的任意⼀个⼩⽅块,其边框变成红⾊。
实现⽅法
我⾃⼰⼀共总结了4种⽅法来实现这个效果,前三种⽅法是⼤同⼩异,只有第四种表格布局⽐较特殊。下⾯我直接给出每⼀种布局⽅式相关的样式和DOM结构的源码。
1. float布局
margin: 50px; //为了和页⾯中的其他块拉开距离
height: 300px;
width: 300px;
}
.float > li{
box-sizing: border-box;
float:left;
width: 100px;
height: 100px;
margin-left: -4px;
margin-top: -4px;
line-height: 100px;
text-align: center;
list-style: none;
border:4px solid #ccc;
}
.float > li:hover{
border-color: red;
position: relative;
}
</style>
<ul class="float">
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>borderbox
<li>7</li>
<li>8</li>
<li>9</li>
</ul>
float布局实现这个9宫格没什么好讲的,关键点在于对li⼦项设置margin-left:-4px;margin-top:-4px;这样就可以使相邻⼦块间的边框发⽣重叠,你可以不设置这个负的margin来看看效果,你会体会更深。整个CSS中我认为最精髓的地⽅在于hover的样式,给li⼦项设置
了position:relative;。这个地⽅的精髓在于,对元素设置了relative后,其将脱离⽂档流,同时其层叠等级会⽐普通⽂档流⾼,就会使其内容覆盖在普通⽂档流之上,那么它被覆盖的border就会显⽰出来,同时遮挡住相邻元素的border。这个设置真的很精髓,后⾯两种⽅法和该⽅法差不多,我就不做过多讲解了。
2. flex布局
/*height: 300px;*/
margin: 50px;
flex-wrap: wrap;
/*align-content: flex-start;      */
box-sizing: border-box;
}
.flex > li{
box-sizing: border-box;
height: 100px;
width: 100px;
margin-left: -4px;
margin-top: -4px;
line-height: 100px;
text-align: center;
list-style: none;
border: 4px solid #ccc;
}
.flex > li:hover{
border-color:red;
position: relative;
/*z-index:2;*/
}
</style>
<ul class="flex">
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>flex</li>
<li>6</li>
<li>7</li>
<li>8</li>
<li>9</li>
</ul>
使⽤flex布局时,有⼀点需要注意,那就是不要给⽗容器ul.flex设置⾼度,如果你设置了⾼度,那么在垂直⽅向上⼦项的margin负值设置将会失效,具体原因我也不知道。如果你设置了⾼度后,还希望垂直⽅向的margin值⽣效,那么你就给ul.flex添加⼀个algin-content:flex-start;属性即可。这个具体为啥会这样,我也不是很明⽩,希望有理解的兄弟在评论区指导⼀下。该flex布局中,也可以在hover时添加z-index:2;来提⾼叠加等级。
3. grid布局
width: 300px;
display: grid;
grid-template-rows: 100px  100px 100px;
grid-template-columns: 100px 100px 100px;
box-sizing: border-box;
}
.grid > li{
margin-top: -4px;
margin-left: -4px;
box-sizing: border-box;
list-style: none;
line-height: 100px;
text-align: center;
border: 4px solid #ccc;
}
.grid > li:hover{
border-color: red;
position: relative;
/*z-index:2;*/
}
</style>
<ul class="grid">
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>grid</li>
<li>6</li>
<li>7</li>
<li>8</li>
<li>9</li>
</ul>
这⾥有⼀个地⽅需要注意,就是不要再给li⼦项设置宽度和⾼度。该grid布局中,也可以在hover时添加z-index:2;来提⾼叠加等级。
4. table布局
margin-top: 100px;
width: 300px;
height: 300px;
text-align: center;
border: 4px solid #ccc;
border-collapse: collapse;
box-sizing: border-box;
}
.table td{
/*height: 100px;*/
width: 100px;
vertical-align: middle;
border: 4px solid #ccc;
text-align: center;
box-sizing: border-box;
line-height: 100px;
}
.table td:hover{
border-color: red;
position: absolute;
width: 94px;
height: 100px;
margin-top: -4px;
margin-left: -4px;
box-sizing: content-box;
}
</style>
<table class="table">
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>table</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
</table>
使⽤table布局时,有以下⼏点需要注意:
1. line-height的设置值需要与height的值保持⼀致。因为对于表格中的⼀⾏来说,它的⾼度取决于该⾏最⼤的单元格的⾼度或者⾏
⾼,line-height与height不⼀致会导致该列中的边框溢出单元格。
2. 要想使某个单元格的边框覆盖其他单元格的边框,必须给单元格设置position:absolute;⽽不是relative。
3. margin-left的设置值是border-width的1.5倍,这个是我在chrome下的测试结果,具体原因我也不清楚,希望有⽼铁评论区解答⼀下。总结
CSS的知识还是⼗分博⼤精深的,⼀个简单的9宫格布局就给我留下了这么多的未解之谜,还需要加强CSS的学习啊!希望后⾯能把埋下的坑给填了。⽂中如有纰漏,欢迎在评论区指正。博⽂中的代码,均是在chrome环境下进⾏的测试,如有兼容性问题,欢迎在评论区⼀起探讨。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。