您好,欢迎访问一九零五行业门户网

懒加载实现的方法有哪些?(三种方法介绍)

本篇文章给大家带来的内容是关于懒加载实现的方法有哪些?(三种方法介绍),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
优势
性能收益:浏览器加载图片、decode、渲染都需要耗费资源,懒加载能节约性能消耗,缩短onload事件时间。
节约带宽:这个不需要解释。
通常,我们在html中展示图片,会有两种方式:
img 标签
css background-image
img的懒加载实现img有两种方式实现懒加载:
事件监听(scroll、resize、orientationchange)
<!doctype html><html lang="en"><head>    <meta charset="utf-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <meta http-equiv="x-ua-compatible" content="ie=edge">    <title>event</title>    <style>        img {            background: #f1f1fa;            width: 400px;            height: 300px;            display: block;            margin: 10px auto;            border: 0;        }    </style></head><body>    <img src="https://ik.imagekit.io/demo/img/image1.jpeg?tr=w-400,h-300" />    <img src="https://ik.imagekit.io/demo/img/image2.jpeg?tr=w-400,h-300" />    <img src="https://ik.imagekit.io/demo/img/image3.jpg?tr=w-400,h-300" />    <img class="lazy" src="https://ik.imagekit.io/demo/img/image2.jpeg?tr=w-400,h-300" />    <img class="lazy" src="https://ik.imagekit.io/demo/img/image3.jpg?tr=w-400,h-300" /> -->    <img class="lazy" src="https://ik.imagekit.io/demo/img/image4.jpeg?tr=w-400,h-300" />    <img class="lazy" src="https://ik.imagekit.io/demo/img/image5.jpeg?tr=w-400,h-300" />    <img class="lazy" src="https://ik.imagekit.io/demo/img/image6.jpeg?tr=w-400,h-300" />    <img class="lazy" src="https://ik.imagekit.io/demo/img/image7.jpeg?tr=w-400,h-300" />    <img class="lazy" src="https://ik.imagekit.io/demo/img/image8.jpeg?tr=w-400,h-300" />    <img class="lazy" src="https://ik.imagekit.io/demo/img/image9.jpeg?tr=w-400,h-300" />    <img class="lazy" src="https://ik.imagekit.io/demo/img/image10.jpeg?tr=w-400,h-300" />    <script>        document.addeventlistener(domcontentloaded, function() {            var lazyloadimages = document.queryselectorall(img.lazy);                var lazyloadthrottletimeout;                        function lazyload () {                if(lazyloadthrottletimeout) {                    cleartimeout(lazyloadthrottletimeout);                }                                    lazyloadthrottletimeout = settimeout(function() {                    var scrolltop = window.pageyoffset;                    lazyloadimages.foreach(function(img) {                        if(img.offsettop < (window.innerheight + scrolltop)) { img.src = img.dataset.src; img.classlist.remove('lazy'); } }); if(lazyloadimages.length == 0) { document.removeeventlistener("scroll", lazyload); window.removeeventlistener("resize", lazyload); window.removeeventlistener("orientationchange", lazyload); } }, 20); } document.addeventlistener("scroll", lazyload); window.addeventlistener("resize", lazyload); window.addeventlistener("orientationchange", lazyload); }); </script></body></html>
intersection observer(兼容性问题)
<!doctype html><html lang="en"><head>    <meta charset="utf-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <meta http-equiv="x-ua-compatible" content="ie=edge">    <title>observer</title>    <style>        img {            background: #f1f1fa;            width: 400px;            height: 300px;            display: block;            margin: 10px auto;            border: 0;        }    </style></head><body>    <img src="https://ik.imagekit.io/demo/img/image2.jpeg?tr=w-400,h-300" />    <img src="https://ik.imagekit.io/demo/img/image3.jpg?tr=w-400,h-300" /> -->    <img class="lazy" src="https://ik.imagekit.io/demo/img/image1.jpeg?tr=w-400,h-300" />    <img class="lazy" src="https://ik.imagekit.io/demo/img/image2.jpeg?tr=w-400,h-300" />    <img class="lazy" src="https://ik.imagekit.io/demo/img/image3.jpg?tr=w-400,h-300" />    <img class="lazy" src="https://ik.imagekit.io/demo/img/image4.jpeg?tr=w-400,h-300" />    <img class="lazy" src="https://ik.imagekit.io/demo/img/image5.jpeg?tr=w-400,h-300" />    <img class="lazy" src="https://ik.imagekit.io/demo/img/image6.jpeg?tr=w-400,h-300" />    <img class="lazy" src="https://ik.imagekit.io/demo/img/image7.jpeg?tr=w-400,h-300" />    <img class="lazy" src="https://ik.imagekit.io/demo/img/image8.jpeg?tr=w-400,h-300" />    <img class="lazy" src="https://ik.imagekit.io/demo/img/image9.jpeg?tr=w-400,h-300" />    <img class="lazy" src="https://ik.imagekit.io/demo/img/image10.jpeg?tr=w-400,h-300" />    <script>        document.addeventlistener(domcontentloaded, function() {            var lazyloadimages = document.queryselectorall(.lazy);            var imageobserver = new intersectionobserver(function(entries, observer) {                entries.foreach(function(entry) {                    if (entry.isintersecting) {                        var image = entry.target;                        image.src = image.dataset.src;                        image.classlist.remove(lazy);                        imageobserver.unobserve(image);                    }                });            });            lazyloadimages.foreach(function(image) {                imageobserver.observe(image);            });        });    </script></body></html>
background-image的实现background-image的实现跟img的原理基本是一样的,区别是在对class的处理上:
<!doctype html><html lang="en"><head>    <meta charset="utf-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <meta http-equiv="x-ua-compatible" content="ie=edge">    <title>background</title>    <style>        body {            margin: 0;        }        .bg {            height: 200px;        }        #bg-image.lazy {            background-image: none;            background-color: #f1f1fa;        }        #bg-image {            background-image: url(https://ik.imagekit.io/demo/img/image1.jpeg?tr=w-400,h-300);            background-size: 100%;        }    </style></head><body>    <p id="bg-image" class="bg lazy"></p>    <p id="bg-image" class="bg lazy"></p>    <p id="bg-image" class="bg lazy"></p>    <p id="bg-image" class="bg lazy"></p>    <p id="bg-image" class="bg lazy"></p>    <p id="bg-image" class="bg lazy"></p>    <p id="bg-image" class="bg lazy"></p>    <p id="bg-image" class="bg lazy"></p>    <script>        document.addeventlistener(domcontentloaded, function() {            var lazyloadimages = document.queryselectorall(.lazy);            var imageobserver = new intersectionobserver(function(entries, observer) {                entries.foreach(function(entry) {                    if (entry.isintersecting) {                        var image = entry.target;                        image.classlist.remove(lazy);                        imageobserver.unobserve(image);                    }                });            });            lazyloadimages.foreach(function(image) {                imageobserver.observe(image);            });        });    </script></body></html>
渐进式懒加载渐进式懒加载,指的是存在降级处理,通常html形式如下:
<a href="full.jpg" class="progressive replace">  <img src="tiny.jpg" class="preview" alt="image" /></a>
这样的代码会有2个好处:
如果js执行失败,可以点击预览
大小与实际图一致的占位data uri,避免reflow
最终的代码如下:
<!doctype html><html lang="en"><head>    <meta charset="utf-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <meta http-equiv="x-ua-compatible" content="ie=edge">    <title>progressive</title>    <style>        a.progressive {            position: relative;            display: block;            overflow: hidden;            outline: none;        }        a.progressive:not(.replace) {            cursor: default;        }        a.progressive img {            display: block;            width: 100%;            max-width: none;            height: auto;            border: 0 none;        }        a.progressive img.preview {            filter: blur(2vw);            transform: scale(1.05);        }        a.progressive img.reveal {            position: absolute;            left: 0;            top: 0;            will-change: transform, opacity;            animation: reveal 1s ease-out;        }        @keyframes reveal {            0% {transform: scale(1.05); opacity: 0;}            100% {transform: scale(1); opacity: 1;}        }    </style></head><body>    <a href="https://s3-us-west-2.amazonaws.com/s.cdpn.io/123941/nature5.jpg" srcset="https://s3-us-west-2.amazonaws.com/s.cdpn.io/123941/nature5.jpg 800w, https://s3-us-west-2.amazonaws.com/s.cdpn.io/123941/nature5big.jpg 1600w" class="progressive replace">        <img src="data:image/jpeg;base64,/9j/4aaqskzjrgabaqeayabgaad//ga7q1jfqvrpujogz2qtanblzyb2ms4wich1c2luzybjskcgslbfryb2njiplcbxdwfsaxr5id0gnzak/9saqwakbwcibwykcagicwokcw4yea4ndq4dfryrgcmfjsqihyihjis3lyypnckhijbbmtq5oz4+piuureldpeg3pt47/9saqwekcwsodq4cebacoygikds7ozs7ozs7ozs7ozs7ozs7ozs7ozs7ozs7ozs7ozs7ozs7ozs7ozs7ozs7ozs7ozs7/8aaeqgabqauaweiaairaqmraf/eab8aaaefaqebaqebaaaaaaaaaaabagmebqyhcakkc//ealuqaaibawmcbamfbqqeaaabfqecawaeequsitfbbhnryqcicrqygzghccncscevuthwjdnicoijchyxgbkajsynkckqndu2nzg5okneruzhselku1rvvldywvpjzgvmz2hpann0dxz3ehl6g4sfhoeiiyqsk5svlpeymzqio6slpqeoqaqys7s1tre4ubrcw8tfxsfiycrs09tv1tfy2drh4upk5ebn6onq8flz9px29/j5+v/eab8baambaqebaqebaqeaaaaaaaabagmebqyhcakkc//ealuraaibagqeawqhbqqeaaecdwabagmrbauhmqysqvehyxetijkbcbrckagxwqkjm1lwfwjy0qowjdthjfexgbkajicokso1njc4otpdrevgr0hjslnuvvzxwflay2rlzmdoawpzdhv2d3h5eokdhiwgh4ijipktljwwl5izmqkjpkwmp6ipqrkztlw2t7i5usldxmxgx8jjytlt1nxw19jz2ulj5oxm5+jp6vlz9px29/j5+v/aaawdaqaceqmrad8a5yc3e2s3gm7oeqhdga57vtulapquoauk7ym7r2bpsiivs5vn8stjmk2ldgvm3lyshg7bxk0uuv4skk2jdn2p/9k=" class="preview" alt="palm trees" />    </a>    <a href="https://s3-us-west-2.amazonaws.com/s.cdpn.io/123941/nature2.jpg" class="progressive replace">        <img src="http://lorempixel.com/20/15/nature/2/" class="preview" alt="sunset" />    </a>    <a href="https://s3-us-west-2.amazonaws.com/s.cdpn.io/123941/nature3.jpg" class="progressive replace">        <img src="http://lorempixel.com/20/15/nature/3/" class="preview" alt="tide" />    </a>    <a href="https://s3-us-west-2.amazonaws.com/s.cdpn.io/123941/nature5.jpg" srcset="https://s3-us-west-2.amazonaws.com/s.cdpn.io/123941/nature5.jpg 800w, https://s3-us-west-2.amazonaws.com/s.cdpn.io/123941/nature5big.jpg 1600w" class="progressive replace">        <img src="data:image/jpeg;base64,/9j/4aaqskzjrgabaqeayabgaad//ga7q1jfqvrpujogz2qtanblzyb2ms4wich1c2luzybjskcgslbfryb2njiplcbxdwfsaxr5id0gnzak/9saqwakbwcibwykcagicwokcw4yea4ndq4dfryrgcmfjsqihyihjis3lyypnckhijbbmtq5oz4+piuureldpeg3pt47/9saqwekcwsodq4cebacoygikds7ozs7ozs7ozs7ozs7ozs7ozs7ozs7ozs7ozs7ozs7ozs7ozs7ozs7ozs7ozs7ozs7/8aaeqgabqauaweiaairaqmraf/eab8aaaefaqebaqebaaaaaaaaaaabagmebqyhcakkc//ealuqaaibawmcbamfbqqeaaabfqecawaeequsitfbbhnryqcicrqygzghccncscevuthwjdnicoijchyxgbkajsynkckqndu2nzg5okneruzhselku1rvvldywvpjzgvmz2hpann0dxz3ehl6g4sfhoeiiyqsk5svlpeymzqio6slpqeoqaqys7s1tre4ubrcw8tfxsfiycrs09tv1tfy2drh4upk5ebn6onq8flz9px29/j5+v/eab8baambaqebaqebaqeaaaaaaaabagmebqyhcakkc//ealuraaibagqeawqhbqqeaaecdwabagmrbauhmqysqvehyxetijkbcbrckagxwqkjm1lwfwjy0qowjdthjfexgbkajicokso1njc4otpdrevgr0hjslnuvvzxwflay2rlzmdoawpzdhv2d3h5eokdhiwgh4ijipktljwwl5izmqkjpkwmp6ipqrkztlw2t7i5usldxmxgx8jjytlt1nxw19jz2ulj5oxm5+jp6vlz9px29/j5+v/aaawdaqaceqmrad8a5yc3e2s3gm7oeqhdga57vtulapquoauk7ym7r2bpsiivs5vn8stjmk2ldgvm3lyshg7bxk0uuv4skk2jdn2p/9k=" class="preview" alt="palm trees" />    </a>    <a href="https://s3-us-west-2.amazonaws.com/s.cdpn.io/123941/nature2.jpg" class="progressive replace">        <img src="http://lorempixel.com/20/15/nature/2/" class="preview" alt="sunset" />    </a>    <a href="https://s3-us-west-2.amazonaws.com/s.cdpn.io/123941/nature3.jpg" class="progressive replace">        <img src="http://lorempixel.com/20/15/nature/3/" class="preview" alt="tide" />    </a>    <script>        window.addeventlistener('load', function() {            var pitem = document.getelementsbyclassname('progressive replace'), timer;            window.addeventlistener('scroll', scroller, false);            window.addeventlistener('resize', scroller, false);            inview();            function scroller(e) {                timer = timer || settimeout(function() {                    timer = null;                    requestanimationframe(inview);                }, 300);            }            function inview() {                var scrolltop = window.pageyoffset;                var innerheight = window.innerheight;                var p = 0;                while (p < pitem.length) {                    var offsettop = pitem[p].offsettop;                    if (offsettop < (scrolltop + innerheight)) {                        loadfullimage(pitem[p]);                        pitem[p].classlist.remove('replace');                    }                    else p++;                }            }            function loadfullimage(item) {                var img = new image();                if (item.dataset) {                    img.srcset = item.dataset.srcset || '';                    img.sizes = item.dataset.sizes || '';                }                img.src = item.href;                img.classname = 'reveal';                if (img.complete) addimg();                else img.onload = addimg;                function addimg() {                    item.addeventlistener('click', function(e) { e.preventdefault(); }, false);                    item.appendchild(img).addeventlistener('animationend', function(e) {                        var pimg = item.queryselector('img.preview');                        if (pimg) {                            e.target.alt = pimg.alt || '';                            item.removechild(pimg);                            e.target.classlist.remove('reveal');                        }                    });                }            }        }, false);    </script></body></html>
现成库推荐下面这个库,使用非常简单:https://www.npmjs.com/package/lozad
以上就是懒加载实现的方法有哪些?(三种方法介绍)的详细内容。
其它类似信息

推荐信息