vue中使用better-scroll实现菜单和列表联动的滚动效果,附完整演示代码,(可直接复制)
2023-09-11 14:22:30 时间
实现类似这种效果:
安装better-scroll
npm install better-scroll --save
vue中引入
import BScroll from 'better-scroll'
完整示例demo(含css,js,html,和data数据):
可直接复制观看: 含有详细注释
<template>
<div id="app">
<div id="wrap">
<div class="goodMenu" ref="goodMenu">
<ul>
<li
v-for="(item ,index) in goodMenu"
:key="index"
:class="{active: currentIndex === index}"
@click="selectLeft(index)"
ref="lItem"
>{{ item}}</li>
</ul>
</div>
<div class="goodList" ref="goodList">
<ul>
<li v-for="(items, index) in goodList" :key="index" ref="rItem">
<p>{{ items.name}}</p>
<div v-for="(item, key) in items.data" :key="key">{{ item}}</div>
</li>
</ul>
</div>
</div>
</div>
</template>
<script>
import Bscroll from "better-scroll";
export default {
data() {
return {
number: 30,
goodMenu: [
"菜单1",
"菜单2",
"菜单3",
"菜单4",
"菜单5",
"菜单6",
"菜单7",
"菜单8"
],
goodList: [
{ name: "菜单1", data: ["1.1", "1.2", "1.3", "1.4", "1.5"] },
{ name: "菜单2", data: ["1.1", "1.2", "1.3", "1.4", "1.5", "1.6"] },
{ name: "菜单3", data: ["1.1", "1.2", "1.3", "1.4", "1.5"] },
{ name: "菜单4", data: ["1.1", "1.2", "1.3", "1.4", "1.5"] },
{
name: "菜单5",
data: ["1.1", "1.2", "1.3", "1.4", "1.5", "1.6", "1.7", "1.8"]
},
{ name: "菜单6", data: ["1.1", "1.2", "1.3", "1.4", "1.5"] },
{ name: "菜单7", data: ["1.1", "1.2", "1.3", "1.4","1.1", "1.2"] },
{ name: "菜单8", data: ["1.1", "1.2","1.1", "1.2","1.1", "1.2"] }
],
scrollY: 0, //获取实时滚动位置
heightList: [] //获取每一个li的高度
};
},
computed: {
//当前想要选中的菜单
currentIndex() {
const index = this.heightList.findIndex((item, index) => {
return (
this.scrollY >= this.heightList[index] &&
this.scrollY < this.heightList[index + 1]
);
});
return index > 0 ? index : 0;
}
},
methods: {
selectLeft(index) {
//点击左边菜单栏,立马高亮,不会等到右侧滚动结束后,左侧菜单栏才开始高亮(优化)
this.scrollY = this.heightList[index];
//点击了左侧菜单,获取相应右侧列表的元素,并使用Bscroll提供的scrollToElement() Api跳转
let rItem = this.$refs.rItem;
let el = rItem[index];
this.goodmenu.scrollToElement(el, 1000);
},
//初始化 better-scroll
_scrollInit() {
this.menuList = new Bscroll(this.$refs.goodMenu, {
//设置点击为true,左边菜单栏才能点击
click: true
});
this.goodmenu = new Bscroll(this.$refs.goodList, {
//选中模式2,避免惯性的滑动也触发事件
probeType: 2
});
this.goodmenu.on("scroll", pos => {
//获取实时滚动的距离 使用scrollY接收
this.scrollY = Math.abs(pos.y);
});
this.goodmenu.on("scrollEnd", pos => {
//结束时触发事件获取一次位置,因为使用了模式2,惯性滚动不触发事件
this.scrollY = Math.abs(pos.y);
});
},
//获取右侧列表每一个li的高度,存入数组中
getHeight() {
//获取每一个li的高度
const lis = this.$refs.rItem;
//heightList的第一个元素为0
let height = 0;
this.heightList.push(height);
//之后的高度即为当前li的高度加上之前面li的高度和
lis.forEach(item => {
//clientHeight = content + padding
height += item.clientHeight;
this.heightList.push(height);
});
}
},
created() {
//因为 _scrollInit函数需要操作DOM,因此必须在DOM元素存在文档中才能获取DOM节点
//因此在 nextTick回调函数里面调用可以是实现此功能
this.$nextTick(() => {
this._scrollInit();
this.getHeight();
});
}
};
</script>
<style >
* {
margin: 0;
padding: 0;
}
#wrap {
display: flex;
height: 200px;
background-color: skyblue;
}
.active {
background-color: red;
}
.goodMenu {
line-height: 60px;
background-color: pink;
}
.goodList{
overflow: hidden;
}
.goodList > ul {
width: 300px;
text-align: center;
list-style: none;
}
</style>
相关文章
- Uncaught ReferenceError: vm is not defined vue.js 2.0
- Vue 常用
- 【Vue】Vue组件中style中的局部样式设置scoped应用
- Vue - 实现信纸输入写作,类似写明信片时的一张背景图片 + 横格纸效果(信纸格子与文字自动对齐、支持自定义背景图、文字或横线大小与颜色,一切由您 DIY 自定义样式)纯CSS完成支持任何vue项目
- Vue - 搜索关键字标红高亮(用户输入关键词搜索后,在搜索结果的列表标题上匹配并标红加粗)怎么使内容文本标红高亮的最详细教程,Nuxt.js uni-app 也适用,搜索功能及搜索结果关键字高亮源码
- Vue - [完整源码] 实现分类菜单 + 轮播图组合布局效果,类似左侧菜单与右侧轮播图连接在一起的效果(当鼠标移入菜单时,侧边出现子菜单列表)常见于商城系统,示例代码注释详细开箱即用!
- Vue - 完美解决小数的四则运算(加减乘除)导致精度丢失问题,提供详细计算示例代码vue数据计算丢失精度
- Vue - 列表分页懒加载 / 点击 “加载更多“ 按钮请求接口数据(如何实现类似用户手动点击 “查看更多“ ,然后请求分页懒加载数据填充)可适用于 Nuxt.js 、uni-app 等 Vue.js
- Vue——vue中的双向数据绑定
- Vue——详解MVVM模型在vue中的使用
- Vue2.0 搭建Vue脚手架(vue-cli)
- vue.js-详解三大流行框架VUE_快速进阶前端大咖-Vue基础
- vue原生input上传文件
- vue 3.0 项目搭建移动端 (二) Vue-router: router-link 与 router-view keep-alive
- [vue]几十行代码写一个图书管理系统小demo来学习表单控件、列表渲染和事件绑定。
- vue-router实现SPA购物APP基本功能
- Vue开发规范
- 用 vue cli 脚手架搭建单页面 Vue 应用(进阶2)
- 【Vue】vue组件和vue插件的创建和使用(底部栏组件、Toast 和 Notify通知插件)
- 【Vue】vue基础语法——自定义指令、过滤、组件和动画(内附详细案例代码)——day04
- vue学习笔记四:Jquery VS Vue之元素操作明细对照
- vue学习笔记三:Jquery VS Vue之差异比较概览
- Vue富文本编辑器的使用vue-quill-deitor
- VUE中的v-if与v-show
- vue渲染列表时报错Avoid using non-primitive value as key, use string/number value instead.
- vue问题解决:Vue packages version mismatch 版本始终不对的解决
- Vue学习第27天——路由vue-router的详解及案例练习
- spring boot + vue + element-ui全栈开发入门——前端列表页面开发
- vue-解决Vue打包上线之后部分CSS不生效的问题
- vue 登录页背景-粒子特效(Vue-Particles)