亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > WEB開發 > 正文

better-scroll插件初使用

2024-04-27 15:03:52
字體:
來源:轉載
供稿:網友

模仿了一個餓了嗎頁面先上圖,看一看better-scroll的效果

better-scroll
如果用overflow:auto或scroll屬性,這樣的頁面就會出現兩個滾動條,用戶體驗會有折扣,所以給介紹一款插件better-scroll,附上github資源鏈接。這款插件是基于iscroll插件做的重新封裝,改善了一些bug,增加了一些拓展功能(插件作者并不是本人,望周知),有興趣的小伙伴們可以自行下載體驗體驗。那么今天就用bs插件配合vue框架對這個頁面重構一下,主要實現以下幾點功能。
- 1、左右側頁面滑動,并且不顯示滾動條。 - 2、根據左側的商品類別對應到右側相應的選擇區間,并且高亮標題。 - 3、根據右側用戶滑動的區間,能夠對應到左側的商品類別,并且高亮選擇標題。 ps:除了用到bs插件的一些基礎功能以外,還有一些vue的基礎知識。

前期準備

我引入了reset.CSS對頁面的樣式做一個算是初始化吧,然后引入js腳本有vue.js,vue-resource.js,bscroll.js,可以進入vue官網下載。

頁面布局

頁面布局和樣式就不浪費時間了,直接上代碼了

樣式代碼
[v-cloak] { display: none; } .goods { position: absolute; width: 100%; top: 174px; bottom: 46px; display: flex; overflow: hidden; } .goods .menu-wrapper { flex: 0 0 80px; width: 80px; background: #f3f5f7; } .goods .menu-wrapper .current { position: relative; z-index: 10; margin-top: -1px; background: #FFFFFF; font-weight: 700; font-size: 14px; } .goods .menu-wrapper .menu-item { display: table; height: 54px; width: 80px; line-height: 14px; padding: 0 12px; border-bottom: 1px solid rgba(7, 17, 27, .1); box-sizing: border-box; } .goods .menu-wrapper .menu-item .icon { display: inline-block; width: 12px; height: 12px; margin-right: 2px; -webkit-background-size: 12px 12px; background-size: 12px 12px; background-repeat: no-repeat; vertical-align: top; } .goods .menu-wrapper .menu-item .text { display: table-cell; width: 56px; vertical-align: middle; font-size: 12px; text-align: center; } .goods .menu-wrapper .menu-item .decrease { background-image: url(img/decrease_2@2x.png); } .goods .menu-wrapper .menu-item .discount { background-image: url(img/decrease_2@2x.png); } .goods .menu-wrapper .menu-item .guarantee { background-image: url(img/decrease_2@2x.png); } .goods .menu-wrapper .menu-item .invoice { background-image: url(img/decrease_2@2x.png); } .goods .menu-wrapper .menu-item .special { background-image: url(img/decrease_2@2x.png); } .goods .foods-wrapper { flex: 1; } .goods .foods-wrapper .title { padding-left: 14px; height: 26px; line-height: 26px; border-left: 2px solid #d9dde1; font-size: 12px; color: rgb(147, 153, 159); background: #F3F5F7; } .goods .foods-wrapper .current { color: #42B983; font-size: 14px; transition: all .5s; line-height: 27px; } .goods .foods-wrapper .food-item { display: flex; margin: 18px 0 18px 0; border-bottom: 1px solid rgba(7, 17, 27, .1); padding-bottom: 18px; } .goods .foods-wrapper .food-item:last-child { border-bottom: 0px solid rgba(7, 17, 27, .1); margin-bottom: 0; } .goods .foods-wrapper .food-item .icon { flex: 0 0 57px; margin-right: 10px; margin-left: 10px; } .goods .foods-wrapper .food-item .content { position: relative; flex: 1; } .goods .foods-wrapper .food-item .content .name { margin: 2px 0 8px 0; height: 14px; line-height: 14px; font-size: 14px; color: rgb(7, 17, 27); } .goods .foods-wrapper .food-item .content .desc { margin-bottom: 8px; line-height: 10px; font-size: 10px; color: rgb(147, 153, 159); } .goods .foods-wrapper .food-item .content .extra { font-size: 10px; color: rgb(147, 153, 159); line-height: 10px; } .goods .foods-wrapper .food-item .content .extra .count { margin-right: 12px; } .goods .foods-wrapper .food-item .content .PRice { font-weight: 700; line-height: 24px; } .goods .foods-wrapper .food-item .content .price .now { margin-right: 8px; font-size: 14px; color: rgb(240, 20, 20); } .goods .foods-wrapper .food-item .content .price .old { text-decoration: line-through; font-size: 10px; color: rgb(147, 153, 159); } .goods .foods-wrapper .food-item .content .cartcontrol-wrapper { position: absolute; right: 6px; bottom: 12px; }
頁面布局代碼
<div class="goods" v-cloak> <div class="menu-wrapper" ref="menuwrapper"> <ul> <!--當currentIndex與index相等的時候,設置高亮--> <li v-for="(item,index) in goods" class="menu-item" :class="{'current':currentIndex === index}" @click="selectMenu(index,$event)" v-cloak> <span class="text"> <span v-show="item.type>0" class="icon" :class="classMap[item.type]" v-cloak></span> {{item.name}} </span> </li> </ul> </div> <div class="foods-wrapper" ref="foodwrapper"> <ul> <!--food-list-hook用于dom操作,獲取整體容器的高度--> <li v-for="(item,index) in goods" class="food-list food-list-hook" v-cloak> <h2 class="title" :class="{'current':currentIndex === index}">{{item.name}}</h2> <ul> <li @click="selectfood(food,$event)" v-for="food in item.foods" class="food-item"> <div class="icon"> <img :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>好評率{{food.rating}}%</span> </div> <div class="price"> <span class="now">¥{{food.price}}</span> <span v-show="food.oldPrice" class="old">¥{{food.oldPrice}}</span> </div> </div> </li> </ul> </li> </ul> </div> </div>

js代碼

首先在data內定義幾個變量 goods:[], listHeight:[], scrollY:0,在created中請求準備好的json數據 this.$http.get('./data.json').then((res) => { if(res.status === ERR_OK) { res = res.body.goods; this.goods = res; } })首先我們已經引入了bs插件,我們先讓左右兩側的被隱藏的部分滾動起來,在methods方法里面定義一個_initScroll的函數,主要用來對左右兩側dom結構進行初始化。用better-scroll的方法初始化需要滾動的dom結構,vue為我們提供了一個方法可以便利的獲取到dom結構,我們在需要獲取dom結構的父容器內添加ref="foodwrapper" ,然后在函數內用this.$refs.menuwrapper獲取到dom。 然后在Ajax內執行_initScroll() 函數,這個時候需要注意兩點,第一使用bs插件的時候子容器的高度一定要大于父容器的高度,才會產生滾動效果。第二,我們要等dom結構完全加載結束在調用_initScroll()方法才會生效,vue的作者也為我們提供了方法,來判斷dom結構是否完全加載this.$nextTick(() => {}),click: true屬性用來設置可以進行點擊事件。 _initScroll() { this.meunScroll = new BScroll(this.$refs.menuwrapper, { click: true }); this.foodScroll = new BScroll(this.$refs.foodwrapper, { click: true }); }這時候created應改為 created() { this.classMap = ['decrease', 'discount', 'guarantee', 'invoice', 'special']; this.$http.get('./data.json').then((res) => { if(res.status === ERR_OK) { res = res.body.goods; this.goods = res; //dom結構加載結束 this.$nextTick(() => { this._initScroll(); }) } }); }, 下面實現左右聯動并且實現文本的高亮,左右聯動的基本原理其實我們計算出右側實時變化的y值,落到哪一個區間,我們就顯示那一個區間。首先我們要計算整體區間的一個高度,然后分別計算第一個區間的高度,第二個區間的高度,以此類推。然后將區間數存入一個定義好的數組。當我們在滾動的時候實時拿到y軸的高度,然后對比在哪一個區間,這樣我們就會得到一個區間的索引值去對應左側的菜品類別,最后我們用一個vue的class去綁定高亮文本。 定義一個方法在_initScroll下面,作為計算高度的方法叫做_calculateHeight () ,在定義一個listHeight:[]數組,存放獲取的高度。我們在定義一個food-list-hook類,用來被js選擇。不要忘記在created內調用函數。_calculateHeight () { let foodList = this.$refs.foodwrapper.getElementsByClassName('food-list-hook'); let height = 0; //把第一個高度送入數組 this.listHeight.push(height); //通過循環foodList下的dom結構,將每一個li的高度依次送入數組 for(let i=0; i<foodList.length; i++){ let item = foodList[i] height += item.clientHeight this.listHeight.push(height); } },我們獲取到區間高度數組后,我們要實時獲取到右側的y值,和左側的索引值做一個對比,定義一個scrollY變量用來存放實時獲取的y值。bs插件為我們提供了一個實時獲取y值的方法,我們在初始化this.foodScroll的時候加一個·屬性probeType: 3,其作用就是實時獲取y值,相當于探針的作用。 我們在添加一個方法this.foodScroll.on('scroll',(pos) => {}),作用是實時滾動的時候把獲取到的位置給暴露出來。代碼如下。 methods: { _initScroll() { this.meunScroll = new BScroll(this.$refs.menuwrapper, { click: true }); this.foodScroll = new BScroll(this.$refs.foodwrapper, { click: true, //探針作用,實時監測滾動位置 probeType: 3 }); //設置監聽滾動位置 this.foodScroll.on('scroll', (pos) => { //scrollY接收變量 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); //通過循環foodList下的dom結構,將每一個li的高度依次送入數組 for(let i = 0; i < foodList.length; i++) { let item = foodList[i] height += item.clientHeight this.listHeight.push(height); } }, }定義一個計算屬性computed,用來計算左側對應的i值,從而定位到左側邊欄的位置 computed:{ currentIndex () { for(let i=0; i<this.listHeight.length; i++){ //判斷當currentIndex在height1和height2之間的時候顯示 let height1 = this.listHeight[i]; let height2 = this.listHeight[i+1]; //最后一個區間沒有height2 if(!height2 || (this.scrollY >= height1 && this.scrollY < height2)){ return i; } } return 0; },獲取到i后,在menu-item綁定一個class:class="{'current':currentIndex === index}",當currentIndex和menu-item對應的index相等時,設置current的樣式。這樣就可以左右聯動了。 最后實現左側點擊的功能。在左側的li下綁定一個selectMenu的點擊事件,并傳入索引值,這樣我們就可以知道點擊的是哪一個li selectMenu (index,event) {// 自己默認派發事件時候(BScroll),_constructed被置為true,但是瀏覽器原生并沒有這個屬性 if (!event._constructed){ return; } //運用BScroll接口,滾動到相應位置 let foodList = this.$refs.foodwrapper.getElementsByClassName('food-list-hook'); //獲取對應元素的列表 let el = foodList[index]; //設置滾動時間 this.foodScroll.scrollToElement(el, 300); },至此,我們就用bs插件完成了這個左右頁面聯動的效果,代碼會上傳到github,有興趣的可以下載下來看一看,大神務噴!完整的js代碼 <script type="text/javascript"> var ERR_OK = 200; new Vue({ el: '.goods', data() { return { msg: 'goods', goods: [], listHeight: [], scrollY: 0, } }, created() { this.classMap = ['decrease', 'discount', 'guarantee', 'invoice', 'special']; this.$http.get('./data.json').then((res) => { if(res.status === ERR_OK) { res = res.body.goods; this.goods = res; //dom結構加載結束 this.$nextTick(() => { this._initScroll(); //計算高度 this._calculateHeight(); }) } }); }, computed: { currentIndex() { for(let i = 0; i < this.listHeight.length; i++) { //判斷當currentIndex在height1和height2之間的時候顯示 let height1 = this.listHeight[i]; let height2 = this.listHeight[i + 1]; // console.log('height1:'+height1+','+'height2:'+height2) //最后一個區間沒有height2 if(!height2 || (this.scrollY >= height1 && this.scrollY < height2)) { return i; } } return 0; } }, methods: { selectMenu(index, event) { // 自己默認派發事件時候(BScroll),_constructed被置為true,但是瀏覽器原生并沒有這個屬性 if(!event._constructed) { return; } //運用BScroll接口,滾動到相應位置 let foodList = this.$refs.foodwrapper.getElementsByClassName('food-list-hook'); //獲取對應元素的列表 let el = foodList[index]; this.foodScroll.scrollToElement(el, 300); }, _initScroll() { this.meunScroll = new BScroll(this.$refs.menuwrapper, { click: true }); this.foodScroll = new BScroll(this.$refs.foodwrapper, { click: true, //探針作用,實時監測滾動位置 probeType: 3 }); //設置監聽滾動位置 this.foodScroll.on('scroll', (pos) => { //scrollY接收變量 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); //通過循環foodList下的dom結構,將每一個li的高度依次送入數組 for(let i = 0; i < foodList.length; i++) { let item = foodList[i] height += item.clientHeight this.listHeight.push(height); } }, } }) </script>
完整項目效果演示

better-scroll


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久不射电影网| 中日韩美女免费视频网址在线观看| 国产精品黄页免费高清在线观看| 亚洲天堂2020| 久久久精品视频成人| 亚洲人成在线观看| 久久久亚洲福利精品午夜| 久久精品国产一区二区电影| 97免费在线视频| 欧美电影免费看| 日本精品视频在线| 亚洲高清免费观看高清完整版| 国模视频一区二区| 91精品久久久久久久久久另类| 欧美性猛交xxxxx免费看| 欧美贵妇videos办公室| 欧美性在线视频| 成人精品视频在线| 久久最新资源网| 97在线视频国产| 国产精品xxxxx| 亚洲精品综合精品自拍| 66m—66摸成人免费视频| 日韩中文在线观看| 久久久久久久久久久av| 在线精品高清中文字幕| 国产精品久久97| 高清欧美电影在线| 91精品在线观看视频| 裸体女人亚洲精品一区| 视频直播国产精品| 亚洲电影成人av99爱色| 欧美黄色性视频| 91美女片黄在线观看游戏| 97在线观看免费高清| 久久久亚洲欧洲日产国码aⅴ| www.日本久久久久com.| 国产日韩欧美夫妻视频在线观看| 久久久国产一区二区三区| 欧美成人午夜剧场免费观看| 欧美大片欧美激情性色a∨久久| 亚洲一区亚洲二区亚洲三区| 亚洲电影免费观看| 91精品久久久久久久| 亚洲自拍欧美另类| 久久久久久亚洲精品不卡| 亚洲国产欧美一区二区三区同亚洲| 亚洲男子天堂网| 欧美成人精品激情在线观看| 欧美xxxx做受欧美| 精品国产一区二区三区久久久| 日韩欧美亚洲范冰冰与中字| 久久人体大胆视频| 欧美日韩国产页| 日本成人黄色片| 精品久久久久久电影| 日韩成人av在线| 国产精品爽黄69天堂a| 成人免费激情视频| 精品女同一区二区三区在线播放| 亚洲久久久久久久久久| 国产精品第8页| 欧美激情第6页| 精品久久久精品| 亚洲第一福利网站| 日韩中文字幕网址| 91九色视频在线| 久久人91精品久久久久久不卡| 国产成人精品视频在线观看| 欧美成人午夜激情| 亚洲高清av在线| 日韩精品在线观看网站| 亚洲国产欧美日韩精品| 日韩电影免费观看在线观看| 插插插亚洲综合网| 色无极亚洲影院| 中文亚洲视频在线| 精品无人国产偷自产在线| 国产精品美女免费看| 国产精品久久久久久久久久久不卡| 国产精品久久久久不卡| 国产一区二区三区18| 欧美精品福利在线| 久久久天堂国产精品女人| 91夜夜揉人人捏人人添红杏| 久久精品亚洲94久久精品| 亚洲成人激情图| 亚洲直播在线一区| 久久影院在线观看| 国内成人精品视频| 日韩在线激情视频| 亚洲欧美日韩天堂一区二区| 国产精品激情自拍| 国产成人鲁鲁免费视频a| 91极品视频在线| 亚洲国产女人aaa毛片在线| 亚洲综合小说区| 国产亚洲人成a一在线v站| 91精品国产综合久久香蕉最新版| 国产网站欧美日韩免费精品在线观看| 26uuu亚洲国产精品| 亚洲欧美国产高清va在线播| 亚洲欧美在线看| 欧美精品在线免费观看| 国产精品老女人视频| 最新91在线视频| 中文字幕亚洲自拍| 欧美综合国产精品久久丁香| 亚洲欧美另类在线观看| 欧美性生交xxxxxdddd| 欧美日韩国产专区| 国产专区精品视频| 国产手机视频精品| 1769国产精品| 久久精品成人欧美大片古装| 亚洲精品黄网在线观看| 欧美人在线视频| 国产精品都在这里| 国产精品久久久久久亚洲调教| 欧美国产极速在线| 欧美亚洲成人xxx| 日韩精品中文字幕有码专区| 久久色精品视频| 国产偷国产偷亚洲清高网站| 欧美猛少妇色xxxxx| 久国内精品在线| 亚洲综合色激情五月| 国产精品成人aaaaa网站| 中文字幕日韩欧美精品在线观看| 久久激情视频免费观看| 欧美性理论片在线观看片免费| 久久亚洲精品小早川怜子66| 亚洲香蕉av在线一区二区三区| 91九色综合久久| 欧美国产精品人人做人人爱| 亚洲va男人天堂| 亚洲国产精品人久久电影| 欧美日韩免费区域视频在线观看| 深夜福利一区二区| 久久99精品久久久久久噜噜| 国产精品视频精品| 最新国产精品拍自在线播放| 国产精品亚洲一区二区三区| 日韩毛片中文字幕| 亚洲人成网在线播放| 亚洲另类图片色| 久久精品视频在线观看| 国产精品电影网站| 欧美日韩视频免费播放| 亚洲国产成人精品久久久国产成人一区| 国产免费一区视频观看免费| 影音先锋欧美在线资源| 国产成人精品久久亚洲高清不卡| 日韩免费在线看| 色综合视频网站| 亚洲美女在线视频| 久久久久久久国产| 日本精品久久中文字幕佐佐木| 欧美大片在线看| 日韩在线观看电影| 久久久久久一区二区三区| yw.139尤物在线精品视频| 欧美性感美女h网站在线观看免费| 亚洲精品中文字幕av|