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();
})