懒加载和预加载

懒加载
1.什么是懒加载?

懒加载也就是延迟加载。 
当访问一个页面的时候,先把img元素或是其他元素的背景图片路径替换成一张大小为1*1px图片的路径(这样就只需请求一次,俗称占位图),只有当图片出现在浏览器的可视区域内时,才设置图片正真的路径,让图片显示出来。这就是图片懒加载。

2.为什么要使用懒加载?

很多页面,内容很丰富,页面很长,图片较多。比如说各种商城页面。这些页面图片数量多,而且比较大,少说百来K,多则上兆。要是页面载入就一次性加载完毕。估计大家都会等到黄花变成黄花菜了。

3.懒加载的原理是什么?

页面中的img元素,如果没有src属性,浏览器就不会发出请求去下载图片,只有通过javascript设置了图片路径,浏览器才会发送请求。 
懒加载的原理就是先在页面中把所有的图片统一使用一张占位图进行占位,把正真的路径存在元素的“data-url”(这个名字起个自己认识好记的就行)属性里,要用的时候就取出来,再设置;

4.懒加载的实现步骤?

1)首先,不要将图片地址放到src属性中,而是放到其它属性(data-original)中。 
2)页面加载完成后,根据scrollTop判断图片是否在用户的视野内,如果在,则将data-original属性中的值取出存放到src属性中。 
3)在滚动事件中重复判断图片是否进入视野,如果进入,则将data-original属性中的值取出存放到src属性中。

5.懒加载的优点是什么?

页面加载速度快、可以减轻服务器的压力、节约了流量,用户体验好

//懒加载代码实现
var viewHeight = document.documentElement.clientHeight // 可视区域的高度

function lazyload () {
  // 获取所有要进行懒加载的图片
  var eles = document.querySelectorAll('img[data-original][lazyload]')
  Array.prototype.forEach.call(eles, function (item, index) {
    var rect
    if (item.dataset.original === '')
      return
    rect = item.getBoundingClientRect()
    // 图片一进入可视区,动态加载
    if (rect.bottom >= 0 && rect.top < viewHeight) {
      !function () {
        var img = new Image()
        img.src = item.dataset.original
        img.onload = function () {
          item.src = img.src
        }
        item.removeAttribute('data-original')
        item.removeAttribute('lazyload')
      }()
    }
  })
}
// 首屏要人为的调用,否则刚进入页面不显示图片
lazyload()

document.addEventListener('scroll', lazyload)
//懒加载代码实现
var viewHeight = document.documentElement.clientHeight // 可视区域的高度

function lazyload () {
  // 获取所有要进行懒加载的图片
  var eles = document.querySelectorAll('img[data-original][lazyload]')
  Array.prototype.forEach.call(eles, function (item, index) {
    var rect
    if (item.dataset.original === '')
      return
    rect = item.getBoundingClientRect()
    // 图片一进入可视区,动态加载
    if (rect.bottom >= 0 && rect.top < viewHeight) {
      !function () {
        var img = new Image()
        img.src = item.dataset.original
        img.onload = function () {
          item.src = img.src
        }
        item.removeAttribute('data-original')
        item.removeAttribute('lazyload')
      }()
    }
  })
}
// 首屏要人为的调用,否则刚进入页面不显示图片
lazyload()

document.addEventListener('scroll', lazyload)
预加载
预加载的核心要点如下:

1.图片等静态资源在使用之前的提前请求;

2.资源后续使用时可以从缓存中加载,提升用户体验;

3.页面展示的依赖关系维护(必需的资源加载完才可以展示页面,防止白屏等);

实现预加载主要有三个方法:

1.html中img标签最初设置为display:none;

2.js脚本中使用image对象动态创建好图片;

3.使用XMLHttpRequest对象可以更加精细的控制预加载过程,缺点是无法跨域:
预加载的核心要点如下:

1.图片等静态资源在使用之前的提前请求;

2.资源后续使用时可以从缓存中加载,提升用户体验;

3.页面展示的依赖关系维护(必需的资源加载完才可以展示页面,防止白屏等);

实现预加载主要有三个方法:

1.html中img标签最初设置为display:none;

2.js脚本中使用image对象动态创建好图片;

3.使用XMLHttpRequest对象可以更加精细的控制预加载过程,缺点是无法跨域:
1.什么是预加载?

提前加载图片,当用户需要查看时可直接从本地缓存中渲染

2.为什么要使用预加载?

图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度。这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速、无缝地发布,也可帮助用户在浏览你网站内容时获得更好的用户体验。

3.实现预加载的方法有哪些?

方法一:用CSS和JavaScript实现预加载 
方法二:仅使用JavaScript实现预加载 
方法三:使用Ajax实现预加载

详见:http://web.jobbole.com/86785/

3、懒加载和预加载的对比

1)概念: 
懒加载也叫延迟加载:JS图片延迟加载,延迟加载图片或符合某些条件时才加载某些图片。 
预加载:提前加载图片,当用户需要查看时可直接从本地缓存中渲染。

2)区别: 
两种技术的本质:两者的行为是相反的,一个是提前加载,一个是迟缓甚至不加载。懒加载对服务器前端有一定的缓解压力作用,预加载则会增加服务器前端压力。

3)懒加载的意义及实现方式有: 
意义: 
懒加载的主要目的是作为服务器前端的优化,减少请求数或延迟请求数。 
实现方式: 
1.第一种是纯粹的延迟加载,使用setTimeOut或setInterval进行加载延迟. 
2.第二种是条件加载,符合某些条件,或触发了某些事件才开始异步下载。 
3.第三种是可视区加载,即仅加载用户可以看到的区域,这个主要由监控滚动条来实现,一般会在距用户看到某图片前一定距离遍开始加载,这样能保证用户拉下时正好能看到图片。

4)预加载的意义及实现方式有: 
意义: 
预加载可以说是牺牲服务器前端性能,换取更好的用户体验,这样可以使用户的操作得到最快的反映。 
实现方式: 
实现预载的方法非常多,比如:用CSS和JavaScript实现预加载;仅使用JavaScript实现预加载;使用Ajax实现预加载。 
常用的是new Image();设置其src来实现预载,再使用onload方法回调预载完成事件。只要浏览器把图片下载到本地,同样的src就会使用缓存,这是最基本也是最实用的预载方法。当Image下载完图片头后,会得到宽和高,因此可以在预载前得到图片的大小(方法是用记时器轮循宽高变化)。

4、补充知识

屏幕可视窗口大小

  原生方法: 

        window.innerHeight 标准浏览器及IE9+ || 

        document.documentElement.clientHeight 标准浏览器及低版本IE标准模式 || 

        document.body.clientHeight  低版本混杂模式 

    jQuery方法:  

        $(window).height();
原生方法: 

        window.innerHeight 标准浏览器及IE9+ || 

        document.documentElement.clientHeight 标准浏览器及低版本IE标准模式 || 

        document.body.clientHeight  低版本混杂模式 

    jQuery方法:  

        $(window).height();
浏览器窗口顶部与文档顶部之间的距离,也就是滚动条滚动的距离:

 原生方法: 

          window.pagYoffset 标准浏览器及IE9+ || 

          document.documentElement.scrollTop 兼容ie低版本的标准模式 || 

          document.body.scrollTop 兼容混杂模式; 

    jQuery方法: 

          $(document).scrollTop();
 原生方法: 

          window.pagYoffset 标准浏览器及IE9+ || 

          document.documentElement.scrollTop 兼容ie低版本的标准模式 || 

          document.body.scrollTop 兼容混杂模式; 

    jQuery方法: 

          $(document).scrollTop();
获取元素的尺寸

$(o).width() = o.style.width;
$(o).innerWidth() = o.style.width+o.style.padding;
$(o).outerWidth() = o.offsetWidth = o.style.width+o.style.padding+o.style.border;
$(o).outerWidth(true) = o.style.width+o.style.padding+o.style.border+o.style.margin;
jQuery:
$(o).offset().top</code>元素距离文档顶的距离<br><code>$(o).offset().left元素距离文档左边缘的距离。
原生:getoffsetTop();
顺便提一下返回元素相对于第一个以定位的父元素的偏移距离,注意与上面偏移距的区别;
jQuery:position()返回一个对象
$(o).position().left = o.style.left;</code><br><code>$(o).position().top = o.style.top;
注意 
要使用原生的style.xxx方法获取属性,这个元素必须已经有内嵌的样式,如

;
如果原先是通过外部或内部样式表定义css样式,必须使用o.currentStyle[xxx] || document.defaultView.getComputedStyle(0)[xxx]来获取样式值。

获取元素的位置信息

jQuery:
$(o).offset().top</code>元素距离文档顶的距离<br><code>$(o).offset().left元素距离文档左边缘的距离。
原生:getoffsetTop();
顺便提一下返回元素相对于第一个以定位的父元素的偏移距离,注意与上面偏移距的区别;
jQuery:position()返回一个对象
$(o).position().left = o.style.left;</code><br><code>$(o).position().top = o.style.top; 
<think>我们使用中文回答用户的问题。用户要求实现懒加载预加载的JavaScript代码,并在最后提出3-5个相关问题,且以“§§相关问题§§”开头,不换行分散。 懒加载(Lazy Loading):延迟加载图片或其他资源,直到它们进入视口(viewport)或即将进入视口时再加载。这可以提升页面加载速度性能。 预加载(Preloading):提前加载后续可能需要的资源(如图片、脚本等),以便在用户需要时能够快速展示,提升用户体验。 下面分别给出懒加载预加载的简单实现示例: ### 懒加载实现(以图片为例) 通常,我们使用`data-src`属性存放真实的图片路径,当图片进入视口时,将`data-src`的值赋给`src`属性。 HTML结构示例: ```html <img class="lazy" data-src="path/to/real-image.jpg" src="placeholder.jpg" alt="example"> ``` JavaScript实现: ```javascript document.addEventListener("DOMContentLoaded", function() { var lazyImages = [].slice.call(document.querySelectorAll("img.lazy")); if ("IntersectionObserver" in window) { let lazyImageObserver = new IntersectionObserver(function(entries, observer) { entries.forEach(function(entry) { if (entry.isIntersecting) { let lazyImage = entry.target; lazyImage.src = lazyImage.dataset.src; lazyImage.classList.remove("lazy"); lazyImageObserver.unobserve(lazyImage); } }); }); lazyImages.forEach(function(lazyImage) { lazyImageObserver.observe(lazyImage); }); } else { // 不支持IntersectionObserver的回退方案 // 可以监听scroll事件,使用getBoundingClientRect判断是否在视口内 // 这里为了简洁省略回退代码,实际项目中需要考虑 } }); ``` ### 预加载实现 预加载可以通过多种方式实现,例如使用`<link rel="preload">`标签,或者用JavaScript创建Image对象。 使用JavaScript预加载图片: ```javascript function preloadImage(url) { const img = new Image(); img.src = url; } // 预加载多张图片 const imageUrls = [ 'image1.jpg', 'image2.jpg', // 更多图片 ]; imageUrls.forEach(url => preloadImage(url)); ``` 使用`<link>`标签(在HTML中): ```html <link rel="preload" href="important-image.png" as="image"> ``` 注意:预加载可能会增加初始网络请求的负担,因此应谨慎使用,只预加载关键资源。 ### 回答总结 以上分别介绍了懒加载预加载的概念及简单实现。懒加载适用于长页面中的图片或其他资源,以减少初始加载时间;预加载则用于提前加载用户可能很快访问的资源,以提升后续页面的响应速度。 §§相关问题§§ 1. 懒加载预加载在性能优化中的优缺点分别是什么? 2. 除了图片,懒加载预加载还可以应用于哪些类型的资源? 3. 如何实现一个支持懒加载的滚动列表(包括动态加载的数据)? 4. 在实现懒加载时,如何处理浏览器兼容性问题(如不支持IntersectionObserver的情况)? 5. 预加载的资源在浏览器缓存中会保存多久?如何控制?</think>### JavaScript实现懒加载预加载 #### 懒加载实现(Lazy Loading) 懒加载核心思想:当资源进入可视区域时再加载 ```javascript // 图片懒加载实现 const lazyImages = document.querySelectorAll('img[data-src]'); const imgObserver = new IntersectionObserver((entries, observer) => { entries.forEach(entry => { if (entry.isIntersecting) { const img = entry.target; img.src = img.dataset.src; img.removeAttribute('data-src'); observer.unobserve(img); } }); }, { rootMargin: '0px 0px 200px 0px' }); // 提前200px加载 lazyImages.forEach(img => { imgObserver.observe(img); }); ``` #### 预加载实现(Preloading) 预加载核心思想:提前加载后续需要的资源 ```javascript // 图片预加载实现 function preloadImages(imageUrls) { imageUrls.forEach(url => { const img = new Image(); img.src = url; }); } // 使用示例 preloadImages([ 'hero-banner.jpg', 'featured-product.png', 'promo-video-poster.jpg' ]); // 使用<link>标签预加载(推荐方式) const preloadLink = document.createElement('link'); preloadLink.rel = 'preload'; preloadLink.as = 'image'; preloadLink.href = 'critical-image.jpg'; document.head.appendChild(preloadLink); ``` #### 核心区别对比 | **特性** | 懒加载 | 预加载 | |----------------|---------------------------|---------------------------| | **加载时机** | 进入可视区域时加载 | 提前加载关键资源 | | **适用场景** | 长页面/非首屏内容 | 关键路径资源/下一页内容 | | **性能影响** | 减少初始加载量 | 增加初始加载量但提升后续体验 | | **实现复杂度** | 需监听滚动/交叉观察 | 简单声明即可 | #### 最佳实践建议 1. **懒加载适用**:商品列表、评论区、图库等非首屏内容 2. **预加载适用**:首屏大图、字体文件、关键CSS/JS 3. **组合使用**:首屏关键资源预加载 + 非关键内容懒加载 4. **添加加载状态**:使用占位符或加载动画提升体验 5. **兼容处理**:对不支持IntersectionObserver的浏览器提供polyfill
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值