前端体验优化-懒加载和预加载

1. 懒加载

懒加载的原理很简单,就是当图片滚动到视口中时,将img的src替换成真是的图片地址。通常我们将真实的图片地址存放于data-original这个属性中

const viewHeight = document.documentElement.clientHeight;
function lazyLoad() {
  const elements = document.querySelectorAll("img[data-original][lazyload]");
  [...elements].forEach(element => {
    if (element.dataset.original === "") return;
    const rect = element.getBoundingClientRect();
    if (rect.bottom >= 0 && rect.top < viewHeight) {
      replaceAttrs(element);
    }
  });
}

// 将img中的data-original的值赋给src
// 并将data-original属性移除,防止该元素多次进行懒加载
function replaceAttrs(element) {
  const originalUrl = element.getAttribute("data-original");
  const image = new Image();
  image.src = originalUrl;
  image.onload = function() {
    element.src = originalUrl;
  };
  element.removeAttribute("data-original");
  element.removeAttribute("lazyload");
}

lazyLoad();
document.addEventListener("scroll", lazyLoad, false);

2. 预加载

预加载通常是在元素展示之前,就将相关的资源加载好的一种方案,对于用户体验更加友好。常用的预加载方案有以下几种

  1. 监听图片加载完毕的时间,加载完毕之后再展示图片
<img src="url" style="display:none;" />
  1. 使用js加载图片
function preloadImg (url, callback) {
    const image = new Image();
    image.src = url;
    image.onLoad = callback;
}
  1. 使用ajax请求来预加载图片,这个过程可以对图片的加载有一个更精细化的控制
const xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
  if (xhr.readyState === 4) {
    if ([200, 206, 304].includes(xhr.status)) {
      const responseText = xhr.responseText;
      console.log("ready!");
    }
  }
}
xhr.onprogress = function(e) {
  e = e || event;
  console.log(e);
  if (e.lengthComputable) {
    console.log(`Received ${e.loaded} of ${e.total} bytes.`);
  }
}
xhr.open("GET", "http://localhost:63343/helloworld.jpeg", true);
xhr.send();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值