你可能不知道的 grid 实用功能!有时候真的很方便

前端下午茶

共 10089字,需浏览 21分钟

 ·

2024-04-12 02:59

作者:欲买炸鸡同载可乐 原文:https://juejin.cn/post/7326816030042669110

flex布局大家应该已经运用的炉火纯青了,相信在日常开发中大家和我一样不管遇到什么都是flex一把搜哈。直到我遇到grid,才发现有些场景下,不是说flex实现不了而是使用grid能够更加轻松的完成任务。下面拿几个场景和大家分享一下。

宫格类的布局

比如我要实现一个布局,最外层元素的宽度是1000px,高度自适应。子元素宽度为300px,一行展示3个,从左到右排列。其中最左边与最右边的元素需要紧挨父元素的左右边框。如下图所示:

fa765716cb9e0cc28bf53e2871514faf.webp

使用flex实现

这个页面布局在日常开发中非常常见,考虑下使用flex布局如何实现,横向排列元素,固定宽度300,wrap设置换行显示,设置双端对齐。看起来很简单,来实现一下。

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

<head>
    <style>
        .box{
            width1000px;
            display: flex;
            flex-wrap: wrap;
            justify-content: space-between;
            gap10px;
        }
        .item{
            background: pink;
            width300px;
            height150px;
        }
    
</style>
</head>

<body>
    <div class="box">
        <div class="item">1</div>
        <div class="item">2</div>
        <div class="item">3</div>
        <div class="item">4</div>
        <div class="item">5</div>
        <div class="item">6</div>
        <div class="item">7</div>
        <div class="item">8</div>
    </div>
</body>

</html>
30d77f9f8b7fa99a2a568fd52347f1fe.webp

实现之后发现了问题,由于我们设置了双端对齐导致,当最后一行的个数不足三个时,页面展示的效果和我们预期的效果有出入。使用flex实现这个效果就要对这个问题进行额外的处理。

处理的方式有很多种,最常见的处理方式是在元素后面添加空元素,使其成为3的倍数即可。其实这里添加空元素的个数没有限制,因为空元素不会展示到页面上,即使添加100个空元素用户也是感知不到的。个人觉得这并不是一个好办法,在实际处理的时候可能还会遇到别的问题。个人觉得还是把flex下的子元素设置成百分比好一点。

使用grid实现

面对这种布局使用grid是非常方便的,设置3列,每列300px,剩下的元素让它自己往下排即可。几行代码轻松实现该效果,不需要flex那样额外的处理。

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

<head>
    <style>
        .box {
            display: grid;
            grid-template-columnsrepeat(3300px);
            justify-content: space-between;
            gap10px;
            width1000px;
        }

        .item {
            background: pink;
            height100px;
        }
    
</style>
</head>

<body>
    <div class="box">
        <div class="item">1</div>
        <div class="item">2</div>
        <div class="item">3</div>
        <div class="item">4</div>
        <div class="item">5</div>
        <div class="item">6</div>
        <div class="item">7</div>
        <div class="item">8</div>

    </div>
</body>

</html>
819a69142e463ce4a2b18c92010033a3.webp

实现后台管理布局

541fa3643a2bdd01e2be9a8b745edd87.webp

这种后台管理的布局,使用flex实现当然也没有问题。首先需要纵向排列红色的两个div,然后再横向的排列蓝色的两个div,最后再纵向的排列绿色的两个div实现布局。达到效果是没有问题的,但是实现起来较为繁琐,而且需要很多额外的标签嵌套。

6c73ed6a894e76cf23f5c59b527cec0d.webp

由于grid是二维的,所以它不需要额外的标签嵌套。html里面结构清晰,如果需要改变页面结构,只需要改变container的样式就可以了,不需要对html进行修改。

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

<head>
    <style>
        .container {
            display: grid;
            grid-template-columns250px 1fr;
            grid-template-rows100px 1fr 100px;
            grid-template-areas:
                'header header'
                'aside  main'
                'aside footer';
            height100vh;
        }

        .header {
            grid-area: header;
            background#b3c0d1;
        }

        .aside {
            grid-area: aside;
            background#d3dce6;
        }

        .main {
            grid-area: main;
            background#e9eef3;
        }

        .footer {
            grid-area: footer;
            background#b3c0d1;
        }
    
</style>
</head>

<body>
    <div class="container">
        <div class="header">Header</div>
        <div class="aside">Aside</div>
        <div class="main">Main</div>
        <div class="footer">Footer</div>
    </div>
</body>

</html>

实现响应式布局

借助grid的auto-fillminmax函数可以实现类似响应式布局的效果,可以应用在后台管理的表单布局等场景。

9fa4c1456c76e7997c976ee73257a03a.webp
      
      <!DOCTYPE html>
<html lang="en">

<head>
    <style>
        .box {
            display: grid;
            grid-template-columnsrepeat(auto-fill, minmax(300px1fr));
            justify-content: space-between;
            gap10px;
        }

        .item {
            background: pink;
            height100px;
        }
    
</style>
</head>

<body>
    <div class="box">
        <div class="item">1</div>
        <div class="item">2</div>
        <div class="item">3</div>
        <div class="item">4</div>
        <div class="item">5</div>
        <div class="item">6</div>
        <div class="item">7</div>
        <div class="item">8</div>
    </div>
</body>

</html>

兼容性对比

flex的兼容性

61e2d3542d9d5aaac120c958ab359b73.webpimage.png

grid的兼容性

8f4dc5f3b4c5b5b9b5c9954a7bcfeda8.webpimage.png

可以看到grid在兼容性上还是不如flex,grid虽然强大,但是在使用前还是需要先考虑一下项目的用户群体。

结尾

除了上述场景外肯定还有许多场景适合使用grid来完成。gridflex都是强大的布局方式,它们并没有明显的优劣之分。关键在于掌握这两种方法,并在开发中根据实际情况选择最合适的方案。

希望大家能有所收获!

最后



如果你觉得这篇内容对你挺有启发,我想邀请你帮我个小忙:

  1. 点个「喜欢」或「在看」,让更多的人也能看到这篇内容

  2. 我组建了个氛围非常好的前端群,里面有很多前端小伙伴,欢迎加我微信「sherlocked_93」拉你加群,一起交流和学习

  3. 关注公众号「前端下午茶」,持续为你推送精选好文,也可以加我为好友,随时聊骚。



点个喜欢支持我吧,在看就更好了
浏览 20
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报