详解 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 结合C#后台的数组对文章的关键字自动添加链接的代码
Jul 15 Javascript
仿jQuery的siblings效果的js代码
Aug 09 Javascript
JS 表单验证大全
Nov 23 Javascript
jquery Mobile入门—外部链接切换示例代码
Jan 08 Javascript
写得不错的jquery table鼠标经过变色代码
Sep 27 Javascript
几种延迟加载JS代码的方法加快网页的访问速度
Oct 12 Javascript
理解javascript回调函数
Dec 28 Javascript
jQuery搜索框效果实现代码(百度关键词联想)
Feb 25 Javascript
Bootstrap的popover(弹出框)2秒后定时消失的实现代码
Feb 27 Javascript
vue+element的表格实现批量删除功能示例代码
Aug 17 Javascript
vue改变对象或数组时的刷新机制的方法总结
Apr 24 Javascript
vue+element-ui JYAdmin后台管理系统模板解析
Jul 28 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
phpBB BBcode处理的漏洞
2006/10/09 PHP
php生成随机密码的三种方法小结
2010/09/04 PHP
php中批量替换文件名的实现代码
2011/07/20 PHP
laravel5 Eloquent 实现事务方式
2019/10/21 PHP
动态加载iframe时get请求传递中文参数乱码解决方法
2014/05/07 Javascript
jquery 按键盘上的enter事件
2014/05/11 Javascript
原生javascript实现获取指定元素下所有后代元素的方法
2014/10/28 Javascript
JavaScript中的Math.E属性使用详解
2015/06/12 Javascript
jQuery使用模式窗口实现在主页面和子页面中互相传值的方法
2016/03/01 Javascript
Bootstrap每天必学之导航组件
2016/04/25 Javascript
JavaScript实现的商品抢购倒计时功能示例
2017/04/17 Javascript
小程序数据通信方法大全(推荐)
2019/04/15 Javascript
微信小程序封装自定义弹窗的实现代码
2019/05/08 Javascript
对Layer UI 模块化的用法详解
2019/09/26 Javascript
javascript实现简单打字游戏
2019/10/29 Javascript
element 中 el-menu 组件的无限极循环思路代码详解
2020/04/26 Javascript
vue使用video插件vue-video-player的示例
2020/10/03 Javascript
Python实现的一个自动售饮料程序代码分享
2014/08/25 Python
Python 3.6 性能测试框架Locust安装及使用方法(详解)
2017/10/11 Python
python实现诗歌游戏(类继承)
2019/02/26 Python
python 将有序数组转换为二叉树的方法
2019/03/26 Python
python opencv 简单阈值算法的实现
2019/08/04 Python
Python列表元素常见操作简单示例
2019/10/25 Python
使用 Python 合并多个格式一致的 Excel 文件(推荐)
2019/12/09 Python
Python环境管理virtualenv&amp;virtualenvwrapper的配置详解
2020/07/01 Python
德国家具在线:Fashion For Home
2017/03/11 全球购物
求职简历中个人的自我评价
2013/12/01 职场文书
中文专业求职信
2014/06/20 职场文书
2014年最新学校运动会广播稿
2014/09/17 职场文书
同学聚会邀请函
2015/01/30 职场文书
党员评议自我评价
2015/03/03 职场文书
解放思想大讨论活动总结
2015/05/09 职场文书
正规欠条模板
2015/07/03 职场文书
python执行js代码的方法
2021/05/13 Python
Python初识逻辑与if语句及用法大全
2021/08/07 Python
TV动画《神废柴☆偶像》公布先导PV
2022/03/20 日漫