美文网首页
CSS自适应正方形

CSS自适应正方形

作者: 泪滴在琴上 | 来源:发表于2023-05-05 11:23 被阅读0次

    [x] css实现正方形的几种方案及优缺点
    [x] css正方形布局实际应用场景
    [x] 由正方形布局引发的其他应用场景扩展

    前言

    在电商、个人博客等网站我们或多或少都可以看到css正方形的应用场景,自适应正方形布局是必须要掌握的;接下来采黎带大家揭开css自适应正方形神秘的面纱~

    正方形

    这很简单,设置盒子宽高都为200px就可以了

    <div class="box">小明写的</div>
    
    .box {
        width: 200px;
        height: 200px;
        background: pink;
    }
    

    自适应正方形

    青铜
    提起自适应,想必都会想到rem、vw等相对单位,我们分别用这些单位来实现一下。

    rem

    <div class="rem">rem</div>
    
    body {
        font-size: 16px;
    }
    
    .rem {
        width: 10rem;
        height: 10rem;
        background: pink;
    }
    
    @media only screen and (max-width: 1200px) {
        body {
            font-size: 12px;
        }
    }
    

    屏幕宽度大于1200px时,字体为16px,rem的盒子的大小为 160px * 160px;

    屏幕宽度小于1200px时,字体为12px,rem的盒子的大小为 120px * 120px;

    实际应用场景屏幕宽度变化会动态计算rem的值,这里只用于案例理解。

    优点

    在适配了rem的项目中,可以直接使用rem设置盒子宽高,即自适应正方形

    缺点

    在未设置rem的项目中,单独为了实现自适应正方形有点大材小用

    vw

    <div class="vw">vw</div>
    
    .vw {
        width: 10vw;
        height: 10vw;
        background: yellow;
    }
    

    可以看到正方形跟随着屏幕宽度的变化自适应,这是我们想要的效果

    优点

    vw为内置视口单位,可直接使用。

    缺点

    在实际的业务场景中,将设计稿的尺寸转化为vw相对麻烦

    黄金
    使用 百分比+padding,这里有一个很细的知识点;当padding、margin取值为百分比时,百分比的值是以父元素的width为参考。

    <div class="padding"></div>
    
    .padding {
        width: 20%;
        padding-top: 20%;
        /* padding-top或padding-bottom都可以 */
        background: #696969;
    }
    ```
    我们给盒子的宽度设置20%,使用的padding的纵轴将盒子高度撑开,这样便得到了一个自适应正方形。
    细心的小伙伴会发现,现在是个自适应正方形没错了,但是高度被占满了,内容没地方放了。 是的,当前只是一个正方形;在实际业务场景中,内部不是图片就是其他内容,不止需要一个正方形的。
    
    解决办法:再嵌套一层内容盒子,外层方形盒为相对定位,内层内容盒为绝对定位;内层盒宽高基于外层方形盒,代码如下
    ```
    <div class="box-wrap">
        <div class="box-content">我是内容区域</div>
    </div>
    
    .box-wrap {
        position: relative;
        width: 20%;
        padding-top: 20%;
    }
    
    .box-content {
        position: absolute;
        width: 100%;
        height: 100%;
        top: 0;
        left: 0;
        z-index: 1;
        background: burlywood;
    }
    ```
    .box-content类为内容盒,我们可以在内容盒里为所欲为还原设计稿了。
    
    若方形区域只需要展示图片,同理如下
    ```
    <div class="box-wrap">
        <img src="./img/A.webp" alt="">
    </div>
    
    .box-wrap {
        position: relative;
        width: 20%;
        padding-top: 20%;
    }
    
    .box-wrap > img {
        position: absolute;
        width: 100%;
        height: 100%;
        top: 0;
        left: 0;
        z-index: 1;
        object-fit: cover;
    }
    ```
    这里我们就实现了一个自适应方形图片了。
    
    ### 优点
    无需其他配置,设置灵活,扩展性强。
    
    ### 缺点
    需要额外嵌套一层内容盒(个人拙见)
    
    钻石
    顾名思义,它很腻害;他就是css属性aspect-ratio
    
    **aspect-ratio MDN文档**[1]
    
    aspect-ratio,简言之就是宽高比。多说无益,上代码
    ```
    <div class="box-square">我是内容</div>
    
    .box-square {
        aspect-ratio: 1 / 1;
        /* aspect-ratio: 1; 可简写 */
        width: 20%;
        background: chocolate;
    }
    ```
    一个属性,自适应正方形就OK啦;属性再好,也得看兼容性和浏览器支持。
    ![image.png](https://img.haomeiwen.com/i2367697/187ebca428f7a94d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    #### 优点
    
    属性通俗易懂,无需其他配置,无需嵌套内容盒。
    
    #### 缺点
    
    唯一缺点就是兼容性了,2023年了该支持的基本都支持上了,此事古难全!
    
    ## 活学活用
    
    至此,知识点应该都掌握了吧;让我们来实现一个真实的业务需求,如图
    
    ![image.png](https://img.haomeiwen.com/i2367697/c07b0d5be3aaecc0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
    
    实现这个布局,假设总宽1000px,商品卡片左右间距12px,布局要求自适应+响应式。
    
    ### 百分比+padding实现
    ```
    <main>
        <div class="shop">
            <div class="shop-img"><img src="./img/A.webp" alt=""></div>
            <div class="shop-title">这是小黎测试的文字区域,实际运用一下百分比+padding实现自适应方形布局。</div>
        </div>
        <div class="shop">
            <div class="shop-img"><img src="./img/A.webp" alt=""></div>
            <div class="shop-title">这是小黎测试的文字区域,实际运用一下百分比+padding实现自适应方形布局。</div>
        </div>
        <div class="shop">
            <div class="shop-img"><img src="./img/A.webp" alt=""></div>
            <div class="shop-title">这是小黎测试的文字区域,实际运用一下百分比+padding实现自适应方形布局。</div>
        </div>
        <div class="shop">
            <div class="shop-img"><img src="./img/A.webp" alt=""></div>
            <div class="shop-title">这是小黎测试的文字区域,实际运用一下百分比+padding实现自适应方形布局。</div>
        </div>
    </main>
    ```
    
    ```
    main {
        max-width: 1000px;
        margin: 0 auto;
        padding: 0 12px;
        display: flex;
        align-items: center;
        justify-content: space-between;
        flex-wrap: wrap;
    
        .shop {
            width: calc(25% - 9px);
            box-shadow: 0 0 8px #0002;
            border-radius: 4px;
            overflow: hidden;
    
            .shop-img {
                position: relative;
                width: 100%;
                padding-top: 100%;
    
                > img {
                    position: absolute;
                    width: 100%;
                    height: 100%;
                    top: 0;
                    left: 0;
                    z-index: 1;
                    object-fit: cover;
                }
            }
    
            .shop-title {
                padding: 8px;
                font-size: 14px;
                color: #232323;
            }
        }
    }
    
    @media only screen and (max-width: 768px) {
        main {
    
            .shop {
                width: calc(50% - 6px);
                margin-bottom: 12px;
            }
        }
    }
    ```
    ![image.png](https://img.haomeiwen.com/i2367697/a5c03540c5c05122.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    ### aspect-ratio实现
    使用aspect-ratio了属性,我们可以少嵌套一个外层方形盒
    ```
    <main>
        <div class="shop">
            <img src="./img/A.webp" alt="">
            <div class="shop-title">这是小黎测试的文字区域,实际运用aspect-ratio实现自适应方形布局。</div>
        </div>
        <div class="shop">
            <img src="./img/A.webp" alt="">
            <div class="shop-title">这是小黎测试的文字区域,实际运用aspect-ratio实现自适应方形布局。</div>
        </div>
        <div class="shop">
            <img src="./img/A.webp" alt="">
            <div class="shop-title">这是小黎测试的文字区域,实际运用aspect-ratio实现自适应方形布局。</div>
        </div>
        <div class="shop">
            <img src="./img/A.webp" alt="">
            <div class="shop-title">这是小黎测试的文字区域,实际运用aspect-ratio实现自适应方形布局。</div>
        </div>
    </main>
    ```
    样式基本不变,改一下图片相关的部分。
    ```
    main {
        max-width: 1000px;
        margin: 0 auto;
        padding: 0 12px;
        display: flex;
        align-items: center;
        justify-content: space-between;
        flex-wrap: wrap;
    
        .shop {
            width: calc(25% - 9px);
            box-shadow: 0 0 8px #0002;
            border-radius: 4px;
            overflow: hidden;
    
            > img {
                width: 100%;
                aspect-ratio: 1;
                object-fit: cover;
            }
    
            .shop-title {
                padding: 8px;
                font-size: 14px;
                color: #232323;
            }
        }
    }
    
    @media only screen and (max-width: 768px) {
        main {
            .shop {
                width: calc(50% - 6px);
                margin-bottom: 12px;
            }
        }
    }
    ```
    来看看效果
    ![image.png](https://img.haomeiwen.com/i2367697/017d25f7b622857e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    ### 扩展
    在实际业务中,应用到的布局不止正方形,也有长方形、圆形等。
    
    我们再来看个需求——UI规定图片区域宽高比为4:3,给的图片也是4:3。
    
    一般情况我们的方案是:设置好图片宽度,高度自适应就OK了。这样做相对简便,但也会存在一些问题;比如图片宽高比并不是4:3,或多或少,又或者传的图不规整;这样会导致我们的页面布局不可控,所谓失之毫厘谬以千里。
    
    这时候就牵扯到了代码健壮性和可扩展性,作为前端开发个人觉得页面应该有良好的用户体验,而不是调教用户。接下来我分别用百分比+padding、aspect-ratio等方案来实现该业务场景。
    
    借用方形示例,这里我就只贴关键代码
    
    ### 百分比+padding实现
    ```
    main {
        .shop {
            .shop-img {
                width: 100%;
                padding-top: 75%;
            }
        }
    }
    ```
    ### aspect-ratio实现
    ```
    main {
        .shop {
            > img {
                width: 100%;
                aspect-ratio: 4 / 3;
                object-fit: cover;
            }
        }
    }
    ```
    ![image.png](https://img.haomeiwen.com/i2367697/64d88c1597a2d4b1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
    转自:作者:采黎
    https://juejin.cn/post/7204485623461691450
    

    相关文章

      网友评论

          本文标题:CSS自适应正方形

          本文链接:https://www.haomeiwen.com/subject/kkafsdtx.html