久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Vue開發(fā)吸頂

 看見就非常 2020-05-27

因?yàn)轫?xiàng)目需求,,最近開始轉(zhuǎn)到微信公眾號(hào)開發(fā),,接觸到了Vue框架,,這個(gè)效果的實(shí)現(xiàn)雖說是基于Vue框架下實(shí)現(xiàn)的,,但是同樣也可以借鑒到其他地方,原理都是一樣的,。

進(jìn)入正題,,先看下效果圖:
吸頂效果

其實(shí)js做這個(gè)效果還是挺簡單的,因?yàn)樵赾ss中我們可以設(shè)置一個(gè)元素的position: fixed;,,這樣它就可以固定在那里,,這樣不管頁面怎么滾動(dòng),它的位置都不受影響,,所以我們的思路就是在合適的時(shí)機(jī)把要吸頂?shù)念^部元素的position屬性設(shè)置為fixed就可以了,。但是這個(gè)合適的時(shí)機(jī)是什么時(shí)候呢,這就需要我們計(jì)算了,,我們需要監(jiān)聽頁面的滾動(dòng)狀態(tài),,當(dāng)頁面滾動(dòng)到要吸頂元素所處的位置的時(shí)候就是我們設(shè)置它固定的時(shí)候,所以就需要我們:

1.監(jiān)聽頁面的滾動(dòng)狀態(tài):

在mounted回調(diào)中加入以下代碼:

mounted() {
  // handleScroll為頁面滾動(dòng)的監(jiān)聽回調(diào)
  window.addEventListener('scroll', this.handleScroll);
 },

同時(shí)在destroyed回調(diào)中移除監(jiān)聽:

destroyed(){
  window.removeEventListener('scroll', this.handleScroll);
},

2.計(jì)算吸頂元素到頁面頂部的距離:

計(jì)算出來這個(gè)距離之后就可以確定固定吸頂元素的時(shí)機(jī)了,,如果你的吸頂元素上面的元素的高度是固定的話,,那就簡單了,直接在handleScroll方法中進(jìn)行判斷就可以了,,可以直接跳到第三步了,,如果是動(dòng)態(tài)的,那就需要我們在接口請求完數(shù)據(jù),,dom元素渲染完之后進(jìn)行動(dòng)態(tài)計(jì)算了,,Vue中有一個(gè)很好用的方法,可以很方便的監(jiān)聽dom渲染完成:

// 監(jiān)聽dom渲染完成
this.$nextTick(function(){
  // 這里fixedHeaderRoot是吸頂元素的ID
  let header = document.getElementById("fixedHeaderRoot");
  // 這里要得到top的距離和元素自身的高度
  this.offsetTop = header.offsetTop;
  this.offsetHeight = header.offsetHeight;
  console.log("offsetTop:" + this.offsetTop + "," + this.offsetHeight);
});

3.判斷頁面滾動(dòng)距離:

handleScroll(){
  // 得到頁面滾動(dòng)的距離
  let scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
  // 判斷頁面滾動(dòng)的距離是否大于吸頂元素的位置
  this.headerFixed = scrollTop > (this.offsetTop - this.offsetHeight * 2);
},

ps:這里理論上其實(shí)應(yīng)該是scrollTop > (this.offsetTop - this.offsetHeight),,但是不知道為啥我這里做出來后滾動(dòng)到吸頂元素位置的時(shí)候scrollTop還是比this.offsetTop - this.offsetHeight的值小,,所以這里*2,這樣得出來的值才剛剛好,,如果有知道的朋友可以幫忙解惑一下,。

上面我們得到了一個(gè)headerFixed的boolean屬性值,接下來我們只需要根據(jù)它的值來設(shè)置吸頂元素的position: fixed;屬性就可以了,。
我們可以寫一個(gè)css樣式:

.isFixed{
  position: fixed;
  top: px2rem(110);
  left: px2rem(20);
  right: px2rem(20);
}

然后Vue可以在dom元素里這樣動(dòng)態(tài)設(shè)置class,,非常方便:

<div id="fixedHeaderRoot">
  <div id="knowPointHeader" class="knowPointHeader" :class="headerFixed?'isFixed':''">
    <div><span>知識(shí)模塊</span></div>
    <div><span>知識(shí)點(diǎn)</span></div>
    <div><span>能力要求</span></div>
  </div>
</div>
其實(shí)到這里這個(gè)效果已經(jīng)實(shí)現(xiàn)完成了,不過我在測試過程中發(fā)現(xiàn),,因?yàn)閕os手機(jī)頁面滾動(dòng)到底部的時(shí)候,,還可以上拉,有一個(gè)橡皮筋效果,,這個(gè)效果會(huì)導(dǎo)致一個(gè)我們頁面的一個(gè)Bug,,因?yàn)樗倪@種橡皮筋效果也會(huì)觸發(fā)頁面滾動(dòng)的監(jiān)聽,,當(dāng)數(shù)據(jù)很多的時(shí)候其實(shí)看不出來,只有當(dāng)數(shù)據(jù)剛好占滿屏幕的時(shí)候,,這個(gè)時(shí)候你再繼續(xù)往上滑動(dòng)屏幕,,就會(huì)觸發(fā)頁面的滾動(dòng)監(jiān)聽,這個(gè)時(shí)候handleScroll方法中計(jì)算出來的值scrollTop是大于吸頂元素top的距離,,所以吸頂元素會(huì)被設(shè)置為固定屬性,,大家知道一個(gè)元素一旦被設(shè)置為position: fixed;,那么它就會(huì)相對(duì)于瀏覽器窗口進(jìn)行定位,,這樣我們下面的內(nèi)容就會(huì)往上頂,,這樣的話scrollTop的值又小于了吸頂元素top的距離,這樣headerFixed屬性又為false,,position: fixed;屬性又沒有了,,這樣它就又相對(duì)與它原本的父元素進(jìn)行定位,這樣就成了一個(gè)循環(huán),,你會(huì)發(fā)現(xiàn)頁面會(huì)上下跳到,,這樣是肯定不行的,所以我下面又針對(duì)這個(gè)問題進(jìn)行了一個(gè)優(yōu)化,,當(dāng)然這個(gè)方案感覺不是特別完美,,不過確實(shí)可以解決這個(gè)問題。
通過上面的分析我們可以得知造成這個(gè)問題的原因是因?yàn)槲覀儼言O(shè)置了元素的position: fixed;屬性,,使得下面的內(nèi)容往上頂,,所以要想解決這個(gè)問題,那我們就不固定這個(gè)元素,,但是這樣的話就達(dá)不到吸頂?shù)男Ч?,所以我們需要再加一個(gè)和吸頂元素一模一樣的元素,它一直就是固定狀態(tài):
<div id="fixedHeaderRootReal">
  <div class="knowPointHeader isFixed" v-show="headerFixed">
    <div><span>知識(shí)模塊</span></div>
    <div><span>知識(shí)點(diǎn)</span></div>
    <div><span>能力要求</span></div>
  </div>
</div>
這個(gè)元素默認(rèn)是隱藏的,,只有當(dāng)頁面滾動(dòng)的距離達(dá)到了它的位置的時(shí)候我們才讓它顯示,,由于它是固定狀態(tài),所以它的隱藏顯示并不會(huì)對(duì)頁面產(chǎn)生影響,,這樣下面的內(nèi)容就不會(huì)往上頂了,,就可以解決ios手機(jī)上拉頁面橡皮筋效果的Bug了,當(dāng)然這種方式有些取巧,,但是暫時(shí)沒有更好的解決方案了,,如果大家有更好的解決方案,歡迎在下面評(píng)論,。最后給大家看一下我的頁面布局:
<div v-show="kpointListShow" class="knowPointList">
      <div id="fixedHeaderRoot">
        <div id="knowPointHeader" class="knowPointHeader">
          <div><span>知識(shí)模塊</span></div>
          <div><span>知識(shí)點(diǎn)</span></div>
          <div><span>能力要求</span></div>
        </div>
      </div>
      <div id="fixedHeaderRootReal">
        <div class="knowPointHeader isFixed" v-show="headerFixed">
          <div><span>知識(shí)模塊</span></div>
          <div><span>知識(shí)點(diǎn)</span></div>
          <div><span>能力要求</span></div>
        </div>
      </div>
      <div class="knowPointItem" v-for="(kpointItem,index) in rows.kpointList" :key="index">
        <div><span>{{kpointItem.knowModule}}</span></div>
        <div><span>{{kpointItem.knowPoint}}</span></div>
        <div><span>{{kpointItem.abilityRequire}}</span></div>
      </div>
</div>

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請遵守用戶 評(píng)論公約

    類似文章 更多