Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
CSS怎样实现图片懒加载?intersection observer应用_创想鸟

CSS怎样实现图片懒加载?intersection observer应用

答案是使用intersection observer实现图片懒加载。1. 用data-src属性存放真实图片地址,src指向占位图;2. 通过javascript创建intersection observer实例,监听图片元素进入视口的状态;3. 当元素进入视口(配合rootmargin提前加载)时,将data-src的值赋给src,触发图片加载,并停止观察该元素;4. 对不支持的浏览器降级处理,直接加载图片。该方案避免了scroll事件导致的性能问题,利用浏览器原生异步机制,提升页面流畅度和用户体验,且可扩展应用于无限滚动、广告曝光、动画触发等多种场景,是当前最优雅高效的解决方案。

CSS怎样实现图片懒加载?intersection observer应用

图片懒加载,尤其是在现代前端开发中,早已不是什么新鲜事,但如何优雅高效地实现它,却是个值得深思的问题。我的答案很简单:用

Intersection Observer

。它几乎是目前最现代、性能最优的解决方案,能让你的页面在用户体验和加载速度上都迈上一个新台阶。

解决方案

实现图片懒加载,核心思路就是让图片在进入用户视口之前不加载,或者只加载一个轻量级的占位符。

Intersection Observer

API 提供了浏览器原生级别的支持,可以异步观察目标元素与祖先元素或文档视口之间的交叉状态。

首先,HTML 部分,我们不再直接使用

src

属性,而是用

data-src

来存放图片的真实地址,并可以添加一个低分辨率的占位图或

loading

动画。

立即学习“前端免费学习笔记(深入)”;

图片描述另一张图片

CSS 部分,其实可以很简单,或者根据你的需求做一些加载动画。这里我们先保持简单。

.lazyload-img {    display: block; /* 确保图片独占一行,方便观察 */    width: 100%; /* 示例:图片宽度 */    min-height: 200px; /* 示例:给个最小高度,避免布局跳动 */    background-color: #f0f0f0; /* 占位背景色 */}

关键在于 JavaScript。我们需要创建一个

Intersection Observer

实例,并给它一个回调函数,当图片进入视口时,这个回调函数就会被触发。

document.addEventListener('DOMContentLoaded', () => {    const lazyImages = document.querySelectorAll('.lazyload-img');    if ('IntersectionObserver' in window) {        let observer = new IntersectionObserver((entries, observer) => {            entries.forEach(entry => {                if (entry.isIntersecting) {                    const img = entry.target;                    const src = img.getAttribute('data-src');                    if (src) {                        img.src = src;                        img.removeAttribute('data-src'); // 加载完成后移除data-src                        observer.unobserve(img); // 停止观察已加载的图片                    }                }            });        }, {            rootMargin: '0px 0px 200px 0px', // 提前200px加载            threshold: 0 // 只要有一个像素可见就触发        });        lazyImages.forEach(img => {            observer.observe(img);        });    } else {        // Fallback for browsers that don't support Intersection Observer        // 这部分可以考虑使用滚动事件或者直接加载所有图片        lazyImages.forEach(img => {            const src = img.getAttribute('data-src');            if (src) {                img.src = src;                img.removeAttribute('data-src');            }        });    }});

这段代码的核心逻辑是:当

lazyload-img

元素进入(或即将进入)视口时,

Intersection Observer

会通知我们,然后我们取出

data-src

中的真实图片地址,赋值给

src

属性,图片就开始加载了。加载完成后,我们会让观察器停止观察这个元素,避免重复操作,也节省资源。

为什么说Intersection Observer是图片懒加载的终极答案?

说实话,我个人是真受够了那些基于滚动事件的图片懒加载方案。过去,我们为了实现懒加载,不得不监听

scroll

事件,然后在回调里不断计算每个图片元素距离视口顶部的距离,判断它们是否进入了可视区域。这听起来似乎没什么问题,但实际操作起来,性能简直是噩梦。想想看,每次滚动都触发大量的

getBoundingClientRect()

调用,这会导致浏览器频繁地进行布局计算(layout thrashing),页面卡顿、掉帧是家常便饭,用户体验直线下降。尤其是在移动设备上,资源有限,这种性能开销更是雪上加霜。

Intersection Observer

的出现,彻底改变了这种局面。它不是基于同步的滚动事件来判断的,而是利用浏览器内部的优化机制,异步地观察元素交叉状态。这意味着什么?意味着你的 JavaScript 不再需要自己去计算位置,浏览器会在合适的时机,以最高效的方式告诉你“嘿,这个元素现在可见了!”或者“它已经离开了!”。它运行在主线程之外,不会阻塞页面的渲染,极大地提升了滚动性能和用户体验。从我个人的开发经验来看,一旦用上了

Intersection Observer

,那些恼人的性能瓶颈几乎瞬间消失,页面滚动变得异常流畅。它就像是浏览器为你量身定制的一个“智能管家”,帮你默默处理这些繁琐又耗性能的判断逻辑,让你能更专注于业务逻辑的实现。

Intersection Observer的配置参数有哪些实用技巧?

Intersection Observer

的强大之处,除了其异步和高性能的特性外,还在于它提供了几个非常灵活的配置参数,让你能精准控制观察行为。理解并善用它们,能让你的懒加载方案更加精细化。

首先是

root

参数。它决定了观察器所观察的目标元素与哪个容器进行交叉。默认情况下,

root

是浏览器视口(

null

undefined

)。但如果你有一个可以滚动的特定区域,比如一个弹窗内的图片列表,你可以将

root

设置为那个可滚动的元素。这样,图片只有在进入那个特定容器的可见区域时才会加载,而不是整个浏览器视口。这在组件化开发中尤其有用,避免了不必要的全局观察。

多个微信小程序源码合集 多个微信小程序源码合集

微信小程序是一种轻量级的应用开发平台,由腾讯公司推出,主要应用于移动端,旨在提供便捷的用户体验,无需下载安装即可在微信内使用。本压缩包包含了丰富的源码资源,涵盖了多个领域的应用场景,下面将逐一介绍其中涉及的知识点。1. 图片展示:这部分源码可能涉及了微信小程序中的“组件的使用,用于显示图片,以及`wx.getSystemInfo`接口获取屏幕尺寸,实现图片的适配和响应式布局。可能还包括了图片懒加

多个微信小程序源码合集 0 查看详情 多个微信小程序源码合集

然后是

rootMargin

,这个参数我个人觉得是懒加载场景下最实用的一个。它允许你为

root

元素(通常是视口)增加或减少一个边距。比如,设置

'0px 0px 200px 0px'

,就意味着当图片距离视口底部还有 200 像素时,它就会被视为“进入视口”并开始加载。这就像是给懒加载图片设置了一个“预加载区域”。用户还没滚动到图片位置,图片就已经悄悄加载好了,避免了用户在滚动时看到图片突然出现的突兀感,极大地提升了用户感知的加载速度和流畅度。你可以根据页面内容和用户习惯,灵活调整这个值。太小可能还是会闪现,太大则失去了懒加载的意义,加载了太多不必要的资源。

最后是

threshold

,这个参数定义了一个或多个阈值,表示目标元素可见部分的百分比。当目标元素的可见比例达到这些阈值时,观察器的回调函数就会被触发。它是一个数组,可以包含多个值,例如

[0, 0.5, 1]

0

表示只要目标元素有一个像素可见就触发回调;

0.5

表示当目标元素一半可见时触发;

1

表示当目标元素完全可见时触发。在图片懒加载场景下,我通常会设置

threshold: 0

,配合

rootMargin

,确保图片能尽早加载,避免空白区域。但如果你想实现一些更复杂的交互,比如当图片完全进入视口才播放动画,那么

threshold: 1

就很有用。

通过这三个参数的组合使用,

Intersection Observer

提供了非常强大的灵活性,让你可以根据具体的业务需求和性能目标,定制出最合适的懒加载策略。

除了图片懒加载,Intersection Observer还能用在哪些场景?

Intersection Observer

的应用远不止图片懒加载这么简单。它的核心能力是高效地检测元素与容器的交叉状态,这使得它在许多需要“元素可见性”判断的场景中都表现出色。

一个非常常见的场景是无限滚动(Infinite Scrolling)。当用户滚动到页面底部时,我们通常需要加载更多内容。使用

Intersection Observer

,你只需要观察一个位于页面底部的“加载更多”元素。当这个元素进入视口时,就触发数据加载请求,然后将新内容添加到页面中。这比传统的监听滚动事件并计算滚动距离的方式要简洁和高效得多。我个人在做内容型网站时,几乎都会用它来实现无缝的内容加载体验。

广告可见性检测也是一个重要的应用。对于广告商来说,了解广告是否真正被用户看到,以及被看到多久,是衡量广告效果的关键指标。

Intersection Observer

可以精确地检测广告元素在视口中的可见性百分比和持续时间,从而提供更准确的广告曝光数据。这对于广告平台和内容发布者都非常有价值。

再比如,实现“粘性”元素(Sticky Elements)。虽然 CSS

position: sticky

已经很方便,但在一些需要更复杂逻辑的场景,或者需要兼容旧浏览器时,

Intersection Observer

可以用来判断某个元素何时进入或离开特定区域,然后通过 JavaScript 动态添加或移除 CSS 类,从而实现吸顶、吸底等效果。

它还能用于视频的自动播放/暂停。当视频元素进入视口时自动播放,离开视口时暂停,可以节省带宽并提升用户体验。同样,动画的触发也可以通过它实现,当元素进入视口时才播放动画,避免了页面加载时所有动画都立即执行,导致性能负担。

甚至在数据分析和用户行为追踪方面,

Intersection Observer

也能发挥作用。你可以用它来跟踪用户是否看到了某个特定的 CTA(Call To Action)按钮,或者用户滚动到了文章的哪个部分,这些数据对于优化产品设计和内容策略都非常有帮助。

总而言之,任何需要判断“一个元素是否在另一个元素(通常是视口)中可见”的场景,

Intersection Observer

都是一个优雅且高性能的解决方案。它极大地简化了前端开发中这类交互的实现,让我们可以构建更流畅、更智能的网页应用。

以上就是CSS怎样实现图片懒加载?intersection observer应用的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1090824.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
SQL查询执行计划怎么看 SQL执行计划解读技巧分享
上一篇 2025年12月2日 10:36:08
GrayKey 破解盒子升级:可“入侵” iPhone 15、Galaxy S24 和 Pixel 6/7 系列手机
下一篇 2025年12月2日 10:36:15

相关推荐

  • UC浏览器国际版和国内版有什么区别_UC浏览器国际版与国内版差异说明

    UC浏览器国际版更简洁高效,因面向全球市场,其界面无信息流和冗余功能,广告与推送极少,不集成阿里系服务,数据存储遵循GDPR,支持繁体中文与英文,安装包小、运行流畅,适合追求纯净浏览体验的用户。 如果您在选择UC浏览器时发现存在国际版和国内版两个版本,可能会对它们的功能和体验差异感到困惑。以下是关于…

    2026年9月22日
    000
  • mysql如何分析索引使用 mysql创建索引后的执行计划解读

    mysql如何分析索引使用 mysql创建索引后的执行计划解读mysql如何分析索引使用 mysql创建索引后的执行计划解读mysql如何分析索引使用 mysql创建索引后的执行计划解读mysql如何分析索引使用 mysql创建索引后的执行计划解读

    要分析mysql索引使用和执行计划,核心是通过explain命令查看查询路径,并结合handler_read%状态变量评估索引效率。1. 使用explain命令分析执行计划,关注type、key、extra等列,判断是否高效利用索引;2. 通过show global status like &#82…

    2026年9月22日 用户投稿
    000
  • 解决TCPDF保存文件权限问题的完整指南

    本文旨在解决使用tcpdf在%ignore_a_1%中生成pdf并保存到服务器(’f’模式)时遇到的“permission denied”错误,尤其是在macos环境下。核心问题通常源于不正确的服务器文件路径或目标文件夹缺乏写入权限。教程将详细阐述如何构建正确的绝对文件路径,…

    2026年9月22日
    100
  • mysql怎么添加前缀索引 mysql创建前缀索引的长度选择

    mysql怎么添加前缀索引 mysql创建前缀索引的长度选择mysql怎么添加前缀索引 mysql创建前缀索引的长度选择mysql怎么添加前缀索引 mysql创建前缀索引的长度选择mysql怎么添加前缀索引 mysql创建前缀索引的长度选择

    在mysql中,为长字符串列添加前缀索引的核心目的是优化查询性能并节省存储空间。1. 前缀索引通过仅索引列值的前n个字符实现这一目标;2. 前缀长度的选择需在区分度与存储效率之间取得平衡,理想长度应确保高区分度(如90%以上)且不过度冗余;3. 可通过执行select count(distinct …

    2026年9月22日 用户投稿
    000
  • 《植物大战僵尸:重植版》制作人:价格亲民 未使用AI!

    经典塔防游戏《植物大战僵尸》在问世16年后迎来重磅回归。由PopCap Games精心打造的重制作品——《植物大战僵尸:重植版》将于10月23日正式登陆PlayStation、Xbox、Nintendo Switch以及PC平台。 据The Gamer报道,该游戏执行制作人Jake Neri在采访中…

    2026年9月22日
    200
  • VSCode运行多文件C项目 完整VSCode配置C++开发教程

    要解决#%#$#%@%@%$#%$#%#%#$%@_e2fc++805085e25c9761616c00e065bfe8运行多文件c项目的问题,核心是正确配置tasks.json、launch.json和settings.json文件以定义编译、调试和项目路径。首先安装c/c++扩展插件和可选的编译…

    2026年9月22日
    000
  • qq浏览器如何清理dns缓存_QQ浏览器强制刷新与清除DNS缓存指南

    首先清除QQ浏览器DNS缓存:打开应用→点击「我的」→进入「设置」→选择「清理浏览数据」→勾选「DNS缓存」→点击「立即清理」;随后可通过在地址栏添加「#refresh」实现强制刷新;也可使用无痕模式验证问题是否由缓存引起。 如果您尝试访问某个网站,但页面加载缓慢或显示错误,可能是由于本地DNS缓存…

    2026年9月22日
    100
  • 全球首发天玑9500!vivo X300发布:4399元起

    全球首发天玑9500!vivo X300发布:4399元起全球首发天玑9500!vivo X300发布:4399元起全球首发天玑9500!vivo X300发布:4399元起全球首发天玑9500!vivo X300发布:4399元起

    10月13日,vivo正式推出了全新旗舰手机——vivo x300,引发广泛关注。 价格方面,该机提供多个配置版本:12GB+256GB售价为4399元,16GB+256GB定价4699元,12GB+512GB为4999元,16GB+512GB则为5299元,顶配的16GB+1TB版本售价5799元…

    2026年9月22日 用户投稿
    000
  • Canva的AI混合工具如何操作?快速设计专业图形与文本的步骤

    Canva的AI混合功能通过Magic Studio将文本、图像生成与智能设计整合,提升创作效率。首先,使用Magic Write生成文案初稿,克服空白页难题;其次,通过Magic Media输入详细描述生成定制化图像,越具体效果越好;再利用Magic Design上传图片或输入文字自动生成多种设计…

    2026年9月22日
    000
  • vivoY系列微信收款语音播报如何设置?快速设置语音的实用方法

    先在微信内开启收款语音提醒,再确保vivo手机系统中微信的通知权限、后台运行和电池优化设置正确,避免静音或勿扰模式干扰,即可解决语音不响问题。 vivo Y系列手机上设置微信收款语音播报,核心在于微信应用内部的设置,同时需要确保手机系统层面的通知权限和后台运行策略没有限制它。简单来说,就是先在微信里…

    2026年9月22日
    000
  • PHPRestfulAPI怎么开发_PHP构建高效安全的RestfulAPI教程

    答案:本文介绍如何用PHP构建高效安全的Restful API,涵盖设计规范、项目结构、数据库操作、安全机制、统一响应格式及性能优化。遵循Restful风格使用标准HTTP方法与状态码,通过index.php统一入口路由请求至控制器;采用PDO预处理防止SQL注入,结合JWT实现认证授权,确保输入验…

    2026年9月22日
    100
  • CentOS7搭建个人站点

    CentOS7搭建个人站点CentOS7搭建个人站点CentOS7搭建个人站点CentOS7搭建个人站点

    在本文中,我们将指导您在centos7系统上使用httpd搭建个人网站。httpd是apache http服务器的主程序,设计为一个独立运行的后台进程,负责建立处理请求的子进程或线程池。 首先,我们需要通过rpm命令检查系统中是否已安装httpd: rpm -qa | grep httpd 如果执行…

    2026年9月22日 用户投稿
    200
  • VSCode 怎样配置项目的依赖包自动安装 VSCode 项目依赖包自动安装的配置指南​

    VSCode 怎样配置项目的依赖包自动安装 VSCode 项目依赖包自动安装的配置指南​VSCode 怎样配置项目的依赖包自动安装 VSCode 项目依赖包自动安装的配置指南​VSCode 怎样配置项目的依赖包自动安装 VSCode 项目依赖包自动安装的配置指南​VSCode 怎样配置项目的依赖包自动安装 VSCode 项目依赖包自动安装的配置指南​

    vscode没有内置“一键安装所有依赖”功能,因为它作为通用编辑器需保持轻量与灵活性,无法预设所有项目的依赖管理逻辑;要实现类似效果,最有效的方法是通过配置tasks.json和launch.json实现半自动安装:1. 在项目根目录的.vscode文件夹中创建tasks.json文件,定义“che…

    2026年9月22日 用户投稿
    100
  • MySQL服务无法启动怎么办?常见解决方法

    MySQL服务无法启动怎么办?常见解决方法MySQL服务无法启动怎么办?常见解决方法MySQL服务无法启动怎么办?常见解决方法MySQL服务无法启动怎么办?常见解决方法

    mysql服务无法启动常见原因包括配置错误、端口占用、数据文件损坏或权限问题。解决方法如下:1. 查看错误日志,定位问题根源;2. 检查配置文件是否存在语法错误或路径问题;3. 确认端口(如3306)未被占用;4. 核查数据目录的权限与完整性;5. 必要时修复或重置数据目录,甚至重新安装mysql。…

    2026年9月22日 用户投稿
    000
  • 如何使用MLflow训练AI大模型?模型管理与跟踪的实用教程

    如何使用MLflow训练AI大模型?模型管理与跟踪的实用教程如何使用MLflow训练AI大模型?模型管理与跟踪的实用教程如何使用MLflow训练AI大模型?模型管理与跟踪的实用教程如何使用MLflow训练AI大模型?模型管理与跟踪的实用教程

    MLflow通过实验跟踪、可复现的项目封装、标准化模型格式和集中式模型注册表,实现大模型训练的全流程管理。它记录超参数、指标和模型文件,支持分布式环境下的集中日志管理,利用远程跟踪服务器和云存储统一收集数据,并通过模型版本控制与阶段管理提升团队协作与部署效率。 ☞☞☞AI 智能聊天, 问答助手, A…

    2026年9月22日 用户投稿
    000
  • qq浏览器怎么设置信任此站点_QQ浏览器添加信任站点设置方法

    可通过设置中心或地址栏将网站添加为可信站点以解除QQ浏览器限制。首先打开QQ浏览器,点击菜单进入设置,选择“隐私与安全”中的“可信站点管理”,添加并保存目标网址;也可在访问页面时点击地址栏锁形图标,通过站点设置直接设为可信;若需临时访问,可在安全警告页点击“继续访问”或“仍然前往”实现临时放行,但不…

    2026年9月22日
    300
  • 如何在MiniToolMovieMaker中编辑AI视频?免费AI视频剪辑的教程

    如何在MiniToolMovieMaker中编辑AI视频?免费AI视频剪辑的教程如何在MiniToolMovieMaker中编辑AI视频?免费AI视频剪辑的教程如何在MiniToolMovieMaker中编辑AI视频?免费AI视频剪辑的教程如何在MiniToolMovieMaker中编辑AI视频?免费AI视频剪辑的教程

    MiniTool MovieMaker虽无AI生成功能,但可高效编辑AI生成的MP4、MOV等格式视频或图片序列。通过导入素材后,利用其剪辑、过渡、滤镜、文字、音频处理等功能,实现AI片段的精剪、色彩统一、无缝衔接与风格化输出。支持主流视频、图片及音频格式,兼容性好,适合个人创作者进行AI内容后期整…

    2026年9月22日 用户投稿
    600
  • VSCode如何调试JavaScript代码 VSCode调试功能的实战技巧

    要在vscode中调试javascript,首先需设置断点、配置launch.json文件、选择合适的调试环境并启动调试会话;2. launch.json至关重要,常见陷阱包括program路径错误、type类型不匹配、cwd设置不当、混淆launch与attach模式以及source map配置缺…

    2026年9月22日
    000
  • Linux内核13-进程切换

    进程切换,也称为任务切换、上下文切换或任务调度,本文将探讨linux内核中进程切换的实现。我们首先理解几个关键概念。 1.1 硬件上下文 每个进程都有自己的地址空间,但所有进程共享CPU寄存器。因此,在恢复进程执行前,内核必须确保挂起时的寄存器值被重新加载到CPU寄存器中。 这些需要加载到CPU寄存…

    2026年9月22日
    200
  • 如何修改MySQL的默认端口号?

    如何修改MySQL的默认端口号?如何修改MySQL的默认端口号?如何修改MySQL的默认端口号?如何修改MySQL的默认端口号?

    修改mysql默认端口号需编辑配置文件,核心步骤为:1.定位my.cnf或my.ini文件;2.在[mysqld]段落中修改或添加port参数;3.保存后重启mysql服务。更改端口主要出于避免冲突、提升安全性和适应网络策略考虑。连接时需在客户端工具或代码中指定新端口,如命令行加-p参数、编程语言连…

    2026年9月22日 用户投稿
    1200

发表回复

登录后才能评论
关注微信