美文网首页
Vue下实现CSS3 Grid图片瀑布流

Vue下实现CSS3 Grid图片瀑布流

作者: microkof | 来源:发表于2023-04-03 01:04 被阅读0次

前言

瀑布流在如今的桌面端和手机端非常常见,在2023年的今天,CSS3 Grid布局已经非常成熟,可以放心使用,因此我们来试试使用Grid来实现瀑布流。

原理

动态给每个单元格设置grid-row即可。

注意事项

  1. 本方案的核心就是grid-row,本范例只考虑了图片是单元格里的唯一元素,如果你的单元格有更复杂的内容,你需要想办法计算正确的grid-row

  2. 图片作为单元格内唯一元素的话,后端接口应当传递图片的宽和高,这就要求图片上传的时候就储存下宽和高,否则的话,需要前端动态计算图片宽高,就很没有必要了。但是,本范例也演示了前端如何获取图片宽和高。

  3. 想要运行范例代码,你需要在/assets/目录存放19张图片,命名从1.jpg到19.jpg。

全部代码

<template>
  <div v-if="show" id="waterfall-container">
    <div
      v-for="item in imgList"
      :key="item"
      class="waterfall-item"
      :style="{ gridRow: item.gridRow }"
    >
      <img :src="item.src" />
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      imgList: [...Array(19 - 1 + 1).keys()].map((e) => {
        return {
          id: e + 1,
          src: require("@/assets/" + (e + 1) + ".jpg"),
          height: 0,
          gridRow: "",
        };
      }),
      show: false,
    };
  },
  created() {
    this.computeGridRow();
  },
  methods: {
    computeGridRow() {
      let count = this.imgList.length;
      this.imgList.forEach((img) => {
        let image = new Image();
        image.src = img.src;
        image.onload = () => {
          img.gridRow =
            "auto / span " + Math.round((image.height * 200) / image.width);
          count -= 1;
          if (!count) {
            this.show = true;
          }
        };
      });
    },
  },
};
</script>

<style lang="scss">
$root-font-size: 10px;
$grid-gap: 1.6rem;

// 假设1920px屏幕打算显示6列
$column-count-1920: 6;
// 这里采用1900px是因为要排掉滚动条宽度,通常是17px,这里多排除一些,所以1920px减掉20px
$minmax-1920: (
    (1900px / $root-font-size) * 1rem - ($grid-gap * ($column-count-1920 + 1))
  ) / $column-count-1920;

// 假设手机屏幕打算显示2列
$column-count-480: 2;
// 480的意思是目前世界上最大的手机分辨率宽度是低于480px,
// 所以@media screen and (max-device-width: 480px)使用480px。
// 这里采用360px是保证360px的老式手机依然能看到双列瀑布流
$minmax-480: (
    (360px / $root-font-size) * 1rem - ($grid-gap * ($column-count-480 + 1))
  ) / $column-count-480;

// 如果你要在平板上有合理的显示效果,你应该添加更多的变量和@media规则,但本范例不再举例

html {
  font-size: $root-font-size;
}

body {
  margin: 0;
}

#waterfall-container {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax($minmax-1920, 1fr));
  column-gap: $grid-gap;
  box-sizing: border-box;
  margin: 0 auto;
  padding: $grid-gap;
  max-width: (1920px / $root-font-size) * 1rem;

  .waterfall-item {
    box-sizing: border-box;
    padding-bottom: $grid-gap;
    width: 100%;
    height: 100%;
    transition: all 0.3s;
    cursor: pointer;

    img {
      width: 100%;
      height: 100%;
    }
  }
}

@media screen and (max-device-width: 480px) {
  #waterfall-container {
    grid-template-columns: repeat(auto-fill, minmax($minmax-480, 1fr));
  }
}
</style>

相关文章

  • grid 布局实现瀑布流

    1. Grid布局是最强大的 CSS 布局方案。 它将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的...

  • 7. 多列

    1. 多列的效果 说明:在CSS3中,可以创建多列来对文本或者区域进行布局。 2. 使用多列实现瀑布流效果 瀑布流...

  • vue图片瀑布流组件

    使用 TheWaterfall.vue

  • 纯css3瀑布流布局

    CSS3瀑布流 /*大层*/ .container{wi...

  • 瀑布流,css3实现和js实现

    Multi-columns方式 纯CSS实现瀑布流要用到Css3多列属性,通过它相关的属性column-count...

  • vue-waterfall-easy 图片显示不出来

    用vue-waterfall-easy 插件写一个瀑布流,图片都能加载正常,但是页面上就是不显示图片,后来查证发现...

  • 优化

    Fresco和 RecyclerView 实现瀑布流 <图片是用本地图片来模拟网络图片的> Fresco之强大之余...

  • 图片瀑布流

    使用CSS3中的多列完成瀑布流 HTML CSS 展示:

  • 瀑布流布局 的学习

    1- 实现瀑布流布局效果 瀑布流效果瀑布流代码木桶布局效果木桶布局代码瀑布流布局 2- 实现一个新闻瀑布流新闻...

  • swift实现瀑布流

    类似瀑布流的使用场景很多. 实现瀑布流的关键节点: 实现cell的高度不同且没有规则的展示 这里整理实现瀑布流思路...

网友评论

      本文标题:Vue下实现CSS3 Grid图片瀑布流

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