zoukankan      html  css  js  c++  java
  • Vue自定义指令实现图片懒加载效果

    vue的懒加载插件很多,自己实现也不难,而且更加精简,调试起来也方便,只要理解了原理,无论是用vue还是react,都能轻松搞定

    原理

    当图片不在区域时,可用默认图片占位src,或者不设置src。用data属性保存图片的url地址,当图片出现在可视区域时,把src替换为data中保存的url即可

    <template>
    <img src="../static/images/default.jpg" :data-src="imgUrl" class="imgLazyLoad" v-lazyload>
    <template>
    <script>
    
    let imgList = []
    let delay
    let time = 250
    let offset = 0
    
    // 节流函数,防止短时间多次触发_loadImg
    function _delay () {
      clearTimeout(delay)
      delay = setTimeout(() => {
        _loadImg()
      }, time)
    }
    
    function _loadImg () {
      for (let i = 0, len = imgList.length; i < len; i++) {
        if (_isShow(imgList[i])) {
          imgList[i].src = imgList[i].getAttribute('data-src');
          imgList.splice(i, 0)
        }
      }
    }
    
    function _isShow (el) {
      // getBoundingClientRect获取图片相对视口的位置
      let coords = el.getBoundingClientRect()
      // 判断图片出否出现在可视区
      return coords.top <= document.documentElement.clientHeight + parseInt(offset)
    }
    export default {
      directives: {
        lazyload: {
          bind (el, binding) {
            imgList.push(el)
            // 初始化,第一次进入页面时应该显示的图片
            _delay()
            window.addEventListener('scroll', _delay, false)
          }
        }
      }
    }
    </script>
    

    自己动手,丰衣足食

    优秀文章首发于聚享小站,欢迎关注!
  • 相关阅读:
    oracle 使用正则表达式获取字符串中包含的数字
    oracle 将逗号分隔的字符串转成多行记录
    sqlplus下 查看oracle 执行计划
    使用connect by 虚拟生成100条记录
    Lomsat gelral
    Legacy
    慢慢变小的序列(好题)
    Walls(扫描线)
    线段树求面积并,面积交,周长
    最小圆覆盖(随机增量||模拟退火)
  • 原文地址:https://www.cnblogs.com/yesyes/p/15356901.html
Copyright © 2011-2022 走看看