Vue.js上下滚动加载组件的实例代码


Posted in Javascript onJuly 17, 2017

由于工作的需要并鉴于网上的vue.js滚动加载方案不合适,自己写了一个简单实用的。就短短的150行代码。

Vue.js上下滚动加载组件的实例代码

组件代码

// scrollLoader.vue
// 滚动加载组件

<style scoped>
  .container-main {margin: 0 auto; overflow: auto; overflow-x: hidden; padding: 0;}
  .loading{ width: 100%; height: 40px; position: relative; overflow: hidden; text-align: center; margin: 5px 0 ; color: #999; font-size: 13px;}
  .loading-icon{color: #707070;};
  .loader {
    font-size: 10px;
    margin: 8px auto;
    text-indent: -9999em;
    width: 24px;
    height: 24px;
    border-radius: 50%;
    background: #999;
    background: -moz-linear-gradient(left, #999 10%, rgba(255, 255, 255, 0) 42%);
    background: -webkit-linear-gradient(left, #999 10%, rgba(255, 255, 255, 0) 42%);
    background: -o-linear-gradient(left, #999 10%, rgba(255, 255, 255, 0) 42%);
    background: -ms-linear-gradient(left, #999 10%, rgba(255, 255, 255, 0) 42%);
    background: linear-gradient(to right, #999 10%, rgba(255, 255, 255, 0) 42%);
    position: relative;
    -webkit-animation: load3 1s infinite linear;
    animation: load3 1s infinite linear;
  }
  .loader:before {
    width: 50%;
    height: 50%;
    background: #999;
    border-radius: 100% 0 0 0;
    position: absolute;
    top: 0;
    left: 0;
    content: '';
  }
  .loader:after {
    background: #f5f5f5;
    width: 72%;
    height: 75%;
    border-radius: 68%;
    content: '';
    margin: auto;
    position: absolute;
    top: 0;
    left: 0;
    bottom: 0;
    right: 0;
  }
  @-webkit-keyframes load3 {
  0% {
    -webkit-transform: rotate(0deg);
    transform: rotate(0deg);
  }
  100% {
    -webkit-transform: rotate(360deg);
    transform: rotate(360deg);
  }
  }
  @keyframes load3 {
  0% {
    -webkit-transform: rotate(0deg);
    transform: rotate(0deg);
  }
  100% {
    -webkit-transform: rotate(360deg);
    transform: rotate(360deg);
  }
  }

</style>

<template>
  <div id="scrollLoader-container" class="container-main">
    <div class="loading" v-if="topLoading">
      <div class="loader">加载中...</div>
    </div>

    <div :style="'min-height:' + realMinHeight + 'px; overflow-x:hidden'">
      <slot></slot>
    </div>

    <div class="loading" v-if="bottonLoading">
      <div class="loader">加载中...</div>
    </div>
  </div>
</template>

<script>
  export default {
    name: "scroll-loader",

    props: {
      //给slot传一个最小值,保证一开始能出现滚动条
      'minHeight': {
        type: Number,
        default: 800
      }, 

    },

    created(){
    },
    computed: {
      realMinHeight(){
        return this.minHeight + 30
      }
    },
    data() {
      return {
        topLoading: false,
        bottonLoading: false,

        stopTopLoading: false, //是否停止传播滚动到顶部事件
        stopBottonLoading: false, //是否停止传播滚动到底部事件
      }
    },
    mounted(){
      this.listenScroll();
    },

    methods: {
      listenScroll(){
        var me = this;
        var topDone = (stopTopLoading) => {
          me.topLoading = false;
          if(stopTopLoading) me.stopTopLoading = true;
        };

        var bottonDone = (stopBottonLoading) => {
          me.bottonLoading = false;
          if(stopBottonLoading) me.stopBottonLoading = true;
        };
        setTimeout(function(){
          var scrollContainer = document.getElementById('scrollLoader-container');

          scrollContainer.onscroll = function(){

            if(scrollContainer.scrollTop<=0 && !me.stopTopLoading){
              if(me.topLoading) return;

              me.topLoading = true;
              me.$emit('scroll-to-top', topDone);
            }
            if((scrollContainer.offsetHeight + scrollContainer.scrollTop+1 >= scrollContainer.scrollHeight) && !me.stopBottonLoading){
              if(me.bottonLoading) return;

              me.bottonLoading = true;
              scrollContainer.scrollTop += 40;
              me.$emit('scroll-to-botton', bottonDone);
            }
          }
        }, 50)
      },

    }
  }
</script>

源码:https://github.com/doterlin/vue-wxChat

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery学习笔记(1)--用jQuery实现异步通信(用json传值)具体思路
Apr 08 Javascript
javascript获取当前鼠标坐标的方法
Jan 10 Javascript
JS自定义选项卡函数及用法实例分析
Sep 02 Javascript
Uploadify上传文件方法
Mar 16 Javascript
js 弹出对话框(遮罩)透明,可拖动的简单实例
Jul 11 Javascript
彻底理解js面向对象之继承
Feb 04 Javascript
Angular5中调用第三方库及jQuery的添加的方法
Jun 07 jQuery
微信小程序调用摄像头隐藏式拍照功能
Aug 22 Javascript
vue axios封装及API统一管理的方法
Apr 18 Javascript
JavaScript单线程和任务队列原理解析
Feb 04 Javascript
微信小程序单选框自定义赋值
May 26 Javascript
在vue中动态修改css其中一个属性值操作
Dec 07 Vue.js
JS实现仿UC浏览器前进后退效果的实例代码
Jul 17 #Javascript
详解利用jsx写vue组件的方法示例
Jul 17 #Javascript
Javascript实现找不同色块的游戏
Jul 17 #Javascript
Vue.js 单页面多路由区域操作的实例详解
Jul 17 #Javascript
Vue项目webpack打包部署到服务器的实例详解
Jul 17 #Javascript
JS中Safari浏览器中的Date
Jul 17 #Javascript
Vue.extend构造器的详解
Jul 17 #Javascript
You might like
PHP操作MongoDB GridFS 存储文件的详解
2013/06/20 PHP
深入理解PHP JSON数组与对象
2016/07/19 PHP
php实现等比例不失真缩放上传图片的方法
2016/11/14 PHP
PHP设计模式之装饰器模式定义与用法简单示例
2018/08/13 PHP
纯js实现的论坛常用的运行代码的效果
2008/07/15 Javascript
客户端js性能优化小技巧整理
2013/11/05 Javascript
IE下window.onresize 多次调用与死循环bug处理方法介绍
2013/11/12 Javascript
关闭页面window.location事件未执行的原因及解决方法
2014/09/01 Javascript
jquery 中ajax执行的优先级
2015/06/22 Javascript
jquery中val()方法是从最后一个选项往前读取的
2015/09/06 Javascript
js运动应用实例解析
2015/12/28 Javascript
JavaScript类型系统之正则表达式
2016/01/05 Javascript
多种js图片预加载实现方式分享
2016/02/19 Javascript
JavaScript学习笔记整理_用于模式匹配的String方法
2016/09/19 Javascript
vue-resourse将json数据输出实例
2017/03/08 Javascript
浅谈react.js 之 批量添加与删除功能
2017/04/17 Javascript
JS实现分页浏览横向图片(类轮播)实例代码
2017/11/06 Javascript
JS排序算法之希尔排序与快速排序实现方法
2017/12/12 Javascript
微信小程序实现录音时的麦克风动画效果实例
2019/05/18 Javascript
微信小程序中如何计算距离某个节日还有多少天
2019/07/15 Javascript
Vue快速实现通用表单验证的方法
2020/02/24 Javascript
Ant Design Vue table中列超长显示...并加提示语的实例
2020/10/31 Javascript
[01:04:32]DOTA2-DPC中国联赛 正赛 Aster vs LBZS BO3 第二场 2月23日
2021/03/11 DOTA
用python爬取租房网站信息的代码
2018/12/14 Python
python用quad、dblquad实现一维二维积分的实例详解
2019/11/20 Python
CSS3 绘制BMW logo实的现代码
2013/04/25 HTML / CSS
CSS3用@font-face实现自定义英文字体
2013/09/23 HTML / CSS
CSS中垂直居中的简单实现方法
2015/07/06 HTML / CSS
自我鉴定200字
2013/10/28 职场文书
英文自荐信
2013/12/19 职场文书
酒店销售主管岗位职责
2014/01/04 职场文书
幼儿园家长会欢迎词
2014/01/09 职场文书
年度评优评先方案
2014/06/03 职场文书
小学校园广播稿(3篇)
2014/09/19 职场文书
文员转正自我鉴定怎么写
2014/09/29 职场文书
MySQL中正则表达式(REGEXP)使用详解
2022/07/07 MySQL