vue和better-scroll實(shí)現(xiàn)列表左右聯(lián)動(dòng)效果詳解
一.實(shí)現(xiàn)思路
- (1)實(shí)現(xiàn)上是左右分別一個(gè)better-scroll列表
- (2)利用計(jì)算右側(cè)列表每一個(gè)大區(qū)塊的高度來(lái)計(jì)算左側(cè)的位置
二.實(shí)現(xiàn)
1.實(shí)現(xiàn)左右兩個(gè)better-scroll
(1)dom結(jié)構(gòu)(better-scroll要求,會(huì)把最外層dom的第一個(gè)子元素作為要滾動(dòng)的區(qū)域)
左邊滾動(dòng)列表dom
<div class="menu-wrapper" v-el:menu-wrapper>
<ul>
<li v-for="item in goods" class="menu-item"
:class="{'current':currentIndex === $index}"
@click="selectMenu($index,$event)">
<span class="text border-1px">
<span v-show="item.type > 0" class="icon"
:class="classMap[item.type]"></span>{{item.name}}
</span>
</li>
</ul>
</div>
右邊滾動(dòng)列表dom
<div class="food-wrapper" v-el:food-wrapper>
<ul>
<li v-for="item in goods" class="food-list food-list-hook">
<h1 class="title">{{item.name}}</h1>
<ul>
<li v-for="food in item.foods" class="food-item border-1px">
<div class="icon">
<img width="57" height="57" :src="food.icon">
</div>
<div class="content">
<h2 class="name">{{food.name}}</h2>
<p class="desc">{{food.description}}</p>
<div class="extra">
<span class="count">月售{{food.sellCount}}份</span>
<span>好評(píng)率{{food.rating}}%</span>
<div class="price">
<span class="now">¥{{food.price}}</span>
<span class="old" v-show="food.oldPrice">¥{{food.oldPrice}}</span>
</div>
</div>
</div>
</li>
</ul>
</li>
</ul>
</div>
在數(shù)據(jù)請(qǐng)求完成后的$nextTick中初始化better-scroll,就能實(shí)現(xiàn)兩個(gè)列表分別能滾動(dòng),至于聯(lián)動(dòng),要后面自己做
_initScroll() {
this.menuScroll = new BScroll(this.$els.menuWrapper,{
click:true //允許better-scroll列表上的點(diǎn)擊事件
});
this.foodsScroll = new BScroll(this.$els.foodWrapper,{
probeType : 3 //讓better-scroll監(jiān)聽(tīng)scroll事件
});
this.foodsScroll.on('scroll',(pos) => {
this.scrollY =Math.abs(Math.round(pos.y));
})
},
2.實(shí)現(xiàn)聯(lián)動(dòng)效果
(1)具體的聯(lián)動(dòng)實(shí)現(xiàn)思路
- 在渲染完成后($nextTick內(nèi)),初始化better-scroll,并在初始化函數(shù)內(nèi)添加右側(cè)列表的scroll監(jiān)聽(tīng)事件,并記錄scrollY值到,存入vue的data中
- 在渲染完成后($nextTick內(nèi)),計(jì)算右側(cè)列表的每一個(gè)大區(qū)塊的高度,并累加,存入數(shù)組listHeight
- 因?yàn)閟crollY值在滾動(dòng)中總是不斷變化的,所以在computed中計(jì)算出currentIndex,當(dāng)前滾動(dòng)區(qū)域是哪一個(gè)大區(qū)塊,也就是listHeight數(shù)組的下標(biāo)
- 在dom中根據(jù)currentIndex應(yīng)用左側(cè)列表被點(diǎn)中的樣式
- 在左側(cè)列表某一項(xiàng)被點(diǎn)中的時(shí)候,右側(cè)列表滑動(dòng)到某一個(gè)大塊區(qū)域,
//初始化better-scroll
_initScroll() {
this.menuScroll = new BScroll(this.$els.menuWrapper,{
click:true
});
this.foodsScroll = new BScroll(this.$els.foodWrapper,{
probeType : 3
});
this.foodsScroll.on('scroll',(pos) => {
this.scrollY =Math.abs(Math.round(pos.y));
})
},
_calculateHeight() {
let foodList = this.$els.foodWrapper.getElementsByClassName("food-list-hook");
let height = 0;
this.listHeight.push(height);
for(let i=0;i<foodList.length;i++) {
let item = foodList[i];
height += item.clientHeight;
this.listHeight.push(height);
}
}
computed: {
currentIndex() {
for(let i=0;i< this.listHeight.length;i++) {
let height1 = this.listHeight[i];
let height2 = this.listHeight[i+1];
if(!height2 || (this.scrollY >= height1 && this.scrollY < height2)){
return i;
}
}
return 0;
}
},
<div class="menu-wrapper" v-el:menu-wrapper>
<ul>
<!-- :class="{'current':currentIndex === $index}" 就是根據(jù)currentIndex應(yīng)用左側(cè)列表被點(diǎn)中的樣式 -->
<li v-for="item in goods" class="menu-item"
:class="{'current':currentIndex === $index}"
@click="selectMenu($index,$event)">
<span class="text border-1px">
<span v-show="item.type > 0" class="icon"
:class="classMap[item.type]"></span>{{item.name}}
</span>
</li>
</ul>
</div>
//被點(diǎn)擊事件
//dom
<div class="menu-wrapper" v-el:menu-wrapper>
<ul>
<!-- @click="selectMenu($index,$event)" 就是點(diǎn)擊事件 -->
<li v-for="item in goods" class="menu-item"
:class="{'current':currentIndex === $index}"
@click="selectMenu($index,$event)">
<span class="text border-1px">
<span v-show="item.type > 0" class="icon"
:class="classMap[item.type]"></span>{{item.name}}
</span>
</li>
</ul>
</div>
//js
selectMenu(index,event) {
if(!event._constructed) {
return ;
}
let foodList = this.$els.foodWrapper.getElementsByClassName("food-list-hook");
let el = foodList[index];
this.foodsScroll.scrollToElement(el,300);
},
以上所述是小編給大家介紹的vue和better-scroll實(shí)現(xiàn)列表左右聯(lián)動(dòng)效果詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- 詳解 vue better-scroll滾動(dòng)插件排坑
- vue滾動(dòng)軸插件better-scroll使用詳解
- vue利用better-scroll實(shí)現(xiàn)輪播圖與頁(yè)面滾動(dòng)詳解
- vue滾動(dòng)插件better-scroll使用詳解
- vue使用 better-scroll的參數(shù)和方法詳解
- vue.js2.0 實(shí)現(xiàn)better-scroll的滾動(dòng)效果實(shí)例詳解
- vue中使用better-scroll實(shí)現(xiàn)滑動(dòng)效果及注意事項(xiàng)
- vue better-scroll插件使用詳解
- vue2.0 better-scroll 實(shí)現(xiàn)移動(dòng)端滑動(dòng)的示例代碼
- Vue中利用better-scroll組件實(shí)現(xiàn)橫向滾動(dòng)功能
相關(guān)文章
前端vue?a鏈接下載文件失敗的問(wèn)題(未發(fā)現(xiàn)文件)
這篇文章主要介紹了前端vue?a鏈接下載文件失敗的問(wèn)題(未發(fā)現(xiàn)文件),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09
springboot?vue接口測(cè)試前端模塊樹(shù)和接口列表
這篇文章主要為大家介紹了springboot?vue接口測(cè)試前端模塊樹(shù)和接口列表,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
vue 解決循環(huán)引用組件報(bào)錯(cuò)的問(wèn)題
今天小編就為大家分享一篇vue 解決循環(huán)引用組件報(bào)錯(cuò)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
vue element ui使用選擇器實(shí)現(xiàn)地區(qū)選擇兩種方法
這篇文章主要給大家介紹了關(guān)于vue element ui使用選擇器實(shí)現(xiàn)地區(qū)選擇的兩種方法,Element UI是一套基于Vue.js開(kāi)發(fā)的UI組件庫(kù),其中包含了地區(qū)選擇器(Cascader)組件,需要的朋友可以參考下2023-09-09
vue頁(yè)面加載時(shí)的進(jìn)度條功能(實(shí)例代碼)
這篇文章主要介紹了vue頁(yè)面加載時(shí)的進(jìn)度條功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01
electron-vite工具打包后如何通過(guò)內(nèi)置配置文件動(dòng)態(tài)修改接口地址
使用electron-vite?工具開(kāi)發(fā)項(xiàng)目打包完后每次要改接口地址都要重新打包,對(duì)于多環(huán)境切換或者頻繁變更接口地址就顯得麻煩,這篇文章主要介紹了electron-vite工具打包后通過(guò)內(nèi)置配置文件動(dòng)態(tài)修改接口地址實(shí)現(xiàn)方法,需要的朋友可以參考下2024-05-05
vue3使用ref獲取dom結(jié)果為'null'的原因詳析
這篇文章主要給大家介紹了關(guān)于vue3使用ref獲取dom結(jié)果為'null'的原因詳析,ref是Vue3中一個(gè)非常重要的功能,它可以用來(lái)獲取DOM節(jié)點(diǎn),從而實(shí)現(xiàn)對(duì)DOM節(jié)點(diǎn)的操作,需要的朋友可以參考下2023-07-07
vue文件批量上傳及進(jìn)度條展示的實(shí)現(xiàn)方法
開(kāi)發(fā)項(xiàng)目的時(shí)候,用到文件上傳的功能很常見(jiàn),包括單文件上傳和多文件上傳,下面這篇文章主要給大家介紹了關(guān)于vue文件批量上傳及進(jìn)度條展示的實(shí)現(xiàn)方法,需要的朋友可以參考下2022-12-12

