css自学框架之图片懒加载

news2024/11/21 0:25:09

首先解释一下什么叫图片懒加载。图片懒加载是一种在页面加载时,延迟加载图片资源的技术,也就是说图片资源在需要的时候才会加载,就是在屏幕显示范围内加载图片,屏幕显示范围外图片不加载。

一、关键函数

用到的关键函数:globalThis.IntersectionObserver。

var observer = new IntersectionObserver(callback,options);

IntersectionObserver两个参数:

  1. callback是当被监听元素的可见性变化时,触发的回调函数。一般会调用两次:一次是目标元素刚刚进入视口(开始可见),另一次是完全离开视口(开始不可见)。
  2. options是一个配置参数,可选,有默认的属性值

官方的示例代码

var observer = new IntersectionObserver(changes => {
    for (const change of changes) {
        console.log(change.time);
        // Timestamp when the change occurred
        // 当可视状态变化时,状态发送改变的时间戳
        // 对比时间为,实例化的时间,
        // 比如,值为1000时,表示在IntersectionObserver实例化的1秒钟之后,触发该元素的可视性变化

        console.log(change.rootBounds);
        // Unclipped area of root
        // 根元素的矩形区域信息,即为getBoundingClientRect方法返回的值

        console.log(change.boundingClientRect);
        // target.boundingClientRect()
        // 目标元素的矩形区域的信息

        console.log(change.intersectionRect);
        // boundingClientRect, clipped by its containing block ancestors,
        // and intersected with rootBounds
        // 目标元素与视口(或根元素)的交叉区域的信息

        console.log(change.intersectionRatio);
        // Ratio of intersectionRect area to boundingClientRect area
        // 目标元素的可见比例,即intersectionRect占boundingClientRect的比例,
        // 完全可见时为1,完全不可见时小于等于0

        console.log(change.target);
        // the Element target
        // 被观察的目标元素,是一个 DOM 节点对象
        // 当前可视区域正在变化的元素

    }
}, {});

// Watch for intersection events on a specific target Element.
// 对元素target添加监听,当target元素变化时,就会触发上述的回调
observer.observe(target);

// Stop watching for intersection events on a specific target Element.
// 移除一个监听,移除之后,target元素的可视区域变化,将不再触发前面的回调函数
observer.unobserve(target);

// Stop observing threshold events on all target elements.
// 停止所有的监听
observer.disconnect();
在这里插入代码片

下面开始实现我们的图片懒加载。

二、Javascript关键代码如下:

lazy: function() {
			var action ={
				setFront:function(item){
					if(item.boundingClientRect.top<=window.innerHeight+100){						
						var img = new Image();
						img.src = item.target.link;
						img.onload = function(){
						item.target.setAttribute("myth-lazy","finished");
						
						item.target.src=item.target.link;
						};
						obs.unobserve(item.target);
					}				
				}
			};
			if(globalThis.IntersectionObserver)
			{
				var obs = new IntersectionObserver(function(changes){
					changes.forEach(function(t){
						action.setFront(t);
					});	
				});
			this.each(function(item){
				item.link = item.getAttribute("myth-thumb")||item.getAttribute("myth-original");
				if(!item.getAttribute("myth-lazy")) obs.observe(item);
			})
			}
		}

这里说明一下,这段代码是嫁到我们以前js框架myth.js中的,想看完整结构的在文章末尾下载相关代码。

二、HTML代码如下:

<div class="mythBox mid">
		<img class="imglazy"  src="img/loading.gif" myth-original="img/1.png"/>
		<img class="imglazy"   src="img/loading.gif" myth-original="img/2.png"/>
		<img class="imglazy"   src="img/loading.gif" myth-original="img/3.png"/>
		<img class="imglazy"   src="img/loading.gif" myth-original="img/4.png"/>
		<img class="imglazy"   src="img/loading.gif" myth-original="img/3.png"/>
		<img class="imglazy"  src="img/loading.gif" myth-original="img/1.png"/>
		<img class="imglazy"   src="img/loading.gif" myth-original="img/2.png"/>
		<img class="imglazy"   src="img/loading.gif" myth-original="img/3.png"/>
		<img class="imglazy"   src="img/loading.gif" myth-original="img/4.png"/>
		<img class="imglazy"   src="img/loading.gif" myth-original="img/2.png"/>
	</div>	
		<script type="text/javascript">					
			myth(".imglazy").lazy(true);					
		</script>

三、展示效果

请添加图片描述
请添加图片描述
第二张图,下面的代码能清楚的看到,展示在用户的部分图片已经展示,未在用户视野范围内的图片还没有展示,指示原来的替代图片。

四、代码下载

源代码下载:请单击

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1010832.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pinctrl子系统_02_使用Pinctrl要掌握的重要概念

本节说明使用Pinctrl子系统时&#xff0c;要掌握的重要概念。 上节我们说到&#xff0c;我们通过Pinctrl子系统来控制设备的引脚&#xff0c;但实际上&#xff0c;大多数芯片都没有一个单独的Pinctrl。引脚的复用、配置等操作&#xff0c;实际上是在GPIO子系统内部实现的。 但…

Centos nginx配置文档

1、安装nginx: yum install nginx 2、Nginx常用命令 查看版本:nginx -v 启动:nginx -c /etc/nginx/nginx.conf 重新加载配置:nginx -s reload 停止:nginx -s stop 3、Nginx反向代理配置 nginx配置详解 1、Nginx配置图 详情可以查看:http://nginx.org/ru/docs/example…

ES6 什么是模板字符串?

模板字符串是一种在编程中用于创建字符串的特殊语法形式&#xff0c;通常用于动态生成包含变量或表达式的文本。它们在许多编程语言中都有类似的实现&#xff0c;但语法可能会有所不同。 在JavaScript中&#xff0c;模板字符串是由反引号 (backtick) 包围的字符串&#xff0c…

Python 环境搭建,集成开发环境IDE: PyCharm

Python 环境搭建,集成开发环境IDE: PyCharm 一、Python 环境搭建二、Python下载三、Python安装四、环境变量配置五、Python 环境变量六、运行Python1、交互式解释器&#xff1a;2、命令行脚本3、集成开发环境&#xff08;IDE&#xff1a;Integrated Development Environment&am…

day13面向对象进阶

面向对象进阶部分学习方法&#xff1a; 特点&#xff1a; ​ 逻辑性没有那么强&#xff0c;但是概念会比较多。 ​ 记忆部分重要的概念&#xff0c;理解课堂上讲解的需要大家掌握的概念&#xff0c;多多练习代码。 day13 今日内容 复习回顾static关键字继承 教学目标 能…

《中国数字经济发展指数报告(2023年)》发布

导读 国家统计局《数字经济及其核心产业统计分类(2021)》首次对数字经济及其核心产业统计分类做出详细说明。然而&#xff0c;由于数字经济内涵外延的不断丰富&#xff0c;区域数字经济发展的量化评估仍在持续发展的过程中&#xff0c;以量化模型方式能够更加客观全面反映新时…

9.14 C++作业

仿照vector手动实现自己的myVector&#xff0c;最主要实现二倍扩容功能 #include <iostream>using namespace std;template <typename T> class Myvector {T *data; //存储数据的数组int len; //当前数组的长度int mycapa; //容纳数据的总容量public://…

MyVector 的实现

myVector #include <iostream> #include <vector>int size20;using namespace std;template <typename type> class myvector {int size;type value;type *arr;public://无参构造myvector(){};//有参构造myvector(int s,type v):size(s),value(v){arrnew in…

uni-app:通过三目运算动态增加样式效果

效果 代码 第一条&#xff1a;当变量line的值等于abc时&#xff0c;class就等于yes,反之class等于no&#xff08;显然等于abc&#xff0c;执行yes,前景色为红色&#xff09; 第一条&#xff1a;当变量line1的值等于abc时&#xff0c;class就等于yes,反之class等于no&#xff…

Hyper-V 安装 CentOS (二)

总目录 https://preparedata.blog.csdn.net/article/details/132877836 文章目录 总目录一、Hyper-V 创建centos的虚拟机实例二、虚拟机安装Centos ISO镜像三、重启后&#xff0c;进入系统 一、Hyper-V 创建centos的虚拟机实例 网络连接先不选择&#xff0c;后面文章专门配置网…

界面控件DevExpress WinForms HTML-CSS模板:预设计UI模板加速.NET应用开发

在过去的一年里&#xff0c;DevExpress官方引入了两个强大的功能来加速/简化.NET桌面应用的开发&#xff0c;当一起使用时&#xff0c;您可以创建优雅/个性化的用户界面&#xff0c;减少重复的代码&#xff0c;从而节省更多的项目时间。 DevExpress WinForms有180组件和UI库&am…

Spark集成hudi创建表报错

环境描述: hudi版本:0.13.1 spark版本:3.3.2 Hive版本:3.1.3 Hadoop版本:3.3.4 问题1: 描述:按照官方文档运行spark-sql创建spark的hudi表报错 建表语句: CREATE TABLE stg.spark_mor_test_01 (uuid string,name string,age int,ts …

数据结构-leetcode-移除元素

int removeElement(int* nums, int numsSize, int val){int start0;int end0;int flag0;for(int i 0;i<numsSize;i){if(nums[end]val){end;flag;}else if(nums[end]!val){nums[start]nums[end];end;start;}}return numsSize-flag; } 注&#xff1a;时间复杂度为O(N)&#xf…

pnpm基础教程

一、概述 1、更小 使用 npm 时&#xff0c;依赖每次被不同的项目使用&#xff0c;都会重复安装一次。 而在使用 pnpm 时&#xff0c;依赖会被存储在内容可寻址的存储中。 2、更快 依赖解析。 仓库中没有的依赖都被识别并获取到仓库。目录结构计算。 node_modules 目录结构是…

自动化测试(五):自动化测试框架的搭建和基于yaml热加载的测试用例的设计

该部分是对自动化测试专栏前四篇的一个补充&#xff0c;本次参考以下文章实现一个完整的谷歌翻译接口自动化测试:   [1]【python小脚本】Yaml配置文件动态加载   [2]【python做接口测试的学习记录day8——pytest自动化测试框架之热加载和断言封装】 目标&#xff1a;框架封…

ARM架构-伪指令、伪操作、ATPCS协议

汇编中的符号&#xff1a; 1.指令&#xff1a;能够编译生成一条32位的机器码且能被CPU识别和执行 2.伪指令&#xff1a;本身不是指令&#xff0c;编译器可以将其替换成若千条指令 3.伪操作:不会生成代码&#xff0c;只是在编译阶段告诉编译器怎么编译&#xff08;例如&#x…

如何利用软文推广进行SEO优化(打造优质软文,提升网站排名)

在当今的互联网时代&#xff0c;SEO优化成为了网站推广的关键。而软文推广作为一种有效的推广方式&#xff0c;其优点不仅仅局限于SEO&#xff0c;还可以带来更多的曝光和用户流量。本文将深入探讨如何做好软文推广&#xff0c;从而提升网站排名和流量。 了解目标受众群体 内容…

【MySQL】基础SQL语句——库的操作

文章目录 一. 创建数据库1.1 基础语句1.2 字符集和校验规则1.3 校验规则对读取数据的影响 二. 查看数据库三. 修改数据库四. 删除数据库及备份4.1 删除4.2 备份和还原 结束语 一. 创建数据库 1.1 基础语句 最简洁的创建数据库的SQL语句是&#xff1a; create database db_nam…

iOS 使用陀螺仪实现裸眼3d效果

直接上完整代码 // // BannerView.m // Test // // Created by liubo on 2023/7/20. //#import "LB3DBannerView.h" #import <Masonry/Masonry.h> #import <CoreMotion/CoreMotion.h>interface LB3DBannerView (){CGFloat maxOffset;CGFloat lastGra…

新增动态排序图、桑基图、AntV组合图,DataEase开源数据可视化分析平台v1.18.10发布

2023年9月14日&#xff0c;DataEase开源数据可视化分析平台正式发布v1.18.10版本。 这一版本的功能升级包括&#xff1a;数据集方面&#xff0c;对字段管理的后台保存做了相关优化&#xff0c;降低了资源消耗&#xff1b;仪表板方面&#xff0c;对联动、查询结果以及过滤组件等…