转:
Vue图片懒加载原理和实现
Vue 中实现图片预加载 + 懒加载原理实现
Vue图片懒加载原理及实现
原理分析
先将img标签的src链接设为同一张图片(默认图片),当js监听到该图片进入可视窗口时,再将实际地址应用。
实现方法
1.判断元素是否在可视范围
1 2 3 4 5 6 7 8 9 10 11 12
| /** * 判断元素是否在可视范围 */ function isVisible(ele){ let windowHeight = window.innerHeight let position = ele.getBoundingClientRect() // 当元素的top偏移量小于页面大小并且大于高度的负数 if(position.top<windowHeight && position.top>-position.height){ return true } return false }
|
2.对图片实现懒加载
1 2 3 4 5 6 7 8 9 10
| /** * 对图片进行懒加载 */ function lazyLoad(img, src){ if(img && src && isVisible(img)){ // 元素存在,元素未被加载,元素可见 setTimeout(function(){ img.setAttribute('src', src) }, 1000) // 模拟网络请求 } }
|
3.添加滚动监听
1 2 3 4
| // 窗口滚动 window.addEventListener('scroll', function(){ lazyLoad(img, src) })
|
Vue插件实现代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| /** * 判断元素可见 */ function isVisible(el){ let windowHeight = window.innerHeight let position = el.getBoundingClientRect() // 当元素的top偏移量小于页面大小并且大于高度的负数 if(position.top<windowHeight && position.top>-position.height){ return true } return false }
/** * 对图片进行懒加载 */ function lazyLoad(img, src){ if(img && src && isVisible(img)){ // 元素存在,元素未被加载,元素可见 setTimeout(function(){ img.setAttribute('src', src) }, 1000) // 模拟网络请求慢的情况 } }
export default { install(Vue, options){ Vue.directive('lazy', { bind: function(el, binding, vnode){ el.setAttribute('src', options.loading) window.addEventListener('scroll', function(){ lazyLoad(el, binding.value) }) }, inserted: function(el, binding, vnode){ lazyLoad(el) } }) } }
|
main.js
Vue.use(myPlugin, {loading: defaultImg})
在Vue中使用 vue-lazyload插件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| 1.安装插件 npm install vue-lazyload --save-dev
2.在入口文件main.js中引入并使用 import VueLazyload from 'vue-lazyload'
直接使用 Vue.use(VueLazyload)
或者添加自定义选项 Vue.use(VueLazyload, { preLoad: 1.3, error: 'dist/error.png', loading: 'dist/loading.gif', attempt: 1 })
3.修改图片显示方式为懒加载(将 :src 属性直接改为v-lazy) <a href="javascript:;"> <img v-lazy="'/static/img/' + item.productImage"> </a>
|
评论和共享