浅谈vue中的瀑布流-懒加载用法

简介: 瀑布流是非常流行的一种布局方式,所以今天来玩下

1. 前言


瀑布流是非常流行的一种布局方式,所以今天来玩下


2. 是什么 what


瀑布流,又称瀑布流式布局。是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部。最早采用此布局的网站是Pinterest,逐渐在国内流行开来。国内大多数清新站基本为这类风格

哈哈以上文字摘抄自百度百科


3. 应用场景


图文混排的网站

AEBZVQX~M12XG}FPM@9MUBD.png



4. 环境安装


需要的数据可以自己去爬取


5. 核心思想


多行等宽元素排列,后面的元素依次添加到其后,等宽不等高

根据图片原比例缩放直至宽度达到我们的要求,依次按照规则放入指定位置


6. 直接上代码 html



<div id="app">
        <div class="list">
            <ul class="col" v-for="col in waterFull">
                <li v-for="good in col.goods">
                    <img :style="{height:good.height+'px'}" v-lazy="good.img" alt="">
                    <h3>{{good.author}}</h3>
                </li>
            </ul>
        </div>
    </div>



7. 瀑布流



let app = Vue.createApp({
        data() {
            return {
                list
            }
        },
        computed: {
            waterFull() {
                /*
                    [{
                        h:10,
                        goods:[{},{},{}]
                    },{
                        h:10,
                        goods:[{},{},{}]
                    }]
                */
                let arr = [];//记录每列信息
                for (let i = 0; i < 5; i++) {
                    arr.push({
                        h: 0,//记录每列高度
                        goods: []//记录每列的数据
                    })
                }
                //分配商品      
                this.list.forEach(item => {
                    // 找最低的列
                    arr.sort((a, b) => a.h > b.h ? 1 : -1)
                    // ?w_h=236x334"
                    // 叠加高度
                    let s = item.img.split("=")[1]; //236x334
                    let s2 = s.split("x");          //[236,334]
                    let height = s2[1] / s2[0] * 200;
                    //经过排序最低的列在 第一个位置
                    arr[0].h += height;  // 一列的高度
                    // 记录当前图片高度
                    item.height = height;
                    // 插入元素
                    arr[0].goods.push(item); //一列的数据
                })
                return arr;
            }
        }
    })

list 是我导入的外部数据

其中 图片链接格式为


"img": "https://xx.com/3P_/fw/480/webp?w_h=236x472"

核心在于如何找到当前行最低的那列,这个只能排序 对比


arr.sort((a, b) => a.h > b.h ? 1 : -1)

凡是返回1或者大于0的正数的时候就要交换位置

所以 a.h >b.h的时候要交换位置 也就是1


8.结合懒加载



app.directive("lazy", {
        mounted(el, binding) {
            // 指定占位图
            el.src = "./placeholder.png";
            el.bindingVal = binding.value;
            let timer;
            el.scrollHandler = () => {
                clearTimeout(timer);
                timer = setTimeout(() => {
                    let H = window.innerHeight;
                    let ot = el.offsetTop;
                    let st = document.body.scrollTop || document.documentElement.scrollTop;
                    if (H + st > ot + 200) {
                        // 设置真实路径
                        el.src = el.bindingVal;
                        // 移除事件监听
                        window.removeEventListener("scroll", el.scrollHandler);
                    }
                }, 100)
            }
            el.scrollHandler();//初始检测
            window.addEventListener("scroll", el.scrollHandler);
        },
        updated(el, binding) {
            // 存储新地址
            el.bindingVal = binding.value;
            el.scrollHandler();//初始检测
        }
    })
    app.mount("#app")

具体懒加载思路可以参考react懒加载 ,代码其实都差不多


9. 瀑布流封装成组件



app.component("water-fall",{
        props:["list","col"],
        template:`
            <div class="list">
                <ul class="col" v-for="col in waterFull">
                    <li v-for="good in col.goods">
                        <img :style="{height:good.height+'px'}" v-lazy="good.img"
                            alt="">
                        <h3>{{good.author}}</h3>
                    </li>
                </ul>
            </div>
        `,
        computed: {
            waterFull() {
                let arr = [];//记录每列信息
                for (let i = 0; i < this.col; i++) {
                    arr.push({
                        h: 0,
                        goods: []
                    })
                }
                //分配商品      
                this.list.forEach(item => {
                    // 找最低的列
                    arr.sort((a,b)=>a.h>b.h?1:-1)
                    // 叠加高度
                    let s=item.img.split("=")[1];
                    let s2=s.split("x");
                    let height=s2[1]/s2[0]*200;
                    arr[0].h+=height;
                    // 记录当前图片高度
                    item.height=height;
                    // 插入元素
                    arr[0].goods.push(item);
                })
                return arr;
            }
        }
    })

单文件组件也一样没啥区别

再结合 懒加载的v-lazy的指令




相关文章
|
20天前
|
缓存 JavaScript 前端开发
vue学习第四章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中计算属性的基本与复杂使用、setter/getter、与methods的对比及与侦听器的总结。如果你觉得有用,请关注我,将持续更新更多优质内容!🎉🎉🎉
35 1
vue学习第四章
|
20天前
|
JavaScript 前端开发
vue学习第九章(v-model)
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript与Vue的大一学生,自学前端2年半,正向全栈进发。此篇介绍v-model在不同表单元素中的应用及修饰符的使用,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
28 1
vue学习第九章(v-model)
|
20天前
|
JavaScript 前端开发 开发者
vue学习第十章(组件开发)
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文深入讲解Vue组件的基本使用、全局与局部组件、父子组件通信及数据传递等内容,适合前端开发者学习参考。持续更新中,期待您的关注!🎉🎉🎉
33 1
vue学习第十章(组件开发)
|
25天前
|
JavaScript 前端开发 UED
vue学习第二章
欢迎来到我的博客!我是一名自学了2年半前端的大一学生,熟悉JavaScript与Vue,目前正在向全栈方向发展。如果你从我的博客中有所收获,欢迎关注我,我将持续更新更多优质文章。你的支持是我最大的动力!🎉🎉🎉
39 3
|
25天前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。自学前端2年半,熟悉JavaScript与Vue,正向全栈方向发展。博客内容涵盖Vue基础、列表展示及计数器案例等,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
52 2
|
7月前
|
JavaScript API
【vue实战项目】通用管理系统:api封装、404页
【vue实战项目】通用管理系统:api封装、404页
77 3
|
7月前
|
人工智能 JavaScript 前端开发
毕设项目-基于Springboot和Vue实现蛋糕商城系统(三)
毕设项目-基于Springboot和Vue实现蛋糕商城系统
|
7月前
|
JavaScript Java 关系型数据库
毕设项目-基于Springboot和Vue实现蛋糕商城系统(一)
毕设项目-基于Springboot和Vue实现蛋糕商城系统
186 0
|
7月前
|
JavaScript 前端开发 API
Vue3+Vite+TypeScript常用项目模块详解
现在无论gitee还是github,越来越多的前端开源项目采用Vue3+Vite+TypeScript+Pinia+Elementplus+axios+Sass(css预编译语言等),其中还有各种项目配置比如eslint 校验代码工具配置等等,而我们想要进行前端项目的二次开发,就必须了解会使用这些东西,所以作者写了这篇文章进行简单的介绍。
149 0
Vue3+Vite+TypeScript常用项目模块详解
|
7月前
|
设计模式 JavaScript
探索 Vue Mixin 的世界:如何轻松复用代码并提高项目性能(上)
探索 Vue Mixin 的世界:如何轻松复用代码并提高项目性能(上)
探索 Vue Mixin 的世界:如何轻松复用代码并提高项目性能(上)