前端vue优化面试

JavaScript - 图片懒加载

2019-10-06  本文已影响0人  ElricTang

一. 为什么需要图片懒加载?

二. 懒加载原理?有什么好处?

三. 实现

问题1:如何判断图片处于可视范围?

Element.getBoundingClientRect():返回元素的大小及其相对于视口的位置。
window.innerHeight:浏览器窗口的视口(viewport)高度(以像素为单位);如果有水平滚动条,也包括滚动条高度

问题2:图片的src暂存的是loading图,如何获取真正的图片内容?
问题3:如何动态获取视窗变化?
问题4:滚动时间触发太频繁,如何优化,减少重复判断?
问题5:已经加载过的图片怎么区分?(避免重复加载)
完整代码
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style>
            .container{
                width:400px;
            }
            img{
                width:400px;
                height:600px;
            }
        </style>
    </head>
    <body>
        <div class="container">
            <img src="./loading.gif" data-src="./smile.jpg" class="lazy">
            <img src="./loading.gif" data-src="./smile.jpg" class="lazy">
            <img src="./loading.gif" data-src="./smile.jpg" class="lazy">
            <img src="./loading.gif" data-src="./smile.jpg" class="lazy">
            <img src="./loading.gif" data-src="./smile.jpg" class="lazy">
            <img src="./loading.gif" data-src="./smile.jpg" class="lazy">
            <img src="./loading.gif" data-src="./smile.jpg" class="lazy">
            <img src="./loading.gif" data-src="./smile.jpg" class="lazy">
            <img src="./loading.gif" data-src="./smile.jpg" class="lazy">
            <img src="./loading.gif" data-src="./smile.jpg" class="lazy">
            <img src="./loading.gif" data-src="./smile.jpg" class="lazy">
            <img src="./loading.gif" data-src="./smile.jpg" class="lazy">
            <img src="./loading.gif" data-src="./smile.jpg" class="lazy">
        </div>
        <script>
        class LazyLoad{
            constructor(className){
                this.imgList = [...document.querySelectorAll(className)];
                this.judge();
                this.bindEvent();
            }
            // 防抖函数
            debounce(fn,delay){
                let timer = null;
                return function(){
                    if(timer){
                        clearTimeout(timer);
                    }
                    timer = setTimeout(fn,delay);
                }
            }
            // 监听滚动条
            bindEvent(){
                window.addEventListener('scroll',this.debounce(()=>{
                    this.imgList.length && this.judge();                  
                },200))
            }
            // 判断是否在可视范围
            judge(){
                let imgs = this.imgList;
                for(let i = 0;i < imgs.length;i++){
                  if(imgs[i].getBoundingClientRect().top <= window.innerHeight){
                        this.load(imgs[i],i);
                    }
                }
            }
            // 将loading图替换为真实地址,加载图片
            load(el,index){
                let src = el.getAttribute('data-src');
                el.src = src;
                this.imgList.splice(index,1);
            }
        }
        const lazy = new LazyLoad('.lazy')
        </script>
    </body>
</html>
上一篇下一篇

猜你喜欢

热点阅读