400-915-1135
开发技术详细

用html+css+script写出让页面图片懒加载的代码

发表日期:2025-05-19 11:55:31   作者来源:众诚企业建站   浏览:11

以下是一个使用HTML+CSS+JavaScript实现图片懒加载的示例代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>图片懒加载示例</title>
    <style>
        .lazyload {
            width: 100%;
            min-height: 200px;
            background: #f0f0f0;
            transition: opacity 0.3s;
            opacity: 0;
        }

        .lazyload.loaded {
            opacity: 1;
        }

        .container {
            max-width: 800px;
            margin: 0 auto;
            padding: 20px;
        }

        .image-item {
            margin-bottom: 400px; /* 增加滚动区域 */
        }
    </style>
</head>
<body>
    <div>
        <h1>滚动查看图片加载效果</h1>
        
        <div>
            <img data-src="https://picsum.photos/800/400?random=1" alt="示例图片1">
        </div>
        
        <div>
            <img data-src="https://picsum.photos/800/400?random=2" alt="示例图片2">
        </div>
        
        <div>
            <img data-src="https://picsum.photos/800/400?random=3" alt="示例图片3">
        </div>
        
        <div>
            <img data-src="https://picsum.photos/800/400?random=4" alt="示例图片4">
        </div>
    </div>

    <script>
        document.addEventListener("DOMContentLoaded", function() {
            // 获取所有需要懒加载的图片
            const lazyloadImages = document.querySelectorAll('.lazyload');
            
            // 配置Intersection Observer
            const observerOptions = {
                root: null, // 使用视口作为根
                rootMargin: '0px 0px 100px 0px', // 提前100px触发加载
                threshold: 0.1
            };

            // 观察回调函数
            const observerCallback = (entries, observer) => {
                entries.forEach(entry => {
                    if (entry.isIntersecting) {
                        const img = entry.target;
                        img.src = img.dataset.src;
                        img.onload = () => {
                            img.classList.add('loaded');
                        };
                        observer.unobserve(img); // 停止观察已加载的图片
                    }
                });
            };

            // 创建观察器
            const observer = new IntersectionObserver(observerCallback, observerOptions);

            // 开始观察所有图片
            lazyloadImages.forEach(img => {
                observer.observe(img);
            });

            // 处理可能的初始化可见图片
            window.addEventListener('load', () => {
                lazyloadImages.forEach(img => {
                    if(img.getBoundingClientRect().top < window.innerHeight + 100) {
                        img.src = img.dataset.src;
                        img.classList.add('loaded');
                        observer.unobserve(img);
                    }
                });
            });
        });
    </script>
</body>
</html>

代码说明:

HTML部分:

使用data-src属性存储真实图片地址

添加lazyload类用于标识需要懒加载的图片

包含多个带占位符的图片容器

CSS部分:

设置初始透明度为0,加载后渐显效果

添加*小高度防止布局抖动

设置灰色背景作为占位符

容器样式用于布局控制

JavaScript部分:

使用Intersection Observer API检测元素可见性

配置提前100px触发加载(通过rootMargin实现)

图片进入视口时替换src属性

图片加载完成后添加loaded类触发渐显动画

加载完成后停止观察该图片

添加初始化检查确保首屏图片立即加载

注意事项:

实际使用时需要确保图片地址正确可用

可根据需要调整以下参数:

rootMargin:控制提前加载的距离

threshold:触发加载的可见比例

动画时长和效果

需要处理图片加载失败的情况(可添加onerror事件处理)

兼容性:需要为不支持Intersection Observer的浏览器提供polyfill

效果特点:

渐进式加载体验

滚动时自动加载

平滑的渐显动画

高性能的观察机制

首屏内容优先加载

你可以通过修改CSS中的transition属性值和添加更多图片来测试不同效果。实际部署时建议压缩代码并添加错误处理。



如没特殊注明,文章均为众诚网络原创,转载请注明来自https://www.94zc.com/jishu/317.html
上一篇: 5v易微联蓝牙WIFI控制模板模块使用说明书
下一篇: 没有了!