国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

vue和better-scroll實(shí)現(xiàn)列表左右聯(lián)動效果詳解

2019-11-19 11:40:50
字體:
供稿:網(wǎng)友

一.實(shí)現(xiàn)思路

  1. (1)實(shí)現(xiàn)上是左右分別一個better-scroll列表
  2. (2)利用計算右側(cè)列表每一個大區(qū)塊的高度來計算左側(cè)的位置

二.實(shí)現(xiàn)

1.實(shí)現(xiàn)左右兩個better-scroll

(1)dom結(jié)構(gòu)(better-scroll要求,會把最外層dom的第一個子元素作為要滾動的區(qū)域)

左邊滾動列表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>右邊滾動列表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>好評率{{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ù)請求完成后的$nextTick中初始化better-scroll,就能實(shí)現(xiàn)兩個列表分別能滾動,至于聯(lián)動,要后面自己做

_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)聽scroll事件    });    this.foodsScroll.on('scroll',(pos) => {     this.scrollY =Math.abs(Math.round(pos.y));    })   },

2.實(shí)現(xiàn)聯(lián)動效果

(1)具體的聯(lián)動實(shí)現(xiàn)思路

  1. 在渲染完成后($nextTick內(nèi)),初始化better-scroll,并在初始化函數(shù)內(nèi)添加右側(cè)列表的scroll監(jiān)聽事件,并記錄scrollY值到,存入vue的data中
  2. 在渲染完成后($nextTick內(nèi)),計算右側(cè)列表的每一個大區(qū)塊的高度,并累加,存入數(shù)組listHeight
  3. 因為scrollY值在滾動中總是不斷變化的,所以在computed中計算出currentIndex,當(dāng)前滾動區(qū)域是哪一個大區(qū)塊,也就是listHeight數(shù)組的下標(biāo)
  4. 在dom中根據(jù)currentIndex應(yīng)用左側(cè)列表被點(diǎn)中的樣式
  5. 在左側(cè)列表某一項被點(diǎn)中的時候,右側(cè)列表滑動到某一個大塊區(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)動效果詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對武林網(wǎng)網(wǎng)站的支持!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 宁河县| 武平县| 宜兴市| 房山区| 饶河县| 河曲县| 华容县| 和平县| 陇川县| 九寨沟县| 临泉县| 霸州市| 神农架林区| 江油市| 望奎县| 乌兰浩特市| 张家口市| 中方县| 于都县| 宁波市| 通州区| 修武县| 五指山市| 宜川县| 始兴县| 中西区| 内丘县| 博野县| 永吉县| 海口市| 广西| 嘉定区| 天水市| 万安县| 武汉市| 亳州市| 比如县| 嵊州市| 乐清市| 阳新县| 枣阳市|