当前位置: 首页 > news >正文

vue实现图片懒加载

在src中创建一个directives文件夹在里面创建一个lazy.js文件

在main.js中引入

import lazy from './directives/lazy'

app.directive('lazy', lazy)

在app.vue中

<script setup lang="ts">
import { RouterLink, RouterView } from 'vue-router'
import HelloWorld from './components/HelloWorld.vue'
</script>

<template>

<div class="img-container">
      <!-- src是刚开始没有加载出的图片 data-src是加载后的图片,已经进入显示区域的图片 -->
      <!--  v-lazy 懒加载 将它绑的在每个需要懒加载的图片上 -->
      <img
        v-lazy
       src="https://copyright.bdstatic.com/vcg/creative/cc9c744cf9f7c864889c563cbdeddce6.jpg@h_1280"
        alt=""
        
        class="lazyload"
      />
    </div>
    <div class="img-container">
      <img
      v-lazy
       src="https://inews.gtimg.com/om_bt/OHyQqgC_5oi4Vm0tlH49XvJzqNBHo2Zryxx5F_be5N2cIAA/1000"
        alt=""
      
        class="lazyload"
      />
    </div>

    <div class="img-container">
      <img
      v-lazy
       src="https://inews.gtimg.com/om_bt/OHyQqgC_5oi4Vm0tlH49XvJzqNBHo2Zryxx5F_be5N2cIAA/1000"
        alt=""
       
        class="lazyload"
      />
    </div>

    <div class="img-container">
      <img
      v-lazy
        src="https://inews.gtimg.com/news_bt/OLxGAuCdJ1SwoZRdrZoqGrpBGX-BgYjWnSFuiDDoS3xQsAA/1000"
        alt=""
      
        class="lazyload"
      />
    </div>

    <div class="img-container">
      <img
      v-lazy
       src="https://img.pconline.com.cn/images/upload/upc/tx/itbbs/2101/25/c1/251135935_1611532823091_mthumb.jpg"
        alt=""
       
        class="lazyload"
      />
    </div>

    <div class="img-container">
      <img
      v-lazy
       src="https://img2.baidu.com/it/u=4045137561,4227164018&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=1280"
        alt=""
     
        class="lazyload"
      />
    </div>


  <!-- <RouterView /> -->
</template>

<style scoped>

* {
      margin: 0;
      padding: 0;
      list-style: none;
    }
    .lazyload {
      width: 200px;
      height: 200px;
    }



@media (min-width: 1024px) {
  header {
    display: flex;
    place-items: center;
    padding-right: calc(var(--section-gap) / 2);
  }

  .logo {
    margin: 0 2rem 0 0;
  }

  header .wrapper {
    display: flex;
    place-items: flex-start;
    flex-wrap: wrap;
  }

  nav {
    text-align: left;
    margin-left: -1rem;
    font-size: 1rem;

    padding: 1rem 0;
    margin-top: 1rem;
  }
}
</style>

在lazy.js中

export default {
  //定义了一个 mounted 方法,在相关组件挂载到页面后执行一些操作,参数 el 通常指的是被挂载的元素。
  mounted(el) {
    //查看图片是否被绑的
    // console.log(el,'这个是el');

    //将图片保存在src属性上
    const imgSrc=el.src;
    //el.src=''; 因为直接进入不加载图片,要将图片清空
    el.src='';

    //观察者 观察当前图片是否进入可视区
    const observer = new IntersectionObserver(([{ isIntersecting }]) => {
      
      //元素出现在可视区域,和元素离开可视区域
      console.log("进入可视区域");

      //isIntersecting 是 IntersectionObserverEntry 对象的一个属性,它表示目标元素与根元素是否相交。
      //如果 isIntersecting 的值为 true,则表示目标元素与根元素相交;
      //如果 isIntersecting 的值为 false,则表示目标元素与根元素不相交。

      //图片出现在可视区,和图片离开可视区
      if(isIntersecting){
        // 加载图片
        el.src =imgSrc;
        //停止观察
        observer.unobserve(el);

      }



    });
    //在进行某种观察或监听操作
    observer.observe(el);
  },
};

相关文章:

  • 网络编程——大端序小端序
  • 力扣爆刷第141天之二叉树十连刷(翻转、对称、深度、平衡、路径)
  • 解密Prompt系列15. LLM Agent之数据库应用设计:DIN C3 SQL-Palm BIRD
  • 上海汇正财经官网怎么样?客户好评如潮,口碑赞誉之声不绝于耳
  • 机器学习-6-对随机梯度下降算法SGD的理解
  • R可视化:可直接发表的柱状图
  • 前端面试问题:子组件的某一个方法调用执行逻辑由父组件的属性状态变化来决定
  • 【Godot4.2】Godot中的继承与组合
  • 832. 翻转图像 - 力扣
  • 数码论坛|基于SprinBoot+vue的数码论坛系统(源码+数据库+文档)
  • web自动化的断言和日志封装
  • 计算机体系结构期末快速复习
  • numpy向量的转置与向量相乘
  • 【大模型】 基于AI和全球化进程的权衡:开源大模型与闭源大模型
  • 『大模型笔记』从基础原理出发提升深度学习性能
  • docker部署kafka实战
  • SpringBoot自定义starter
  • 软件无线电学习-第二代移动通信系统过程理解
  • 【计算机网络】第三章——回退N帧协议
  • 上海亚商投顾:沪指震荡反弹 半导体产业链午后爆发
  • 太好玩了!坐进大卫·霍克尼的敞篷车进入他画笔下的四季
  • 非法收受财物逾1648万,湖南原副厅级干部康月林一审被判十年半
  • 见证上海援藏30年成果,萨迦非遗珍品展来沪
  • 扎克伯格怕“错过风口”?Meta AI数字伴侣被允许与未成年人讨论不当话题
  • 多家媒体及网红走进云南曲靖沾益:感受珠江源头
  • 来论|如何看待韩企在美申请“饺子”专利