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

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

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

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

進入正題,先看下效果圖:

 

其實js做這個效果還是挺簡單的,因為在css中我們可以設(shè)置一個元素的 position: fixed;

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

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

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

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

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

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

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

計算出來這個距離之后就可以確定固定吸頂元素的時機了,如果你的吸頂元素上面的元素的高度是固定的話,那就簡單了,直接在handleScroll方法中進行判斷就可以了,可以直接跳到第三步了,如果是動態(tài)的,那就需要我們在接口請求完數(shù)據(jù),dom元素渲染完之后進行動態(tài)計算了,Vue中有一個很好用的方法,可以很方便的監(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.判斷頁面滾動距離:

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

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

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

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

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

<div id="fixedHeaderRoot">
 <div id="knowPointHeader" class="knowPointHeader" :class="headerFixed?'isFixed':''">
 <div><span>知識模塊</span></div>
 <div><span>知識點</span></div>
 <div><span>能力要求</span></div>
 </div>
</div>

其實到這里這個效果已經(jīng)實現(xiàn)完成了,不過我在測試過程中發(fā)現(xiàn),因為ios手機頁面滾動到底部的時候,還可以上拉,有一個橡皮筋效果,這個效果會導致一個我們頁面的一個Bug,因為它的這種橡皮筋效果也會觸發(fā)頁面滾動的監(jiān)聽,當數(shù)據(jù)很多的時候其實看不出來,只有當數(shù)據(jù)剛好占滿屏幕的時候,這個時候你再繼續(xù)往上滑動屏幕,就會觸發(fā)頁面的滾動監(jiān)聽,這個時候handleScroll方法中計算出來的值scrollTop是大于吸頂元素top的距離,所以吸頂元素會被設(shè)置為固定屬性,大家知道一個元素一旦被設(shè)置為 position: fixed; ,那么它就會相對于瀏覽器窗口進行定位,這樣我們下面的內(nèi)容就會往上頂,這樣的話scrollTop的值又小于了吸頂元素top的距離,這樣headerFixed屬性又為false, position: fixed; 屬性又沒有了,這樣它就又相對與它原本的父元素進行定位,這樣就成了一個循環(huán),你會發(fā)現(xiàn)頁面會上下跳到,這樣是肯定不行的,所以我下面又針對這個問題進行了一個優(yōu)化,當然這個方案感覺不是特別完美,不過確實可以解決這個問題。

通過上面的分析我們可以得知造成這個問題的原因是因為我們把設(shè)置了元素的 position: fixed; 屬性,使得下面的內(nèi)容往上頂,所以要想解決這個問題,那我們就不固定這個元素,但是這樣的話就達不到吸頂?shù)男Ч?,所以我們需要再加一個和吸頂元素一模一樣的元素,它一直就是固定狀態(tài):

<div id="fixedHeaderRootReal">
 <div class="knowPointHeader isFixed" v-show="headerFixed">
 <div><span>知識模塊</span></div>
 <div><span>知識點</span></div>
 <div><span>能力要求</span></div>
 </div>
</div>

這個元素默認是隱藏的,只有當頁面滾動的距離達到了它的位置的時候我們才讓它顯示,由于它是固定狀態(tài),所以它的隱藏顯示并不會對頁面產(chǎn)生影響,這樣下面的內(nèi)容就不會往上頂了,就可以解決ios手機上拉頁面橡皮筋效果的Bug了,當然這種方式有些取巧,但是暫時沒有更好的解決方案了,如果大家有更好的解決方案,歡迎在下面評論。最后給大家看一下我的頁面布局:

<div v-show="kpointListShow" class="knowPointList">
  <div id="fixedHeaderRoot">
  <div id="knowPointHeader" class="knowPointHeader">
   <div><span>知識模塊</span></div>
   <div><span>知識點</span></div>
   <div><span>能力要求</span></div>
  </div>
  </div>
  <div id="fixedHeaderRootReal">
  <div class="knowPointHeader isFixed" v-show="headerFixed">
   <div><span>知識模塊</span></div>
   <div><span>知識點</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>

參考

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 在vue項目中 實現(xiàn)定義全局變量 全局函數(shù)操作

    在vue項目中 實現(xiàn)定義全局變量 全局函數(shù)操作

    這篇文章主要介紹了在vue項目中 實現(xiàn)定義全局變量 全局函數(shù)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • 解決vue2中使用axios http請求出現(xiàn)的問題

    解決vue2中使用axios http請求出現(xiàn)的問題

    下面小編就為大家分享一篇解決vue2中使用axios http請求出現(xiàn)的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • Vue實現(xiàn)選擇城市功能

    Vue實現(xiàn)選擇城市功能

    這篇文章主要介紹了Vue實現(xiàn)選擇城市功能,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-05-05
  • Vue中el-form標簽中的自定義el-select下拉框標簽功能

    Vue中el-form標簽中的自定義el-select下拉框標簽功能

    這篇文章主要介紹了Vue中el-form標簽中的自定義el-select下拉框標簽功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • vue+elementUI實現(xiàn)圖片上傳功能

    vue+elementUI實現(xiàn)圖片上傳功能

    這篇文章主要為大家詳細介紹了vue+elementUI實現(xiàn)圖片上傳功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • 解決vue-element-admin安裝依賴npm install報錯問題

    解決vue-element-admin安裝依賴npm install報錯問題

    這篇文章主要介紹了解決vue-element-admin安裝依賴npm install報錯問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Vue實現(xiàn)下拉加載更多

    Vue實現(xiàn)下拉加載更多

    這篇文章主要為大家詳細介紹了Vue實現(xiàn)下拉加載更多,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • Vue前端整合Element?Ui的教程詳解

    Vue前端整合Element?Ui的教程詳解

    這篇文章主要介紹了Vue前端整合Element?Ui,本節(jié)內(nèi)容服務(wù)于SpringBoot?+?Vue?搭建?JavaWeb?增刪改查項目,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • 快速掌握Vue3.0中如何上手Vuex狀態(tài)管理

    快速掌握Vue3.0中如何上手Vuex狀態(tài)管理

    Vuex 是一個專為 Vue.js 應用程序開發(fā)的狀態(tài)管理模式,本文給大家分享Vue3.0中快速上手Vuex狀態(tài)管理的方式,本文通過實例代碼講解的很詳細,對大家學習Vuex狀態(tài)管理相關(guān)知識有很大的幫助,感興趣的朋友一起學習吧
    2021-05-05
  • 如何正確快速使用Vue中的插槽和配置代理

    如何正確快速使用Vue中的插槽和配置代理

    這篇文章主要介紹了正確快速使用Vue中的插槽和配置代理的相關(guān)知識,插槽分為三種,分別是默認插槽、具名插槽、作用域插槽,下面分別列出了如何使用這三種插槽,需要的朋友可以參考下
    2023-01-01

最新評論

改则县| 忻州市| 康乐县| 双牌县| 沈阳市| 玉环县| 沁源县| 秭归县| 福鼎市| 漳平市| 肥东县| 香河县| 鄂尔多斯市| 彭泽县| 德清县| 丰台区| 大埔县| 图片| 镇安县| 华阴市| 镇远县| 宿松县| 通州区| 古丈县| 巴南区| 鄂伦春自治旗| 威远县| 长丰县| 廉江市| 盱眙县| 荥阳市| 霸州市| 十堰市| 永新县| 龙陵县| 永靖县| 东宁县| 安图县| 建阳市| 界首市| 驻马店市|