Skip to content

CSS九宫格布局实现

基本的布局

html
<!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,消除子盒子代理的移动
  • 父盒子消除浮动
css
.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的级联使用,方法看如下的代码:

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布局

css
.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布局

css
.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;*/
}
最近更新