最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue.js2.0 實現(xiàn)better-scroll的滾動效果實例詳解

 更新時間:2018年08月13日 11:55:36   作者:至情相遇  
better-scroll 是一個移動端滾動的解決方案,它是基于 iscroll 的重寫。better-scroll 也很強大,不僅可以做普通的滾動列表,還可以做輪播圖、picker 等等,下面通過本文給大家介紹vue.js2.0 實現(xiàn)better-scroll的滾動效果,感興趣的朋友一起看看吧

什么是 better-scroll

better-scroll 是一個移動端滾動的解決方案,它是基于 iscroll 的重寫,它和 iscroll 的主要區(qū)別在這里 。better-scroll 也很強大,不僅可以做普通的滾動列表,還可以做輪播圖、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結構加載結束(nextTick這個接口是計算dom相關的,要確保原生dom已經(jīng)渲染了)
  this.$nextTick(()=>{
   this._initScroll();
  });
  });
 },
 methods:{
  _initScroll(){
        // 使用better-scroll實現(xiàn)的關鍵代碼
  this.menuScroll=new BScroll(this.$refs.menuWrapper,{click:true});
  this.foodScroll=new BScroll(this.$refs.foodWrapper,{click:true});
  }
 }
  };
</script>

很簡單這樣頁面就可以滾動了,如下圖

但是,這樣左右兩個頁面并沒有聯(lián)動起來,需要我們再定義一個方法來計算滾動的高度,以及在計算屬性中計算左側當前索引在哪里

從而定義左側邊欄的位置

 computed:{
  //用來計算左側當前索引在哪,從而定位到左側邊欄的位置
  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實現(xiàn)的關鍵代碼
  this.menuScroll=new BScroll(this.$refs.menuWrapper,{click:true});
  this.foodScroll=new BScroll(this.$refs.foodWrapper,{
   click: true,
          //探針作用,實時監(jiān)測滾動位置
          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結構加載結束(nextTick這個接口是計算dom相關的,要確保原生dom已經(jīng)渲染了)
         this.$nextTick(()=>{
           this._initScroll();
           this._calculateHeight();
         });

在dom渲染后,也是需要計算高度的.

滑動右邊,實現(xiàn)左邊聯(lián)動已經(jīng)實現(xiàn)了,接下來就是,點擊左邊的菜單,右邊的食物相應滾動到具體的位置

給左邊菜單綁定一個事件:@click="selectMenu(index,$event)"

/左邊的菜單項的點擊事件
selectMenu(index,event){
//自己默認派發(fā)事件時(BScroll),_constructed默認為true.但原生的瀏覽器并沒有這個屬性
 if (!event._constructed) {
   return;
 }
 //運用BScroll滾動到相應位置
 //運用index去找到對應的右側位置
 let foodList=this.$refs.foodWrapper.getElementsByClassName('food-list-hook');
 //滾動到相應的位置
 let el=foodList[index];
 //設置滾動時間
 this.foodScroll.scrollToElement(el,2000);
}

至此,整個聯(lián)動實現(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">
   <h1 class="title">{{item.name}}</h1>
   <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">
     <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 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結構加載結束(nextTick這個接口是計算dom相關的,要確保原生dom已經(jīng)渲染了)
  this.$nextTick(()=>{
   this._initScroll();
   this._calculateHeight();
  });
  });
 },
 computed:{
  //用來計算左側當前索引在哪,從而定位到左側邊欄的位置
  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實現(xiàn)的關鍵代碼
  this.menuScroll=new BScroll(this.$refs.menuWrapper,{click:true});
  this.foodScroll=new BScroll(this.$refs.foodWrapper,{
   click: true,
          //探針作用,實時監(jiān)測滾動位置
          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);
  }
  },
  //左邊的菜單項的點擊事件
  selectMenu(index,event){
  //自己默認派發(fā)事件時(BScroll),_constructed默認為true.但原生的瀏覽器并沒有這個屬性
  if (!event._constructed) {
   return;
  }
  //運用BScroll滾動到相應位置
  //運用index去找到對應的右側位置
  let foodList=this.$refs.foodWrapper.getElementsByClassName('food-list-hook');
  //滾動到相應的位置
  let el=foodList[index];
  //設置滾動時間
  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.js2.0 實現(xiàn)better-scroll的滾動效果實例詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關文章

  • vue Router常用屬性詳解

    vue Router常用屬性詳解

    這篇文章主要介紹了vueRouter常用屬性,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2023-12-12
  • Vue拖拽組件開發(fā)實例詳解

    Vue拖拽組件開發(fā)實例詳解

    本文重點給大家介紹Vue拖拽組件開發(fā)實例,拖拽的原理是手指在移動的過程中,實時改變元素的位置即top和left值,使元素隨著手指的移動而移動。對實例代碼感興趣的朋友跟隨腳本之家小編一起學習吧
    2018-05-05
  • Vue 3 + Element Plus樹形表格全選多選及子節(jié)點勾選的問題解決方法

    Vue 3 + Element Plus樹形表格全選多選及子節(jié)點勾選的問題解決方

    在本文中,我們解決了Vue 3和Element Plus樹形表格中的全選、多選、子節(jié)點勾選和父節(jié)點勾選等常見問題,通過逐步實現(xiàn)這些功能,您可以構建功能強大且用戶友好的樹形表格組件,以滿足各種數(shù)據(jù)展示需求,對Vue 3 Element Plus樹形表格相關知識感興趣的朋友一起看看吧
    2023-12-12
  • nuxt 實現(xiàn)在其它js文件中使用store的方式

    nuxt 實現(xiàn)在其它js文件中使用store的方式

    這篇文章主要介紹了nuxt 實現(xiàn)在其它js文件中使用store的方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • Vue單頁式應用(Hash模式下)實現(xiàn)微信分享的實例

    Vue單頁式應用(Hash模式下)實現(xiàn)微信分享的實例

    本篇文章介紹了Vue單頁式應用(Hash模式下)實現(xiàn)微信分享的實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • 同步cookie插件原理及實現(xiàn)示例

    同步cookie插件原理及實現(xiàn)示例

    這篇文章主要為大家介紹了同步cookie插件原理及實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • avue實現(xiàn)自定義搜索欄及清空搜索事件的實踐

    avue實現(xiàn)自定義搜索欄及清空搜索事件的實踐

    本文主要介紹了avue實現(xiàn)自定義搜索欄及清空搜索事件的實踐,主要包括對搜索欄進行自定義,并通過按鈕實現(xiàn)折疊搜索欄效果,具有一定的參考價值,感興趣的可以了解一下
    2021-12-12
  • vue如何判斷dom的class

    vue如何判斷dom的class

    這篇文章主要介紹了vue如何判斷dom的class,vue點擊給dom添加class然后獲取含有class的dom文件,具體內容詳情大家參考下本文
    2018-04-04
  • vue實現(xiàn)日歷表格(element-ui)

    vue實現(xiàn)日歷表格(element-ui)

    這篇文章主要為大家詳細介紹了vue實現(xiàn)日歷表格(element-ui),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • vue3?使用provide?inject父子組件傳值失敗且子組件不響應

    vue3?使用provide?inject父子組件傳值失敗且子組件不響應

    這篇文章主要介紹了vue3使用provide?inject父子組件傳值傳不過去且傳遞后子組件不具備響應性問題解決方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08

最新評論

娄烦县| 白银市| 尖扎县| 白银市| 伊宁县| 乡宁县| 临海市| 绿春县| 土默特左旗| 梁河县| 嘉义县| 曲靖市| 赣州市| 宁蒗| 邵武市| 当涂县| 曲麻莱县| 项城市| 理塘县| 新巴尔虎左旗| 博客| 昭通市| 湘潭市| 凤翔县| 舞钢市| 靖远县| 景谷| 铁岭县| 抚远县| 定日县| 鄂托克旗| 合阳县| 白河县| 山阴县| 雅江县| 盐边县| 扬州市| 赤峰市| 黄骅市| 吴旗县| 武汉市|