Vue下實現(xiàn)CSS3 Grid圖片瀑布流

前言

瀑布流在如今的桌面端和手機端非常常見,在2023年的今天,CSS3 Grid布局已經(jīng)非常成熟,可以放心使用,因此我們來試試使用Grid來實現(xiàn)瀑布流。

原理

動態(tài)給每個單元格設(shè)置grid-row即可。

注意事項

  1. 本方案的核心就是grid-row,本范例只考慮了圖片是單元格里的唯一元素,如果你的單元格有更復(fù)雜的內(nèi)容,你需要想辦法計算正確的grid-row

  2. 圖片作為單元格內(nèi)唯一元素的話,后端接口應(yīng)當傳遞圖片的寬和高,這就要求圖片上傳的時候就儲存下寬和高,否則的話,需要前端動態(tài)計算圖片寬高,就很沒有必要了。但是,本范例也演示了前端如何獲取圖片寬和高。

  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;

// 假設(shè)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;

// 假設(shè)手機屏幕打算顯示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;

// 如果你要在平板上有合理的顯示效果,你應(yīng)該添加更多的變量和@media規(guī)則,但本范例不再舉例

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>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、概述 網(wǎng)格布局(Grid)是最強大的 CSS 布局方案。 它將網(wǎng)頁劃分成一個個網(wǎng)格,可以任意組合不同的網(wǎng)格,做...
    為光pig閱讀 662評論 0 13
  • CSS Grid 網(wǎng)格布局教程 作者: 阮一峰 一、概述 網(wǎng)格布局(Grid)是最強大的 CSS 布局方案。 它將...
    Daeeman閱讀 1,181評論 0 2
  • 一、概述 網(wǎng)格布局(Grid)是最強大的 CSS 布局方案。 它將網(wǎng)頁劃分成一個個網(wǎng)格,可以任意組合不同的網(wǎng)格,做...
    硅谷干貨閱讀 546評論 0 14
  • 一、概述 網(wǎng)格布局(Grid)是最強大的 CSS 布局方案。 它將網(wǎng)頁劃分成一個個網(wǎng)格,可以任意組合不同的網(wǎng)格,做...
    小邊_leo閱讀 378評論 0 1
  • 簡介 CSS Grid Layout(下文稱 “Grid”)是一個非常強大的雙維度布局方式,目的在于消除之前通...
    阿湯哥的鼎閱讀 1,438評論 0 0

友情鏈接更多精彩內(nèi)容