前端性能优化
图片懒加载
在前端的项目中,为了提高性能经常会使用到上拉加载,clientHeight、offsetHeight、scrollHeight、scrollTop是实现上拉 加载的关键。所以,首先来介绍下三者的意义以及区别。
- clientHeight:表示的是当前显示的元素的高度,如果存在X轴的滚动条与根元素边框,不包括X轴的滚动条与根元素边框的高度 。
- offsetHeight:也表示的是当前显示元素的高度,与clientHeight类似,但offsetHeight包括X轴的滚动条与根元素边框的高度。
- offsetTop:表示元素顶部到父元素顶部的距离
- scrollHeight:表示内容区域的整个高度,包括溢出的内容区域,即滚动条的高度。
- scrollTop:表示的是滚动条滚动的高度,初始未滚动时的高度为0。
//法一:利用getBoundingClientRect直接获取元素顶部距离可视区域顶部的高度
const imgs = document.getElementsByTagName("img");
// 获取可视区域的高度
const viewHight = document.documentElement.clientHeight;
// 统计当前加载到了哪张照片,避免每一次都从第一张照片开始检查
var num = 0;
function lazyload() {
for (let i = num; i < imgs.length; i++) {
const item = imgs[i]
// 可视区域高度减去元素顶部距离可视区域顶部的高度,如果差值大于 0 说明元素展示
let distance = viewHight - item.getBoundingClientRect().top;
let distance =
if (distance >= 0) {
// 展示真实图片
item.src = item.getAttribute("data-src");
num = i + 1;
}
}
}
//法二:自己计算元素顶部到可视窗口顶部的距离
const viewScroll = document.documentElement.scrollTop;
function lazyLoad() {
for (let i = num;i<imgs.length;i++) {
let item = imgs[i];
if (viewHight+viewScroll>getRealTop(item)) {
item.src = item.getAttribute('data-src');
item.removeAttribute('data-src');
}
}
}
function getRealTop(item) {
var realTop = item.offsetTop;
while (item = item.offsetParent) {
realTop+=item.offsetTop
}
return realTop
}
// 监听 scroll 事件,实际项目中需要进行**节流优化**
window.addEventListener("scroll", throttle(lazyload,200), false);
lazyload();
查看10道真题和解析
