图片延迟加载

延迟加载 是一种用于将资源的加载推迟到需要时才加载的技术。对于图像,这意味着直到用户滚动到图像在屏幕上可见的位置时才会下载图像。这是加快网站速度的好方法,因为您只下载用户实际看到的图像。这对于包含大量图像的站点特别有用,因为您可以通过仅下载用户实际看到的图像来节省大量带宽。

实现延迟加载

延迟加载相对比较简单,只要在图片中加入 loading 属性并且设置为 lazy 就可以实现延迟加载。但是需要注意的是延迟加载跟容器的限定高度有关,即浏览器首先会加载容器限定高度中的图片,当浏览器向下滚动时才会加载后续的图片,具体的实例如下:

<style>
  * {
    margin: 0;
    padding: 0;
  }

  .img_box {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    height: 400px;
    overflow-x: scroll;
  }

  .img_box img {
    width: 100%;
    aspect-ratio: 1 / 1;
    display: block;
  }
</style>

<div class="img_box">
  <img src="./images/max-1.jpg" loading="lazy" />
  <img src="./images/max-2.jpg" loading="lazy" />
  <img src="./images/max-3.jpg" loading="lazy" />
  <img src="./images/max-4.jpg" loading="lazy" />
  <img src="./images/max-5.jpg" loading="lazy" />
  <img src="./images/max-6.jpg" loading="lazy" />
  <img src="./images/max-7.jpg" loading="lazy" />
  <img src="./images/max-8.jpg" loading="lazy" />
  <img src="./images/max-9.jpg" loading="lazy" />
  <img src="./images/max-10.jpg" loading="lazy" />
  <img src="./images/max-11.jpg" loading="lazy" />
  <img src="./images/max-12.jpg" loading="lazy" />
  <img src="./images/max-13.jpg" loading="lazy" />
  <img src="./images/max-14.jpg" loading="lazy" />
  <img src="./images/max-15.jpg" loading="lazy" />
  <img src="./images/max-16.jpg" loading="lazy" />
  <img src="./images/max-17.jpg" loading="lazy" />
  <img src="./images/max-18.jpg" loading="lazy" />
  <img src="./images/max-19.jpg" loading="lazy" />
  <img src="./images/max-20.jpg" loading="lazy" />
  <img src="./images/max-21.jpg" loading="lazy" />
  <img src="./images/max-22.jpg" loading="lazy" />
</div>

高级延迟加载

当使用上述方式进行图片延迟加载后,假如页面的网速比较慢的时候,页面还是会出现大片的空白区域,这样就会给用户带来不好的印象,所以我们可以在图片的外层包裹一个 div 元素,而 div 元素中加载一个 20 像素大小的图片,这样就不会产生页面大量空白区。具体实例如下:

<style>
  .blurred-img {
    background-repeat: no-repeat;
  }

  .small-img-1 {
    background-image: url(imageName-small.jpg);
    background-size: cover;
  }
</style>

<div class="blurred-img small-img-1">
  <img src="./images/max-1.jpg" loading="lazy" />
</div>

提升延迟效果

在上述例子中,我们为图片添加了一个小图片来解决页面空白的问题,但是整体的效果还不是很好,所以我们可以为容器添加一些动画效果来提升交互效果。具体实例代码片段如下:

<style>
  .blurred-img {
    filter: blur(10px);
  }

  .blurred-img img {
    opacity: 0;
  }

  .blurred-img::before {
    content: "";
    position: absolute;
    inset: 0;
    opacity: 0;
    animation: pulse 2.5s infinite;
    background-color: white;
  }

  @keyframes pulse {
    0% {
      opacity: 0;
    }

    50% {
      opacity: 0.1;
    }

    100% {
      opacity: 0;
    }
  }

  .blurred-img.loaded {
    background-image: none;
    filter: none;
  }

  .blurred-img.loaded::before {
    animation: none;
    content: none;
  }

  .blurred-img img {
    opacity: 0;
    transition: opacity 250ms ease-in-out;
  }

  .blurred-img.loaded img {
    opacity: 1;
  }
</style>

<script>
  const blurredImageDiv = document.querySelectorAll(".blurred-img");

  blurredImageDiv.forEach((div) => {
    const img = div.querySelector("img");

    function loaded() {
      div.classList.add("loaded");
    }

    if (img.complete) {
      loaded();
    } else {
      img.addEventListener("load", loaded);
    }
  });
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值