web新能优化四-图片的懒加载

在做web端开发的时候,有些场景是需要加载很多资源的,比如图片、css、js等,举个例子来说,在电商网站,需要很多图片,但是浏览器并行加载资源的能力是有限的,这就需要我们思考如何能在不影响用户体验的情况下解决这个问题,从而提高用户体验,今天这篇文章主要是讲解图片的懒加载和预加载实现原理

懒加载实现原理

先看一张图
图片在屏幕中位置

  • 当我们的图片不在可视区域内,浏览器不会加载图片资源,当我们的图片进入可视区域,去请求资源
  • 这个时候需要去监听scroll事件,在scroll事件的回调中,去判断懒加载的图片是否在可视区域
  • 需要知道整个手机屏幕的高度height,还有懒加载的图片是否进入可视区域,上边缘top与height的比较

来我们先看一下手淘网站是怎么实现图片懒加载的
手淘网站懒加载示意图

lazyload

从以上两张图中可以看到手淘使用了懒加载技术,它会提前把图片的url存放在data-image这个属性中,等scroll到这个图片的时候,再把url放在img的src上开始加载图片,同时去掉lazyload的属性就可以了。接下来,我给大家准备了一个简单的demo,来实现懒加载的效果,大家就会明白懒加载的实现原理是什么了。

HTML
<!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>懒加载</title>
    <link rel="stylesheet" href="./main.css">
</head>

<body>
    <div class="image-list">
        <img src="" lazyload="true" alt="" class="image-item" data-original="https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=2048320673,585588639&fm=200&gp=0.jpg" />
        <img src="" lazyload="true" alt="" class="image-item" data-original="https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=1314614636,1104617902&fm=27&gp=0.jpg" />
        <img src="" lazyload="true" alt="" class="image-item" data-original="https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=1188734066,1612191317&fm=27&gp=0.jpg" />
        <img src="" lazyload="true" alt="" class="image-item" data-original="https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=189835623,747133716&fm=27&gp=0.jpg" />
        <img src="" lazyload="true" alt="" class="image-item" data-original="https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=1069058874,714751845&fm=27&gp=0.jpg" />
        <img src="" lazyload="true" alt="" class="image-item" data-original="https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=2117740928,4022788063&fm=200&gp=0.jpg" />
        <img src="" lazyload="true" alt="" class="image-item" data-original="https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=1226935977,279123673&fm=27&gp=0.jpg" />
        <img src="" lazyload="true" alt="" class="image-item" data-original="https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=2114582188,2400828084&fm=200&gp=0.jpg" />
        <img src="" lazyload="true" alt="" class="image-item" data-original="https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=2682530319,821374529&fm=27&gp=0.jpg" />
        <img src="" lazyload="true" alt="" class="image-item" data-original="https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=2917618884,954472175&fm=27&gp=0.jpg" />
        <img src="" lazyload="true" alt="" class="image-item" data-original="https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=1297574326,2374783510&fm=200&gp=0.jpg" />
        <img src="" lazyload="true" alt="" class="image-item" data-original="https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=915649383,5826850&fm=27&gp=0.jpg" />
        <img src="" lazyload="true" alt="" class="image-item" data-original="https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=2649107868,4130636842&fm=200&gp=0.jpg" />
        <img src="" lazyload="true" alt="" class="image-item" data-original="https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=1492742573,3780054889&fm=11&gp=0.jpg" />
        <img src="" lazyload="true" alt="" class="image-item" data-original="https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=1129138747,3617672605&fm=11&gp=0.jpg" />
        <img src="" lazyload="true" alt="" class="image-item" data-original="https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=3266475804,3837111637&fm=200&gp=0.jpg" />
        <img src="" lazyload="true" alt="" class="image-item" data-original="https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=2091400635,3282083388&fm=11&gp=0.jpg" />
        <img src="" lazyload="true" alt="" class="image-item" data-original="https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=872452946,1452698219&fm=11&gp=0.jpg" />
        <img src="" lazyload="true" alt="" class="image-item" data-original="https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=2838282368,3051708889&fm=27&gp=0.jpg" />
        <img src="" lazyload="true" alt="" class="image-item" data-original="https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=651246321,2706649063&fm=27&gp=0.jpg" />
        <img src="" lazyload="true" alt="" class="image-item" data-original="https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=709719514,1780049916&fm=27&gp=0.jpg" />
        <img src="" lazyload="true" alt="" class="image-item" data-original="https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=3250370743,2700982366&fm=27&gp=0.jpg" />
        <img src="" lazyload="true" alt="" class="image-item" data-original="https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=86523415,926805342&fm=27&gp=0.jpg" />
    </div>
    <script src="./lazyload.js"></script>
</body>

</html>
css
.image-item {
    width: 40%;
    margin-right: 5%;
    display: inline-block;
    height: 200px;
    background: grey;
}

.image-list {
    margin-left: 5%;
}
Javascript
var viewHeight = document.documentElement.clientHeight; // 可视区域高度

function lazyload() {
    var eles = document.querySelectorAll('img[data-original][lazyload]');
    Array.prototype.forEach.call(eles, function(item, index) {
        var rect
        if (item.dataset.original === '')
            return
        rect = item.getBoundingClientRect();
        // getBoundingClientRect用于获取某个元素相对于视窗的位置集合。集合中有top, right, bottom, left等属性。
        //   rectObject.top:元素上边到视窗上边的距离;

        //  rectObject.right:元素右边到视窗左边的距离;

        //  rectObject.bottom:元素下边到视窗上边的距离;

        //  rectObject.left:元素左边到视窗左边的距离;
        if (rect.bottom >= 0 && rect.top < viewHeight) {
            // 立即执行函数
            ! function() {
                var img = new Image();
                img.src = item.dataset.original;
                img.onload = function() {
                    item.src = img.src
                }
                item.removeAttribute('data-original')
                item.removeAttribute('lazyload')
            }()
        }
    })
}

lazyload()
document.addEventListener('scroll', lazyload)
页面效果

demo效果

在js代码中我们首先是获取了可视区域的高度viewHeight ,并且声明一个函数,函数的作用就是判断图片是否进入到可视区域,进入到可视区域后对图片进行加载并显示在页面上,同时去掉标签内的属性

总结,以上是使用原生写法实现图片栏架的方法,现在有很多封装好的库都可以实现,依赖于jquery,react和vue等框架的,大家可以自行搜索。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: RTX 3060 Ti是一款由英伟达公司生产的高性能显卡,拥有8GB GDDR6显存容量,支持Ray tracing和AI加速,带有4864个 CUDA核心,频率为1410 MHz,能够提供出色的游戏和图形处理性能。 ### 回答2: RTX 3060 Ti是NVIDIA推出的一款中高端显卡,拥有强大的性能和先进的新一代技术。它采用了NVIDIA的Ampere架构,具备了强大的图形处理能力和更高的能效。RTX 3060 Ti拥有4864个CUDA核心和8GB的GDDR6显存,能够提供卓越的图形渲染性能和更流畅的游戏体验。 在游戏方面,RTX 3060 Ti具备了支持实时光线追踪和DLSS 2.0技术,使得游戏画面更加逼真和细腻。实时光线追踪可以模拟真实光线的传播,呈现更真实的光影效果,让画面更加逼真。DLSS 2.0技术则可以通过智能的神经网络算法,提供更高质量的图像并提升帧率,进一步增强了游戏的流畅性和画质。 除了游戏,RTX 3060 Ti在其他工作负载中也显示出出色的性能。对于专业图形设计和视频编辑等工作,它可以提供更快的渲染速度和更高的计算能力,提升工作效率。同时,它还支持NVIDIA的CUDA和RTX技术,可以加速各种GPU加速的应用程序,为用户提供更好的体验。 总之,RTX 3060 Ti作为一款中高端显卡,具备了强大的性能和先进的图形技术,可以提供极佳的游戏体验和工作性能。无论是游戏爱好者还是专业用户,都可以从它的强大能力中受益。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值