详解 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 相关文章推荐
使用javascript为网页增加夜间模式
Jan 26 Javascript
纯javascript实现图片延时加载方法
Aug 21 Javascript
利用jQuery中的ajax分页实现代码
Feb 25 Javascript
超实用的JavaScript表单代码段
Feb 26 Javascript
实践中学习AngularJS表单
Mar 21 Javascript
浅谈几种常用的JS类定义方法
Jun 08 Javascript
angularJS 指令封装回到顶部示例详解
Jan 22 Javascript
Jquery动态列功能完整实例
Aug 30 jQuery
vue中监听路由参数的变化及方法
Dec 06 Javascript
javascript实现拖拽碰撞检测
Mar 12 Javascript
vue+element table表格实现动态列筛选的示例代码
Jan 14 Vue.js
TypeScript 使用 Tuple Union 声明函数重载
Apr 07 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
PHP 创建标签云函数代码
2010/05/26 PHP
php实现数组筛选奇数和偶数示例
2014/04/11 PHP
php读取csv数据保存到数组的方法
2015/01/03 PHP
浅谈Laravel队列实现原理解决问题记录
2017/08/19 PHP
如何确保JavaScript的执行顺序 之实战篇
2011/03/03 Javascript
DOM 中的事件处理介绍
2012/01/18 Javascript
js编写trim()函数及正则表达式的运用
2013/10/24 Javascript
JS将表单导出成EXCEL的实例代码
2013/11/11 Javascript
js带前后翻页的图片切换效果代码分享
2015/09/08 Javascript
jQuery入门之层次选择器实例简析
2015/12/11 Javascript
轻松实现JavaScript图片切换
2016/01/12 Javascript
JavaScript基本语法学习教程
2016/01/14 Javascript
JS实现Select的option上下移动的方法
2016/03/01 Javascript
JS如何生成一个不重复的ID的函数
2016/12/25 Javascript
微信小程序 动态绑定事件并实现事件修改样式
2017/04/13 Javascript
通过V8源码看一个关于JS数组排序的诡异问题
2017/08/14 Javascript
node.js的exports、module.exports与ES6的export、export default深入详解
2017/10/26 Javascript
vue的常用组件操作方法应用分析
2018/04/13 Javascript
利用vscode调试编译后的js代码详解
2018/05/14 Javascript
11个教程中不常被提及的JavaScript小技巧(推荐)
2019/04/17 Javascript
简单的通用表达式求10乘阶示例
2014/03/03 Python
简单介绍Ruby中的CGI编程
2015/04/10 Python
浅谈python类属性的访问、设置和删除方法
2016/07/25 Python
谈谈如何手动释放Python的内存
2016/12/17 Python
使用Python3+PyQT5+Pyserial 实现简单的串口工具方法
2019/02/13 Python
python 实现turtle画图并导出图片格式的文件
2019/12/07 Python
keras 多gpu并行运行案例
2020/06/10 Python
伦敦剧院门票:From The Box Office
2018/06/30 全球购物
后勤采购员岗位职责
2013/12/19 职场文书
生产部岗位职责范文
2014/02/07 职场文书
十八大感想感言
2014/02/10 职场文书
股票投资建议书
2014/05/19 职场文书
办公室文员岗位职责
2015/02/04 职场文书
2015小学新教师个人工作总结
2015/10/14 职场文书
2016年社区国庆节活动总结
2016/04/01 职场文书
《工作是最好的修行》读后感3篇
2019/12/13 职场文书