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入门学习书籍推荐
Jun 12 Javascript
Chrome中模态对话框showModalDialog返回值问题的解决方法
May 25 Javascript
json对象转字符串如何实现
Dec 02 Javascript
jQuery获取当前对象标签名称的方法
Feb 07 Javascript
JavaScript判断是否为数组的3种方法及效率比较
Apr 01 Javascript
微信小程序 地图(map)实例详解
Nov 16 Javascript
详解使用fetch发送post请求时的参数处理
Apr 05 Javascript
从零开始学习Node.js系列教程一:http get和post用法分析
Apr 13 Javascript
深入理解Vue生命周期、手动挂载及挂载子组件
Sep 27 Javascript
原生JS封装animate运动框架的实例
Oct 12 Javascript
从零开始在NPM上发布一个Vue组件的方法步骤
Dec 20 Javascript
原生javascript制作的拼图游戏实现方法详解
Feb 23 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
一个简单实现多条件查询的例子
2006/10/09 PHP
php判断手机访问还是电脑访问示例分享
2014/01/20 PHP
使用ThinkPHP+Uploadify实现图片上传功能
2014/06/26 PHP
PHP基于迭代实现文件夹复制、删除、查看大小等操作的方法
2017/08/11 PHP
php版本CKEditor 4和CKFinder安装及配置方法图文教程
2019/06/05 PHP
DOM精简教程
2006/10/03 Javascript
jQuery 动画基础教程
2008/12/25 Javascript
Extjs学习笔记之六 面版
2010/01/08 Javascript
解决js正则匹配换行问题实现代码
2012/12/10 Javascript
JS去除数组重复值的五种不同方法
2013/09/06 Javascript
jQuery中even选择器的定义和用法
2014/12/23 Javascript
搭建简单的nodejs http服务器详解
2017/03/09 NodeJs
用js实现before和after伪类的样式修改的示例代码
2017/09/07 Javascript
vue-cli脚手架引入图片的几种方法总结
2018/03/13 Javascript
JavaScript实现的开关灯泡点击切换特效示例
2019/07/08 Javascript
element-ui table组件如何使用render属性的实现
2019/11/04 Javascript
vue项目中监听手机物理返回键的实现
2020/01/18 Javascript
使用Vue+Django+Ant Design做一个留言评论模块的示例代码
2020/06/01 Javascript
JS removeAttribute()方法实现删除元素的某个属性
2021/01/11 Javascript
Python urls.py的三种配置写法实例详解
2017/04/28 Python
使用Django Form解决表单数据无法动态刷新的两种方法
2017/07/14 Python
python requests爬取高德地图数据的实例
2018/11/10 Python
Python中numpy模块常见用法demo实例小结
2019/03/16 Python
如何让python的运行速度得到提升
2020/07/08 Python
Python获取浏览器窗口句柄过程解析
2020/07/25 Python
松本清官方海外旗舰店:日本最大的药妆连锁店
2017/11/21 全球购物
Bailey帽子官方商店:Bailey Hats
2018/09/25 全球购物
大学生创业感言
2014/01/25 职场文书
植树节活动总结
2014/04/30 职场文书
超市主管竞聘书
2015/09/15 职场文书
windows下快速安装nginx并配置开机自启动的方法
2021/05/11 Servers
Java并发编程必备之Future机制
2021/06/30 Java/Android
如何创建一个创建MySQL数据库中的datetime类型
2022/03/21 MySQL
Python可变与不可变数据和深拷贝与浅拷贝
2022/04/06 Python
CSS控制继承中的height能变为可继承吗
2022/06/10 HTML / CSS
Win11自动黑屏怎么办 Win11自动黑屏设置教程
2022/07/15 数码科技