You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WordPress仅用HTML实现懒加载时加载图片过多的问题解决

解决WordPress原生懒加载加载过多的问题

原生的loading="lazy"由浏览器自主控制预加载逻辑,它会依据视口高度的固定比例(比如Chrome默认是视口高度的150%)提前加载图片,所以没法做到只加载下一张。要实现精确控制,得自己编写JS懒加载逻辑:

步骤1:修改图片标签,替换原生懒加载

在WordPress主题的functions.php中添加钩子,替换图片的src属性为data-src,同时移除原生loading="lazy",避免冲突:

add_filter( 'wp_get_attachment_image_attributes', 'custom_lazyload_attrs', 10, 3 );
function custom_lazyload_attrs( $attrs, $attachment, $size ) {
    // 把真实图片地址存入data-src
    $attrs['data-src'] = $attrs['src'];
    // 替换src为空白占位图(也可以用小尺寸占位图URL)
    $attrs['src'] = 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';
    // 移除原生loading属性
    unset( $attrs['loading'] );
    // 添加自定义类方便JS选中
    $attrs['class'] .= ' custom-lazy';
    return $attrs;
}

步骤2:编写自定义懒加载JS

这段JS会监听滚动,仅加载刚好进入视口或距离视口仅一张图片高度的图片,实现只加载下一张的效果:

document.addEventListener('DOMContentLoaded', function() {
    const lazyImages = document.querySelectorAll('.custom-lazy');
    
    // 防抖函数,减少滚动触发频率
    function debounce(func, wait) {
        let timeout;
        return function(...args) {
            clearTimeout(timeout);
            timeout = setTimeout(() => func(...args), wait);
        };
    }

    function checkLazyImages() {
        lazyImages.forEach(img => {
            if (!img.classList.contains('custom-lazy')) return;
            const rect = img.getBoundingClientRect();
            // 触发阈值:视口底部 + 当前图片的高度(仅提前加载下一张)
            const triggerThreshold = window.innerHeight + img.offsetHeight;
            // 图片顶部进入阈值范围时加载
            if (rect.top < triggerThreshold && rect.bottom > 0) {
                img.src = img.dataset.src;
                img.classList.remove('custom-lazy');
                // 可选:添加加载完成动画类
                img.classList.add('lazy-loaded');
            }
        });
    }

    // 初始化时检查当前视口内的图片
    checkLazyImages();
    // 绑定防抖后的滚动、窗口 resize 事件
    window.addEventListener('scroll', debounce(checkLazyImages, 50));
    window.addEventListener('resize', debounce(checkLazyImages, 50));
});

把这段代码放到主题的footer.php中(</body>标签之前),或者通过WordPress的wp_enqueue_script方法引入。

可选优化:添加加载动画

给图片加过渡效果,提升用户体验:

.custom-lazy {
    opacity: 0;
    transition: opacity 0.3s ease;
}
.lazy-loaded {
    opacity: 1;
}

内容的提问来源于stack exchange,提问作者macylau21

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 14:30:21