亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Vue開發(fā)實(shí)現(xiàn)吸頂效果的示例代碼

 更新時(shí)間:2018年08月21日 13:44:53   作者:浮空掠影x  
這篇文章主要介紹了Vue開發(fā)實(shí)現(xiàn)吸頂效果的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

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

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

 

其實(shí)js做這個(gè)效果還是挺簡(jiǎn)單的,因?yàn)樵赾ss中我們可以設(shè)置一個(gè)元素的 position: fixed;

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

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

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

mounted() {
 // handleScroll為頁(yè)面滾動(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ì)算吸頂元素到頁(yè)面頂部的距離:

計(jì)算出來這個(gè)距離之后就可以確定固定吸頂元素的時(shí)機(jī)了,如果你的吸頂元素上面的元素的高度是固定的話,那就簡(jiǎn)單了,直接在handleScroll方法中進(jìn)行判斷就可以了,可以直接跳到第三步了,如果是動(dòng)態(tài)的,那就需要我們?cè)诮涌谡?qǐng)求完數(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.判斷頁(yè)面滾動(dòng)距離:

handleScroll(){
 // 得到頁(yè)面滾動(dòng)的距離
 let scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
 // 判斷頁(yè)面滾動(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)完成了,不過我在測(cè)試過程中發(fā)現(xiàn),因?yàn)閕os手機(jī)頁(yè)面滾動(dòng)到底部的時(shí)候,還可以上拉,有一個(gè)橡皮筋效果,這個(gè)效果會(huì)導(dǎo)致一個(gè)我們頁(yè)面的一個(gè)Bug,因?yàn)樗倪@種橡皮筋效果也會(huì)觸發(fā)頁(yè)面滾動(dòng)的監(jiān)聽,當(dāng)數(shù)據(jù)很多的時(shí)候其實(shí)看不出來,只有當(dāng)數(shù)據(jù)剛好占滿屏幕的時(shí)候,這個(gè)時(shí)候你再繼續(xù)往上滑動(dòng)屏幕,就會(huì)觸發(fā)頁(yè)面的滾動(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)頁(yè)面會(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)頁(yè)面滾動(dòng)的距離達(dá)到了它的位置的時(shí)候我們才讓它顯示,由于它是固定狀態(tài),所以它的隱藏顯示并不會(huì)對(duì)頁(yè)面產(chǎn)生影響,這樣下面的內(nèi)容就不會(huì)往上頂了,就可以解決ios手機(jī)上拉頁(yè)面橡皮筋效果的Bug了,當(dāng)然這種方式有些取巧,但是暫時(shí)沒有更好的解決方案了,如果大家有更好的解決方案,歡迎在下面評(píng)論。最后給大家看一下我的頁(yè)面布局:

<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>

參考

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 談?wù)刅ue.js——vue-resource全攻略

    談?wù)刅ue.js——vue-resource全攻略

    本篇文章主要介紹了談?wù)刅ue.js——vue-resource全攻略,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-01-01
  • Vue實(shí)現(xiàn)阻止瀏覽器記住密碼功能的三種方法

    Vue實(shí)現(xiàn)阻止瀏覽器記住密碼功能的三種方法

    本文主要介紹了Vue實(shí)現(xiàn)阻止瀏覽器記住密碼功能的三種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • dataV大屏在vue中的使用方式

    dataV大屏在vue中的使用方式

    這篇文章主要介紹了dataV大屏在vue中的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • vue-ls vue本地儲(chǔ)存的實(shí)例講解

    vue-ls vue本地儲(chǔ)存的實(shí)例講解

    這篇文章主要介紹了vue-ls vue本地儲(chǔ)存的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • vue中調(diào)用HTTP請(qǐng)求的詳細(xì)步驟

    vue中調(diào)用HTTP請(qǐng)求的詳細(xì)步驟

    這篇文章主要介紹了vue中調(diào)用HTTP請(qǐng)求的詳細(xì)步驟,文中通過代碼示例給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定幫助,需要的朋友可以參考下
    2024-07-07
  • van-dialog彈窗異步關(guān)閉功能-校驗(yàn)表單實(shí)現(xiàn)

    van-dialog彈窗異步關(guān)閉功能-校驗(yàn)表單實(shí)現(xiàn)

    有時(shí)候我們需要通過彈窗去處理表單數(shù)據(jù),在原生微信小程序配合vant組件中有多種方式實(shí)現(xiàn),其中UI美觀度最高的就是通過van-dialog嵌套表單實(shí)現(xiàn),這篇文章主要介紹了van-dialog彈窗異步關(guān)閉-校驗(yàn)表單,需要的朋友可以參考下
    2023-11-11
  • vant使用datetime-picker組件設(shè)置maxDate和minDate的坑及解決

    vant使用datetime-picker組件設(shè)置maxDate和minDate的坑及解決

    這篇文章主要介紹了vant使用datetime-picker組件設(shè)置maxDate和minDate的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • 關(guān)于Vue.js一些問題和思考學(xué)習(xí)筆記(1)

    關(guān)于Vue.js一些問題和思考學(xué)習(xí)筆記(1)

    這篇文章主要為大家分享了關(guān)于Vue.js一些問題和思考的學(xué)習(xí)筆記,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • vue-router如何實(shí)時(shí)動(dòng)態(tài)替換路由參數(shù)(地址欄參數(shù))

    vue-router如何實(shí)時(shí)動(dòng)態(tài)替換路由參數(shù)(地址欄參數(shù))

    這篇文章主要介紹了vue-router如何實(shí)時(shí)動(dòng)態(tài)替換路由參數(shù)(地址欄參數(shù)),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • 專業(yè)級(jí)Vue?多級(jí)菜單設(shè)計(jì)

    專業(yè)級(jí)Vue?多級(jí)菜單設(shè)計(jì)

    這篇文章主要為大家介紹了專業(yè)級(jí)的Vue?多級(jí)菜單設(shè)計(jì)實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07

最新評(píng)論