vue使用better-scroll实现滑动以及左右联动


Posted in Javascript onJune 30, 2020

本文实例为大家分享了vue实现滑动以及左右联动效果的具体代码,供大家参考,具体内容如下

一、首先需要在项目中引入better-scroll

1. 在package.json 直接写入 "better-scroll":"^1.15.1"  版本以github上为准(目前最新)

2.cpnm install  在node_modules  可以查看版本是否安装

3.直接在你的组件里面写入import BScroll from 'better-scroll';

二、better-scroll优点

1.体验像原生:滚动非常流畅,而且没有滚动条。

2.滚动位置固定:在vue中通过路由切换页面时组件会自动滚动到顶部,需要监听滚动行为才能让滚动位置固定,better-scroll解决了这个问题。

三、下面是在项目中的使用

移动端很常见的效果,当滑动右边部分的时候,左边会联动显示与当前内容相符合的标题高亮,当点击左边某一个标题的时候,右边会自动滑动到相应的内容。

项目如下图:

vue使用better-scroll实现滑动以及左右联动

实现及说明

1.滚动效果

better-scroll在使用的时候需要在dom元素渲染完成之后初始化better-scroll的实例,初始化的时候,先要获取需要滑动的元素,然后在初始化的时候将获取到的元素传递给初始化函数,此时便可实现滑动效果

2.左右联动效果

左右联动效果的实现,是better-scroll通过监听事件实现的。

首先获取到右边内容盒子的高度,然后获取到该盒子中每一项的高度并做前n项高度累加(第n项的高度是前n项的高度和)存储到listHeight数组中。在初始化的时候传递属性probeType=3 (探针的效果,时时获取滚动高度),并给右边的内容盒子对象监听scroll事件,从而时时获取Y轴位置,来与listHeight数组中的数据做比较,时时计算当前的索引值,并给对边对应索引值的项添加背景色高亮,从而实现右边滑动,联动左边。

当点击左边的每一项的时候,获取到当前的索引值,并根据当前的索引值获取到与右边内容盒子中对应索引的元素,右边的盒子元素通过监听scrollToElement,并传递获取到的对应索引元素和动画时间,从而实现点击左边,实现右边联动;

实现代码如下:

<template>
 <section class="box">
 <div class="head">
 head
 </div>
 <div class="content">
 <div class="left" ref="left">
 <ul>
  <li v-for="(item, index) in left" :key="item" :class="{current: currentIndex == index}" @click="selectItem(index, $event)">
  <span class="left-item">{{item}}</span>
  </li>
 </ul>
 </div>
 <div class="right" ref="right">
 <ul>
  <li class="right-item right-item-hook" v-for="item in right" :key="item.name">
  <h2>{{item.name}}</h2>
  <ul>
  <li v-for="num in item.content" :key="num.name">
  <div>{{item.name+num}}</div>
  </li>
  </ul>
  </li>
 </ul>
 </div>
 </div>
 </section>
</template>
<script>
import BScroll from 'better-scroll'
export default {
 data () {
 return {
 left: ['a', 'b', 'c', 'd', 'e', 'f'],
 right: [
 {
  name: 'a',
  content: ['1', '2', '3', '4', '5']
 },
 {
  name: 'b',
  content: ['1', '2', '3', '4', '5']
 },
 {
  name: 'c',
  content: ['1', '2', '3', '4', '5']
 },
 {
  name: 'd',
  content: ['1', '2', '3', '4', '5']
 },
 {
  name: 'e',
  content: ['1', '2', '3', '4', '5']
 },
 {
  name: 'f',
  content: ['1', '2', '3', '4', '5']
 },
 ],
 listHeight: [],
 scrollY: 0, //实时获取当前y轴的高度
 clickEvent: false
 }
 },
 methods: {
 _initScroll () {
 //better-scroll的实现原理是监听了touchStart,touchend事件,所以阻止了默认的事件(preventDefault)
 //所以在这里做点击的话,需要在初始化的时候传递属性click,派发一个点击事件
 //在pc网页浏览模式下,点击事件是不会阻止的,所以可能会出现2次事件,所以为了避免2次,可以在绑定事件的时候把$event传递过去
 this.lefts = new BScroll(this.$refs.left, {
 click: true
 })
 this.rights = new BScroll(this.$refs.right, {
 probeType: 3 //探针的效果,实时获取滚动高度
 })
 //rights这个对象监听事件,实时获取位置pos.y
 this.rights.on('scroll', (pos) => {
 this.scrollY = Math.abs(Math.round(pos.y))
 })
 },
 _getHeight () {
 let rightItems = this.$refs.right.getElementsByClassName('right-item-hook')
 let height = 0
 this.listHeight.push(height)
 for(let i = 0; i < rightItems.length; i++){
 let item = rightItems[i]
 height += item.clientHeight
 this.listHeight.push(height)
 }
 },
 selectItem(index,event){
 this.clickEvent = true
 //在better-scroll的派发事件的event和普通浏览器的点击事件event有个属性区别_constructed
 //浏览器原生点击事件没有_constructed所以当时浏览器监听到该属性的时候return掉
 if(!event._constructed){
 return
 }else{
 let rightItems = this.$refs.right.getElementsByClassName('right-item-hook')
 let el = rightItems[index]
 this.rights.scrollToElement(el, 300)
 }
 }
 },
 mounted () {
 this.$nextTick(() => {
 this._initScroll()
 this._getHeight()
 })
 },
 computed: {
 currentIndex () {
 for(let i = 0; i < this.listHeight.length; i ++){
 let height = this.listHeight[i]
 let height2 = this.listHeight[i + 1]
 //当height2不存在的时候,或者落在height和height2之间的时候,直接返回当前索引
 //>=height,是因为一开始this.scrollY=0,height=0
 if(!height2 || (this.scrollY >= height && this.scrollY < height2)){
  return i
 }
 if(this.listHeight[this.listHeight.length - 1] - this.$refs.right.clientHeight <= this.scrollY){
  if(this.clickTrue){
  return this.currentNum
  }else{
  return (this.listHeight.length - 1)
  }
 }
 }
 //如果this.listHeight没有的话,就返回0
 return 0
 }
 }
}
</script>
<style scoped>
.content{
 display: flex;
 position: absolute;
 top:100px;
 bottom:100px;
 width:100%;
 overflow: hidden;
 background: #eee;
}
.left{
 flex: 0 0 80px;
 width:80px;
 background-color: #f3f5f7;
}
 .left li{
 width: 100%;
 height: 100%;
 }
 .current{
 background-color: red;
 }
 .left-item{
 display: block;
 width:100%;
 height:100px;
 line-height: 50px;
 text-align: center;
 border-bottom:1px solid yellow;
 }
 .right{
 flex: 1;
 }
 .right-item li{
 width:100%;
 height:100px;
 line-height:100px;
 text-align: center;
 border-bottom: 1px solid yellow;
 }
 *{
 list-style: none;
 margin: 0;
 padding: 0;
 }
</style>

关于vue.js组件的教程,请大家点击专题vue.js组件学习教程进行学习。

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

Javascript 相关文章推荐
判断客户端浏览器是否安装了Flash插件的多种方法
Aug 11 Javascript
当滚动条滚动到页面底部自动加载增加内容的js代码
May 13 Javascript
javascript获取网页各种高宽及位置的方法总结
Jul 27 Javascript
js中动态创建json,动态为json添加属性、属性值的实例
Dec 02 Javascript
原生js实现轮播图
Feb 27 Javascript
通过学习bootstrop导航条学会修改bootstrop颜色基调
Jun 11 Javascript
在一般处理程序(ashx)中弹出js提示语
Aug 16 Javascript
关于jquery layui弹出层的使用方法
Apr 21 jQuery
jquery实现的简单轮播图功能【适合新手】
Aug 17 jQuery
vue2.0$nextTick监听数据渲染完成之后的回调函数方法
Sep 11 Javascript
Vue中图片Src使用变量的方法
Oct 30 Javascript
微信jssdk踩坑之签名错误invalid signature
May 19 Javascript
vue基于better-scroll实现左右联动滑动页面
Jun 30 #Javascript
Postman动态获取返回值过程详解
Jun 30 #Javascript
JS简易计算器实例讲解
Jun 30 #Javascript
如何在postman中添加cookie信息步骤解析
Jun 30 #Javascript
JSON获取属性值方法代码实例
Jun 30 #Javascript
JS猜数字游戏实例讲解
Jun 30 #Javascript
vue实现评价星星功能
Jun 30 #Javascript
You might like
解析PHP中ob_start()函数的用法
2013/06/24 PHP
php中并发读写文件冲突的解决方案
2013/10/25 PHP
PHP扩展模块Pecl、Pear以及Perl的区别
2014/04/09 PHP
PHP 7.0新增加的特性介绍
2017/06/08 PHP
jquery tools 系列 scrollable(2)
2009/09/06 Javascript
用JQuery在网页中实现分隔条功能的代码
2012/08/09 Javascript
jQuery动画特效实例教程
2014/08/29 Javascript
jQuery中innerWidth()方法用法实例
2015/01/19 Javascript
javascript比较两个日期相差天数的方法
2015/07/24 Javascript
理解JavaScript中worker事件api
2015/12/25 Javascript
使用contextMenu插件实现Bootstrap table弹出右键菜单
2017/02/20 Javascript
JavaScript无阻塞加载和defer、async详解
2017/02/26 Javascript
深入理解Javascript中的作用域链和闭包
2017/04/25 Javascript
详解使用vue实现tab 切换操作
2017/07/03 Javascript
js实现数字从零慢慢增加到指定数字示例
2019/11/07 Javascript
基于ID3决策树算法的实现(Python版)
2017/05/31 Python
pandas中Timestamp类用法详解
2017/12/11 Python
python3 读取Excel表格中的数据
2018/10/16 Python
python处理DICOM并计算三维模型体积
2019/02/26 Python
Python 获取指定文件夹下的目录和文件的实现
2019/08/30 Python
python列表推导和生成器表达式知识点总结
2020/01/10 Python
python脚本监控logstash进程并邮件告警实例
2020/04/28 Python
html5画布旋转效果示例
2014/01/27 HTML / CSS
HTML5获取当前地理位置并在百度地图上展示的实例
2020/07/10 HTML / CSS
若通过ObjectOutputStream向一个文件中多次以追加方式写入object,为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException?
2016/10/17 面试题
机房搬迁方案
2014/05/01 职场文书
贸易经济专业自荐书
2014/06/29 职场文书
机关党员进社区活动总结
2014/07/05 职场文书
应届毕业生自荐信
2015/03/04 职场文书
节水宣传标语口号
2015/12/26 职场文书
解决goland 导入项目后import里的包报红问题
2021/05/06 Golang
教你怎么用PyCharm为同一服务器配置多个python解释器
2021/05/31 Python
Python实现抖音热搜定时爬取功能
2022/03/16 Python
俄罗斯十大城市人口排名,第三首都仅排第六,第二是北方首都
2022/03/20 杂记
python获取字符串中的email
2022/03/31 Python
vue3不同环境下实现配置代理
2022/05/25 Vue.js