廢話就很少說了,直接上教程吧html
將須要作懶加載的元素佔一下位,這裏爲何我是用一個類名是來獲取元素下面會有介紹app
<img class="J_lazyload" data-src="{{路徑}}" />
<!-- 這裏是給背景作懶加載 -->
<div class="J_lazyload" data-src="{{路徑}}"></div>
複製代碼
定義一個lazyload的構造函數,而且定義一個獲取對應的節點位置的方法dom
function LazyLoad() {
this.getPositions()
this.initData()
}
LazyLoad.prototype.getPositions = function () {
//這裏須要使用獲取靜態節點列表,不能獲取動態節點列表,由於須要移除J_lazyload鉤子
let imgs = document.querySelectorAll('.J_lazyload')
let targetHeight = window.innerHeight
for (let i = 0, ii = imgs.length; i < ii; i++) {
let items = imgs[i]
let handle = ((img)=>{
return function(){
if (img.tagName.toLowerCase() === 'img') {
img.src = img.dataset.src;
} else {
img.style['background-image'] = 'url(' + img.dataset.src + ')';
}
}
})(items)
let pos = items.getBoundingClientRect()
// 這裏是判斷是否在屏幕內
if (pos.top < targetHeight && pos.bottom > 0) {
// 這裏是使用的Image,下載完成後再將對應的dom節點的src
let image = new Image()
image.src = items.dataset.src
image.onload = handle
// 移除J_lazyload鉤子,防止重複進行懶加載
items.classList.remove('J_lazyload')
}
}
}
複製代碼
綁定事件以前 = >,先來講一下防抖,因爲頻繁觸發,因此這裏須要引入防抖函數函數
function debounce(fn, time) {
var timer = null;
time = time || 60;
var _arguments;
return function () {
var self = this
clearTimeout(timer)
_arguments = [...arguments];
timer = setTimeout(() => {
fn.apply(self, _arguments)
timer = null
}, time)
}
}
複製代碼
LazyLoad.prototype.initData = function () {
let scrolls = debounce(this.replaceUrl, 1000).bind(this)
window.addEventListener('scroll', scrolls)
}
// 進行懶加載
LazyLoad.prototype.replaceUrl = function () {
this.getPositions()
}
複製代碼
以上就是實現一個基本的懶加載了。以爲不錯的話,能夠點個贊呀ui