启用 Lazy Loading(懒加载),仅在用户滚动到图片区域时加载,代码实例

在PHP网站开发中,实现图片的**Lazy Loading(懒加载)**通常需要结合前端技术(如JavaScript)和后端PHP代码。PHP主要负责生成HTML结构,而懒加载的逻辑主要由JavaScript实现。以下是具体的实现方法:


1. 实现懒加载的基本步骤

  1. HTML结构:

    • 使用data-src属性代替src属性来存储图片的真实URL。

    • 初始加载时,src属性可以设置为占位图或空。

  2. JavaScript逻辑:

    • 监听页面滚动事件。

    • 检查图片是否进入可视区域。

    • 将data-src的值赋给src,触发图片加载。

  3. PHP部分:

    • 动态生成带有data-src属性的图片标签。


2. 代码实现

PHP部分

php
复制
<?php// 假设从数据库或其他地方获取图片列表$images = [
    'image1.jpg',
    'image2.jpg',
    'image3.jpg',
    // 更多图片...];foreach ($images as $image) {
    echo '<img class="lazy-load" data-src="' . htmlspecialchars($image) . '" src="placeholder.jpg" alt="Lazy Loaded Image">';}

JavaScript部分

javascript
复制
document.addEventListener("DOMContentLoaded", function () {
    const lazyImages = document.querySelectorAll("img.lazy-load");

    // 懒加载逻辑
    const lazyLoad = () => {
        lazyImages.forEach((img) => {
            if (img.getAttribute("data-src") && isInViewport(img)) {
                img.src = img.getAttribute("data-src");
                img.removeAttribute("data-src"); // 移除 data-src,避免重复加载
                img.classList.remove("lazy-load"); // 移除懒加载类
            }
        });
    };

    // 检查图片是否进入可视区域
    const isInViewport = (element) => {
        const rect = element.getBoundingClientRect();
        return (
            rect.top >= 0 &&
            rect.left >= 0 &&
            rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&
            rect.right <= (window.innerWidth || document.documentElement.clientWidth)
        );
    };

    // 初始加载
    lazyLoad();

    // 监听滚动事件
    window.addEventListener("scroll", lazyLoad);
    window.addEventListener("resize", lazyLoad);});

3. 优化懒加载

使用 Intersection Observer API

现代浏览器支持Intersection Observer API,可以更高效地实现懒加载,避免频繁计算图片位置。

javascript
复制
document.addEventListener("DOMContentLoaded", function () {
    const lazyImages = document.querySelectorAll("img.lazy-load");

    // Intersection Observer 回调函数
    const lazyLoad = (entries, observer) => {
        entries.forEach((entry) => {
            if (entry.isIntersecting) {
                const img = entry.target;
                img.src = img.getAttribute("data-src");
                img.removeAttribute("data-src");
                img.classList.remove("lazy-load");
                observer.unobserve(img); // 停止观察已加载的图片
            }
        });
    };

    // 创建 Intersection Observer 实例
    const observer = new IntersectionObserver(lazyLoad, {
        rootMargin: "0px",
        threshold: 0.1, // 当图片 10% 进入可视区域时触发
    });

    // 观察所有懒加载图片
    lazyImages.forEach((img) => observer.observe(img));});

4. 占位图优化


5. 完整示例

PHP + HTML

php
复制
<?php$images = [
    'image1.jpg',
    'image2.jpg',
    'image3.jpg',
    // 更多图片...];foreach ($images as $image) {
    echo '<img class="lazy-load" data-src="' . htmlspecialchars($image) . '" src="placeholder.jpg" alt="Lazy Loaded Image">';}

JavaScript

javascript
复制
document.addEventListener("DOMContentLoaded", function () {
    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.getAttribute("data-src");
                img.removeAttribute("data-src");
                img.classList.remove("lazy-load");
                observer.unobserve(img);
            }
        });
    }, {
        threshold: 0.1,
    });

    lazyImages.forEach((img) => observer.observe(img));});

6. 注意事项

  1. SEO友好:

    • 确保懒加载的图片在搜索引擎中可以被索引,可以使用<noscript>标签提供备用内容。

  2. 兼容性:

    • 如果需要支持旧版浏览器,可以使用Intersection Observer的polyfill。

  3. 性能优化:

    • 避免一次性加载过多图片,可以分页或分批加载。


通过以上方法,可以在PHP网站中实现高效的图片懒加载,提升页面加载速度和用户体验。


上一篇:启用 ETag 和 Last-Modified 机制,避免重复加载资源,开发应用案例
下一篇:没有了!