> 双联动属于一个常见的需求组件,左右的元素可进行联动定位
![](https://img.kancloud.cn/cc/55/cc55284ab5466d4064136a833422f479_646x368.png)
> 主要用到了scroll-view一下特性
> 1. scroll-into-view 滚动到指定id的元素位置
> 2. scroll-with-animation 滚动使用动画效果
> 3. @scrolltolower 滚动至底部
> 4. @scroll 滚动事件(~~当滚动时,定位的scrollTop在元素区间位置进行联动定位,逻辑实现~~)
> 官网文档:https://uniapp.dcloud.io/component/scroll-view
```
<template>
<view class="m-conatiner">
<view class="left">
<view :class="{activeClass:currentIndex == index}" v-for="(item,index) in list" :key="index" @click="setViewId(index)">{{item.title}}</view>
</view>
<view class="right">
<scroll-view scroll-y="true" :scroll-into-view="viewId" scroll-with-animation @scroll="scroll" @scrolltolower="scrolltolower" style="white-space: nowrap;height: 400rpx;" >
<view v-for="(item, index) in list" :key="index">
<view class="title" :id="'title'+index">{{item.title}}</view>
<view v-for="(it,idx) in item.alist" :key="idx">{{it}}</view>
</view>
</scroll-view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
list: [
{title:'中餐',alist: ['馒头','包子','盖饭','炒面','饺子','鸡排饭']},
{title:'西餐',alist: ['牛排','意大利面','披萨','汉堡']},
{title:'法餐',alist: ['鹅肝1','鹅肝2','鹅肝3','鹅肝4','鹅肝5','鹅肝6','鹅肝7','鹅肝8','鹅肝9','鹅肝10']}
],
viewId: '',
currentIndex: 0,
topList: []
}
},
onLoad() {
},
onReady(){
this.getNodeInfo();
},
methods: {
setViewId(index) { // 点击左边标题 触发事件 动态改变左边标题的id
this.viewId = 'title'+index;
this.currentIndex = index;
},
scroll(e) { // 右边滚动触发事件 获取每个标题间的距离,判断滚动的高度在哪个区间内
let scrollTop = e.target.scrollTop+1;
for(let i=0; i<this.topList.length; i++) {
const h1 = this.topList[i];
let h2 = this.topList[i+1];
if (scrollTop >= h1 && scrollTop < h2){
this.currentIndex = i;
}
}
},
scrolltolower(){ // 滚动到底部触发
setTimeout(()=> {
this.currentIndex = this.list.length -1;
},80)
},
getNodeInfo(){ // 获取DOM 取得每个标题间的高度。exec执行
let query = uni.createSelectorQuery().in(this);
query.selectAll('.title').boundingClientRect(data => {
console.log("得到布局位置信息",data,);
let arr = [];
data.map(item=>{
arr.push(item.top)
})
this.topList = arr;
}).exec();
}
}
}
</script>
<style lang="scss">
.m-conatiner{
width: 100%;
height: 400rpx;
border: 2rpx solid #ddd;
display: flex;
justify-content: space-between;
align-items: center;
box-sizing: border-box;
}
.left{
flex: 0 0 200rpx;
height: 100%;
border: 2rpx solid red;
.activeClass{
background: pink;
}
}
.right{
flex: 1;
height: 100%;
border: 2rpx solid red;
.title{
font-size: 40rpx;
font-weight: bold;
background: pink;
}
}
</style>
```
- 基础知识
- UNI核心介绍
- flex布局
- 生命周期
- 全局方法
- 组件定义
- 自定义组件
- 全局组件
- 组件之间的数据传输
- 条件编译
- 自定义头部
- 节点信息 (SelectorQuery)
- vuejs基础语法
- 页面跳转以及参数传递
- 事件的监听注册以及触发
- css3动画
- block的妙用
- mixin (混入)
- uniapp快捷键
- vuex状态管理
- 实用功能
- 获取服务提供商
- 启动页 / 启动界面
- 引导页
- tabbar配置
- 头部导航栏基础设置
- 上拉下拉(刷新/加载)
- 第三方登录
- 第三方分享
- 推送通知 之 unipush
- scroll-view双联动
- 配置iOS通用链接(Universal Links)
- 本地缓存操作
- 升级/更新方案
- 热更新
- 图片上传
- 搜索页实现
- canvas绘图助手
- 地图定位
- 第三方支付————todo
- 分类轮播
- 清除应用缓存
- uniapp与webview的实时通讯
- 视频-----todo
- 聊天----todo
- 长列表swiper左右切换
- 第三方插件
- uview
- mescroll
- uCharts (图表)
- 无名 (更新插件)
- 第三方模版
- 自定义基座
- 打包发行
- 要封装的方法
- 缓存 cache.js
- 请求接口 request.js
- 工具类 util.js
- 小程序登录 xcxLogin.js
- 版本更新 update.js
- 优质插件
- 更新插件----todo
- 语音
- 语音识别 (含上传)
- 百度语音合成播报接口
- 官方常用组建
- input 输入框
- image 图片
- audio 音频
- picker 选择器
- video 视频
- scroll-view 滚动视图