【CSS】---- 根据【张鑫旭-高宽不等图片固定比例布局的三重进化】的思考

前言

今天突然看到了张鑫旭大佬2023年写的《CSS高宽不等图片固定比例布局的三重进化》,从最开始的百分比padding到flex和aspect-ratio配合,最后使用container-type: inline-size和cqw配合实现,发现遇到相同的情况和我们现在实现的不同,于是就自己实现了一下。

效果

1. 基础的HTML结构

复制代码
<div class="box">
  <img src="http://image.zhangxinxu.com/image/study/s/hanyun.jpg"/>
  <img src="http://image.zhangxinxu.com/image/study/s/s512/mm1.jpg"/>
  <img src="http://image.zhangxinxu.com/image/study/s/s512/mm5.jpg"/>
  <img src="http://image.zhangxinxu.com/image/study/s/s512/mm2.jpg"/>
  <img src="http://image.zhangxinxu.com/image/study/s/s512/mm3.jpg"/>
  <img src="http://image.zhangxinxu.com/image/study/s/s512/mm4.jpg"/>
</div>

2. 使用flex实现

2.1 实现代码
复制代码
.box{
  width: 400px;
  display: flex;
  gap: 0.5rem;
  flex-wrap: wrap;
}
.box img{
  width: calc(25% - 1.5rem / 4);
  aspect-ratio: 1;
  object-fit: cover;
}
  1. 可以看到在 img 的宽度时,还是需要通过 calc 函数进行计算,这里的1.5rem其实就是 gap 是 0.5rem,四张图片之间存在三个空隙,所以总宽度就是 0.5rem * 3 = 1.5rem;然后这个空隙需要四张图片来平分,所以除以 4,计算出最后宽度,高度没有进行计算,直接使用的是 aspect-ratio。

  2. 当然这里你也可以使用 container-type: inline-size和cqw 实现,只是需要将 % 换成 cqw。

    .box{
    width: 400px;
    display: flex;
    gap: 0.5rem;
    flex-wrap: wrap;
    container-type: inline-size;
    }
    .box img{
    width: calc(25cqw - 1.5rem / 4);
    aspect-ratio: 1;
    object-fit: cover;
    }

  3. 可以到这些方法都是需要进行计算的,感觉比较麻烦,如何进行不计算,就能实现呢?我想到了 grid。

2.2 查看效果

flex 实现效果

3. 使用 grid 实现

3.1 实现代码
复制代码
.box{
  width: 400px;
  display: grid;
  gap: 0.5rem;
  grid-template-columns: repeat(4, 1fr);
}
.box img{
  width: 100%;
  aspect-ratio: 1;
  object-fit: cover;
}
3.2 查看效果

grid 实现效果

4. 总结

  1. 通过 CSS高宽不等图片固定比例布局的三重进化,可以看到从最开始的浮动布局使用padding,到最后的 cqw,使用的CSS代码是越来越少,实现相同的效果。
  2. 现在我们实现使用 grid 布局后,连原来计算图片的宽度都省掉,发现CSS让我们越来越方便;
  3. CSS 的进化让我想起前两天看到的一个属性,以前的瀑布流布局,需要在每天加一个元素,计算高度,但是现在直接两行CSS就能解决,不用再使用那么多JS去获取、计算、比较,可见CSS都是让我们的开发越来越简单,代码越来越简洁的。
相关推荐
ℋᙚᵐⁱᒻᵉ鲸落3 小时前
移动端滑动手势冲突:overflow: auto导致外层横向滑动失效
前端·javascript·css·vue.js·html
默_笙4 小时前
🎃 前端学了 Next.js,后端该学啥?NestJS 就是 Node 版的蜜雪冰城
前端·javascript
前端snow5 小时前
ai agent --- 实现 openclaw 定时间效果
前端
码云之上6 小时前
换模型之后,Chatbot 为什么要自己做 compact?
前端·agent·前端工程化
星栈6 小时前
自定义 UI-UX-Pro-Max 的 CSV 知识库,把 AI 生成的后台拉回行业该有的样子
前端·agent·weui
研☆香6 小时前
简单的图片上传 删除 预览
前端
ITresearchGuest6 小时前
我用 AI 一小时写了一个世界杯数据可视化平台|前端 VibeCoding 初体验
前端·人工智能·信息可视化
慧一居士7 小时前
Vite项目中使用Less步骤,详细使用示例
前端·css
花间相见8 小时前
【LangChain组件03】—— LangChain Agents 执行与状态:工作流程与状态管理实战
java·前端·langchain
kyriewen8 小时前
面试官让我用 AI 重构一个 8 年陈的 React 组件——他说他不看代码,只看我会不会拆
前端·javascript·面试