前端小功能|懒加载

问题

一个电商网站上有大量的图片,加载很慢,如何使用懒加载优化用户体验?
懒加载的原理:
先让所有的图片都显示同一张图片,在通过判断窗口大小以及滚动距离,判断该 DOM 元素是否在我们已视区域,如果在已视区域,则用 js 修改 img 标签的 src 为 data 中储存的真正的 src ,然后再添加一些图片出现的特效即可!
html 代码

其中 data-img 储存的是 img 的真正的 src。
CSS代码:
* { padding: 0; margin: 0; text-decoration: none; list-style: none; } .lazyload img { width: 640px; } .lazyload{ width: 700px; margin: 0 auto; text-align: center; } @media screen and (max-width: 980px) { .lazyload img { width: 100%; height: 480px; } .lazyload{ width: 100%; margin: 0 auto; text-align: center; } }

这里做了一些用户体验优化,当屏幕小于980px时,图片宽度100%,用到了媒体查询@media
JS 代码:
var lazyLoad = (function(){ var clock; // 函数初始化,启动监听 function init(){ // 监听滚动 $(window).on("scroll", function(){ // 清楚定时器,当滚动时间位于 200ms 内时,减少不必要的遍历 if (clock) { clearTimeout(clock); } // 滚动两百毫秒后遍历一次检查 clock = setTimeout(function(){ checkShow(); }, 200); }) // 检查图片是否处于已视区域 checkShow(); } // 检查图片是否处于已视区域 function checkShow(){ $(".lazyload img").each(function(){ var $cur =$(this); // 给每个 img 增加一个 isLoaded 属性 // 如果 isLoaded 为 true ,则不用再次显示,return 回去 if($cur.attr('isLoaded')){ return; } // 如果 shouldShow($cur) 为 true,则表示该图片位于已视区域,且 isLoaded 属性还未存在 if(shouldShow($cur)){ // 展示该图片真正src showImg($cur); } }) } // $node 代表 this,表示 img 数组里面对应的每一个 img function shouldShow($node){ // 获取距离窗口滚动距离,窗口高度,和图片距离文档顶部的距离 var scrollH = $(window).scrollTop(), winH = $(window).height(), top = $node.offset().top; // 如果图片距离文档顶部的距离小于距离窗口滚动距离+窗口高度,那么处于已视区域,否则处于未视区域 if(top < winH + scrollH){ return true; }else{ return false; } } // 展示该图片真正src function showImg($node){ // 先将图片隐藏 $node.hide() // 设置该图片真正src $node.attr('src', $node.attr('data-img')); // 让图片淡入 $node.fadeIn() // 设置 isLoaded 属性为 true $node.attr('isLoaded', true); } // 返回 init 方法 return { init: init } })() // 调用lazyLoad.init()方法 lazyLoad.init();

记得,本文基于JQ进行操作,记得引入JQ

个人认为这是最简单理解懒加载的实例,项目DEMO请点击这里。
【前端小功能|懒加载】希望本文对你有用,喜欢就点个顶呗!(? ω ?)

    推荐阅读