欢迎学习交流!!!
持续更新中…
资源预加载是另一个性能优化技术,我们可以使用该技术来预先告知浏览器某些资源可能在将来会被使用到。预加载简单来说就是将所有所需的资源提前请求加载到本地,这样后面在需要用到时就直接从缓存取资源。
在网页全部加载之前,对一些主要内容进行加载,以提供给用户更好的体验,减少等待的时间。否则,如果一个页面的内容过于庞大,没有使用预加载技术的页面就会长时间的展现为一片空白,直到所有内容加载完毕。
场景举例:
当我们观看漫画时,如果看完一张,切换到下一张的漫画还未加载出来,需要空白时间进行等待,就会大大影响用户的体验感,浏览网页时也是如此。
预加载缺点:
实现原理
让 img 标签先显示其他的图片,当其指向的真实图片缓存完成后,再显示为实际的图片。
CSS方法
display=none
, 否则预加载会失效
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>CSS 预加载title>
<link rel="stylesheet" href="./preLoad.css">
head>
<body>
<button onclick="show()">显示button>
<ul>
<li id="preImg1"/>
<li id="preImg2"/>
<li id="preImg3"/>
ul>
body>
<script>
var show = function () {
// 点击 ul 里的标签 ,显示图片
document.querySelector("ul").innerHTML =
`
`
}
script>
html>
/* 预加载样式文件 */
img {
width: 200px;
}
/* 预加载文件 */
#preImg1 {
background-image: url('https://tse3-mm.cn.bing.net/th/id/OIP-C.gzfC-tfjMW3ckgMlTln9gQHaEV?pid=ImgDet&rs=1');
width: 0;
height: 0; /* 隐藏用来预加载的标签 */
}
#preImg2 {
background-image: url('https://tse1-mm.cn.bing.net/th/id/OIP-C.yrwsPVFmAUEPECn8DsgJfgHaEy?pid=ImgDet&rs=1');
width: 0;
height: 0;
}
#preImg3 {
background-image: url('https://tse1-mm.cn.bing.net/th/id/OIP-C.hxoEaM5oD20OmIk7ilOHpQHaHa?pid=ImgDet&rs=1');
width: 0;
height: 0;
}
JavaScript方法
new Image()
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JS 实现图片预加载title>
<style>
ul {
float: left;
margin: 0;
padding: 0;
}
li {
list-style-type: none;
float: left;
}
img {
width: 100px;
height: 100px;
}
#mask {
position: absolute;
width: 300px;
height: 100px;
background-color: rgb(177, 177, 177);
line-height: 100px;
text-align: center;
color: rgb(255, 255, 255);
font-size: 32px;
font-weight: 600;
}
style>
head>
<body>
<div id="mask">00%div>
<ul>
ul>
body>
<script src="./preLoad.js">script>
html>
// 预加载脚本文件
// 预加载的图片 URL
const urlList = [
'https://tse3-mm.cn.bing.net/th/id/OIP-C.gzfC-tfjMW3ckgMlTln9gQHaEV?pid=ImgDet&rs=1',
'https://tse1-mm.cn.bing.net/th/id/OIP-C.yrwsPVFmAUEPECn8DsgJfgHaEy?pid=ImgDet&rs=1',
'https://tse1-mm.cn.bing.net/th/id/OIP-C.hxoEaM5oD20OmIk7ilOHpQHaHa?pid=ImgDet&rs=1']
// 预加载函数 ,会在加载完毕后隐藏遮罩层
function preLoad() {
let process = document.querySelector('#mask'), // 遮罩层 ,用于修改进度和隐藏
len = urlList.length,// 提出 URL 数组长度 ,提供性能
count = 0, // 计算已加载数量和修改进度
ul = document.querySelector("ul"), // 将图片放入此
imgList=""; // img 标签字符串临时存放点,避免刷新DOM的次数。
// 为了模拟多图片资源和将加载过程慢下来,这里使用了计时器 , 实际情况我们采用遍历 URL 数组。
let id = setInterval(() => {
let img = new Image()
img.src = urlList[count]
imgList += `${urlList[count]} ">`
img.onload = img.onerror = function () {
count++;
process.innerText = (count / len * 100).toFixed(2) + '%'; // 设置进度百分比
if (count === len) {
clearInterval(id)
ul.innerHTML += imgList;
process.style.display = 'none'
}
}
}, 500)
}
// 调用预加载函数
preLoad()
懒加载也叫延迟加载,指的是在长网页中延迟加载图像,是一种很好优化网页性能的方式。用户滚动到它们之前,可视区域外的图像不会加载。这与图像预加载相反,在长网页上使用延迟加载将使网页加载更快。在某些情况下,它还可以帮助减少服务器负载。
当访问一个页面的时候,先把img元素或是其他元素的背景图片路径替换成一张大小为1*1px图片的路径(这样就只需请求一次,俗称占位图),只有当图片出现在浏览器的可视区域内时,才设置图片正真的路径,让图片显示出来。
懒加载的缺点:
data-original
属性中data-original
的值,即可实现延迟加载。首先对于页面API的介绍:
描述 | API |
---|---|
页可见区域宽 | document.body.clientWidth; |
网页可见区域高 | document.body.clientHeight; |
网页可见区域宽 | document.body.offsetWidth (包括边线的宽); |
网页可见区域高 | document.body.offsetHeight (包括边线的宽); |
网页正文全文宽 | document.body.scrollWidth; |
网页正文全文高 | document.body.scrollHeight; |
网页被卷去的高 | document.body.scrollTop; |
网页被卷去的左 | document.body.scrollLeft; |
网页正文部分上 | window.screenTop; |
网页正文部分左 | window.screenLeft; |
屏幕分辨率的高 | window.screen.height; |
屏幕分辨率的宽 | window.screen.width; |
屏幕可用工作区高度 | window.screen.availHeight; |
HTMLElement.offsetTop
为只读属性,它返回当前元素相对于其 offsetParent
元素的顶部的距离。
window.innerHeight
:浏览器窗口的视口(viewport)高度(以像素为单位);如果有水平滚动条,也包括滚动条高度。
其中, 当 offsetTop <= scrollTop + clientHeight
时 , 图片便是显示出来或者在可视区之上了。
JavaScript方法
<script>
var num = document.getElementsByTagName('img').length;
var img = document.getElementsByTagName("img");
var n = 0; //存储图片加载到的位置,避免每次都从第一张图片开始遍历
lazyload(); //页面载入完毕加载可是区域内的图片
window.onscroll = lazyload;
function lazyload() { //监听页面滚动事件
var seeHeight = document.documentElement.clientHeight; //可见区域高度
var scrollTop = document.documentElement.scrollTop || document.body.scrollTop; //滚动条距离顶部高度
for (var i = n; i < num; i++) {
if (img[i].offsetTop < seeHeight + scrollTop) {
if (img[i].getAttribute("src") == "default.jpg") {
img[i].src = img[i].getAttribute("data-src");
}
n = i + 1;
}
}
}
</script>
jQuery方法
<script>
var n = 0,
imgNum = $("img").length,
img = $('img');
lazyload();
$(window).scroll(lazyload);
function lazyload(event) {
for (var i = n; i < imgNum; i++) {
if (img.eq(i).offset().top < parseInt($(window).height()) + parseInt($(window).scrollTop())) {
if (img.eq(i).attr("src") == "default.jpg") {
var src = img.eq(i).attr("data-src");
img.eq(i).attr("src", src);
n = i + 1;
}
}
}
}
</script>
前面有提到懒加载的缺点,它对服务器友好,对浏览器却不友好。因为一直监听滚动事件,一直触发是非常消耗性能的 。
对此我们可以进行防抖和节流来减少性能的消耗 、提高流畅度。
详解请看:JS的防抖和节流
概念:
区别:
优秀文章:
超详细的图片预加载和懒加载教程
懒加载和预加载