這篇文章主要介紹vue.js2.0如何實(shí)現(xiàn)better-scroll的滾動(dòng)效果,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
在梅列等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎ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)站制作,營(yíng)銷型網(wǎng)站建設(shè),外貿(mào)營(yíng)銷網(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>
很簡(jiǎn)單這樣頁(yè)面就可以滾動(dòng)了,如下圖
但是,這樣左右兩個(gè)頁(yè)面并沒有聯(lián)動(dòng)起來,需要我們?cè)俣x一個(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)測(cè)滾動(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去找到對(duì)應(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>好評(píng)率{{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)測(cè)滾動(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去找到對(duì)應(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)用,其核心庫(kù)只關(guān)注視圖層,方便與第三方庫(kù)和項(xiàng)目整合,且使用Vue可以采用單文件組件和Vue生態(tài)系統(tǒng)支持的庫(kù)開發(fā)復(fù)雜的單頁(yè)應(yīng)用。
以上是“vue.js2.0如何實(shí)現(xiàn)better-scroll的滾動(dòng)效果”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
當(dāng)前題目:vue.js2.0如何實(shí)現(xiàn)better-scroll的滾動(dòng)效果
轉(zhuǎn)載注明:http://aaarwkj.com/article26/isgecg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、微信公眾號(hào)、、手機(jī)網(wǎng)站建設(shè)、做網(wǎng)站、定制開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)