详解 vue better-scroll滚动插件排坑


Posted in Javascript onFebruary 08, 2018

BetterScroll号称目前最好用的移动端滚动插件,因此它的强大之处肯定是存在的。要不...哈哈。个人感觉还是很好用的。这篇文章不是笼统的讲 BetterScroll ,而是单讲滚动,想要深入了解它,请移步这里 。

滚动原理

详解 vue better-scroll滚动插件排坑

better-scroll 是什么滚动原理

better-scroll 是一款重点解决移动端(已支持 PC)各种滚动场景需求的插件。它的核心是借鉴的 iscroll 的实现,它的 API 设计基本兼容 iscroll,在 iscroll 的基础上又扩展了一些 feature 以及做了一些性能优化。

better-scroll 是基于原生 JS 实现的,不依赖任何框架。它编译后的代码大小是 63kb,压缩后是 35kb,gzip 后仅有 9kb,是一款非常轻量的 JS lib。

绿色部分为 wrapper,也就是父容器,它会有固定的高度。黄色部分为 content,它是父容器的第一个子元素,它的高度会随着内容的大小而撑高。那么,当 content 的高度不超过父容器的高度,是不能滚动的,而它一旦超过了父容器的高度,我们就可以滚动内容区了。横向滚动的原理一致就是将固定高度改为固定宽度。(这里就不??铝耍?/p>

纵向滚动

废话不多说,我们直接上代码。

<template>
 <div class="wrapper" ref="wrapper">
   <ul>
    <li v-for="item in 8">{{item}}</li>
   </ul>
 </div>
</template>
<script>
 import BScroll from 'better-scroll';
  export default {
   mounted() {
    this.$nextTick(() => {
     this.scroll = new BScroll(this.$refs.wrapper);
    });
   }
  };
</script>
<style type="text/css">
 .wrapper{
  overflow:hidden;
  height:100vh;
 }
 ul li{
  height:400px;
 }
</style>

这是一个Vue BetterScroll纵向滚动demo,这里需要注意的有两点。

  1. 只能有一层父级div,也就是容器
  2. 父级div要设置溢出隐藏,并且固定高度

横向滚动

横向滚动,相比纵向滚动需要动态的去获取滚动区的宽度,直接上代码。

<template>
 <div class="tab" ref="tab">
  <ul class="tab_content" ref="tabWrapper">
   <li class="tab_item" v-for="item in itemList" ref="tabitem">
     {{item.title}}
   </li>
  </ul>
 </div>
 </template>
 <script>
 import BScroll from 'better-scroll';
  export default {
   data() {
    return{
     itemList:[
     {
      'title':'关注'
     },
     {
      'title':'推荐'
     },
     {
      'title':'深圳'
     },
     {
      'title':'视频'
     },
     {
      'title':'音乐'
     },
     {
      'title':'热点'
     },
     {
      'title':'新时代'
     },
     {
      'title':'娱乐'
     },
     {
      'title':'头条号'
     },
     {
      'title':'问答'
     },
     {
      'title':'图片'
     },
     {
      'title':'科技'
     },
     {
      'title':'体育'
     },
     {
      'title':'财经'
     },
     {
      'title':'军事'
     },
     {
      'title':'国际'
     }
     ]
    }
   },
   created() {
    this.$nextTick(() => {
     this.InitTabScroll();
    });
   },
   methods:{
    InitTabScroll(){
     let width=0
     for (let i = 0; i <this.itemList.length; i++) {
       width+=this.$refs.tabitem[0].getBoundingClientRect().width; //getBoundingClientRect() 返回元素的大小及其相对于视口的位置
     }
     this.$refs.tabWrapper.style.width=width+'px'
     this.$nextTick(()=>{
       if (!this.scroll) {
        this.scroll=new BScroll(this.$refs.tab, {
         startX:0,
         click:true,
         scrollX:true,
         scrollY:false,
         eventPassthrough:'vertical'
        });
       }else{
        this.scroll.refresh()
       }
     });
    }
   }
  };
 </script>
 <style lang="scss" scoped>
 .tab{
  width: 100vw;
  overflow: hidden;
  padding:5px;
  .tab_content{
   line-height: 2rem;
   display: flex;
   .tab_item{
    flex: 0 0 60px;
    width:60px;
   } 
  }
 } 
 </style>

横向滚动需要注意。

  1. 只能有一层父级div,也就是容器
  2. 父容器要设置溢出隐藏并固定宽度
  3. 动态获取滚动区的宽度

因为最近项目需要,所以从网上查阅了许多资料也无法解决我的问题。 BetterScroll 官网也没有提供实际demo参考,所以就利用休息时间,写了这篇文章。希望能对你们有用。需要具体 demo 请移步,别忘了给个star啊,写文章不容易,给个赞呗!

tips:上文的代码可以直接使用,小伙伴们安装完依赖后可以直接copy测试哦~

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

Javascript 相关文章推荐
jQuery动画效果animate和scrollTop结合使用实例
Apr 02 Javascript
document.write的几点使用心得
May 14 Javascript
Jquery插件之Fancybox丰富的弹出层效果附源码下载
Dec 02 Javascript
需灵活掌握的Bootstrap预定义排版类 你精通吗?
Jun 20 Javascript
js实现五星评价功能
Mar 08 Javascript
JS实现汉字与Unicode码相互转换的方法详解
Apr 28 Javascript
一个可复用的vue分页组件
May 15 Javascript
Vue组件之Tooltip的示例代码
Oct 18 Javascript
vue .js绑定checkbox并获取、改变选中状态的实例
Aug 24 Javascript
react 中父组件与子组件双向绑定问题
May 20 Javascript
实例详解带参数的 npm script
May 28 Javascript
小程序登录之支付宝授权的实现示例
Dec 13 Javascript
VUE + UEditor 单图片跨域上传功能的实现方法
Feb 08 #Javascript
关于vue中watch检测到不到对象属性的变化的解决方法
Feb 08 #Javascript
使用veloticy-ui生成文字动画效果
Feb 08 #Javascript
js中let和var定义变量的区别
Feb 08 #Javascript
详解Nuxt.js Vue服务端渲染摸索
Feb 08 #Javascript
VUE 使用中踩过的坑
Feb 08 #Javascript
JavaScript实现多叉树的递归遍历和非递归遍历算法操作示例
Feb 08 #Javascript
You might like
Amazon Prime Video平台《无限住人 -IMMORTAL-》2020年开始TV放送!
2020/03/06 日漫
CodeIgniter图像处理类的深入解析
2013/06/17 PHP
PHP is_subclass_of函数的一个BUG和解决方法
2014/06/01 PHP
PHP中类型转换 ,常量,系统常量,魔术常量的详解
2017/10/26 PHP
js类中获取外部函数名的方法与代码
2007/09/12 Javascript
js 左右悬浮对联广告代码示例
2014/12/12 Javascript
js插件设置innerHTML时在IE8下提示“未知运行时错误”解决方法
2015/04/25 Javascript
简介JavaScript中的italics()方法的使用
2015/06/08 Javascript
JavaScript简单下拉菜单实例代码
2015/09/07 Javascript
学习JavaScript设计模式(封装)
2015/11/26 Javascript
JS表格组件神器bootstrap table详解(基础版)
2015/12/08 Javascript
深入浅析JavaScript的API设计原则
2016/06/14 Javascript
浅谈js对象的创建和对6种继承模式的理解和遐想
2016/10/16 Javascript
JSON创建键值对(key是中文或者数字)方式详解
2017/08/24 Javascript
javascript实现电脑和手机版样式切换
2017/11/10 Javascript
浅析Node.js非对称加密方法
2018/01/29 Javascript
一次记住JavaScript的6个正则表达式方法
2018/02/22 Javascript
Python动态语言与鸭子类型详解
2019/07/01 Python
Python叠加两幅栅格图像的实现方法
2019/07/05 Python
python如何实现不用装饰器实现登陆器小程序
2019/12/14 Python
Pycharm创建文件时自动生成文件头注释(自定义设置作者日期)
2020/11/24 Python
使用phonegap进行本地存储的实现方法
2017/03/31 HTML / CSS
戴尔英国官网:Dell英国
2017/05/27 全球购物
安全协议书
2014/04/23 职场文书
竞选学生会主席演讲稿
2014/04/24 职场文书
支部鉴定材料
2014/06/02 职场文书
学校献爱心活动总结
2014/07/08 职场文书
党员弘扬焦裕禄精神思想汇报
2014/09/10 职场文书
高一课前三分钟演讲稿
2014/09/13 职场文书
2014年高校辅导员工作总结
2014/12/09 职场文书
大学生在校表现评语
2014/12/31 职场文书
史上最全书信经典范文大全(建议收藏)
2019/07/10 职场文书
学习师德师风的心得体会(2篇)
2019/10/08 职场文书
Oracle11g R2 安装教程完整版
2021/06/04 Oracle
java设计模式--建造者模式详解
2021/07/21 Java/Android
Golang 字符串的常见操作
2022/04/19 Golang