vue实现瀑布流效果

2 篇文章 0 订阅
1 篇文章 0 订阅

一、介绍

瀑布流,又称为瀑布流布局。是比较流行的一种网页展示形式,在视觉上表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部。即多行等宽元素排列,后面的元素依次添加到其后,等宽不等高,根据图片原比例缩放直至宽度达到我们的要求,依次按照规则放入指定位置。

二、布局原理

等宽不等高的图片排列,从第二行开始,图片插入的位置根据上一行插入图片得最低处依次插入,最终形成参差不齐的布局效果。

三、具体实现

这里是根据移动端项目实现(两栏效果)

<template>
  <div class="waterfall-container" >
    <div v-for="(item, index) in list" :key="index" class="list">
      <div
        v-for="(it, key) in item"
        :key="key"
        class="item"
        :style="{ height: `${it.itemHeight}rem` }"
      >
        <img
          class="cover"
          :key="it.thumb_path"
          src="https://img1.halobear.com/upload_page/FvZmzzPmEhvRzE7ThqyrjcSZXAg_.png"
          v-lazy="it.thumb_path"
          :style="{ height: `${it.imageHeight}rem` }"
        />
      </div>
    </div>
  </div>
</template>

<script>
export default {
  props: {
    data: {
      type: Array,
      default: () => []
    },
  },
  data() {
    return {
      index: 0
    };
  },
  computed: {
    list() {
      let leftHeight = 0;
      // let middleHeight = 0;
      let rightHeight = 0;
      const leftData = [];
      // const middleData = [];
      const rightData = [];
      this.data.forEach(item => {
        const w = item.width || item.cover_width;
        const h = item.height || item.cover_height;
        if (!item.imageHeight) {
          item.imageHeight = (((h || 100) / (w || 100)) * 324) / 100;
        }
        // if (Math.min(leftHeight, middleHeight, rightHeight) == leftHeight) {
        //   leftHeight += item.imageHeight;
        //   leftData.push(item);
        // } else if (
        //   Math.min(leftHeight, middleHeight, rightHeight) == middleHeight
        // ) {
        //   middleHeight += item.imageHeight;
        //   middleData.push(item);
        // } else {
        //   rightHeight += item.imageHeight;
        //   rightData.push(item);
        // }
        
        if (leftHeight <= rightHeight) {
          leftHeight += item.imageHeight;
          leftData.push(item);
        } else {
          rightHeight += item.imageHeight;
          rightData.push(item);
        }
      });
      return [leftData, rightData];
      // return [leftData, middleData, rightData];
    }
  },
};
</script>

<style lang="less" scoped>
.waterfall-container {
  display: flex;
  justify-content: space-between;
  padding: 0 30px 40px;
  .list {
    width: 339px;
  }
  .item {
    display: block;
    width: 100%;
    margin-bottom: 0.12rem;
  }
  .cover {
    width: 100%;
    background: block;
    border-radius: 6px;
    background: #f0f2f5;
    opacity: 0.5;
  }
  .fadeIn {
    transition: all 1s;
    opacity: 1;
  }
}
</style>

四、实现效果

在这里插入图片描述

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3是一种行的JavaScript框架,用于构建用户界面。要现瀑布布局,可以使用Vue3的响应式数据和计算属性来动态计算每个元素的位置。 以下是一种实现瀑布布局方法: 1. 创建一个Vue组件,于展示瀑布布局的元素。 2. 在组件中定义响应式数组,用于存储要展示的元素。 3. 使用Vue 3的计算属性来计算每个元素的位置。可以使用CSS的flexbox或grid布局来实现瀑布效果。 4. 在模板中使用v-for指令遍历元素数组,并使用动态绑定样式来设置每个元素的位置。 5. 当需要添加新的元素时,可以通过修改元素数组来触发重新计算布局。 下面是一个简单的示例代码: ```html <template> <div class="waterfall"> <div v-for="(item, index) in items" :key="index" :style="{ top: item.top + 'px', left: item.left + 'px' }"> <!-- 元素内容 --> </div> </div> </template> <script> import { reactive, computed } from 'vue'; export default { data() { return { items: [ // 元素数据 ] }; }, computed: { layoutItems() { const columnCount = 3; // 列数 const columnWidth = 200; // 列宽度 const gap = 10; // 元素间隔 // 计算每个元素的位置 return this.items.map((item, index) => { const columnIndex = index % columnCount; const left = columnIndex * (columnWidth + gap); const top = this.getColumnHeight(columnIndex) + gap; return { ...item, left, top }; }); } }, methods: { getColumnHeight(columnIndex) { // 计算指定列的高度 // 可以根据实际情况自行实现 } } }; </script> <style> .waterfall { display: flex; flex-wrap: wrap; } </style> ``` 这是一个简单的瀑布布局的实现示例。你可以根据实际需求进行调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值