1. 什么是图片懒加载
在传统的网页中,所有的图片都是在页面加载的时候一次性全部加载完成的。但随着移动设备的普及及页面内容的增多,图片的加载会影响到页面的加载速度和交互效果。如果一次性加载所有图片的话,会造成页面卡顿,影响用户体验。
图片懒加载的原理是当用户拉动页面滚动条时,才去加载出现在可视范围内的图片,未出现在可视范围内的图片则不进行加载,从而节省资源、提高页面加载速度。
在本文中,将介绍如何使用Vue和Element-UI实现图片懒加载功能。
2. 实现原理
Vue和Element-UI中实现图片懒加载的原理是:
通过window.onload
事件监听页面加载
获取所有需要懒加载的图片元素节点列表
利用IntersectionObserver
API监听图片元素节点是否出现在视口内,如果出现则加载该图片
除了IntersectionObserver
API之外,还可以使用自定义指令或其他JS库实现图片懒加载。但IntersectionObserver
API减轻了页面滚动时产生的性能问题,是较为推荐的方式。
3. 代码实现
首先,在Vue实例中注册全局自定义指令v-lazy
:
Vue.directive('lazy', {
inserted: function (el) {
let observer = new IntersectionObserver(function (entries) {
let realSrc = el.dataset.original
if (entries[0].isIntersecting && realSrc) {
el.src = realSrc
el.removeAttribute('data-original')
observer.unobserve(el)
}
})
observer.observe(el)
}
})
上述代码中,定义了一个IntersectionObserver实例,监听所有加入vue的元素节点,在元素节点进入视口中时,将原本预设的data-original
attribute中的真实图片地址提取出来,加载该图片,并移除data-original
attribute。
然后,在模板中使用v-lazy自定义指令,在需要懒加载的img标签上添加v-lazy
指令,并将真实图片地址保存到data-original
attribute中:
<img v-for="img in imgList" :src="loadingImg" :data-original="img.src" v-lazy>
上述代码中,绑定了一个图片列表imgList
,使用v-for
遍历输出需要懒加载的图片。在标签中,将初始占位图片的地址绑定到:src
中,并将真实图片地址绑定到data-original
中,然后通过v-lazy
指令实现图片懒加载。
4. 使用Element-UI中的图片懒加载
Element-UI已经封装了图片懒加载组件el-image
,可以在项目中直接使用。使用方法如下:
在组件中导入el-image
组件:
import {Image} from 'element-ui'
export default {
components: {Image}
}
在模板中使用el-image
组件,将需要懒加载的图片地址赋值给src
属性:
<el-image v-for="img in imgList" :src="img.src" :lazy="true"></el-image>
在<el-image>
标签中加入:lazy="true"
属性即可启用图片懒加载。
5. 总结
在本文中,介绍了使用Vue和Element-UI实现图片懒加载的原理和代码实现方法。采用IntersectionObserver API能较好地解决页面卡顿问题,并且Element-UI还封装了图片懒加载组件,能大大减少开发成本。在开发网页时,及时适配移动设备,优化用户体验,实现图片懒加载是必然的趋势。