懒加载和预加载

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title>照片墙懒加载</title>
<style>
#app {
width: 800px;
margin: 0 auto;
}
img {
display: inline-block;
width: 200px;
height: 300px;
/* border: 1px solid red; */
margin: 5px;
}
</style>
</head>
<body>
<div id="app">
<img src="" alt="" lazyload=true
data-original="https://pic4.zhimg.com/80/v2-e011998436428d4c032416333a4cb058_720w.jpg">
<img src="" alt="" lazyload=true
data-original="https://pic2.zhimg.com/80/v2-0c5d5b1401590bee6b55fb11734f0298_720w.jpg">
<img src="" alt="" lazyload=true
data-original="https://pic4.zhimg.com/80/v2-17d534ee853fe12109c158b5780970ff_720w.jpg">
<img src="" alt="" lazyload=true
data-original="https://pic1.zhimg.com/80/v2-959ef535ec78b21d48f70ebde4cd168a_720w.jpg">
<img src="" alt="" lazyload=true
data-original="https://pic1.zhimg.com/80/v2-f457edab6aaccd4ca4e85679ea8cb730_720w.jpg">
<img src="" alt="" lazyload=true
data-original="https://pic1.zhimg.com/80/v2-d5a33bd3f8b2037b00943a8bb6515c54_720w.jpg">
<img src="" alt="" lazyload=true
data-original="https://pic1.zhimg.com/80/v2-3717f52544ee146404594e8845e620d9_720w.jpg">
<img src="" alt="" lazyload=true
data-original="https://pic3.zhimg.com/80/v2-3268f96a253ae093946bb42b2639f1ac_720w.jpg">
<img src="" alt="" lazyload=true
data-original="https://pic3.zhimg.com/80/v2-2b7a96ba5a85644a930a82e8e3ba512f_720w.jpg">
<img src="" alt="" lazyload=true
data-original="https://pic4.zhimg.com/80/v2-11cfe8fe00d88bf00fb007e453faadac_720w.jpg">
<img src="" alt="" lazyload=true
data-original="https://pic1.zhimg.com/80/v2-f27bf527e0dcdf793dcaab1d13f1b6a8_720w.jpg">
<img src="" alt="" lazyload=true
data-original="https://pic4.zhimg.com/80/v2-50a26dfad91b940961dc15a4728ed92d_720w.jpg">
<img src="" alt="" lazyload=true
data-original="https://pic4.zhimg.com/80/v2-2ee0e476de11f96b7e32262b3144e2ae_720w.jpg">
<img src="" lazyload=true alt=""
data-original="https://pic4.zhimg.com/80/v2-e011998436428d4c032416333a4cb058_720w.jpg">
<img src="" lazyload=true alt=""
data-original="https://pic3.zhimg.com/80/v2-4caf0c9270c3f0684cfd90842259e947_720w.jpg">
<img src="" lazyload=true alt=""
data-original="https://pic1.zhimg.com/80/v2-3717f52544ee146404594e8845e620d9_720w.jpg">
<img src="" lazyload=true alt=""
data-original="https://pic2.zhimg.com/80/v2-1d30acf93a82b0b1628432a561d5c523_720w.jpg">
<img src="" lazyload=true alt=""
data-original="https://pic2.zhimg.com/80/v2-b1e578b6c917f9536ae06c988ddcac4b_720w.jpg">
<img src="" lazyload=true alt=""
data-original="https://pic1.zhimg.com/80/v2-ccb832b49df107e522822f2a83a2b42e_720w.jpg">
<img src="" lazyload=true alt=""
data-original="https://pic4.zhimg.com/80/v2-0d57812c2a6978d7666308ead4242209_720w.jpg">
<img src="" lazyload=true alt=""
data-original="https://pic3.zhimg.com/80/v2-c7006dbe924b7d30773af191bc4307c2_720w.jpg">
<img src="" lazyload=true alt=""
data-original="https://pic4.zhimg.com/80/v2-793920eced87452f7f480cf3706e0bb0_720w.jpg">
<img src="" lazyload=true alt=""
data-original="https://pic1.zhimg.com/80/v2-9a13fe29d1ab03be279282fe31f4ab54_720w.jpg">
<img src="" lazyload=true alt=""
data-original="https://pic1.zhimg.com/80/v2-b63b0a47b732b60517cb6fe99fc5d564_720w.jpg">
<img src="" lazyload=true alt=""
data-original="https://pic4.zhimg.com/80/v2-b2d00072a9c7534c26a019bdc14e837d_720w.jpg">
<img src="" lazyload=true alt=""
data-original="https://pic2.zhimg.com/80/v2-0f2e68bea3342b21e0e95e659faa9b8a_720w.jpg">
<img src="" lazyload=true alt=""
data-original="https://pic2.zhimg.com/80/v2-ca764f7f5b6c17849e210a3611e65a43_720w.jpg">
<img src="" lazyload=true alt=""
data-original="https://pic2.zhimg.com/80/v2-eed3e915b606295050fa21ca61925fc5_720w.jpg">
<img src="" lazyload=true alt=""
data-original="https://pic2.zhimg.com/80/v2-d2663a8d65ee92324dfe3ef44c9dec80_720w.jpg">
<img src="" lazyload=true alt=""
data-original="https://pic2.zhimg.com/80/v2-0a271add45d4b8cdfb85a891018ffcce_720w.jpg">
<img src="" lazyload=true alt=""
data-original="https://pic2.zhimg.com/80/v2-c3c7a7996ae3e40e2d1c01ea132356ff_720w.jpg">
<img src="" lazyload=true alt=""
data-original="https://pic1.zhimg.com/80/v2-9b9d67f88bb5fdbc34a652a641cfda48_720w.jpg">
<img src="" lazyload=true alt=""
data-original="https://pic1.zhimg.com/80/v2-3513570260a9e273b8aa5499718bf784_720w.jpg">
<img src="" lazyload=true alt=""
data-original="https://pic2.zhimg.com/80/v2-58cd74dcc875e1b101c56d792aae14ad_720w.jpg">
<img src="" lazyload=true alt=""
data-original="https://pic3.zhimg.com/80/v2-82933a790c788d938b0d782cfead6255_720w.jpg">
<img src="" lazyload=true alt=""
data-original="https://pic4.zhimg.com/80/v2-8c4aff083676684725e4a3e013f278cf_720w.jpg">
<img src="" lazyload=true alt=""
data-original="https://pic4.zhimg.com/80/v2-e3c7380d78088a92989672917b3c0bea_720w.jpg">
<img src="" lazyload=true alt=""
data-original="https://pic2.zhimg.com/80/v2-9752254028ba7806ace22f93a97e354c_720w.jpg">
</div>
<!-- built files will be auto injected -->
</body>
<script>
function throttle(fn, delay, atleast) {
let timer = null
let previous = null
return function () {
let now = +new Date()
if (!previous) previous = now
if (atleast && now - previous > atleast) {
fn()
previous = now
clearTimeout(timer)
} else {
clearTimeout(timer)
timer = setTimeout(function () {
fn()
previous = null
}, delay)
}
}
}
var viewHieght = document.documentElement.clientHeight //获取可视区域 就是窗口的网页每次显示的那个告诉 缩小会显示宽X高的这个高度
console.log(viewHieght)
function lazyload() {
var eles = document.querySelectorAll('img[data-original][lazyload]')
console.log("eles", eles)
Array.prototype.forEach.call(eles, function (item, index) {
var rect
if (item.dataset.origin)
return;
rect = item.getBoundingClientRect() //获取元素在可视区域内的位置 当滚动位置发生了改变,top和left属性值就会随之立即发生变化(因此,它们的值是相对于视口的,而不是绝对的)
console.log("rec")//滚动时候看rect数组 发现是变化的 此时应该做个节流
if (rect.bottom >= 0 && rect.top < viewHieght) {
!function () { //而将运算符加载函数定义的前面,则是将函数看做一个整体,然后再调用这个函数,并对返回的结构进行逻辑运算
var img = new Image()
img.src = item.dataset.original
img.onload = function () {
item.src = img.src
}
item.removeAttribute('data-original')
item.removeAttribute('lazyload')
}()
}
})
//全部加载的时候,elem的长度为0 移除监听 以下写法不知为何解除监听失败
if (eles.length == 0)
window.removeEventListener('scroll', throttle(lazyload, 1000, 100))
}
lazyload();
window.addEventListener('scroll', throttle(lazyload, 1000, 100))
</script>
</html>