From 847e5092442c62c1d7a7e48540e1905f4062440b Mon Sep 17 00:00:00 2001 From: zhuxiang Date: Tue, 7 Mar 2017 14:56:47 +0800 Subject: [PATCH] done --- packages/lazyload/index.js | 85 +++++++++++++++++++++++++++++++++- packages/lazyload/src/main.vue | 18 ------- 2 files changed, 83 insertions(+), 20 deletions(-) delete mode 100644 packages/lazyload/src/main.vue diff --git a/packages/lazyload/index.js b/packages/lazyload/index.js index 59bd195b2..554352235 100644 --- a/packages/lazyload/index.js +++ b/packages/lazyload/index.js @@ -1,3 +1,84 @@ -import SampleComponent from './src/main'; +export default { + install: function(Vue,options){ + options = options || { + fade: false, + nohori: false + } + // scroll结束的时候触发scrollend事件 + var timer = null; + var topValue = 0; + var bodyEle = document.body; -export default SampleComponent; + var scrollEnd = document.createEvent('HTMLEvents'); + scrollEnd.initEvent('scrollEnd',true,false) + function enterFrame(){ + if(bodyEle.scrollTop == topValue){ + window.cancelAnimationFrame(timer); + window.dispatchEvent(scrollEnd) + } else { + topValue = bodyEle.scrollTop; + } + requestAnimationFrame(enterFrame); + } + document.addEventListener('scroll',function(){ + if(!timer) { + timer = window.requestAnimationFrame(enterFrame); + } + },true) + + //vue指令 + function update(value){ + if (!value) { + return; + } + var isFadeIn = this.modifiers.fade || options.fade + var isNoHori = this.modifiers.nohori || options.nohori + // 用css3来控制过渡效果 + if(isFadeIn){ + this.el.style.opacity = 0 + this.el.style.transition = 'opacity .3s' + this.el.style.webkitTransition = 'opacity .3s' + } + var compute = function(){ + if (this.el === null) { + return; + } + var rect = this.el.getBoundingClientRect(); + var vpWidth = document.head.parentNode.clientWidth + var vpHeight = document.head.parentNode.clientHeight + var loadImg = function(){ + this.el.src = value + this.el.addEventListener('load',onloadEnd) + window.removeEventListener('scrollEnd',compute,true) + window.removeEventListener('resize',compute,true) + + }.bind(this) + if(this.el.src == value)return + if(isNoHori){ + if(rect.bottom >=0 && rect.top <= vpHeight){ + loadImg() + } + }else if(rect.bottom >=0 && rect.top <= vpHeight + && rect.right >= 0 && rect.left <= vpWidth){ + loadImg() + } + }.bind(this) + var onload = function(){ + compute(); + this.el && this.el.removeEventListener('load',onload) + window.addEventListener('scrollEnd',compute,true) + window.addEventListener('resize',compute,true) + }.bind(this) + var onloadEnd = function(){ + if (this.el === null) {return;} + if(isFadeIn){ + this.el.style.opacity = 1 + } + this.el.removeEventListener('load',onloadEnd) + }.bind(this) + // 元素load触发事件 + this.el.addEventListener('load',onload) + } + Vue.directive('lazyload',update) + } +}; diff --git a/packages/lazyload/src/main.vue b/packages/lazyload/src/main.vue deleted file mode 100644 index 0d2c38ebd..000000000 --- a/packages/lazyload/src/main.vue +++ /dev/null @@ -1,18 +0,0 @@ - - -