CSS九宫格布局实现

[[toc]]

基本的布局

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width,user-scalable=no,initial-scale=1,maximum-scale=1,minimum-scale=1,viewport-fit=cover">
<title></title>
<style>
.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: rgba(146, 203, 230, 0.65);
border-radius: 8px;
}
</style>
</head>

<body>
<div class="box">
<ul class="flex grid">
<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>
</body>
</html>

margin负值实现

  • 最外层的包裹元素等于:li宽度3+li右间距2
  • 子盒子左浮动,margin-left margin-bottom间距为20px
  • 父盒子的margin-bottom和margin-top的的间距为-20px,消除子盒子代理的移动
  • 父盒子消除浮动
.box {
width: 940px;
}

ul {
margin-right: -20px;
margin-bottom: -20px;
}

ul:after {
content: '';
display: block;
height: 0;
width: 0;
clear: both;
visibility: hidden;
}

.box li {
float: left;
width: 300px;
height: 200px;
margin-right: 20px;
margin-bottom: 20px;
}

nth-child

跟上面的那种方法类似,就是把父盒子的移动换成了指定的子盒子移动

但是这回出现一个问题就是最下的一层盒子个数不确定所以margin-bottom,就没办法正确的设置
所以就会用到css的级联使用,方法看如下的代码:

...  // 代码跟上面的一致,去除UI部分
.box li:nth-child(3n) {
margin-right: 0
}
.box li:nth-child(3n+1):nth-last-child(-n+3), .box li:nth-child(3n+1):nth-last-child(-n+3) ~ li {
margin-bottom: 0;
}
// li:nth-last-child(-n+3)

grid布局

 .grid {
display: grid;
grid-template-rows: 100px 100px 100px;
grid-template-columns: 100px 100px 100px;
}

.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;
background: #6a8bad;
}
.grid > li:hover{
border-color: red;
position: relative;
transition: all 500ms;
/*z-index:-2;*/
}

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

flex布局

.flex {
display: flex;
width: 312px;
flex-wrap: wrap;
margin: -4px 0 0 -4px;
}

.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;
background: rgba(146, 203, 230, 0.65);
}

.flex > li:hover {
background: red;
position: relative;
/*z-index:2;*/
}