VUE2.0 實現移動端在固定區域內的滾動效果

1.開發工具:微信web開發者工具;前端

2.項目:嵌在APP中的一個活動,活動是H5頁面,使用VUE2.0框架。vue

3.需求,直接上截圖:android

item 上拉滾動到底部,遮罩層部分消失;item下拉,遮罩層部分顯示。ios

4.代碼:web

HTML:微信

遮罩層部分與滾動區域部分是平級框架

<template>
  <div id="selectGoods">
    <!--item列表區域-->
    <div class="goods-area" ref="box">
      <div class="goods-list" ref="item" v-for="(item,index) in items" >
        <img class="left-img" :src="item.goodsUrl" alt="">
        <div class="right-text">
          <span class="inviter-goods">{{item.resourceName}}</span> <br>
          <span class="invitee-rules"><span class="person-num">{{item.inviteResourceId}}</span>我是右側文本第二行</span>
        </div>
      </div>
    </div>
    <!--列表底部遮罩層-->
    <div class="bottom-mask" v-show="bottomMaskShow">
      <img class="mask-img" src="../../../static/inviteFriends/goodsListMask.png" alt="">
      <img class="bottom-triangle" src="../../../static/inviteFriends/xiasanjiao.png" alt="">
    </div>
  </div>
</template>

CSS(重點):函數

.goods-area{
  height:8.58rem;
  overflow-x: hidden;       /* 解決左右能夠滑動的問題 */
  overflow-y: auto;       /* 解決左右能夠滑動的問題 */
  overflow-scrolling: touch;   /*兼容性 ios5+、android4+ */
}

JS:工具

this.$refs.是VUE2.0新增的一個對象,不須要使用JS原生的獲取DOM節點的方法,直接在元素上綁定ref,如上,<div  ref = "box">,而後再JS中直接調用 this.$refs.box 就能夠直接獲取。另外,感興趣的小夥伴能夠看一下,console.log(this.$refs.item)的結果。開發工具

迴歸本文主題,vue2.0 中的 mounted 方法,是頁面加載後調用方法的地方。這還牽扯到另一個問題就是VUE的鉤子函數(後續工做中有了更深刻的體會結合本身的實際項目再寫一篇)。

頁面加載後,監聽滾動區域的 scroll 事件,調用 onScroll 方法,根據滾動的尺寸判斷是否已經滾動到底部,控制遮罩層的顯示和隱藏。

mounted () {
  this.$refs.box.addEventListener('scroll', this.onScroll);
},
onScroll () {    //onScroll方法放在methods:{}中
  let nScrollHeight = this.$refs.box.scrollHeight;  // 滾動距離總長   內部div的高度
  let nScrollTop = this.$refs.box.scrollTop;  // 滾動條(點)當前的位置在內部div的高度 裏佔多少
  let itemHeight = nScrollHeight / (this.items.length);  // 能夠理解爲每個item的高度
  let scrollLength = itemHeight * (this.items.length - 4);  // 默認顯示4個item
  this.bottomMaskShow = true;
  if (nScrollTop  > (scrollLength -49)) {  // 49  這個差值比較靈活,是根據項目中打印出來的item高度和scrollTop實際滾動(出去)的值對比得出的
    this.bottomMaskShow = false;
  } else
  if(nScrollTop <= (scrollLength -49)){   
    this.bottomMaskShow = true;
  }
}

其實這個功能沒有什麼難點,可是本身在這個問題上糾纏了好長時間,在移動端的效果老是不理想,緣由在於,在一開始本身就進入了一個誤區,認爲在微信的開發工具上打印出來的 scrollTop 跟手機上打印出來的是同樣的,結果是,徹底不同,手機根據尺寸的大小scrollTop的值也是不同的。

寫在最後:

1.對於移動端的適配問題,靈活,以不變應萬變;

2.遇到問題,想一想那些點都是「你覺得的」,可能就是這些「你覺得的」出了問題;

寫在最後的最後:

轉行前端小白的第一篇博客,茫茫‘博’海中的一粟,不求能幫助他人,只爲審查自身,記錄,成長。

相關文章
相關標籤/搜索