编程 一个简单的瀑布流布局实现方法,使用Vue3和Vite技术

2024-11-19 09:50:45 +0800 CST views 706

一个简单的瀑布流布局实现方法,使用Vue3和Vite技术

背景

在工作中,我们常常需要实现瀑布流布局。今天,我将分享一个简单的实现方法,供大家参考。

技术

  • Vue 3
  • Vite

HTML

<template>
  <div>
    <button @click="addCard">增加</button>
    <div class="card">
      <div class="card-list"
           v-waterfall
           v-for="(item,index) in list" 
           :key="index"
           :style="{backgroundColor:item.color,height:item.height}">
        <p class="text"> {{ index }} </p>
      </div>
    </div>
  </div>
</template>

CSS

注意:由于在JS中使用了transform,所以需要设置定位。

.card {
  position: relative;
  display: flex;
  flex-wrap: wrap;
  width: 700px;
}
.card-list {
  position: absolute;
  width: 200px;
}

JS

实现逻辑

  1. 声明一个高度数组,保存每列的高度。
  2. 获取最小高度的位置,方便定位。
  3. 自定义指令:v-waterfall,在mounted中获取DOM元素。
import { onMounted, ref, nextTick } from "vue";

const list = ref([
  {color:'#76da6e', height:'100px'},
  {color:'#40a988', height:'70px'},
  {color:'#2384c4', height:'120px'},
  {color:'#106ba3', height:'80px'},
  {color:'#0a589e', height:'110px'},
  {color:'#0a4e98', height:'90px'},
  {color:'#09408c', height:'100px'},
  {color:'#083680', height:'130px'},
]);
const tabulationHeights = ref([0, 0, 0, 0]);

const updateLayout = (el) => {
  const columns = getMinTabulationHeight(tabulationHeights.value);
  const top = tabulationHeights.value[columns];
  const left = columns * el.clientWidth;
  el.style.transform = `translate(${left}px,${top}px)`;
  tabulationHeights.value[columns] += el.offsetHeight;
}

const getMinTabulationHeight = (arr) => {
  let min = Math.min(...arr);
  return arr.indexOf(min) !== -1 ? arr.indexOf(min) : 0;
}

const vWaterfall = {
  mounted: (el) => {
    updateLayout(el);
  },
  updated: (el) => {
    // updateLayout(el);
  }
}

// 增加卡片
const addCard = () => {
  const height = Math.floor(Math.random() * 50 + 100);
  const color = '#' + Math.floor(Math.random() * 16777215).toString(16);
  list.value.push({color, height: height + 'px'});
}

问题与处理

有朋友可能会问:列表之间肯定不会没有间隔吧?这很简单。如果要封装一个组件,只需传递一个GAP值,参与计算即可:

const updateLayout = (el) => {
  const columns = getMinTabulationHeight(tabulationHeights.value);
  const top = tabulationHeights.value[columns] + 20; // 加上间隔
  const left = (columns * el.clientWidth) + (columns * 20); // 加上间隔
  el.style.transform = `translate(${left}px,${top}px)`;
  tabulationHeights.value[columns] += el.offsetHeight + 20; // 更新高度
}

总结

以上只是一个简单的模板,大家可以在此基础上进行优化,以满足自己的需求。今天的分享就到这里,如果觉得不错,请收藏这个源码库,后续会更新插件库!

复制全文 生成海报 前端开发 Web设计 Vue框架

推荐文章

npm速度过慢的解决办法
2024-11-19 10:10:39 +0800 CST
JavaScript设计模式:装饰器模式
2024-11-19 06:05:51 +0800 CST
Vue3中的Scoped Slots有什么改变?
2024-11-17 13:50:01 +0800 CST
Rust 并发执行异步操作
2024-11-18 13:32:18 +0800 CST
使用 node-ssh 实现自动化部署
2024-11-18 20:06:21 +0800 CST
Nginx 防盗链配置
2024-11-19 07:52:58 +0800 CST
html一个全屏背景视频
2024-11-18 00:48:20 +0800 CST
Vue3中如何处理异步操作?
2024-11-19 04:06:07 +0800 CST
Vue 3 中的 Watch 实现及最佳实践
2024-11-18 22:18:40 +0800 CST
Vue3中如何处理组件间的动画?
2024-11-17 04:54:49 +0800 CST
Elasticsearch 条件查询
2024-11-19 06:50:24 +0800 CST
手机导航效果
2024-11-19 07:53:16 +0800 CST
css模拟了MacBook的外观
2024-11-18 14:07:40 +0800 CST
Vue中的`key`属性有什么作用?
2024-11-17 11:49:45 +0800 CST
Vue3 结合 Driver.js 实现新手指引
2024-11-18 19:30:14 +0800 CST
软件定制开发流程
2024-11-19 05:52:28 +0800 CST
deepcopy一个Go语言的深拷贝工具库
2024-11-18 18:17:40 +0800 CST
基于Flask实现后台权限管理系统
2024-11-19 09:53:09 +0800 CST
MySQL设置和开启慢查询
2024-11-19 03:09:43 +0800 CST
在Rust项目中使用SQLite数据库
2024-11-19 08:48:00 +0800 CST
JavaScript 的模板字符串
2024-11-18 22:44:09 +0800 CST
使用 Go Embed
2024-11-19 02:54:20 +0800 CST
程序员茄子在线接单