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 相关文章推荐
javaScript(JS)替换节点实现思路介绍
Apr 17 Javascript
javascript不同类型数据之间的运算的转换方法
Feb 13 Javascript
js实现接收表单的值并将值拼在表单action后面的方法
Nov 23 Javascript
jQuery简单实现列表隐藏和显示效果示例
Sep 12 Javascript
JS基于面向对象实现的拖拽功能示例
Dec 20 Javascript
vue 运用mock数据的示例代码
Nov 07 Javascript
javascript中的隐式调用
Feb 10 Javascript
vue filters的使用详解
Jun 11 Javascript
vue.js使用v-pre与v-html输出HTML操作示例
Jul 07 Javascript
jQuery的ztree仿windows文件新建和拖拽功能的实现代码
Dec 05 jQuery
浅谈vuex为什么不建议在action中修改state
Feb 02 Javascript
antd design table更改某行数据的样式操作
Oct 31 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学习 函数 课件
2008/06/15 PHP
php的zip解压缩类pclzip使用示例
2014/03/14 PHP
php常用数学函数汇总
2014/11/21 PHP
thinkphp实现附件上传功能
2017/05/26 PHP
[原创]php正则删除img标签的方法示例
2017/05/27 PHP
PHP实现从PostgreSQL数据库检索数据分页显示及根据条件查找数据示例
2018/06/09 PHP
javascript入门基础之私有变量
2010/02/23 Javascript
JQuery实现鼠标移动到图片上显示边框效果
2014/01/09 Javascript
两个多选select(multiple左右)添加、删除选项和取值实例
2014/05/12 Javascript
通过Jquery的Ajax方法读取将table转换为Json
2014/05/31 Javascript
快速解决js动态改变dom元素属性后页面及时渲染的问题
2016/07/06 Javascript
JS中script标签defer和async属性的区别详解
2016/08/12 Javascript
浅谈js常用内置方法和对象
2016/09/24 Javascript
详谈js对url进行编码和解码(三种方式的区别)
2017/08/16 Javascript
vue实现打印功能的两种方法
2018/09/07 Javascript
微信小程序实现获取小程序码和二维码java接口开发
2019/03/29 Javascript
Python中实现字符串类型与字典类型相互转换的方法
2014/08/18 Python
Python脚本判断 Linux 是否运行在虚拟机上
2015/04/25 Python
Python3 replace()函数使用方法
2018/03/19 Python
python自定义函数实现一个数的三次方计算方法
2019/01/20 Python
selenium+PhantomJS爬取豆瓣读书
2019/08/26 Python
python 图片二值化处理(处理后为纯黑白的图片)
2019/11/01 Python
Python values()与itervalues()的用法详解
2019/11/27 Python
Python hashlib加密模块常用方法解析
2019/12/18 Python
Python unittest单元测试框架及断言方法
2020/04/15 Python
英国排名第一的最新设计师品牌手表独立零售商:TIC Watches
2016/09/24 全球购物
《三袋麦子》教学反思
2014/03/02 职场文书
现金出纳岗位职责
2014/03/15 职场文书
2014组织生活会方案
2014/05/19 职场文书
甜品店创业计划书
2014/08/14 职场文书
反洗钱宣传活动总结
2014/08/26 职场文书
研究生个人学年总结
2015/02/14 职场文书
保卫工作个人总结
2015/03/03 职场文书
纪律委员竞选稿
2015/11/19 职场文书
redis实现排行榜功能
2021/05/24 Redis
美元符号 $
2022/02/17 杂记