实现微信朋友圈图片布局

写在前面

除了常见的3列的朋友圈图片格式,发一张图和四张图的朋友圈,布局确实又有点不同,一时兴起想实现下。

思路

我们可以观察到的是:除了一张和四张图片的情况,其他图片都是规规矩矩得在3 X 3表格中找到自己的位置,那么我们只要对一张和四张图片进行特殊处理。

1 张图片

一张图片是任性的,它不受正方形的约束,按原比例完完整整得展示自己全部得宽高,但是,真的这么随心所欲吗?我测试了宽高比低和宽高比高的如下两种情况

原来宽度也是在约束之中的,不会超过3列 情况下2列 + 1*边距的范围,这么看来高度貌似更为自由,我们再把图片裁细试试?

好的,看来高度确实是自由的。

人生的宽度是有限的,高度是无限的 这或许是微信设计师想告诉我们的道理

好了,让我们进入正题

具体方法

效果图

先贴下完整代码(直接复制粘贴即可运行)

html 复制代码
<!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>
    html, body, div, img {
      padding: 0;
      margin: 0;
      border: 0;
    }
    .main {
      width: 100vw;
      height: 100vh;
      display: flex;
      justify-content: center;
      flex-direction: column;
    }
    .album {
      margin: 0 auto;
      width: 30.2vw;
      background-color: #f9f9f9;
      display: flex;
      flex-wrap: wrap;
    }
    .album img {
      width: 10vw;
      height: 10vw;
      object-fit: cover;
      display: block;
      margin-top: 0.1vw;
    }
    .album img:not(:nth-child(3n)) {
      margin-right: 0.1vw;
    }
    .album img:nth-child(1), .album img:nth-child(2), .album img:nth-child(3) {
      margin-top: 0;
    }
    .album img:only-child {
      width: initial;
      height: initial;
      max-width: 20.1vw;
    }
    .album img:nth-child(2):nth-last-child(3) {
      margin-right: 10.1vw;
    }
    .album img:nth-child(3):nth-last-child(2) {
      margin-right: 0.1vw;
      margin-top: 0.1vw;
    }
    .item {
      display: flex;
      margin: 10px auto;
    }
    .item div {
      width: 20px;
      height: 20px;
      line-height: 20px;
      text-align: center;
      margin: 10px;
      padding: 10px;
      background-color: #2a82e4;
      color: #fff;
      cursor: pointer;
    }
  </style>
</head>
<body>
<div id="app" class="main">
  <div class="item">
    <div v-for="item in arr" @click="handleChange(item)">
      {{item}}
    </div>
  </div>
  <div class="album">
    <img v-for="(image, index) in images" :src="image.src" :key="index" alt="">
  </div>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
<script>
  new Vue({
    el: '#app',
    data: {
      image: { 
          src: 'https://img1.baidu.com/it/u=2205560513,2700243422&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=500' 
      },
      images: [],
      arr: ['1', '2', '3', '4', '5', '6', '7', '8', '9']
    },
    methods: {
      handleChange(item) {
        let arr = [];
        for(let i = 0; i < item; i++) {
          arr.push(this.image);
        }
        this.images = arr;
      }
    }
  });
</script>
</body>
</html>

边距、图片放缩等

css 复制代码
.album img {
  width: 10vw;
  height: 10vw;
  object-fit: cover;
  display: block;
  margin-top: 0.1vw;
}
.album img:not(:nth-child(3n)) {
  margin-right: 0.1vw;
}
.album img:nth-child(1), .album img:nth-child(2), .album img:nth-child(3) {
  margin-top: 0;
}
  • object-fit: cover;是截取图片符合比例的部分,不失真
  • 将img设置为display: block;是为了去除图片元素自带的外边距,当然也有其他方法
  • .album img:not(:nth-child(3n))选中的是除了第3列之外的元素,只有它们有右边距
  • .album img:nth-child(1), .album img:nth-child(2), .album img:nth-child(3)选中的是第一行的元素,只有它们没有上边距

1 张图片

css 复制代码
.album img:only-child {
  width: initial;
  height: initial;
  max-width: 20.1vw;
}
  • .album img:only-child只针对只有一张图片的情况下起作用
  • 宽高保持原比例,但是限制了最大宽度

4 张图片

css 复制代码
.album img:nth-child(2):nth-last-child(3) {
  margin-right: 10.1vw;
}
.album img:nth-child(3):nth-last-child(2) {
  margin-right: 0.1vw;
  margin-top: 0.1vw;
}
  • .album img:nth-child(2):nth-last-child(3)的意思是元素为顺数第2个 且为倒数第3个 ,只有图片个数为4的情况可以满足
  • 通过加大margin-right来实现第二张图片的换行效果

More

你可以在object-fit - CSS:层叠样式表 | MDN (mozilla.org)找到更多关于object-fit的相关内容

相关推荐
康小汪6 小时前
AI 写 Vue 总写成同一个味道:给它装 Skills,装的不是知识是边界
前端·vue.js·人工智能·ai编程·最佳实践
智能运维指南6 小时前
研制过程“两张皮“怎么破:研制一体化支撑平台的定位、能力边界与落地前提
java·前端·人工智能·嘉为蓝鲸
白山编程大哥8 小时前
Java 后端如何优雅地把 List 集合返回给前端
java·前端·list
Flynt9 小时前
我把热榜那篇"禁用 axios"逐条实测了一遍:结论大体对,坑在它没讲的地方
前端·javascript·axios
Csvn9 小时前
bundle优化
前端
北冥有鱼10 小时前
发版后动态路由点击报 `Failed to fetch dynamically imported module`」问题上的完整排查与修复过程
前端·vue.js
静默回滚10 小时前
视频压到 25 MB 以内,码率要算、音轨要扣、余量要留
前端
用户372037492601810 小时前
把 10MB 中文语义模型塞进浏览器:STSB 做到教师模型的 93%,但线上 top1 只有 42%
前端
光锥智能10 小时前
海康机器人举行2026移动机器人新品发布会:箱式存拣升级,「明智」系列发布
java·前端·机器人
计算机魔术师10 小时前
Anthropic 上市文件最吓人的一幕,不是亏损 807 亿
前端