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 相关文章推荐
用js解决数字不能换行问题
Aug 10 Javascript
仿新浪微博返回顶部的jquery实现代码
Oct 01 Javascript
addEventListener和attachEvent二者绑定的执行函数中的this不相同
Dec 09 Javascript
javascript简单事件处理和with用法介绍
Sep 16 Javascript
JS格式化数字保留两位小数点示例代码
Oct 15 Javascript
jQuery写fadeTo示例代码
Feb 21 Javascript
JavaScript判断字符长度、数字、Email、电话等常用判断函数分享
Apr 01 Javascript
配置Grunt的Task时通配符支持和动态生成文件名问题
Sep 06 Javascript
JS+CSS实现的简单折叠展开多级菜单效果
Sep 12 Javascript
微信小程序教程之本地图片上传(leancloud)实例详解
Nov 16 Javascript
Bootstrap开发中Tab标签页切换图表显示问题的解决方法
Jul 13 Javascript
vue项目接口管理,所有接口都在apis文件夹中统一管理操作
Aug 13 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实现执行某一操作时弹出确认、取消对话框
2013/12/30 PHP
destoon二次开发常用数据库操作
2014/06/21 PHP
php限制上传文件类型并保存上传文件的方法
2015/03/13 PHP
thinkPHP3.2.3实现阿里大于短信验证的方法
2018/06/06 PHP
php实现微信企业转账功能
2018/10/02 PHP
幻宇的层模拟窗口效果-提供演示和下载
2007/01/20 Javascript
JavaScript面向对象编程
2008/03/02 Javascript
JAVASCRIPT IE 与 FF中兼容问题小结
2009/02/18 Javascript
非常强大的 jQuery.AsyncBox 弹出对话框插件
2011/08/29 Javascript
js或者jquery判断图片是否加载完成实现代码
2013/03/20 Javascript
jQuery实现响应浏览器缩放大小并改变背景颜色
2014/10/31 Javascript
AngularJS中监视Scope变量以及外部调用Scope方法
2016/01/23 Javascript
jquery遍历json对象集合详解
2016/05/18 Javascript
基于zepto.js简单实现上传图片
2016/06/21 Javascript
js鼠标单击和双击事件冲突问题的快速解决方法
2016/07/11 Javascript
JavaScript实现刷新不重记的倒计时
2016/08/10 Javascript
jquery插件bootstrapValidator表单验证详解
2016/12/15 Javascript
用vue构建多页面应用的示例代码
2017/09/20 Javascript
基于$.ajax()方法从服务器获取json数据的几种方式总结
2018/01/31 Javascript
基于vue2.0动态组件及render详解
2018/03/17 Javascript
浅谈Vue.js路由管理器 Vue Router
2018/08/16 Javascript
Python初学者需要注意的事项小结(python2与python3)
2018/09/26 Python
pandas分批读取大数据集教程
2020/06/06 Python
Sephora丝芙兰菲律宾官方网站:购买化妆品和护肤品
2017/04/05 全球购物
美术指导求职信
2014/03/17 职场文书
学生请假条格式
2014/04/11 职场文书
监督检查工作方案
2014/05/28 职场文书
合作意向书
2014/07/30 职场文书
教师节学生演讲稿
2014/09/03 职场文书
党员先进性教育整改措施
2014/09/18 职场文书
2014年置业顾问工作总结
2014/11/17 职场文书
2015清明节祭奠英烈寄语大全
2015/03/04 职场文书
首次购房证明
2015/06/19 职场文书
2016年读书月活动总结范文
2016/04/06 职场文书
python scrapy简单模拟登录的代码分析
2021/07/21 Python
Java实现给Word文件添加文字水印
2022/02/15 Java/Android