Skip to Content

面试导航 - 程序员面试题库大全 | 前端后端面试真题 | 面试

场景题NEW让你设计img,怎么实现img的loading lazy

要实现 <img> 标签的 懒加载(lazy loading),确保在用户滚动到图片位置时再加载图片,从而提高页面性能,我们可以通过不同的方法来实现懒加载。以下是几种常见的实现方式,每种方式我都会进行详细解释,并展示代码示例。

1. 使用原生 HTML5 属性 loading="lazy"(最简单)

HTML5 提供了原生的懒加载功能,通过在 <img> 标签中添加 loading="lazy" 属性,你可以让浏览器自动处理图片的懒加载。当图片即将出现在视口时,浏览器会自动加载它。

示例代码:
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>原生懒加载</title> </head> <body> <h1>图片懒加载示例(HTML5 原生)</h1> <img src="https://cdn.pixabay.com/photo/2021/07/16/14/54/cat-6602447_960_720.jpg" alt="A cute kitten" loading="lazy" /> <img src="https://cdn.pixabay.com/photo/2021/07/16/14/54/cat-6602447_960_720.jpg" alt="Another cute kitten" loading="lazy" /> </body> </html>
解释:
  • loading="lazy":告诉浏览器该图片应该懒加载,只有在图片即将进入视口时才会开始加载。
  • 这种方法非常简单,现代浏览器(如 Chrome、Firefox、Edge)都支持它。
  • 优点:非常简单,原生支持,易于实现,自动处理图片加载。
  • 缺点:不支持旧版本的浏览器(如 Internet Explorer)。
2. 使用 Intersection Observer API(自定义懒加载)

如果你需要更大的控制权,或者需要支持更老的浏览器,可以使用 JavaScriptIntersection Observer API 来实现懒加载。通过该 API,你可以更灵活地定义图片进入视口时的加载行为。

示例代码:
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Intersection Observer 实现懒加载</title> <style> img { max-width: 100%; height: auto; border-radius: 10px; opacity: 0; transition: opacity 1s ease-in-out; } /* 占位符的样式 */ .lazy-load { opacity: 0; } </style> </head> <body> <h1>图片懒加载示例(Intersection Observer)</h1> <img data-src="https://cdn.pixabay.com/photo/2021/07/16/14/54/cat-6602447_960_720.jpg" src="https://via.placeholder.com/600x400/cccccc/ffffff?text=Loading..." alt="A cute kitten" class="lazy-load" /> <img data-src="https://cdn.pixabay.com/photo/2021/07/16/14/54/cat-6602447_960_720.jpg" src="https://via.placeholder.com/600x400/cccccc/ffffff?text=Loading..." alt="Another cute kitten" class="lazy-load" /> <script> const lazyImages = document.querySelectorAll('img.lazy-load'); const observer = new IntersectionObserver( (entries, observer) => { entries.forEach((entry) => { if (entry.isIntersecting) { const img = entry.target; img.src = img.dataset.src; // 设置实际图片路径 img.onload = () => { img.classList.remove('lazy-load'); // 加载完成后移除占位符样式 img.style.opacity = 1; // 图片渐显 }; observer.unobserve(img); // 停止观察当前图片 } }); }, { rootMargin: '100px', // 提前加载图片,避免滚动时出现延迟 }, ); lazyImages.forEach((image) => { observer.observe(image); // 观察每个图片 }); </script> </body> </html>
解释:
  • IntersectionObserver API:这是一个浏览器 API,可以用来检测元素是否进入视口。我们通过它来控制何时加载图片。
  • data-src:图片的真实地址存储在 data-src 中,初始时 src 设置为占位符图像。
  • rootMargin: '100px':通过 rootMargin 提前 100px 加载图片,这样当图片接近视口时就会加载。
  • 优点:非常灵活,可以通过 JavaScript 控制加载行为,并提供额外的功能(如渐显动画)。
  • 缺点:需要用 JavaScript 实现,且某些旧版浏览器不支持 IntersectionObserver(可以使用 polyfill)。
3. 使用占位符和渐进式加载(带占位图)

为了更好的用户体验,我们还可以使用占位图(如透明的 GIF 图片)作为占位符,直到实际图片加载完成。这个方法通常与懒加载一起使用。

示例代码:
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>占位符和渐进式加载</title> <style> img { width: 100%; height: auto; border-radius: 10px; opacity: 0; transition: opacity 1s ease-in-out; } </style> </head> <body> <h1>图片懒加载示例(占位符和渐进式加载)</h1> <img data-src="https://cdn.pixabay.com/photo/2021/07/16/14/54/cat-6602447_960_720.jpg" src="https://via.placeholder.com/600x400/cccccc/ffffff?text=Loading..." alt="A cute kitten" class="lazy-load" /> <img data-src="https://cdn.pixabay.com/photo/2021/07/16/14/54/cat-6602447_960_720.jpg" src="https://via.placeholder.com/600x400/cccccc/ffffff?text=Loading..." alt="Another cute kitten" class="lazy-load" /> <script> const lazyImages = document.querySelectorAll('img.lazy-load'); const observer = new IntersectionObserver( (entries, observer) => { entries.forEach((entry) => { if (entry.isIntersecting) { const img = entry.target; img.src = img.dataset.src; // 设置实际图片路径 img.onload = () => { img.style.opacity = 1; // 图片加载完成后渐显 }; observer.unobserve(img); // 停止观察当前图片 } }); }, { rootMargin: '100px', // 提前加载 }, ); lazyImages.forEach((image) => { observer.observe(image); // 观察每个图片 }); </script> </body> </html>
解释:
  • 初始时,图片显示为 占位符图像(如 https://via.placeholder.com/600x400/cccccc/ffffff?text=Loading...)。
  • 当图片进入视口时,使用 IntersectionObserver 加载实际图片。
  • 图片加载完成后,通过 opacity 渐变显示效果,让图片平滑显示。
总结:
  1. 原生 HTML5(loading="lazy":简单易用,浏览器自动处理懒加载,适用于现代浏览器。
  2. Intersection Observer:通过 JavaScript 控制懒加载,提供更灵活的实现,可以加上渐显效果,支持更多功能。
  3. 占位符和渐进式加载:结合占位符和渐变加载效果,提升用户体验,直到实际图片加载完成。

这些方法都可以用来实现 懒加载,根据需求和兼容性选择适合的方式来实现。

最后更新于:
Copyright © 2025Moment版权所有粤ICP备2025376666