美文网首页
浅谈vue中的瀑布流-懒加载用法

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

作者: 云高风轻 | 来源:发表于2021-11-08 22:24 被阅读0次

1. 前言

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


2. 是什么 what

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

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


3. 应用场景

图文混排的网站


1.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的指令


参考资料

react懒加载


初心

我所有的文章都只是基于入门,初步的了解;是自己的知识体系梳理;
如果能帮助到有缘人,非常的荣幸,一切为了部落的崛起;
共勉

相关文章

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

    1. 前言 瀑布流是非常流行的一种布局方式,所以今天来玩下 2. 是什么 what 瀑布流,又称瀑布流式布局[ht...

  • vue—插件

    1.懒加载 vue-lazyload 2.滚动瀑布流插件 vue-infinite-scroll 3.一个简单易用...

  • 新闻瀑布流懒加载

    新闻瀑布流懒加载效果 代码

  • 常用效果(瀑布流.懒加载.木桶布局)

    瀑布流.木桶.新闻页懒加载demogif

  • 懒加载、瀑布流

    懒加载 懒加载是通过延迟加载不可见元素,提升网页性能,减少同一时间服务器请求的一种方式。当用户滚动当前页面时再去自...

  • 懒加载和瀑布流的原理

    瀑布流-新浪新闻 瀑布流项目结合懒加载预览地址 懒加载原理 为了防止页面一次性向服务器发送大量请求,导致服务器响应...

  • 懒加载和瀑布流

    懒加载机制和瀑布流结合 预览链接预览链接 懒加载原理 懒加载的目的是为了加快对资源的请求,减少请求的时间,减少用户...

  • 前端一些工具

    图片懒加载 lazyloadhttps://github.com/tuupola/jq... 瀑布流 Masonr...

  • 瀑布流与懒加载

    什么是图片的滚动加载 当访问一个页面的时候,先把img元素或是其他元素的背景图片路径替换成一个1*1大小的图片路径...

  • 懒加载和瀑布流

    1.懒加载 原理 先将页面中的img元素的路径(src)设置为同一张图片的路径,当访问这个页面时,一开始只需要加载...

网友评论

      本文标题:浅谈vue中的瀑布流-懒加载用法

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