话不多说,上demo

<template>
<div id="app">
<header>左右列表双向联动</header>
<div class="content">
<!-- 左侧列表 -->
<ul class="left_title" ref="left">
<li
class="title_item"
v-for="(item, index) in cateData"
:key="index"
:class="currentIndex === index ? 'active' : ''"
@click="change(index)"
>
{{ item.name }}
</li>
</ul> <!-- 右侧内容区域 -->
<div class="right_content">
<div class="container" ref="container">
<div ref="foodsUI" class="foodsUI">
<div class="list">
<div class="name">健康蔬菜</div>
<ul>
<li>苹果</li>
<li>西红柿</li>
<li>番茄</li>
</ul>
</div>
<div class="list">
<div class="name">时令蔬菜</div>
<ul>
<li>苹果</li>
<li>西红柿</li>
<li>番茄</li>
</ul>
</div>
<div class="list">
<div class="name">拨草</div>
<ul>
<li>苹果</li>
<li>西红柿</li>
<li>番茄</li>
</ul>
</div>
<div class="list">
<div class="name">1</div>
<ul>
<li>苹果</li>
<li>西红柿</li>
<li>番茄</li>
</ul>
</div>
<div class="list">
<div class="name">2</div>
<ul>
<li>苹果</li>
<li>西红柿</li>
<li>番茄</li>
</ul>
</div>
<div class="list">
<div class="name">3</div>
<ul>
<li>苹果</li>
<li>西红柿</li>
<li>番茄</li>
</ul>
</div>
<div class="list">
<div class="name">4</div>
<ul>
<li>苹果</li>
<li>西红柿</li>
<li>番茄</li>
</ul>
</div>
<div class="list">
<div class="name">5</div>
<ul>
<li>苹果</li>
<li>西红柿</li>
<li>番茄</li>
</ul>
</div>
<div class="list">
<div class="name">6</div>
<ul>
<li>苹果</li>
<li>西红柿</li>
<li>番茄</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
</template> <script>
import BScroll from 'better-scroll'
export default {
data() {
return {
scroll: '',
// 右侧滑动的y轴坐标(滑动过程中的实时变化)
scrollY: 0,
foodsScroll: '',
// 所有右侧分类li的top组成的数组
tops: [],
cateData: [
{
name: '健康蔬菜'
},
{
name: '时令蔬菜'
},
{
name: '拨草'
},
{
name: '1'
},
{
name: '2'
},
{
name: '3'
},
{
name: '4'
},
{
name: '5'
},
{
name: '6'
}
]
}
},
methods: {
// 初始化滚动
initScroll() {
const container = this.$refs.container
this.scroll = new BScroll(container)
/* eslint-disable no-new */
new BScroll('.left_title', {
click: true
})
// 监听右侧列表
this.foodsScroll = new BScroll('.container', {
// 惯性滑动不会被触发
probeType: 2,
click: true
})
// 给右侧列表绑定scroll监听
this.foodsScroll.on('scroll', ({ x, y }) => {
// math.abs绝对值
this.scrollY = Math.abs(y)
console.log(x, y)
})
// 给右侧列表绑定滚动结束监听,滚动结束后改变左侧列表背景颜色
this.foodsScroll.on('scrollEnd', ({ x, y }) => {
this.scrollY = Math.abs(y)
})
},
// 初始化tops
_initTops() {
// 1.初始化tops
const tops = []
let top = 0
tops.push(top)
// 2.搜集
// 找到所有分类的li
const lis = this.$refs.foodsUI.getElementsByClassName('list')
Array.prototype.slice.call(lis).forEach(li => {
top += li.clientHeight
tops.push(top)
})
// 3。更新数据
this.tops = tops
console.log(this.tops)
},
// 点击左侧列表右侧滚动到相应位置
change(index) {
// 得到目标scrollY
const y = this.tops[index]
// 立即更新scrollY
this.scrollY = y
// 平滑滑动右侧列表
this.foodsScroll.scrollTo(0, -y, 300)
}
},
computed: {
// 计算当前分类的下表
currentIndex() {
// 得到条件数据
const { scrollY, tops } = this
// 根据条件计算产出一个结果
const index = tops.findIndex((top, index) => {
return scrollY >= top && scrollY < tops[index + 1]
})
// 返会结果
return index
}
},
mounted() {
this.$nextTick(() => {
this.initScroll()
this._initTops()
})
}
}
</script>
<style scoped>
header {
height: 50px;
width: 100%;
background-color: green;
color: #fff;
font-size: 18px;
display: flex;
justify-content: center;
align-items: center;
}
.content {
display: flex;
}
.left_title {
flex: 1;
margin-right: 5px;
}
.title_item {
height: 35px;
width: 100%;
border: 1px solid #ccc;
display: flex;
justify-content: center;
align-items: center;
font-size: 18px;
border-bottom: none; }
.title_item :last-child {
border-bottom: 1px solid #ccc;
}
.right_content {
flex: 3;
position: relative; }
.name {
text-align: center;
padding: 20px;
font-size: 28px;
}
.list li{
font-size: 20px;
}
.container {
overflow: hidden;
height: calc(100vh - 50px);
}
.active {
background-color: red;
color: #fff;
}
.list {
height: 200px;
border: 1px solid #ccc;
}
.foodsUI {
padding-bottom: 400px;
}
</style>

vue实现移动端左右菜单双向联动效果的更多相关文章

  1. Vue如何使用vue-area-linkage实现地址三级联动效果

    很多时候我们需要使用地址三级联动,即省市区三级联动.网上有很多插件,在此介绍Vue的一款地区联动插件:vue-area-linkage,下面介绍如何使用这个插件实现地址联动效果:         1. ...

  2. js实现菜单二级联动

    代码如下,以便自己以后方便查阅: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> < ...

  3. vue配合iview/element等ui实现界面效果起步

    iview与element都是与vue配合使用的ui框架,用法与配置基本一致,在此,我以iview为例,教你如何起步.*首先,你需要有一定的vue基础,如果你还是个小白,可以去我之前介绍如何搭建一个v ...

  4. 【vue】iView-admin2.0动态菜单路由

    vue项目实现动态路由有俩种方式 一.前端在routers中写好--所有--路由表 <前端控制路由>,登录时根据用户的角色权限来动态的显示菜单路由 二.前端通过调用接口请求拿到当前用户-- ...

  5. vue-awesome-swiper ---移动端h5 swiper 和 tab 栏选项联动效果实现

    很久之前做小程序时有个类似每日优鲜里储值卡充值界面里的 卡轮播和价格tab栏联动效果,当时觉得新鲜做出来之后也没当回事.直到今天又遇到了一个类似的功能,所以想着总结经验. 实现效果如下图: 图解:点击 ...

  6. 基于SqlSugar的开发框架循序渐进介绍(20)-- 在基于UniApp+Vue的移动端实现多条件查询的处理

    在做一些常规应用的时候,我们往往需要确定条件的内容,以便在后台进行区分的进行精确查询,在移动端,由于受限于屏幕界面的情况,一般会对多个指定的条件进行模糊的搜索,而这个搜索的处理,也是和前者强类型的条件 ...

  7. Vue.js 服务端渲染业务入门实践

    作者:威威(沪江前端开发工程师) 本文原创,转载请注明作者及出处. 背景 最近, 产品同学一如往常笑嘻嘻的递来需求文档, 纵使内心万般拒绝, 身体倒是很诚实. 接过需求,好在需求不复杂, 简单构思 后 ...

  8. ASP.NET Core 与 Vue.js 服务端渲染

    http://mgyongyosi.com/2016/Vuejs-server-side-rendering-with-aspnet-core/ 原作者:Mihály Gyöngyösi 译者:oop ...

  9. vue.js移动端配置flexible.js

    前言 最近在用vue做移动端项目,网上找了一些移动端适配的方案,个人觉得手淘团队flexible.js还是比较容易上手,在这里做下总结. 主体 flexible.js适配方案采用rem布局,根据屏幕分 ...

随机推荐

  1. Java 读写锁 ReadWriteLock 原理与应用场景详解

    Java并发编程提供了读写锁,主要用于读多写少的场景,今天我就重点来讲解读写锁的底层实现原理@mikechen 什么是读写锁? 读写锁并不是JAVA所特有的读写锁(Readers-Writer Loc ...

  2. [题解] Atcoder ABC 213 H Stroll DP,分治FFT

    题目 令\(dp_{i,j}\)表示从点1到达点i,路径长度为j的方案数.转移为\(dp_{i,j}=\sum_{(i,v,w)\in E}dp_{v,j-w}p_{i,v,w}\). 显然只能从长度 ...

  3. 为什么ArrayList的subList结果不能转换为ArrayList????

    subList是List接口中的一个方法,该方法主要返回一个集合中的一段子集,可以理解为截取一个集合中的部分元素,它的返回值也是一个List. 让我们初始化一个例子: import java.util ...

  4. OnionArch - 采用DDD+CQRS+.Net 7.0实现的洋葱架构

    博主最近失业在家,找工作之余,看了一些关于洋葱(整洁)架构的资料和项目,有感而发,自己动手写了个洋葱架构解决方案,起名叫OnionArch.基于最新的.Net 7.0 RC1, 数据库采用Postgr ...

  5. Mapper 实体转换Entiy to Dto

    实际使用中发现很多问题 如果用EFcore 框架,这个表达式树生成一个新的实体导致EFcore 跟踪失败!/// <summary> /// 生成表达式目录树 泛型缓存 /// </ ...

  6. qiankun+vue,为什么我的子应用的子路由老是跳404?这么解决

    主要解决子应用内部跳转路由时,跳到404页的问题 你能搜这个,我姑且认为你基本配置已经好了,而且主跳子的一级路由是正常的,请往下看 忘说了,我的主应用和子应用都是Vue 主应用跳子应用都正常,为什么子 ...

  7. Vue3 JS 与 SCSS 变量相互使用

    在开发中会遇到如下需求: JS 中使用 SCSS 变量.如在 scss 中定义了一个颜色,el-menu 组件使用该颜色作为背景色,此时需要获取 scss 变量,通过 background-color ...

  8. C++ 函数重载解析策略

    参考<C++ Primer Plus>(第6版)中文版,Stephen Prata 著,张海龙 袁国忠译,人民邮电出版社.C++ 使用重载解析策略来决定为函数调用使用哪一个函数定义.重载解 ...

  9. 参考Dubbo3官方文档做的学习笔记

    文章目录 概念与架构 2.1 服务发现 Dubbo3官方文档: https://dubbo.apache.org 服务:是 Dubbo 中的核心概念,一个服务代表一组 RPC 方法的集合,服务是面向用 ...

  10. Java单例模式,看这一篇就够了

    在创建型设计模式中,我们第一个学习的是单例模式(Singleton Pattern),这是设计模式中最简单的模式之一. 单例是什么意思呢? 单例就是单实例的意思,即在系统全局,一个类只创建一个对象,并 ...