详解 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 相关文章推荐
JS实现淘宝幻灯片效果的实现方法
Mar 22 Javascript
Jquery为a标签的href赋值实现代码
May 03 Javascript
Extjs3.0 checkboxGroup 动态添加item实现思路
Aug 14 Javascript
图片放大镜jquery.jqzoom.js使用实例附放大镜图标
Jun 19 Javascript
Javascript代码实现仿实例化类
Apr 03 Javascript
在JavaScript中访问字符串的子串
Jul 07 Javascript
js实现网页抽奖实例
Aug 05 Javascript
JS获取文件大小方法小结
Dec 08 Javascript
JavaScript Math 对象常用方法总结
Apr 28 Javascript
AngularJS中的promise用法分析
May 19 Javascript
Angular实现的table表格排序功能完整示例
Dec 22 Javascript
js屏蔽F12审查元素,禁止修改页面代码等实现代码
Oct 02 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
正义联盟的终局之战《天启星战争》将成为DC动画宇宙的最后一部
2020/04/09 欧美动漫
ThinkPHP模板范围判断输出In标签与Range标签用法详解
2014/06/30 PHP
PHP获取mysql数据表的字段名称和详细信息的方法
2014/09/27 PHP
PHP中的随机性 你觉得自己幸运吗?
2016/01/22 PHP
Yii2使用dropdownlist实现地区三级联动功能的方法
2016/07/18 PHP
PHP实现单例模式建立数据库连接的方法分析
2020/02/11 PHP
如何取得中文输入的真实长度?
2006/06/24 Javascript
javascript Split方法,indexOf方法、lastIndexOf 方法和substring 方法
2009/03/21 Javascript
js实现在字符串中提取数字
2013/11/05 Javascript
JavaScript实现从数组中选出和等于固定值的n个数
2014/09/03 Javascript
jquery中append()与appendto()用法分析
2014/11/14 Javascript
Javascript刷新窗口方法小结
2015/10/21 Javascript
如何判断Javascript对象是否存在的简单实例
2016/05/18 Javascript
JS实现一个简单的日历
2017/02/22 Javascript
Vue非父子组件通信详解
2017/06/12 Javascript
微信小程序分页加载的实例代码
2017/07/11 Javascript
JavaScript的查询机制LHS和RHS解析
2019/08/16 Javascript
vue动态循环出的多个select出现过的变为disabled(实例代码)
2019/11/10 Javascript
[46:38]完美世界DOTA2联赛PWL S2 Magma vs PXG 第三场 11.28
2020/12/02 DOTA
python实现定制交互式命令行的方法
2014/07/03 Python
Python实现竖排打印传单手机号码易撕条
2015/03/16 Python
Python制作爬虫采集小说
2015/10/25 Python
Python如何实现守护进程的方法示例
2017/02/08 Python
用python写一个windows下的定时关机脚本(推荐)
2017/03/21 Python
快速解决安装python没有scripts文件夹的问题
2018/04/03 Python
Python3实现转换Image图片格式
2018/06/21 Python
详解Python self 参数
2019/08/30 Python
python中的线程threading.Thread()使用详解
2019/12/17 Python
Pandas实现一列数据分隔为两列
2020/05/18 Python
GUESS德国官网:美国牛仔服装品牌
2017/02/14 全球购物
美国时尚大码女装购物网站:Avenue
2019/05/24 全球购物
Servlet如何得到服务器的信息
2015/12/22 面试题
企划主管岗位职责
2013/12/12 职场文书
满月酒邀请函
2015/01/30 职场文书
公司门卫岗位职责
2015/04/13 职场文书
前端使用svg图片改色实现示例
2022/07/23 HTML / CSS