vue自定义指令 - v-load

2023-11-04


前言

懒加载是一种网页性能优化的方式,它能极大的提升用户体验。图片一直是影响网页性能的主要元凶,现在一张图片超过几兆已经是很经常的事了。如果每次进入页面就请求所有的图片资源,那么可能等图片加载出来用户也早就走了。所以进入页面的时候,只请求可视区域的图片资源。

减少资源的加载,页面启动只加载首屏的图片,这样能明显减少了服务器的压力和流量,也能够减小浏览器的负担。

原理

图片懒加载的原理就是初始化时不设置图片的 src 属性,不进行加载,等当前图片到了可视区域再将图片真实的 url 放进 src 属性里面,从而实现图片的延迟加载。

实现方法

一、注册指令

  1. 创建 lazy.js:
export default {
  inserted (el) {
    console.log(el);
  }
}

打印结果:

在这里插入图片描述

  1. 在 main.js 引入并创建自定义指令:
import lazy from './directives/lazy.js'

Vue.directive('lazy', lazy)
  1. 对需要懒加载的图片使用该指令:
<template>
  <div class="hello">
	...
    <div>
      <img src="../assets/img/1.png" alt="" v-lazy>
    </div>
    <div>
      <img src="../assets/img/2.png" alt="" v-lazy>
    </div>
    <div>
      <img src="../assets/img/3.png" alt="" v-lazy>
    </div>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld'
}
</script>

二、实现指令逻辑

lazy.js:使用 IntersectionObserver 实现元素观察。

export default {
  inserted (el) {
    // 将img的src属性设置为空,初始化不进行加载
    const imgSrc = el.src
    el.src = ''

    // 观察者
    const observer = new IntersectionObserver(([{isIntersecting}]) => {
      /*
      * 元素进入可视区域 和 离开可视区域被 触发
      * 元素进入可视区域:isIntersecting === true
      * 元素离开可视区域:isIntersecting === false
      * */
      if (isIntersecting) {
        // 加载图片
        el.src = imgSrc
        // 停止观察
        observer.unobserve(el)
      }
    })

    observer.observe(el)
  }
}

三、页面效果

初始化:
在这里插入图片描述

图片进入可视范围内:

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue自定义指令 - v-load 的相关文章

  • Google 饼图未显示所有数据行

    我正在尝试绘制人口与国家名称的关系图 我发现 Google 可视化库仅渲染前几个 实际上数字似乎是随机的 具体取决于我使用的数据 有时添加 其他 条目 但它没有t 实际上具有其余条目的值 Example 1 With all countri
  • 零作为 IIFE 中的第一个参数[重复]

    这个问题在这里已经有答案了 In babeljs v6 5 1 class Foo 编译为 use strict var classCallCheck2 require babel runtime helpers classCallChec
  • 使用 NodeJS 让 Discord 机器人发送带有消息的图片

    我有几张照片 全部在 imgur 上 带有直接图像链接 格式 https i imgur com XXXXXX jpg https i imgur com XXXXXX jpg 以及用 NodeJS 制作的 Discord 机器人 我发送这
  • Three.js - 在代码中包含网格数据

    我有这个 Three js 代码 其中 JSON 加载器从文件 models mountain json 加载网格 var Three new function this scene new THREE Scene this camera
  • jQuery 的 css() 在应用于滚动事件时滞后

    我正在尝试实现一个简单的 固定标题 表 我知道这在理论上只能用 CSS 来完成 但是当涉及到 OSX Lion 及其消失的滚动条时 它效果不佳 所以我用 jQuery 来做 方法很简单 只有1 5行代码 inbox scroll funct
  • ngModel.$parsers 忽略 ng-model 值末尾的空格

    我有这样的指令 directive noWhitespace parse function parse return restrict A require ngModel link function scope element attrs
  • 是否可以将反应组件导出为非反应项目中的函数

    有没有办法在非 React 项目中将 React 组件导出为函数并传入 props 作为函数的参数 我最近用 create react app 完成了一个 React 项目 现在我想将它用于其他非 React 项目 纯 Javascript
  • 向对象添加元素

    我需要填充一个 json 文件 现在我有这样的东西 element id 10 quantity 1 我需要添加另一个 元素 我的第一步是使用该 json 将该 json 放入对象类型中cart JSON parse 现在我需要添加新元素
  • 具有行组的 JQuery 斑马条纹表

    我通常将斑马条纹表行设置为奇数 偶数 如下所示 效果很好 table tbody tr visible even this addClass even table tbody tr visible odd this addClass odd
  • 光滑的轮播缓动示例

    我正在使用 Slick Carousel http kenwheeler github io slick http kenwheeler github io slick 但不知道如何合并不同的幻灯片切换 有人有例子可以分享吗 这是我目前拥有
  • JQuery DataTable 单元格从行单击

    我正在尝试在 jquery 数据表上实现一个函数 该函数返回单击行的第一列和第四列 我正在遵循这个示例 它允许我操作单击的行http datatables net examples api select single row html ht
  • 点击问题:动态生成的链接不触发点击功能

    下面是两个代码片段 由于某种原因什么也没有发生 但来自同一个 JS 文件的其他 jQuery 函数在带有 UL 的页面上执行得很好 这是在盯着我看吗 ul class paganation li 1 li li a href 2 a li
  • 在 vue.js 模板中包含外部脚本

    我是 Vue js 和 web pack 的新手 所以我决定使用 vue cli webpack 来构建初始应用程序 我试图包含一个外部脚本 例如组件 不需要的模板中 但是 Vue 警告这是不允许的 我的 index html 文件与最初生
  • 空 URL 哈希导致页面在 js 事件上跳转

    我有一个带有下一个和上一个按钮的照片库 如果我的某个 javascript 方法由于某种原因被破坏 那么当单击其中一个按钮时 它会向 url 添加一个哈希值 即 www google com 我知道可以给散列一个 div id 来跳转到页面
  • 使用 onBlur 事件上的值更新 React 输入文本字段

    我有以下输入字段 在模糊时 该函数调用服务来更新服务器的输入值 完成后 它会更新输入字段 我怎样才能让它发挥作用 我可以理解为什么它不允许我更改字段 但我能做些什么才能使其工作 我无法使用defaultValue因为我会将这些字段更改为其他
  • Javascript 选择 onchange='this.form.submit()'

    我有一个带有选择和一些文本输入的表单 我希望在更改选择时提交表单 使用以下方法可以正常工作 onchange this form submit 但是 如果表单还包含提交按钮 则当选择更改时 表单不会提交 我猜有某种冲突 我在这里有什么选择
  • 常规 JavaScript 可以与 jQuery 混合使用吗?

    例如 我可以采用这个脚本 来自 Mozilla 教程 https developer mozilla org en Canvas tutorial Basic usage
  • Laravel 使用 laravel-cors 和 axios 进行 POST 的“CSRF 令牌不匹配”

    我有一个正在运行的domain A拉拉维尔 5 8返回 API 的引擎网络路线 它必须检查来源才能只服务几个域 包括domain B Barryvdh laravel cors我安装了barryvdh laravel cors https
  • 使用 jquery 提供附加功能时菜单未正确对齐

    I need to make a mega menu similar to one as show in image below 到目前为止 我已经能够在某种程度上使其发挥作用 例如jsFiddle 在这里 http jsfiddle ne
  • 使用 Lodash 将对象键转换为具有键值数量的数组[重复]

    这个问题在这里已经有答案了 我有一个产品对象 products bread 1 milk 2 cheese 2 chicken 1 我想要一个包含产品名称的数组 如下所示 products bread milk milk cheese ch

随机推荐

  • 【JDBC】使用DBUtils包来管理JDBC

    什么是DBUtils 是JDBC的简化开发工具包 使用它就不用再写很多冗余的代码了 总而言之 就是使得JDBC的操作更加的简单化了 文章目录 为啥要用DBUtils QueryRunner类 使用的数据库 注册驱动并建立起连接 update
  • ping 不通百度问题的解决

    ping 不通百度问题的解决 问题 网络能够ping通百度的ip地址 115 239 210 27这个ip地址 但是ping www baidu com长时间等待无反应 解决方式 碰到这个问题两次了 每次都挺无奈的 第一次解决是通过回退快照
  • 记录:ubuntu18下使用karlibr标定zed双目相机

    一 karlibr的安装 1 安装依赖 sudo apt get install python setuptools python rosinstall ipython libeigen3 dev libboost all dev doxy
  • Python3 面向对象(22)

    Python3 面向对象 Python从设计之初就已经是一门面向对象的语言 正因为如此 在Python中创建一个类和对象是很容易的 本章节我们将详细介绍Python的面向对象编程 如果你以前没有接触过面向对象的编程语言 那你可能需要先了解一
  • JAVA 相关书籍推荐(全)

    一 软件质量 1 代码整洁之道 the clean coder 2 重构 3 clean coder 代码整洁之道 4 编写可读代码的艺术 5 Effective Java 6 架构整洁之道 7 阿里巴巴 Java 开发手册 8 effec
  • 【扩散模型】3、Stable Diffusion 原型

    文章目录 一 背景 二 方法 2 1 感知图像压缩 2 2 潜在扩散模型 2 3 条件机制 三 实验 论文 High Resolution Image Synthesis with Latent Diffusion Models 代码 ht
  • i5 11300h和R5 5600H 参数对比哪个好

    酷睿i5 11300H配置为4个内核及8个线程 具备8MB的L3缓存和5MB的L2缓存 基础频率3 10GHz最高睿频4 40GHz Intel的显卡将集成Xe GPU内核 至于TDP i5 11300H TDP为35W 最高可配置为45W
  • jupyter的简单配置和使用

    更改jupyter文件目录 在应用当中需要输入anaconda prompt找到该命令窗口 会默认打开C盘 此时需要我们输入D 这里需要注意的是后面的冒号也要输入 还有就是d 和D 都是可以的 输入jupyter notebook就可以打开
  • yml配置,简化代码优化不必要的麻烦

    安全平台url security private url 1 getCustomerUrl 2 addCustomerUrl 3 editCustomerUrl 4 appId 5 appKey 6 appSecret 7 代码引用
  • MYSQL——分组

    1 group by 1 group by的含义 将查询结果按照1个或多个字段进 分组 字段值相同的为 组 2 group by可 于单个字段分组 也可 于多个字段分组 根据gender字段来分组 gender字段的全部值有4个 男 中性
  • 前端制作科技感网页登录界面

    注 如需背景图请联系作者 QQ 3416252112 效果图 源码
  • flutter图片点击跳转_Flutter 你需要知道的那些事 01

    公众号 AndroidTraveler 首发 1 width 属性 对于设置控件宽度填充父控件这件事情 在 Android 里面 只需要设置 MATCH PARENT 即可 但是在 Flutter 里面却不是这样 因为 Flutter 要具
  • Nginx学习研究-Docker安装Nginx 实现反向代理

    Docker安装Nginx 实现反向代理 为了安全考虑 我们一般会设置反向代理 用来屏蔽应用程序真实的IP和端口号 在Linux系统上最常用的反向代理就是Nginx 一 Nginx 安装部署 1 下载 nginx 镜像 docker pul
  • Windows统计分析进程流量工具AppNetworkCounter

    下载地址 link AppNetworkCounter是一个用于Windows的简单工具 它统计并显示系统上每个应用程序发送和接收的TCP UDP字节数和数据包数 对于每个应用程序 将显示以下信息 发送和接收字节数 发送和接收数据包数 发送
  • 用汇编语言实现从键盘输入一个字符,输出其对应的ASCII码

    Hello 大家好呀 这是本人的第一篇博客 这学期正好在学汇编语言 上周老师布置了一个作业 用汇编语言实现从键盘输入一个字符 输出其对应的ASCII码 说实话 这个问题最开始的时候令我不知从何下手 明明用c语言只需要几行代码 用汇编来实现却
  • GB 9706.1-2020和GB9706.1-2007对照表

    GB 9706 1 2020和GB9706 1 2007对照表 目录 GB 9706 1 2020和GB9706 1 2007对照表 新版GB 9706 1 2020标准基本情况及主要变化 pptx 原创力文档 关于发布GB 9706 1新
  • 自用工具 猴子都会用的UNITY文件浏览器(浏览文件夹)

    获取插件 效果图 支持按名称排序 按类别排序 关键词搜索 提供的接口 Vector3 最后UI位置 方便定做滑动菜单定位首尾 Bool 是否开启类别排序 可以重写该布尔值来达成切换排序方式的功能 Bool 刷新 调用这个布尔值可以刷新本插件
  • SOC基本知识

    1 什么是soc SOC称为系统级芯片 也称片上芯片 是一个专有目标的集成电路的产品 其中包括完整系统并有嵌入软件的全部内容 目前SOC更多的集成处理器 包括CPU GPU DSP 存储器 基带 各种接口控制模块 各种互联总线等 其典型代表
  • 解决问题记录7:kettle9.1在mysql中生成资源库问题

    使用kettle9 1在mysql生成资源库时 遇到了个问题 问题产生及解决步骤如下 1 kettle主页右上角没有 connect 下拉选项 解决方式一 删除下图路径下的repositories文件 然后重启kettle就可以了 解决方式
  • vue自定义指令 - v-load

    vue自定义指令 v load 前言 原理 实现方法 一 注册指令 二 实现指令逻辑 三 页面效果 前言 懒加载是一种网页性能优化的方式 它能极大的提升用户体验 图片一直是影响网页性能的主要元凶 现在一张图片超过几兆已经是很经常的事了 如果