GVKun编程网logo

css如何实现n宫格布局?(css实现九宫格布局)

29

最近很多小伙伴都在问css如何实现n宫格布局?和css实现九宫格布局这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展21九宫格布局、6-1商城小程序首页九宫格布局的初步实现、CSS

最近很多小伙伴都在问css如何实现n宫格布局?css实现九宫格布局这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展21 九宫格布局、6-1商城小程序首页九宫格布局的初步实现、CSS Grid 网格布局实现自适应9宫格、css 九宫格布局等相关知识,下面开始了哦!

本文目录一览:

css如何实现n宫格布局?(css实现九宫格布局)

css如何实现n宫格布局?(css实现九宫格布局)

常见应用场景

现在的APP界面基本都是大同小异,宫格布局现在基本成了每个APP必然的存在.

带边框,常用在"功能导航"页面
无边框,常用在首页分类

 

设计目标

在scss环境下,通过mixin实现n宫格,并且可以支持"有无边框"和"每个格是否正方形":

@include grid(3,3,true); // 3 x 3,有边框,且每个格为正方形
@include grid(2,5,false,false); // 2 x 5,无边框

 

最终效果

 

"padding百分比"小技巧

先解释一个小技巧,如何实现正方形,保证看一遍就会,结论就是:

padding的值如果是百分比,那么他是相对"父"元素宽度计算的,也就是说如果"父"元素宽度是100px,"子"元素设置padding-top:100%,"子"元素的padding-top实际上等于100px,这样就实现了一个正方形(100 x 100). 为了减少干扰,我们把"子"元素高度设置为0;

 

设计思路(无关你是scss还是less)

  1. 为了方便内部元素水平/垂直居中,整体我们用flex布局.
  2. 使用正方形占位,因为用了padding-top:100%,所以我们就需要再单独用一个div来装内容,我给他起名"item__content".
  3. 为了让内容的容器div充满方块,我们给他设置样式:position:absolute;top:0;left:0;right:0;bottom:0;;

因此我们的html是这样的:

<!-- a-grid是一个flex容器,方便他的内容做"水平/垂直居中" -->
<div class="a-grid">
  <!-- a-grid__item用来占位实现正方形 -->
  <div class="a-grid__item">
      <!-- item__content才是真正装内容的容器 -->
      <div class="item__content">
        内容...
      </div>
  </div>
</div>

东莞vi设计https://www.houdianzi.com/dgvi/ 豌豆资源网站大全https://55wd.com

代码(scss)

这里做了3件事:

为了不冗余,我把公共的部分抽离的出来起名".a-grid";
mixin支持4个参数,分别是&dollar;row(行数),&dollar;column(列数),&dollar;hasBorder(是否有边框),&dollar;isSquare(是否保证每个块是正方形).
mixin内部通过计算并结合:nth-child实现"整体无外边框"的效果,
.a-grid {
    display: flex;
    flex-wrap: wrap;
    width: 100%;

    .a-grid__item {
        text-align:center;
        position:relative;
        >.item__content {
            display:flex
            flex-flow: column;
            align-items: center;
            justify-content: center;
        }
    }
}

@mixin grid($row:3,$column:3,$hasBorder:false,$isSquare:true) {
    @extend .a-grid;

    .a-grid__item {

        flex-basis: 100%/$column;

        @if($isSquare) {
            padding-bottom: 100%/$column;
            height: 0;
        }

        >.item__content {

            @if($isSquare) {
                position:absolute;
                top:0;left:0;right:0;bottom:0;
            }
        }
    }

    @for $index from 1 to (($row - 1) * $column + 1) {
        .a-grid__item:nth-child(#{$index}) {
            @if($hasBorder) {
                border-bottom: 1px solid #eee;
            }
        }
    }

    @for $index from 1 to $column {
        .a-grid__item:nth-child(#{$column}n + #{$index}) {
            @if($hasBorder) {
                border-right: 1px solid #eee;
            }
        }
    }
}

使用

// 生成一个 3行3列,正方形格子的宫格
.a-grid-3-3 {
    @include grid(3,true);
}

// 生成一个 2行5列,无边框宫格,每个格子由内容决定高度
.a-grid-2-5 {
    @include grid(2,false);
}

提醒大家: 如要做n x m的布局,用@include grid(n,m)后千万别忘了在html中添加 n x m个对应的dom结构.

总结

以上是小编为你收集整理的css如何实现n宫格布局?全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

21 九宫格布局

21 九宫格布局

九宫格布局

  1 <!DOCTYPE html>
  2 <html lang="en">
  3 <head>
  4     <meta charset="UTF-8">
  5     <title>九宫格布局</title>
  6     <style type="text/css">
  7         *{
  8             padding:0;
  9             margin:0;
 10         }
 11         #wrap{
 12             overflow: hidden;
 13         }
 14         .item{
 15             width: 248px;
 16             height: 360px;
 17             font-size: 13px;
 18         }
 19         #wrap .item .title{
 20             width: 248px;
 21             height: 30px;
 22             line-height: 30px;
 23             overflow: hidden;
 24             margin-bottom: 10px;
 25         }
 26         .imgContainer{
 27             width: 248px;
 28             display: table-cell;
 29             text-align: center;
 30         }
 31         #wrap .item .price{
 32             color:#ff6700;
 33             font-size: 18px;
 34             font-weight: bold;
 35          }
 36     </style>
 37 </head>
 38 <body>
 39     <div id="cols">
 40         <button>3列</button>
 41         <button>4列</button>
 42         <button>5列</button>
 43     </div>
 44     <div id="wrap">
 45         <div class="item">
 46             <div class="imgContainer">
 47                 <img src="images/taobao_1.jpg" alt="">
 48             </div>
 49             <p class="title">纯色短袖女春季秋t恤韩版国新款服装2019潮</p>
 50             <p class="price">¥69</p>
 51          </div>
 52         <div class="item">
 53             <div class="imgContainer">
 54                 <img src="images/taobao_2.jpg" alt="">
 55             </div>
 56             <p class="title">百搭开春装女胖mm夏季显瘦2019新款大码韩版</p>
 57             <p class="price">¥69</p>
 58         </div>
 59         <div class="item">
 60             <div class="imgContainer">
 61                 <img src="images/taobao_3.jpg" alt="">
 62             </div>
 63             <p class="title">婚纱2019新款欧美韩式孕妇婚纱高腰韩版</p>
 64             <p class="price">¥69</p>
 65         </div>
 66         <div class="item">
 67             <div class="imgContainer">
 68                 <img src="images/taobao_4.jpg" alt="">
 69             </div>
 70             <p class="title">点上衣很仙的女装夏2019新款洋气打底衫</p>
 71             <p class="price">¥90</p>
 72         </div>
 73         <div class="item">
 74             <div class="imgContainer">
 75                 <img src="images/taobao_5.jpg" alt="">
 76             </div>
 77             <p class="title">大码女装胖MM文艺时尚格子圆点显瘦连衣裙</p>
 78             <p class="price">¥78</p>
 79         </div>
 80         <div class="item">
 81             <div class="imgContainer">
 82                 <img src="images/taobao_6.jpg" alt="">
 83             </div>
 84             <p class="title">2019夏季新款女装韩版修身显瘦V领无袖</p>
 85             <p class="price">¥89</p>
 86         </div>
 87         <div class="item">
 88             <div class="imgContainer">
 89                 <img src="images/taobao_7.jpg" alt="">
 90             </div>
 91             <p class="title">春季短款小外套女2019春装春秋新款韩</p>
 92             <p class="price">¥100</p>
 93         </div>
 94         <div class="item">
 95             <div class="imgContainer">
 96                 <img src="images/taobao_8.jpg" alt="">
 97             </div>
 98             <p class="title">大码女装中长款针织衫春装胖mm显瘦</p>
 99             <p class="price">¥120</p>
100         </div>
101         <div class="item">
102             <div class="imgContainer">
103                 <img src="images/taobao_9.jpg" alt="">
104             </div>
105             <p class="title">春款韩版2019新款女装时尚初春两件套</p>
106             <p class="price">¥107</p>
107         </div>
108         <div class="item">
109             <div class="imgContainer">
110                 <img src="images/taobao_10.jpg" alt="">
111             </div>
112             <p class="title">牛仔外套女短款2019春装新款女装韩版</p>
113             <p class="price">¥69</p>
114         </div>
115         <div class="item">
116             <div class="imgContainer">
117                 <img src="images/taobao_11.jpg" alt="">
118             </div>
119             <p class="title">2019夏季新款女装裙子纯色流苏a字裙</p>
120             <p class="price">¥56</p>
121         </div>
122         <div class="item">
123             <div class="imgContainer">
124                 <img src="images/taobao_12.jpg" alt="">
125             </div>
126             <p class="title">女装休闲短袖韩版宽松2019新款春夏季</p>
127             <p class="price">¥76</p>
128         </div>
129         <div class="item">
130             <div class="imgContainer">
131                 <img src="images/taobao_13.jpg" alt="">
132             </div>
133             <p class="title">棉上衣女装秋季新款2019早春休闲时尚</p>
134             <p class="price">¥45</p>
135         </div>
136     </div>
137 </body>
138 <script type="text/javascript">
139     function $(id) {
140         return typeof id === ''string'' ? document.getElementById(id) : null
141     }
142     window.onload = function () {
143         var btns = document.getElementsByTagName(''button'');
144         var items = document.getElementsByClassName(''item'');
145         btns[0].onclick = function () {
146             buju(3)
147         };
148         btns[1].onclick = function () {
149             buju(4)
150         };
151         btns[2].onclick = function () {
152             buju(5)
153         };
154 
155         function buju(num) {
156             for (var i = 0; i < items.length; i++) {
157                 items[i].style.float = ''left'';
158                 items[i].parentNode.style.width = items[i].offsetWidth * num + ''px'';
159             }
160         }
161     }
162 </script>
163 </html>

 

九宫格布局plus

  1 <!DOCTYPE html>
  2 <html lang="en">
  3 <head>
  4     <meta charset="UTF-8">
  5     <title>九宫格布局plus</title>
  6     <style type="text/css">
  7         *{
  8             padding: 0;
  9             margin: 0;
 10         }
 11         #wrap{
 12            position: relative;
 13         }
 14         #wrap .item{
 15             width: 248px;
 16             height: 360px;
 17             font-size: 13px;
 18         }
 19         #wrap .item .title{
 20             width: 248px;
 21             height: 30px;
 22             line-height: 30px;
 23             overflow: hidden;
 24             margin-bottom: 10px;
 25         }
 26         .imgContainer{
 27             width: 248px;
 28             display: table-cell;
 29             text-align: center;
 30         }
 31          #wrap .item .price{
 32             color:#ff6700;
 33             font-size: 18px;
 34             font-weight: bold;
 35          }
 36 
 37 
 38     </style>
 39 </head>
 40 <body>
 41 <div class="cols">
 42     <button>3列</button>
 43     <button>4列</button>
 44     <button>5列</button>
 45 </div>
 46 <div id="wrap">
 47         <div class="item">
 48             <div class="imgContainer">
 49                 <img src="images/taobao_1.jpg" alt="">
 50             </div>
 51             <p class="title">纯色短袖女春季秋t恤韩版国新款服装2019潮</p>
 52             <p class="price">¥69</p>
 53          </div>
 54         <div class="item">
 55             <div class="imgContainer">
 56                 <img src="images/taobao_2.jpg" alt="">
 57             </div>
 58             <p class="title">百搭开春装女胖mm夏季显瘦2019新款大码韩版</p>
 59             <p class="price">¥69</p>
 60         </div>
 61         <div class="item">
 62             <div class="imgContainer">
 63                 <img src="images/taobao_3.jpg" alt="">
 64             </div>
 65             <p class="title">婚纱2019新款欧美韩式孕妇婚纱高腰韩版</p>
 66             <p class="price">¥69</p>
 67         </div>
 68         <div class="item">
 69             <div class="imgContainer">
 70                 <img src="images/taobao_4.jpg" alt="">
 71             </div>
 72             <p class="title">点上衣很仙的女装夏2019新款洋气打底衫</p>
 73             <p class="price">¥90</p>
 74         </div>
 75         <div class="item">
 76             <div class="imgContainer">
 77                 <img src="images/taobao_5.jpg" alt="">
 78             </div>
 79             <p class="title">大码女装胖MM文艺时尚格子圆点显瘦连衣裙</p>
 80             <p class="price">¥78</p>
 81         </div>
 82         <div class="item">
 83             <div class="imgContainer">
 84                 <img src="images/taobao_6.jpg" alt="">
 85             </div>
 86             <p class="title">2019夏季新款女装韩版修身显瘦V领无袖</p>
 87             <p class="price">¥89</p>
 88         </div>
 89         <div class="item">
 90             <div class="imgContainer">
 91                 <img src="images/taobao_7.jpg" alt="">
 92             </div>
 93             <p class="title">春季短款小外套女2019春装春秋新款韩</p>
 94             <p class="price">¥100</p>
 95         </div>
 96         <div class="item">
 97             <div class="imgContainer">
 98                 <img src="images/taobao_8.jpg" alt="">
 99             </div>
100             <p class="title">大码女装中长款针织衫春装胖mm显瘦</p>
101             <p class="price">¥120</p>
102         </div>
103         <div class="item">
104             <div class="imgContainer">
105                 <img src="images/taobao_9.jpg" alt="">
106             </div>
107             <p class="title">春款韩版2019新款女装时尚初春两件套</p>
108             <p class="price">¥107</p>
109         </div>
110         <div class="item">
111             <div class="imgContainer">
112                 <img src="images/taobao_10.jpg" alt="">
113             </div>
114             <p class="title">牛仔外套女短款2019春装新款女装韩版</p>
115             <p class="price">¥69</p>
116         </div>
117         <div class="item">
118             <div class="imgContainer">
119                 <img src="images/taobao_11.jpg" alt="">
120             </div>
121             <p class="title">2019夏季新款女装裙子纯色流苏a字裙</p>
122             <p class="price">¥56</p>
123         </div>
124         <div class="item">
125             <div class="imgContainer">
126                 <img src="images/taobao_12.jpg" alt="">
127             </div>
128             <p class="title">女装休闲短袖韩版宽松2019新款春夏季</p>
129             <p class="price">¥76</p>
130         </div>
131         <div class="item">
132             <div class="imgContainer">
133                 <img src="images/taobao_13.jpg" alt="">
134             </div>
135             <p class="title">棉上衣女装秋季新款2019早春休闲时尚</p>
136             <p class="price">¥45</p>
137         </div>
138 </div>
139 <script type="text/javascript">
140     // 1.获取标签
141     var btns = document.getElementsByTagName(''button'');
142     var items = document.getElementsByClassName(''item'');
143 
144     // 2.监听按钮的点击
145     btns[0].onclick = function(){
146 
147         // 3.循环
148        mjj_flex(3);
149     }
150      btns[1].onclick = function(){
151 
152         mjj_flex(4)
153 
154     }
155     btns[2].onclick = function(){
156 
157        mjj_flex(5);
158     }
159 
160     function mjj_flex(colsNum){
161          // 第0行第0列   top: row * h         left: col* w
162          // 第0行第1列   top: 0 * h         left: 1* w
163          // 第0行第2列   top: 0 * h         left: 2* w
164          // 第1行第0列   top: 1 * h         left: 0 * w
165          // 第1行第1列   top: 1 * h         left: 1 * w
166          // 第1行第2列   top: 1 * h         left: 2* w
167          // 第2行第0列   top: 2 * h         left: 0* w
168          // 第2行第1列   top: 2 * h         left: 0* w
169          // 第2行第2列   top: 2 * h         left: 0* w
170          for(var i = 0; i < items.length; i++){
171                  // 求每个盒子占得行数和列数      10      3行  1列
172                                                                      // 11     3行 2列
173                  var row = parseInt(i / colsNum);
174                  var col = parseInt(i % colsNum);
175                  // 设置盒子定位
176                   items[i].style.position = ''absolute'';
177                   items[i].style.top = (row * items[i].offsetHeight) + ''px'';
178                   items[i].style.left = (col * items[i].offsetWidth) + ''px'';
179          }
180 
181 
182     }
183 
184 </script>
185 
186 </body>
187 </html>

 

6-1商城小程序首页九宫格布局的初步实现

6-1商城小程序首页九宫格布局的初步实现

CSS Grid 网格布局实现自适应9宫格

CSS Grid 网格布局实现自适应9宫格

引用阮一峰老师话说网格布局(Grid)是最强大的 CSS 布局方案。CSS Grid 网格布局教程

它将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局。以前,只能通过复杂的 CSS 框架达到的效果,现在浏览器内置了。

上图这样的布局,就是 Grid 布局的拿手好戏。

Grid 布局与 Flex 布局有一定的相似性,都可以指定容器内部多个项目的位置。但是,它们也存在重大区别。

Flex 布局是轴线布局,只能指定"项目"针对轴线的位置,可以看作是一维布局。Grid 布局则是将容器划分成"行"和"列",产生单元格,然后指定"项目所在"的单元格,可以看作是二维布局。Grid 布局远比 Flex 布局强大。

下面我给大家分享一个用grid实现的自适应9宫格,格子大小自定义,间隔不变,以前都是用dom计算,好蠢。
需要根据自己的布局个数,来计算每个格子大小,主要是每个格子的宽高减去相应行和列间隔的大小,以九宫格为列,有3行3列,有行间距2 24px, 有列间距2 24px,每个格子的宽高都要减去48px / 3。

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width,initial-scale=1.0" />
  <title>grid</title>
</head>

<body>
  <div>
    <div></div>
    <div></div>
    <div></div>

    <div></div>
    <div></div>
    <div></div>

    <div></div>
    <div></div>
    <div></div>
  </div>
</body>


<style>
  * {
    padding: 0;
    margin: 0;
    box-sizing: border-box
  }

  body {
    height: 100vh;
    padding: 20px;
  }

  .container {
    width: 100%;
    height: 100%;
    display: grid;
    /*行间距*/
    grid-row-gap: 24px;
    /*列间距*/
    grid-column-gap: 24px;
    /*每3行有2个行间距,所以每个格子的宽高都要减去(24*2) / 3 */
    grid-template-columns: repeat(3, calc(33.33% - 16px));
    grid-template-rows: repeat(3, calc(33.33% - 16px));
    overflow: hidden;
  }

  .item {
    background: #33a8a5;
  }
</style>

</html>

css 九宫格布局

css 九宫格布局

 

原文链接: css 九宫格布局

上一篇: lz-string 面向localstorage的字符串压缩库

下一篇: 音频播放错误的异常 [已解决]

之前做了几个数字相关的小游戏, 用到了类似的布局, 对于css这种东西, 还是用到再查吧

https://juejin.im/post/6886770985060532231#heading-7

 

不过这篇文章中也有几个不错的点

1, 使用 nth-child 来设置取消边距, 比手写class和写死在css里面好很多

2, 居中使用grid布局, 比flex少写一行代码

3, 颜色讲到了 currentColor 这个确实没怎么了解

不过对于事件的绑定, 这个只能说有时候还是要看情况, 不过确实在父级上绑定一个后, 直接用id来区分点击的是哪一个能减少一些开销, 在这种简单场景下使用完全没问题, 但也不至于就怎么滴了.....

 

仿照着实现了一下, 基本样例就这样了

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      .wrap {
        display: flex;
        width: 300px;
        flex-wrap: wrap;
      }
      .cell {
        font-size: 40px;
        display: grid;
        place-items: center;
        width: 100px;
        height: 100px;
        box-sizing: border-box;
        border: 4px solid black;
        background: deepskyblue;
        color: white;
        margin-left: -4px;
        margin-top: -4px;
        z-index: 1;
      }

      .cell:hover {
        border: 4px red solid;
        z-index: 2;
      }

      /* 第1、4、7个子元素 */
      .cell:nth-child(3n + 1) {
        /* 取消左负边距 */
        margin-left: 0;
      }

      /* 前三个子元素 */
      .cell:nth-child(-n + 3) {
        /* 取消上负边距 */
        margin-top: 0;
      }
    </style>
  </head>

  <divonclick="showItem(event)">
    <div>1</div>
    <div>2</div>
    <div>3</div>
    <div>4</div>
    <div>5</div>
    <div>6</div>
    <div>7</div>
    <div>8</div>
    <div>9</div>
  </div>
  <body></body>

  <script>
      function showItem(e){
        alert(e.target.innerText)
      }
  </script>
</html>

 

我们今天的关于css如何实现n宫格布局?css实现九宫格布局的分享就到这里,谢谢您的阅读,如果想了解更多关于21 九宫格布局、6-1商城小程序首页九宫格布局的初步实现、CSS Grid 网格布局实现自适应9宫格、css 九宫格布局的相关信息,可以在本站进行搜索。

本文标签: