首页 > 其他分享 >#yyds干货盘点#前端图片懒加载

#yyds干货盘点#前端图片懒加载

时间:2022-10-19 17:00:49浏览次数:51  
标签:el yyds binding 加载 干货 imgs src 图片

前端性能优化里有图片的加载,有懒加载和预加载。那么什么是懒加载呢?

懒加载也叫做延迟加载、按需加载,指的是在长网页中延迟加载图片数据,是一种较好的网页性能优化的方式。 有的网站图片很多,而如果一上来就加载所有的图片,会导致网页加载很慢

图片懒加载:等图片正式进入到可视区中时,才加载对应的图片,否则不请求图片

预加载指的是将所需的资源提前请求加载到本地,这样后面在需要用到时就直接从缓存取资源。通过预加载能够减少用户的等待时间,提高用户的体验。我了解的预加载的最常用的方式是使用 js 中的 image 对象,通过为 image 对象来设置 scr 属性,来实现图片的预加载。


图片懒加载的基本实现

图片的加载是由src引起的,当对src赋值时,浏览器就会请求图片资源。根据这个原理,我们使用HTML5 的data-xxx属性来储存图片的路径,在需要加载图片的时候,将data-xxx中图片的路径赋值给src,这样就实现了图片的按需加载,即懒加载。

注意:data-xxx 中的xxx可以自定义,这里我们使用data-src来定义。

​懒加载的实现重点在于确定用户需要加载哪张图片,在浏览器中,可视区域内的资源就是用户需要的资源。所以当图片出现在可视区域时,获取图片的真实地址并赋值给图片即可。

<div class="container">
<img src="loading.gif" data-src="pic.png">
<img src="loading.gif" data-src="pic.png">
<img src="loading.gif" data-src="pic.png">
<img src="loading.gif" data-src="pic.png">
<img src="loading.gif" data-src="pic.png">
<img src="loading.gif" data-src="pic.png">
</div>
<script>
var imgs = document.querySelectorAll('img');
function lozyLoad(){
var scrollTop = document.body.scrollTop || document.document
Element.scrollTop;
var winHeight= window.innerHeight;
for(var i=0;i < imgs.length;i++){
if(imgs[i].offsetTop < scrollTop + winHeight ){
imgs[i].src = imgs[i].getAttribute('data-src');
}
}
}
window.onscroll = lozyLoad();
</script>

Intersection Observer实现图片懒加载

Intersection Observer是HTML5新增的API,可以用来实现图片懒加载。MDN中对Intersection Observer的解释

​IntersectionObserver​接口 (从属于Intersection Observer API) 提供了一种异步观察目标元素与其祖先元素或顶级文档视窗(viewport)交叉状态的方法。祖先元素与视窗(viewport)被称为根(root)。

当一个IntersectionObserver对象被创建时,其被配置为监听根中一段给定比例的可见区域。一旦IntersectionObserver被创建,则无法更改其配置,所以一个给定的观察者对象只能用来监听可见区域的特定变化值;然而,你可以在同一个观察者对象中配置监听多个目标元素。

这里封装一个组件并且自定义一个v-lazy属性,然后替换到src上,实现懒加载。

import { useIntersectionObserver } from "@vueuse/core";
import defaultImg from '@/assets/images/200.png'
import { App } from 'vue';

export default {
install(app: App) {
// 全局指令
app.directive('lazy', {
// mounted 是 v3 中自定义指令的生命周期,他会被自动调用
// 它表示的含义和组件的mounted是一样的
// el是 dom 元素, binding
mounted(el, binding) {
el.src = defaultImg
console.log('lazy', el, binding.value);

//实时鉴定el是否可见, 如果可见 给它的src设置binding.value
const { stop } = useIntersectionObserver(el, ([{ isIntersecting }]) => {
if (isIntersecting) {
el.src = binding.value

stop()
el.onerror = function () {
el.src = defaultImg
}
}
})

}
})
}
}

标签:el,yyds,binding,加载,干货,imgs,src,图片
From: https://blog.51cto.com/u_11365839/5776081

相关文章

  • 干货分享 | Shader 实现 PPT 转场效果(附源码)
    知乎上看到一位大佬用Shader实现了PPT里面的转场效果,转载大佬的文章,一起围观膜拜一下。原文分为上下两篇,详细阐述了每个效果的实现。上篇:https://zhuanlan.zhihu.com/p/......
  • 超级干货!如何仅花5步就能写出一篇领导绝对满意的数据分析报告
    一篇完整的数据分析报告可能会让你的求职变得更加容易。为什么会这么说?这源于我之前的求职经历。彼时我虽然在工作中经常用数据赋能业务,但这些案例十分的碎片化,没有形成完整......
  • Unity IO 加载图片
    ///<summary>///以IO方式进行加载///</summary>privatevoidLoadByIo(stringurl,GameObjectImageOBJ){//创建文件读取流FileStream......
  • Jetpeck paging3实践(1)——无限加载网页列表数据
    Jetpeckpaging3实践(1)——无限加载网页列表数据一、问题背景抽空研究一下jetpeck相关库的使用,来看一下paging3,话不多说,一步步完成paging3的demo,直接上代码。二、实现方案......
  • 干货 | Elasticsearch 冷热集群架构实战
    Elasticsearch最少必要知识实战教程直播回放0、题记Elasticsearch实战数据量级少的时候,单节点就能玩的很6,但是随着数据量的增长,多节点分布式横向扩展集群是大势所趋。之前......
  • 干货 | Elasitcsearch7.X集群、索引备份与恢复实战
    Elasticsearch最少必要知识实战教程直播回放1、问题引出ES中文社区中,有如下问题:问题1:存储数据,data目录从一个机器直接移到一台新的机器是否可以直接使用?问题2:es升级时,data......
  • 干货 | Elasticsearch基础但非常有用的功能之二:模板
    Elasticsearch最少必要知识实战教程直播回放1、引言业务场景1:数据量非常大,需要进行索引生命周期管理,按日期划分索引,要求多个索引的Mapping一致,每次手动创建或者脚本创......
  • 干货 | Elasticsearch 索引设计实战指南
    题记随着Elastic的上市,ELKStack不仅在BAT的大公司得到长足的发展,而且在各个中小公司都得到非常广泛的应用,甚至连“婚庆网站”都开始使用Elasticsearch了。随之而来......
  • 干货 | Elasticsearch开发人员最佳实战指南
    Elasticsearch最少必要知识实战教程直播回放题记几个月以来,我一直在记录自己开发Elasticsearch应用程序的最佳实践。本文梳理的内容试图传达Java的某些思想,我相信其同样......
  • #yyds干货盘点#前端优化之压缩
    前端文件的压缩主要是资源图片以及js和css压缩,今天分享一下vue项目中的文件压缩方法。压缩js和css如果你使用的是webpackv5或更高版本,是开箱机带的功能,但是你的webpack是......