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 相关文章推荐
checkbox全选/取消全选以及checkbox遍历jQuery实现代码
Dec 02 Javascript
suggestion开发小结以及对键盘事件的总结(针对中文输入法状态)
Dec 20 Javascript
为原生js Array增加each方法
Apr 07 Javascript
JS中怎样判断undefined(比较不错的方法)
Mar 27 Javascript
JavaScript中实现map功能代码分享
Jun 11 Javascript
JS拖动鼠标画出方框实现鼠标选区的方法
Aug 05 Javascript
详解JavaScript中的构造器Constructor模式
Jan 14 Javascript
jQuery弹出窗口打开链接的实现代码
Dec 24 Javascript
微信小程序实现人脸识别
May 25 Javascript
实例详解ztree在vue项目中使用并且带有搜索功能
Aug 24 Javascript
js的新生代垃圾回收知识点总结
Aug 22 Javascript
vue props 一次传多个值实例
Jul 22 Javascript
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安装问题
2006/10/09 PHP
用文本文件制作留言板提示(下)
2006/10/09 PHP
php中防止伪造跨站请求的小招式
2011/09/02 PHP
PHP合并两个数组的两种方式的异同
2012/09/14 PHP
PHP在不同页面间传递Json数据示例代码
2013/06/08 PHP
总结PHP如何获取当前主机、域名、网址、路径、端口和参数等
2016/09/09 PHP
Javascript开发包大全整理
2006/12/22 Javascript
javascript跟随滚动效果插件代码(javascript Follow Plugin)
2013/08/03 Javascript
javascript中数组的sort()方法的使用介绍
2013/12/18 Javascript
javascript创建和存储cookie示例
2014/01/07 Javascript
JavaScript和HTML DOM的区别与联系及Javascript和DOM的关系
2015/11/15 Javascript
CSS3 3D 技术手把手教你玩转
2016/09/02 Javascript
对vue v-if v-else-if v-else 的简单使用详解
2018/09/29 Javascript
JavaScript setInterval()与setTimeout()计时器
2019/12/27 Javascript
[02:26]2018DOTA2亚洲邀请赛赛前采访-Newbee篇
2018/04/03 DOTA
Python中asyncore的用法实例
2014/09/29 Python
5个很好的Python面试题问题答案及分析
2018/01/19 Python
python清除字符串中间空格的实例讲解
2018/05/11 Python
详解Python中的分组函数groupby和itertools)
2018/07/11 Python
python配置grpc环境
2019/01/01 Python
浅谈pandas筛选出表中满足另一个表所有条件的数据方法
2019/02/08 Python
python实现nao机器人手臂动作控制
2019/04/29 Python
python如何实现视频转代码视频
2019/06/17 Python
Django自定义模板过滤器和标签的实现方法
2019/08/21 Python
Python 实现将数组/矩阵转换成Image类
2020/01/09 Python
详解CSS3中Media Queries的相关使用
2015/07/17 HTML / CSS
美国大尺码女装零售商:TORRID
2016/10/01 全球购物
阿玛尼美妆俄罗斯官网:Giorgio Armani Beauty RU
2020/07/19 全球购物
介绍JAVA 中的Collection FrameWork(及如何写自己的数据结构)
2014/10/31 面试题
取保候审保证书
2014/04/30 职场文书
公安局副政委班子个人对照检查材料
2014/10/04 职场文书
逃课检讨书怎么写
2015/01/01 职场文书
唐山大地震的观后感
2015/06/05 职场文书
儿子满月酒致辞
2015/07/29 职场文书
幼儿园班级管理心得体会
2016/01/07 职场文书
《全神贯注》教学反思
2016/02/22 职场文书