lazyLoad-scroll-getBoundingClientRect-SAM9029
lazyload-IntersectionObserver-SAM9029
进阶–利用getBoundingClientRect实现图片的无限滚动加载 无限滚动懒加载–getBoundingClientRect
scroll
+ getBoundingClientRect
lazyLoad-scroll-getBoundingClientRect-SAM9029
let imgList = document.querySelectorAll('img')
window.onscroll = function() {
console.log('执行懒加载监听')
//imgList 本身是 类数组含有 forEach方法同理实现
//此处使用 map 调用call 只是为了加深 改变执行上下文的方法 使用,不必在意
Array.prototype.map.call(imgList,item =>{
// 目标 对象 距离 xx 的顶部距离 小于 当前浏览器窗口的可视高度
if(item.getBoundingClientRect().top < window.innerHeight){
// 将 存储 在data自定义属性中的src 提出 赋值给 img的src
item.src = item.dataset.src
}
})
}
IntersectionObserver
(推荐)lazyload-IntersectionObserver-SAM9029
let imgList = document.querySelectorAll('img')
let imgObserver = new IntersectionObserver(callback)
//我把callback 写在 外面,方便理解,亦可直接写在构造函数参数内
function callback(entries){
console.log('执行懒加载监听')
//被观察的 图片数组对象
entries.forEach(item=>{
// 调用 被观察的目标元素 是否 与可视窗口 出现交叉区域
if(item.isIntersecting){
//获取 被观察的目标元素
const targetImg = item.target
// 将 存储 在data自定义属性中的src 提出 赋值给 img的src
targetImg.src = targetImg.dataset.src
// 在懒加载完成后可执行 停止观察,节约性能资源
imgObserver.unobserve(targetImg)
}
})
}
//每个图片都进行观察
imgList.forEach(item=>{
imgObserver.observe(item)
})
MDN-Element.getBoundingClientRect()
无参普通函数方法
视口
的位置。视口
可☞window,也可指具有滚动条的父元素!!!
{
//元素大小信息
height: 120
width: 100
//元素在窗口的位置信息
top: 571.5
left: 18
bottom: 691.5
right: 118
y: 571.5
x: 18
} ```
超好用的API之IntersectionObserver-掘金-Va007
构造函数
,let targetImgObserver = new IntersectionObserver(callback, option);
callback
回调函数 (理解起来可能有些难,多看几遍参考文章,多写几遍代码!!)
_entries
一般写成 箭头函数的形式(见基本使用语法)_entries
我们需要知道 这就是构造函数的 .observe(_target)
方法调用后拿到的 目标对象(可接受为数组形式,即我们多个对象进行了观察,这种情况下很多见,可结合本次例子理解),并可以调用其的观察信息属性
entries.isIntersecting
:返回一个布尔值,下列两种操作均会触发callback:1. 如果目标元素出现在root可视区,返回true。2. 如果从root可视区消失,返回falseentries.target
目标元素:即被观察的目标元素 let targetImgObserver = new IntersectionObserver(callback = _entries =>{
//code
}, option);
//调用该 观察方法后,回调函数的 _entries 就会拿到 被观察的对象
targetImgObserver.observe(_target)
// 在懒加载完成后可执行 停止观察
// targetImgObserver.unobserve(_target)
innerWidht
+ innerHeight
菜鸟教程___Window innerWidth 和 innerHeight 属性
innerHeight 返回窗口的文档显示区的高度,如果有垂直滚动条,也包括滚动条高度。
innerWidth 返回窗口的文档显示区的宽度,如果有水平滚动条,也包括滚动条高度。
innerWidth 和 innerHeight 是只读属性。
注意:使用 outerWidth 和 outerHeight 属性获取浏览器窗口的宽度与高度。
- .innerWidht .innerHeight
- .outterWidht .outterHeight
- .screenX .screenY
- .clientTop .clientLeft
- .clientWidth .clientHeight
- .offsetTop .offsetLeft
- .offsetWidth .offsetHeight
- .scrollTop .scrollLeft
- .scrollWidth .scrollHeight
<style>
img{
display: block;
margin: 10px;
width: 100px;
height: 120px;
}
style>
<div>
<div>
<h1>清平乐·六盘山h1>
<p>
天高云淡,望断南飞雁。
p>
<p>
不到长城非好汉,屈指行程二万。
p>
<p>
六盘山上高峰,红旗漫卷西风。
p>
<p>
今日长缨在手,何时缚住苍龙?
p>
div>
<div>
<h1>清平乐·六盘山h1>
<p>
天高云淡,望断南飞雁。
p>
<p>
不到长城非好汉,屈指行程二万。
p>
<p>
六盘山上高峰,红旗漫卷西风。
p>
<p>
今日长缨在手,何时缚住苍龙?
p>
div>
<div>
<h1>清平乐·六盘山h1>
<p>
天高云淡,望断南飞雁。
p>
<p>
不到长城非好汉,屈指行程二万。
p>
<p>
六盘山上高峰,红旗漫卷西风。
p>
<p>
今日长缨在手,何时缚住苍龙?
p>
div>
<div>
<h1>清平乐·六盘山h1>
<p>
天高云淡,望断南飞雁。
p>
<p>
不到长城非好汉,屈指行程二万。
p>
<p>
六盘山上高峰,红旗漫卷西风。
p>
<p>
今日长缨在手,何时缚住苍龙?
p>
div>
div>
<img data-src='https://i.postimg.cc/QdzdhHzg/i001.jpg' alt="">
<img data-src='https://i.postimg.cc/RF7S7GZG/i002.jpg' alt="">
<img data-src='https://i.postimg.cc/gJFcL1mn/i003.jpg' alt="">
<img data-src='https://i.postimg.cc/ZqyKRJkG/i004.jpg' alt="">
data-src='https://i.postimg.cc/QdzdhHzg/i001.jpg' alt="">
<img data-src='https://i.postimg.cc/RF7S7GZG/i002.jpg' alt="">
<img data-src='https://i.postimg.cc/gJFcL1mn/i003.jpg' alt="">
<img data-src='https://i.postimg.cc/ZqyKRJkG/i004.jpg' alt="">