> 雙聯動屬于一個常見的需求組件,左右的元素可進行聯動定位

> 主要用到了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 滾動視圖