基于浏览器'IntersectionObserver'接口,实现的Vue
懒加载组件,初步计划是有实现图片懒加载以及模块的懒加载两种内容,分别以指令和组件的形式来使用
Demo: 'https://liyu.fun/demo/vue-lazyload-widget'
使用npm
npm install vue-lazyload-widget
在main.js
中引入
import vueLazyloadWidget from 'vue-lazyload-widget'
Vue.use(vueLazyloadWidget)
直接引入文件
<script src="path/vue-lazyload-widget.js"></script>
设置图片路径时有两种可用方式,直接将路径设置为指令属性值或者设置为data-src
属性
<img v-lazy-img="path">
// or
<img dat-src="path" v-lazy-img>
图片路径需要设置绝对路径,或者提前引入图片,参考'Demo'
<lazy-widget>
<!--组件内容-->
<div slot="skeleton"><!--预加载内容,比如骨架--></div>
</lazy-widget>
没有设置骨架时,组件未加载之前默认显示loading图片
接受唯一参数el
,为当前组件dom实例
before-leave
: 预加载内容即将离开after-leave
: 预加载内容已离开before-enter
: 组件内容即将进入after-enter
: 组件内容已进入before-init
: 组件内容即将被渲染after-enter
: 组件内容已渲染完成
目前包括以下配置项
root
视图窗口viewport的dom对象,默认为当前浏览器窗口rootMargin
触发懒加载的视图外边距,默认值为"0px 0px 0px 0px",例如设置为"10px"时,会在距离视图10px
时开始加载
目前设计的有三种配置方式,按优先级从低到高来看
- 在注册时直接传入
const options = {};
Vue.use(vueLazyloadWidget, options)
- 组件中修改配置项,会优先读取组件中的
lazyOptions
属性
data () {
lazyOptions: {
root: null,
rootMargin: '0px'
}
}
- 组件注册时传入,如果父组件内有定义,会直接读取父级配置,只有需要单独对组件进行配置时需要传入
<lazy-widget :options="lazyOptions" :height="100"></lazy-widget>
组件上额外的配置
height
: 表示组件内容未加载时的高度,默认为50px
name
: 组件中transition
过度组件的name,用于设置过渡动画,默认为lazy-widget
默认的过渡动画效果为
.lazy-widget-enter-active {
transition: opacity .5s;
}
.lazy-widget-enter{
opacity: 0;
}
可以通过自定义样式和name
来修改过渡动画
由于主要依赖于'IntersectionObserver'接口,目前只适用于部分高版本浏览器,如果要兼容低版本,需要额外安装'IntersectionObserver Polyfill'
npm install intersection-observer
之后在文件内引入即可
require('intersection-observer');
or
<script src="path/intersection-observer.js"></script>
注意
intersection-observer
的引用要在本组件之前