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 相关文章推荐
JS location几个方法小姐
Jul 09 Javascript
javascript 动态数据下的锚点错位问题解决方法
Dec 24 Javascript
javascript判断ie浏览器6/7版本加载不同样式表的实现代码
Dec 26 Javascript
javascript中的throttle和debounce浅析
Jun 06 Javascript
jQuery中get和post方法传值测试及注意事项
Aug 08 Javascript
Angular开发者指南之入门介绍
Mar 05 Javascript
Bootstrap笔记—折叠实例代码
Mar 13 Javascript
利用JS做网页特效_大图轮播(实例讲解)
Aug 09 Javascript
详解Vue用自定义指令完成一个下拉菜单(select组件)
Oct 31 Javascript
Vue框架之goods组件开发详解
Jan 25 Javascript
基于jquery实现的tab选项卡功能示例【附源码下载】
Jun 10 jQuery
js实现选项卡效果
Mar 07 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模板函数 正则实现代码
2012/10/15 PHP
解析php中如何调用用户自定义函数
2013/08/06 PHP
php导出excel格式数据问题
2014/03/11 PHP
php jsonp单引号转义
2014/11/23 PHP
PHP调用.NET的WebService 简单实例
2015/03/27 PHP
php基于PDO连接MSSQL示例DEMO
2016/07/13 PHP
Laravel使用memcached缓存对文章增删改查进行优化的方法
2016/10/08 PHP
PHP利用pdo_odbc实现连接数据库示例【基于ThinkPHP5.1搭建的项目】
2019/05/13 PHP
js表数据排序 sort table data
2009/02/18 Javascript
JavaScript 字符串与数组转换函数[不用split与join]
2009/12/13 Javascript
jquery validate.js表单验证的基本用法入门
2010/05/13 Javascript
Jquery 选中表格一列并对表格排序实现原理
2012/12/15 Javascript
javascript中bind函数的作用实例介绍
2014/09/28 Javascript
基于jQuery实现复选框的全选 全不选 反选功能
2014/11/24 Javascript
理解 JavaScript Scoping &amp; Hoisting(二)
2015/11/18 Javascript
jquery自适应布局的简单实例
2016/05/28 Javascript
完美实现八种js焦点轮播图(上篇)
2016/07/18 Javascript
JS数组排序方法实例分析
2016/12/16 Javascript
ECMAscript 变量作用域总结概括
2017/08/18 Javascript
es6基础学习之解构赋值
2018/12/10 Javascript
一文搞懂ES6中的Map和Set
2019/05/20 Javascript
关于vue表单提交防双/多击的例子
2019/10/31 Javascript
vue 监听窗口变化对页面部分元素重新渲染操作
2020/07/28 Javascript
vue video和vue-video-player实现视频铺满教程
2020/10/30 Javascript
python Pygame的具体使用讲解
2017/11/03 Python
python批量修改ssh密码的实现
2019/08/08 Python
pytorch打印网络结构的实例
2019/08/19 Python
如何解决python多种版本冲突问题
2020/10/13 Python
HTML5新表单元素_动力节点Java学院整理
2017/07/12 HTML / CSS
皇家阿尔伯特瓷器美国官网:Royal Albert美国
2020/02/16 全球购物
大学生自我鉴定范文
2013/12/28 职场文书
结对共建工作方案
2014/06/02 职场文书
单方离婚协议书范本(2014版)
2014/09/30 职场文书
2014年行政工作总结
2014/11/19 职场文书
使用php的mail()函数实现发送邮件功能
2021/06/03 PHP
【海涛DOTA解说】EVE女子战队独家录像加ZSMJ神牛两连发
2022/04/01 DOTA