网页内容如何懒加载

懒加载是一种网页优化技术,可以减少页面初次加载时需要下载的资源量,提高页面加载速度。懒加载的核心思想就是将网页的资源(例如图片、视频等)延迟加载,只有当用户需要滚动页面到该资源的位置时才开始加载。

以下是懒加载的基本实现步骤:

  1. 将需要延迟加载的资源的标签中的 src 属性设置为占位符(例如 data-src)。
  2. 使用 JavaScript 监听页面滚动事件(例如window.onscroll)。
  3. 在用户滚动到资源所在位置时,将该资源的 data-src 属性值赋值给 src 属性,开始加载资源。
  4. 使用 CSS 或 JavaScript 给资源添加 fade-in 效果,提升用户体验。

需要注意的是,在实现懒加载时,需要权衡页面的加载速度和用户用于享受资源的时间,以确保在用户需要资源时加载足够快,同时避免用户太早看到空白页面。

假设有一篇博客页面,页面上包含多张图片,其中有些图片非常大,加载时间较长,影响页面的加载速度和用户体验。这时就可以使用懒加载技术,将这些图片的src属性设置为占位符,只有当用户滚动到图片位置时才开始加载真实的图片资源。

懒加载的基本实现

示例代码如下:

HTML代码:

<img class="lazy" data-src="image.jpg" src="placeholder.jpg">
<img class="lazy" data-src="image2.jpg" src="placeholder.jpg">

CSS代码:

.lazy {
    opacity: 0; /* 初始时不可见 */
    transition: opacity 0.3s ease-in-out;
}

JavaScript代码:

(function() {
    var lazyLoadImages = function() {
        var lazyImages = document.querySelectorAll('.lazy');
        lazyImages.forEach(function(img) {
            if (img.getBoundingClientRect().top <= window.innerHeight && img.getBoundingClientRect().bottom >= 0) {
                img.src = img.dataset.src;
                img.classList.add('fade-in');
                img.classList.remove('lazy');
            }
        });
    }
    lazyLoadImages(); // 初始化页面时加载可见区域内的图片
    window.addEventListener('scroll', lazyLoadImages); // 监听页面滚动事件
})();

在上述代码中,图片的占位符使用了相同的src属性值placeholder.jpg,真实的图片资源使用了data-src属性来指定,JavaScript代码监听了scroll事件,一旦某个图片所在位置滚动到可视区域时,就将该图片的data-src属性值赋值给它的src属性,让它开始加载真实的图片资源,并添加了fade-in效果,提升用户体验。

图片是动态数据

如果图片是动态数据,并且需要通过 AJAX 或其他异步方式获取,那么可以按照以下方式实现懒加载。

  1. 首先,为需要懒加载的图片添加占位符,和前面的例子一样。
<img class="lazy" data-src="image.jpg" src="placeholder.jpg">
  1. 在页面初始化时,不需要为图片设置 src 属性,只为它们提供 data-src 属性值。然后在完成异步请求之后,将每个图片的
    data-src 属性值设置为真实的资源 URL 。
var image = new Image();
image.onload = function() {
    // 异步请求完成,并获取到图片 URL
    var url = 'image.jpg';
    // 将图片的占位符的 data-src 属性设置为真实的资源 URL
    var img = document.querySelector('.lazy');
    img.setAttribute('data-src', url);
};
image.src = 'image.jpg';
  1. 最后,使用 JavaScript 监听页面滚动事件,当用户滚动到图片的位置时,将该图片的 data-src 属性值赋值给它的 src
    属性,让它开始加载真实的图片资源。
(function() {
    var lazyLoadImages = function() {
        var lazyImages = document.querySelectorAll('.lazy');
        lazyImages.forEach(function(img) {
            if (img.getBoundingClientRect().top <= window.innerHeight && img.getBoundingClientRect().bottom >= 0 && !img.src) {
                img.src = img.dataset.src;
                img.classList.add('fade-in');
                img.classList.remove('lazy');
            }
        });
    }
    lazyLoadImages(); // 初始化页面时加载可见区域内的图片
    window.addEventListener('scroll', lazyLoadImages); // 监听页面滚动事件
})();

在上述代码中,当当前图片的src属性未被设置时,才将图片的data-src属性值赋值给它的src属性,避免重复加载图片。

懒加载图片的完整示例

以下是一个懒加载图片的完整示例 HTML 代码:

<!DOCTYPE html>
<html>
<head>
    <title>懒加载示例</title>
    <style>
        .lazy {
            opacity: 0;
            transition: opacity 0.3s ease-in-out;
        }
    </style>
</head>
<body>

    <h1>懒加载示例</h1>

    <img class="lazy" data-src="https://www.example.com/image1.jpg" src="https://www.example.com/placeholder.jpg">
    <img class="lazy" data-src="https://www.example.com/image2.jpg" src="https://www.example.com/placeholder.jpg">
    <img class="lazy" data-src="https://www.example.com/image3.jpg" src="https://www.example.com/placeholder.jpg">
    <img class="lazy" data-src="https://www.example.com/image4.jpg" src="https://www.example.com/placeholder.jpg">

    <script>
        (function() {
            var lazyLoadImages = function() {
                var lazyImages = document.querySelectorAll('.lazy');
                lazyImages.forEach(function(img) {
                    if (img.getBoundingClientRect().top <= window.innerHeight && img.getBoundingClientRect().bottom >= 0 && !img.src) {
                        img.src = img.dataset.src;
                        img.classList.add('fade-in');
                        img.classList.remove('lazy');
                    }
                });
            }
            lazyLoadImages(); // 初始化页面时加载可见区域内的图片
            window.addEventListener('scroll', lazyLoadImages); // 监听页面滚动事件
        })();
    </script>
</body>
</html>

在上面的代码中,图片的占位符使用了相同的 src 属性值 https://www.example.com/placeholder.jpg,在需要懒加载的图片中使用 data-src 属性指定真实的图片资源地址。JavaScript 代码中监听了scroll事件,并在图片进入可视区域时将占位符的 src 属性设置为真实的资源地址,同时添加了 fade-in 效果。

长表格的懒加载

长表格的懒加载需要满足以下两个需求:

仅在表格的当前视窗范围内显示数据,避免整个表格的一次性加载;
滚动表格时,自动加载新的数据,并移除视窗范围之外的旧数据。
以下是一个基于 jQuery 的表格懒加载示例:

HTML:

<table class="table">
  <thead>
    <tr>
      <th>ID</th>
      <th>名称</th>
      <th>价格</th>
    </tr>
  </thead>
  <tbody>
    <!-- 表格内容为空 -->
  </tbody>
</table>

CSS:

.table {
    height: 400px;
    overflow-y: scroll;
    border-collapse: collapse;
    width: 100%;
}
td, th {
    padding: 8px;
    border: 1px solid #ddd;
    text-align: left;
}

JavaScript:

$(document).ready(function() {
    var table = $('.table');
    var tbody = table.find('tbody');
    var rows = [];
    // 模拟数据
    for (var i = 1; i <= 1000; i++) {
        rows.push({
            id: i,
            name: '商品 ' + i,
            price: '$' + (Math.random() * 100).toFixed(2)
        });
    }
    // 计算每行的高度
    var rowHeight = tbody.find('tr:first-child').outerHeight();
    var visibleRowsCount = Math.ceil(table.height() / rowHeight);
    var loadedRowsCount = 0;
    var totalRowsCount = rows.length;
    // 滚动事件处理
    table.on('scroll', function() {
        var scrollTop = table.scrollTop();
        var startIdx = Math.floor(scrollTop / rowHeight) - visibleRowsCount;
        var endIdx = startIdx + visibleRowsCount * 2;
        if (startIdx < 0) startIdx = 0;
        if (endIdx >= totalRowsCount) endIdx = totalRowsCount - 1;
        addRows(startIdx, endIdx);
        removeRows(startIdx, endIdx);
    });
    // 添加行到表格
    function addRows(fromIdx, toIdx) {
        if (loadedRowsCount >= totalRowsCount) return;
        if (toIdx >= totalRowsCount) {
            toIdx = totalRowsCount - 1;
        }
        for (var i = fromIdx; i <= toIdx; i++) {
            if (rows[i]) {
                var tr = $('<tr>');
                tr.append($('<td>').text(rows[i].id));
                tr.append($('<td>').text(rows[i].name));
                tr.append($('<td>').text(rows[i].price));
                tbody.append(tr);
                loadedRowsCount++;
            }
        }
    }
    // 移除过时的行
    function removeRows(fromIdx, toIdx) {
        if (loadedRowsCount <= visibleRowsCount * 3) return;
        if (fromIdx > visibleRowsCount) {
            tbody.find('tr:lt(' + (fromIdx - visibleRowsCount) + ')').remove();
            loadedRowsCount -= (fromIdx - visibleRowsCount);
        }
        if (toIdx < (totalRowsCount - visibleRowsCount * 2)) {
            tbody.find('tr:gt(' + (toIdx - visibleRowsCount * 2) + ')').remove();
            loadedRowsCount -= (totalRowsCount - visibleRowsCount * 2 - toIdx);
        }
    }
    // 初始化表格
    addRows(0, visibleRowsCount * 3 - 1);
});

在上述代码中,我们通过以下步骤实现了懒加载表格的功能:

  1. 计算表格的每行高度、可见行数等参数;
  2. 使用模拟数据初始化表格,实现懒加载;
  3. 监听表格的滚动事件,实现滚动加载和移除过时行的功能。

在滚动事件处理函数中,我们计算出当前视窗范围内的数据索引,并通过 addRows 和 removeRows 函数来实现只加载当前视窗范围内的数据,并移除视窗范围之外的旧数据。

vue中懒加载

在 Vue 中,懒加载可以应用于图片、组件、路由等方面。下面分别介绍各种情况下的实现方法。

  1. 图片懒加载

使用 vue-lazyload 插件可以方便地实现图片的懒加载。它提供了一个 v-lazy 指令,只有当图片进入可视区域时才开始加载。

以下是一个使用 vue-lazyload 插件的简单示例:

<template>
  <div>
    <img v-lazy="imageUrl">
  </div>
</template>

<script>
import VueLazyload from 'vue-lazyload';

export default {
  data() {
    return {
      imageUrl: 'placeholder.png'
    };
  },
  created() {
    this.imageUrl = 'http://example.com/image.jpg'; // 真实图片地址
  },
  directives: {
    lazyload: VueLazyload.directive
  }
}
</script>

使用 v-lazy 指令将图片的 src 属性设置为占位符(例如 placeholder.png),然后将真实图片地址赋值给 imageUrl 变量,当图片进入可视范围时,vue-lazyload 插件会自动将 imageUrl 对应的图片加载进来。

有关 vue-lazyload 的更多用法,请参考官方文档。

  1. 组件懒加载

在 Vue 中,可以使用异步组件实现组件的懒加载。异步组件使用 import() 动态导入组件定义,只有在需要使用组件时才会加载。

以下是一个使用异步组件实现懒加载的示例:

<template>
  <div>
    <button @click="loadComponent">加载组件</button>
    <component v-if="loaded" :is="component"></component>
  </div>
</template>

<script>
export default {
  data() {
    return {
      loaded: false,
      component: null
    };
  },
  methods: {
    loadComponent() {
      import('@/components/SomeComponent.vue').then(component => {
        this.loaded = true;
        this.component = component.default;
      });
    }
  }
}
</script>

在上述示例中,通过 import() 函数异步加载组件 SomeComponent.vue,将组件定义赋值给 component 变量,并将 loaded 变量设置为 true,在模板中使用动态组件将组件定义渲染为实例。

  1. 路由懒加载

在路由中使用动态导入(Dynamic Import)可以实现路由的懒加载。动态导入是 ECMAScript6 中的语法,使用 import() 函数动态加载路由定义,只有在需要使用路由时才会加载。

以下是一个使用动态导入实现路由懒加载的示例:

const routes = [
  {
    path: '/home',
    name: 'home',
    component: () => import('@/views/Home.vue')
  },
  {
    path: '/about',
    name: 'about',
    component: () => import('@/views/About.vue')
  }
];

在上述示例中,使用 import() 函数动态导入路由组件,将组件定义作为 component 属性的值。当路由被访问时,路由组件会按需加载。

需要注意的是,使用动态导入后,路由组件不会在打包时被包含在主 bundle 中,而是会被打包成单独的 chunk。这样可以实现更快的页面加载速度和更小的代码体积。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值