這篇文章主要介紹vue.js2.0如何實(shí)現(xiàn)better-scroll的滾動(dòng)效果,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
在梅列等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站 網(wǎng)站設(shè)計(jì)制作按需定制網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站制作,營銷型網(wǎng)站建設(shè),外貿(mào)營銷網(wǎng)站建設(shè),梅列網(wǎng)站建設(shè)費(fèi)用合理。
什么是 better-scroll
better-scroll 是一個(gè)移動(dòng)端滾動(dòng)的解決方案,它是基于 iscroll 的重寫,它和 iscroll 的主要區(qū)別在這里 。better-scroll 也很強(qiáng)大,不僅可以做普通的滾動(dòng)列表,還可以做輪播圖、picker 等等。
<template> <div> <div class="goods"> <div class="menu-wrapper" ref="menuWrapper"> </div> <div class="food-wrapper" ref="foodWrapper"> </div> </div> </div> </template>
與1.0版本不同的是,我們使用的是ref
<script type="text/ecmascript-6">
import BScroll from "better-scroll";
export default {
data(){
return {
currentIndex:1,
goods:[]
}
},
created(){
this.classMap=['decrease','discount','special','invoice','guarantee'];
this.$http.get('/api/goods').then((response)=>{
response=response.body;
if (response.errno===ERR_OK) {
this.goods=response.data;
}
//dom結(jié)構(gòu)加載結(jié)束(nextTick這個(gè)接口是計(jì)算dom相關(guān)的,要確保原生dom已經(jīng)渲染了)
this.$nextTick(()=>{
this._initScroll();
});
});
},
methods:{
_initScroll(){
// 使用better-scroll實(shí)現(xiàn)的關(guān)鍵代碼
this.menuScroll=new BScroll(this.$refs.menuWrapper,{click:true});
this.foodScroll=new BScroll(this.$refs.foodWrapper,{click:true});
}
}
};
</script>很簡單這樣頁面就可以滾動(dòng)了,如下圖

但是,這樣左右兩個(gè)頁面并沒有聯(lián)動(dòng)起來,需要我們再定義一個(gè)方法來計(jì)算滾動(dòng)的高度,以及在計(jì)算屬性中計(jì)算左側(cè)當(dāng)前索引在哪里
從而定義左側(cè)邊欄的位置
computed:{
//用來計(jì)算左側(cè)當(dāng)前索引在哪,從而定位到左側(cè)邊欄的位置
currentIndex(){
for (let i = 0; i < this.listHeight.length; i++) {
var height1=this.listHeight[i] ;
var height2=this.listHeight[i+1];
if(!height2||(this.scrollY >= height1 && this.scrollY < height2)){
return i;
}
}
return 0;
}
},
methods:{
_initScroll(){
// 使用better-scroll實(shí)現(xiàn)的關(guān)鍵代碼
this.menuScroll=new BScroll(this.$refs.menuWrapper,{click:true});
this.foodScroll=new BScroll(this.$refs.foodWrapper,{
click: true,
//探針作用,實(shí)時(shí)監(jiān)測滾動(dòng)位置
probeType: 3
});
this.foodScroll.on('scroll',(pos)=>{
this.scrollY=Math.abs(Math.round(pos.y))
});
},
_calculateHeight(){
let foodList=this.$refs.foodWrapper.getElementsByClassName('food-list-hook');
let height=0;
this.listHeight.push(height);
for (var i = 0; i < foodList.length; i++) {
let item=foodList[i];
height+=item.clientHeight;
this.listHeight.push(height);
}
}
}
//dom結(jié)構(gòu)加載結(jié)束(nextTick這個(gè)接口是計(jì)算dom相關(guān)的,要確保原生dom已經(jīng)渲染了)
this.$nextTick(()=>{
this._initScroll();
this._calculateHeight();
});在dom渲染后,也是需要計(jì)算高度的.
滑動(dòng)右邊,實(shí)現(xiàn)左邊聯(lián)動(dòng)已經(jīng)實(shí)現(xiàn)了,接下來就是,點(diǎn)擊左邊的菜單,右邊的食物相應(yīng)滾動(dòng)到具體的位置
給左邊菜單綁定一個(gè)事件:@click="selectMenu(index,$event)"
/左邊的菜單項(xiàng)的點(diǎn)擊事件
selectMenu(index,event){
//自己默認(rèn)派發(fā)事件時(shí)(BScroll),_constructed默認(rèn)為true.但原生的瀏覽器并沒有這個(gè)屬性
if (!event._constructed) {
return;
}
//運(yùn)用BScroll滾動(dòng)到相應(yīng)位置
//運(yùn)用index去找到對應(yīng)的右側(cè)位置
let foodList=this.$refs.foodWrapper.getElementsByClassName('food-list-hook');
//滾動(dòng)到相應(yīng)的位置
let el=foodList[index];
//設(shè)置滾動(dòng)時(shí)間
this.foodScroll.scrollToElement(el,2000);
}至此,整個(gè)聯(lián)動(dòng)實(shí)現(xiàn)的,完整代碼如下
<template>
<div>
<div class="goods">
<div class="menu-wrapper" ref="menuWrapper">
<ul>
<li v-for="(item,index) 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>
<div class="food-wrapper" ref="foodWrapper">
<ul>
<li v-for="(item,index) in goods" class="food-list food-list-hook">
<h2 class="title">{{item.name}}</h2>
<ul>
<li v-for="food in item.foods" class="food-item border-1px">
<div class="icon">
<img :src="food.icon" width="57" height="57" alt="">
</div>
<div class="content">
<h3 class="name">{{food.name}}</h3>
<p class="desc">{{food.description}}</p>
<div class="extra">
<span class="count">月售{{food.sellCount}}份</span>
<span>好評率{{food.rating}}%</span>
</div>
<div class="price">
<span class="now">¥{{food.price}}</span><span class="old" v-show="food.oldPrice">¥{{food.oldPrice}}</span>
</div>
</div>
</li>
</ul>
</li>
</ul>
</div>
</div>
</div>
</template>
<script type="text/ecmascript-6">
import BScroll from "better-scroll";
const ERR_OK=0;
export default {
props:{
seller:{
type:Object
}
},
data(){
return {
goods:[],
listHeight:[],
scrollY:0
}
},
created(){
this.classMap=['decrease','discount','special','invoice','guarantee'];
this.$http.get('/api/goods').then((response)=>{
response=response.body;
if (response.errno===ERR_OK) {
this.goods=response.data;
}
//dom結(jié)構(gòu)加載結(jié)束(nextTick這個(gè)接口是計(jì)算dom相關(guān)的,要確保原生dom已經(jīng)渲染了)
this.$nextTick(()=>{
this._initScroll();
this._calculateHeight();
});
});
},
computed:{
//用來計(jì)算左側(cè)當(dāng)前索引在哪,從而定位到左側(cè)邊欄的位置
currentIndex(){
for (let i = 0; i < this.listHeight.length; i++) {
var height1=this.listHeight[i] ;
var height2=this.listHeight[i+1];
if(!height2||(this.scrollY >= height1 && this.scrollY < height2)){
return i;
}
}
return 0;
}
},
methods:{
_initScroll(){
// 使用better-scroll實(shí)現(xiàn)的關(guān)鍵代碼
this.menuScroll=new BScroll(this.$refs.menuWrapper,{click:true});
this.foodScroll=new BScroll(this.$refs.foodWrapper,{
click: true,
//探針作用,實(shí)時(shí)監(jiān)測滾動(dòng)位置
probeType: 3
});
this.foodScroll.on('scroll',(pos)=>{
this.scrollY=Math.abs(Math.round(pos.y))
});
},
_calculateHeight(){
let foodList=this.$refs.foodWrapper.getElementsByClassName('food-list-hook');
let height=0;
this.listHeight.push(height);
for (var i = 0; i < foodList.length; i++) {
let item=foodList[i];
height+=item.clientHeight;
this.listHeight.push(height);
}
},
//左邊的菜單項(xiàng)的點(diǎn)擊事件
selectMenu(index,event){
//自己默認(rèn)派發(fā)事件時(shí)(BScroll),_constructed默認(rèn)為true.但原生的瀏覽器并沒有這個(gè)屬性
if (!event._constructed) {
return;
}
//運(yùn)用BScroll滾動(dòng)到相應(yīng)位置
//運(yùn)用index去找到對應(yīng)的右側(cè)位置
let foodList=this.$refs.foodWrapper.getElementsByClassName('food-list-hook');
//滾動(dòng)到相應(yīng)的位置
let el=foodList[index];
//設(shè)置滾動(dòng)時(shí)間
this.foodScroll.scrollToElement(el,2000);
}
}
};
</script>
<style lang="stylus" rel="stylesheet/stylus">
@import "../../common/stylus/mixin.styl";
.goods
display:flex
position:absolute
top:174px
bottom:46px
width:100%
overflow:hidden
.menu-wrapper
flex:0 0 80px
width: 80px
background:#f3f5f7
.menu-item
display:table
height:54px
width:56px
padding:0 12px
line-height:14px
&.current
position:relative
z-index:10
margin-top:-1px
background:#fff
font-weight:700
.text
border-none()
.icon
display:inline-block
vertical-align:top
margin-right:2px
width:12px
height:12px
background-size:12px 12px
background-repeat:no-repeat
&.decrease
bg-image('decrease_3')
&.discount
bg-image('discount_3')
&.guarantee
bg-image('guarantee_3')
&.invoice
bg-image('invoice_3')
&.special
bg-image('special_3')
.text
display:table-cell
vertical-align:middle
width:56px
border-1px(rgba(7,17,27,0.1))
font-size:12px
.food-wrapper
flex:1
.title
padding-left:14px
font-size:12px
color:rgb(147,153,159)
height:26px
border-left:2px solid #d9dde1
line-height:26px
background:#f3f5f7
.food-item
display:flex
margin:18px
padding-bottom:18px
border-1px(rgba(7,17,27,0.1))
&:last-child
border-none()
margin-bottom:0
.icon
flex:0 0 57px
margin-right:10px
.content
flex:1
.name
margin:2px 0 8px 0
height:14px
line-height:14px
font-size:14px
color:rgb(7,17,27)
.desc,.extra
line-height:10px
font-size:10px
color:rgb(147,153,159)
.desc
margin-bottom:8px
line-height:12px
.extra
.count
margin-right:12px
.price
font-weight:700
line-height:24px
.now
margin-right:8px
font-size:14px
color:rgb(240,20,20)
.old
text-decoration:line-through
font-size:10px
color:rgb(147,153,159)
</style>Vue是一套用于構(gòu)建用戶界面的漸進(jìn)式JavaScript框架,Vue與其它大型框架的區(qū)別是,使用Vue可以自底向上逐層應(yīng)用,其核心庫只關(guān)注視圖層,方便與第三方庫和項(xiàng)目整合,且使用Vue可以采用單文件組件和Vue生態(tài)系統(tǒng)支持的庫開發(fā)復(fù)雜的單頁應(yīng)用。
以上是“vue.js2.0如何實(shí)現(xiàn)better-scroll的滾動(dòng)效果”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
當(dāng)前題目:vue.js2.0如何實(shí)現(xiàn)better-scroll的滾動(dòng)效果
轉(zhuǎn)載注明:http://chinadenli.net/article26/isgecg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、微信公眾號、、手機(jī)網(wǎng)站建設(shè)、做網(wǎng)站、定制開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)