1.如何判斷一個元素是否出現在窗口可視范圍(瀏覽器的上邊緣和下邊緣之間,肉眼可視)。寫一個函數 isVisible實現。
function isVisible($node){ var windowHeight=$(window).height(); var scrollTop=$(window).scrollTop(); var nodeOffsetTop=$node.offset().top(); var nodeHeight=$node.outerHeight(); if((windowHeight+scrollTop)>nodeOffsetTop && scrollTop<(nodeOffsetTop+nodeHeight)){ return true; }else{ return false; } }
2.當窗口滾動時,判斷一個元素是不是出現在窗口可視范圍。每次出現都在控制臺打印 true 。用代碼實現。
$(window).on("scroll",function(){ if(isVisible($("#btn"))){ console.log(true); } }) function isVisible($node){ var windowHeight=$(window).height(); var scrollTop=$(window).scrollTop(); var nodeOffsetTop=$node.offset().top(); var nodeHeight=$node.outerHeight(); if((windowHeight+scrollTop)>nodeOffsetTop && scrollTop<(nodeOffsetTop+nodeHeight)){ return true; }else{ return false; } }
3.當窗口滾動時,判斷一個元素是不是出現在窗口可視范圍。在元素第一次出現時在控制臺打印 true,以后再次出現不做任何處理。用代碼實現。
//設置標志位:第一次出現過則改變狀態 var isShowed=false; $(window).on("scroll",function(){ if(isVisible($("#btn")) && !isShowed){ console.log(true); isShowed=true; } })
function isVisible($node){ var windowHeight=$(window).height(); var scrollTop=$(window).scrollTop(); var nodeOffsetTop=$node.offset().top(); var nodeHeight=$node.outerHeight(); if((windowHeight+scrollTop)>nodeOffsetTop && scrollTop<(nodeOffsetTop+nodeHeight)){ return true; }else{ return false; } }
4.圖片懶加載的原理是什么?
一、原理
在瀏覽器滾動的時候,遍歷所有圖片,若圖片在視窗可視區域,則加載該圖片
將圖片地址存放在自定義屬性中(data-src),需要加載圖片再從中取出來
判斷圖片可見:
- 圖片上部分進入可視窗體
windowHeight + scrollTop > offsetTop - 圖片下部分進入可視窗體
offsetTop + nodeHeight > scrollTop
二、如何實現
需要用到4個高度
let windowHeight = $(window).height(), //視窗高度
scrollTop = $(window).scrollTop(), //滾動條滾動距離
offsetTop = $node.offset().top() //圖片相對于文檔的垂直坐標
nodeHeight = $node.outerHeight(); //圖片高度-
判斷圖片可見
if ( (windowHeight + scrollTop) > offsetTop && (offsetTop + nodeHeight ) > scrollTop) { return true; } else { return false; }
-
方法:是否顯示該圖片
const isShow = ($node) => { let windowHeight = $(window).height(), scrollTop = $(window).scrollTop(), offsetTop = $node.offset().top(); nodeHeight = $node.outerHeight(); if (windowHeight + scrollTop > offsetTop && offsetTop + nodeHeight > scrollTop) { return true; } else { return false; } }
-
方法:遍歷所有圖片,加載沒有load類名且isShow返回true的圖片(加載前給圖片加類名load)
const loadImgs = ()=>{ console.log('1'); $('.wrapper img').not('.load').each(function(index){ console.log('2'); let $node = $(this); if(isShow($node)){ $node.addClass('load'); $node.attr('src',$node.attr('data-src')); } }); }
最后,監聽屏幕滾動事件,并在一開始進入界面時加載圖片
loadImgs();
$(window).scroll(function () {
loadImgs();
})