1. 什么是渐进式图片
当我们网站会加载很多图片的时候,有些图片尺寸很大,加载就会很慢,会导致页面长时间陷入白屏状态,用户体验很不好。所以可以使用渐进式图片,先给用户展示模糊图,这些图尺寸小,加载快,可以快速显现出来。然后再逐步传输大图,大图传输完成之后替换模糊图。这就是渐进式图片。
2. 实现方式
有两种方案,一种靠设计师,一种靠自己
2.1 靠设计师
直接让设计师给你渐进式图片,因为 jpg 图片支持多帧,设计师可以在第一帧放一个模糊图,在第二帧放高清图。在传输的时候,浏览器首先会收到模糊图并展示,然后再慢慢传输高清图,一步一步去替换模糊图。但是这有两个缺陷,一个是浏览器兼容,还有一个是设计师不干或者不会。
2.2 靠自己
我们构建一个 ProgressiveImg.vue 组件,实现渐进式图片。实现思路是传入两个图片,一张模糊,一张高清,高清图片加载完成后触发替换。
ProgressiveImg.vue 组件构建
<script setup>
defineProps({
placeholder: String,
origin: String,
});
const handleLoaded = (e) => {
e.target.parentElement.classList.add("loaded");
};
</script>
<template>
<div class="progressive">
<img class="img placeholder" :src="placeholder" />
<img @load="handleLoaded" class="img origin" :src="origin" />
</div>
</template>
<style scoped>
.progressive {
width: 100%;
height: 100%;
position: relative;
}
.img {
width: 100%;
height: 100%;
display: block;
object-fit: cover;
transition: all 0.6s;
}
.origin {
opacity: 0;
position: absolute;
left: 0;
top: 0;
filter: blur(10px);
}
.loaded .origin {
opacity: 1;
filter: blur(0);
}
</style>
使用 ProgressiveImg.vue 组件
<script setup>
import ProgressiveImg from "./components/ProgressiveImg.vue";
import small from "./assets/_bg.jpg";
import big from "./assets/bg.jpg";
</script>
<template>
<div class="contain">
<ProgressiveImg :placeholder="small" :origin="big" />
</div>
</template>
<style>
body {
margin: 0;
padding: 0;
}
.contain {
width: 100vw;
height: 100vh;
}
</style>