懒加载的实现

简介: 懒加载的实现
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        p {
   
            height: 10vh;
        }
    </style>
</head>
<body>
    <p>LOREM IPSUM DOLOR SIT AMET...</p>
    <p>LOREM IPSUM DOLOR SIT AMET...</p>
    <p>LOREM IPSUM DOLOR SIT AMET...</p>
    <p>LOREM IPSUM DOLOR SIT AMET...</p>
    <p>LOREM IPSUM DOLOR SIT AMET...</p>
    <p>LOREM IPSUM DOLOR SIT AMET...</p>
    <p>LOREM IPSUM DOLOR SIT AMET...</p>
    <p>LOREM IPSUM DOLOR SIT AMET...</p>
    <p>LOREM IPSUM DOLOR SIT AMET...</p>

    <img data-src="home-banner.png" alt="">
    <img data-src="home-banner1.jpg" alt="">
    <img data-src="home-banner2.jpg" alt="">

    <p>LOREM IPSUM DOLOR SIT AMET...</p>
    <p>LOREM IPSUM DOLOR SIT AMET...</p>
    <p>LOREM IPSUM DOLOR SIT AMET...</p>
    <script>
        const images = document.querySelectorAll('img')
        const callback = entry => {
   
            entry.forEach(entry => {
   
                if (entry.isIntersecting) {
   
                    const image = entry.target;
                    const data_src = image.getAttribute("data-src");
                    image.setAttribute("src", data_src);
                    observer.unobserve(image);
                    console.log("触发");
                }
            })
        }
        const observer = new IntersectionObserver(callback);
        images.forEach(image => {
   
            observer.observe(image)
        })
    </script>
</body>
</html>

步骤1:
image.png
步骤2:
image.png
步骤3:
image.png

  • getAttribute()方法介绍
    elementNode.getAttribute(name):获取节点的属性,name是属性名称,比如ID,title,value等的值。

  • setAttribute()方法介绍
    elementNode.setAttribute(name,value):增加一个指定名称和值得新属性,或者把一个现有的属性设定为指定的值。name:要设置的属性名。value:要设置的属性值。

setAttribute()方法和getAttribute()方法经常一起使用达到操作目的。
如代码:
const data_src = image.getAttribute("data-src");
image.setAttribute("src", data_src);

  • IntersectionObserver概念
    IntersectionObserver接口(从属于Intersection Observer API)为开发者提供了一种可以异步监听目标元素与其祖先或视窗(viewport)交叉状态的手段。祖先元素与视窗(viewport)被称为根(root)。
    intersectionRatio和isIntersecting是用来判断元素是否可见的
目录
相关文章
|
12天前
|
设计模式 人工智能 数据可视化
测试用例复用率低?Dify工作流+知识库,把测试经验沉淀为可复用的资产
在软件测试中,用例复用率低、经验难传承是常见痛点。本文介绍如何利用Dify的工作流与知识库功能,将分散的测试经验沉淀为可复用的团队资产。通过构建智能生成应用,实现基于需求描述自动产出结构化测试用例,大幅提升效率与覆盖率,推动测试工作从“手工劳作”迈向“智能工业化”。
|
10月前
|
Python
用Pygame Zero 画矩形 (空心、实心、多个矩形、多层同心矩形、彩虹条矩形、条纹相间、随机颜色矩形、特殊效果、渐变效果)
用Pygame Zero 画矩形 (空心、实心、多个矩形、多层同心矩形、彩虹条矩形、条纹相间、随机颜色矩形、特殊效果、渐变效果)
291 40
|
Java Maven Spring
Java Web 应用中,资源文件的位置和加载方式
在Java Web应用中,资源文件如配置文件、静态文件等通常放置在特定目录下,如WEB-INF或classes。通过类加载器或Servlet上下文路径可实现资源的加载与访问。正确管理资源位置与加载方式对应用的稳定性和可维护性至关重要。
364 7
|
监控 数据安全/隐私保护 UED
数字版权管理
【10月更文挑战第30天】数字版权管理
491 4
|
前端开发 安全 关系型数据库
秒合约系统/开发模式规则/技术架构实现
秒合约系统是一种高频交易平台,支持快速交易、双向持仓和高杠杆。系统涵盖用户注册登录、合约创建与编辑、自动执行、状态记录、提醒通知、搜索筛选、安全权限管理等功能。交易规则明确,设有价格限制和强平机制,确保风险可控。技术架构采用高并发后端语言、关系型数据库和前端框架,通过智能合约实现自动化交易,确保安全性和用户体验。
|
安全 网络协议 Java
Java 网络编程详解
《Java网络编程详解》深入浅出地讲解了使用Java进行网络编程的技术和方法。从基础的网络协议介绍到核心的Socket编程,以及高级的NIO与多线程应用,帮助读者全面掌握Java网络编程技能,是Java开发者不可或缺的学习指南。
474 8
|
SQL 数据采集 存储
"揭秘SQL Server中REPLACE函数的神奇力量!一键替换字符串,解锁数据处理的无限可能,你还在等什么?"
【8月更文挑战第20天】SQL Server 的 REPLACE 函数是处理字符串的强大工具,用于在查询中替换字符串的部分内容。基本语法为 `REPLACE(string_expression, string_pattern, string_replacement)`。例如,可将员工邮箱从 `@example.com` 替换为 `@newdomain.com`。支持多级嵌套替换与变量结合使用,适用于动态生成查询。注意大小写敏感性及全局替换特性。掌握 REPLACE 函数能有效提升数据处理能力。
740 0
|
存储 SQL 监控
SLS新版告警自助排查系列之告警监控
在SLS告警中,告警监控通过对数据源的查询监控,然后产生告警,并将告警发送到告警管理,告警管理会对告警进行降噪处理包括合并抑制静默后,在将告警发送给行动管理,最终发送通知到用户配置的接收渠道。在整个过程中,告警监控作为告警的源头,决定着告警是否能准确的发出。在配置告警监控规则时,配置不当或者配置错误都会导致告警不能触发或者不是希望的触发。本文主要介绍在告警监控中如何进行自助排查问题。
893 0
|
数据安全/隐私保护
Saltstack极速入门
Saltstack极速入门
428 0
RFM用户分层模型|原理+Python全流程实现
详细解读如何使用RFM模型进行用户分层(附代码)
RFM用户分层模型|原理+Python全流程实现