亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

Vue開發實現吸頂效果的示例代碼

2019-11-19 13:11:53
字體:
來源:轉載
供稿:網友

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

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

 

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

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

1.監聽頁面的滾動狀態:

在mounted回調中加入以下代碼:

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

同時在destroyed回調中移除監聽:

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

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

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

// 監聽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屬性值,接下來我們只需要根據它的值來設置吸頂元素的 position: fixed; 屬性就可以了。 我們可以寫一個css樣式:

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

然后Vue可以在dom元素里這樣動態設置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>

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

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

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

這個元素默認是隱藏的,只有當頁面滾動的距離達到了它的位置的時候我們才讓它顯示,由于它是固定狀態,所以它的隱藏顯示并不會對頁面產生影響,這樣下面的內容就不會往上頂了,就可以解決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>

參考

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产欧美日韩91| 1769国产精品| 欧美另类老女人| 亚洲视频第一页| 性色av一区二区三区红粉影视| 日本精品一区二区三区在线| 青青草国产精品一区二区| 日韩av第一页| 亚洲最大激情中文字幕| 欧美性色视频在线| 精品香蕉在线观看视频一| 91亚洲永久免费精品| 奇米一区二区三区四区久久| 久久频这里精品99香蕉| 国产91在线播放精品91| 欧美高清在线视频观看不卡| 久久综合免费视频影院| 亚州欧美日韩中文视频| 国产精品成人一区二区| 国产丝袜精品视频| 日韩精品极品视频免费观看| 欧美成人亚洲成人日韩成人| 亚洲精美色品网站| 国产精品入口福利| 97国产一区二区精品久久呦| 国产免费一区视频观看免费| 亚洲欧美在线一区二区| 欧美成人免费一级人片100| 欧美性猛交丰臀xxxxx网站| 欧美自拍视频在线| 欧美性受xxxx黑人猛交| 韩国v欧美v日本v亚洲| 欧美日韩第一视频| 亚洲天堂免费观看| 最近2019年日本中文免费字幕| 欧美精品久久久久久久免费观看| 国产91精品视频在线观看| 丝袜亚洲另类欧美重口| 91高清在线免费观看| 国产精品免费网站| 中文字幕欧美日韩va免费视频| 98视频在线噜噜噜国产| 亚洲无亚洲人成网站77777| 韩剧1988在线观看免费完整版| 91精品国产自产在线观看永久| 在线观看亚洲视频| 国产精品九九九| 成人做爰www免费看视频网站| 亚洲第一中文字幕| 亚洲有声小说3d| 久久精品视频va| 美女撒尿一区二区三区| 欧美色图在线视频| 最新69国产成人精品视频免费| 欧美高清视频一区二区| 高清欧美性猛交| 国产亚洲精品成人av久久ww| 亚洲桃花岛网站| 亚洲午夜未满十八勿入免费观看全集| 亚洲国产成人精品电影| 在线观看国产精品91| 欧美激情视频在线观看| 久久色精品视频| 岛国视频午夜一区免费在线观看| 亚洲精品自在久久| 国产日韩精品在线| 国产啪精品视频网站| 欧美中文在线视频| 色黄久久久久久| 欧美色videos| 日韩电视剧免费观看网站| 日韩精品欧美国产精品忘忧草| 国产欧美亚洲精品| 亚洲国产日韩欧美在线99| 一道本无吗dⅴd在线播放一区| 日韩欧美极品在线观看| 亚洲男人的天堂在线播放| 日韩av免费看| 91精品视频免费看| 久久视频免费在线播放| 亚洲va久久久噜噜噜久久天堂| 色综合色综合久久综合频道88| 亚洲大胆人体在线| 久久久久久久97| 国产精品久久久久久久久久免费| 亚洲欧美第一页| 亚洲精品99久久久久中文字幕| 国产性色av一区二区| 欧美日韩精品在线播放| 亚洲综合av影视| 97免费视频在线播放| 亚洲人精选亚洲人成在线| 88国产精品欧美一区二区三区| 欧美成人h版在线观看| 中文字幕欧美国内| 亚洲图片欧洲图片av| 日韩中文字幕不卡视频| 国产日韩中文字幕| 国产一区二区三区久久精品| 欧美日韩色婷婷| 国产99久久精品一区二区 夜夜躁日日躁| 人体精品一二三区| 一二美女精品欧洲| 欧美在线观看网址综合| 日韩电影免费观看中文字幕| 96国产粉嫩美女| 亚洲日韩中文字幕在线播放| 久久精视频免费在线久久完整在线看| 国产美女精彩久久| 亚洲a中文字幕| 疯狂欧美牲乱大交777| 亚洲二区在线播放视频| 欧美美女18p| 91国自产精品中文字幕亚洲| 国产脚交av在线一区二区| 一区二区三区天堂av| 欧美在线视频导航| 欧美性猛交xxxx乱大交3| 九九热99久久久国产盗摄| 欧美精品久久久久久久久| 国产香蕉精品视频一区二区三区| 日韩精品中文字| 最近2019好看的中文字幕免费| 一区二区三区精品99久久| 欧美日韩国产精品一区| 国产精品自产拍在线观| 国产成人91久久精品| 欧美日韩国产一区二区| 色香阁99久久精品久久久| 91精品国产亚洲| 欧美日本亚洲视频| 懂色aⅴ精品一区二区三区蜜月| 成人福利在线视频| 韩国v欧美v日本v亚洲| 久久久av一区| 国产精品视频免费在线观看| 日韩亚洲在线观看| 国内免费久久久久久久久久久| 国产精品人人做人人爽| 97国产精品久久| 国产精品青草久久久久福利99| 97在线免费观看| 亚洲精品天天看| 亚洲午夜色婷婷在线| 播播国产欧美激情| 国产人妖伪娘一区91| 久久久久久久久网站| 日韩动漫免费观看电视剧高清| 8x海外华人永久免费日韩内陆视频| 91国产高清在线| 欧美精品一区在线播放| 麻豆精品精华液| 亚洲天堂男人天堂女人天堂| 日韩av在线免费观看一区| 亚洲另类激情图| 日韩一区在线视频| 91久久久久久久久久| 日韩大片免费观看视频播放| 久久躁日日躁aaaaxxxx| 国产欧美一区二区三区四区| 在线播放精品一区二区三区| 日本久久久久久久| 欧美乱大交xxxxx另类电影| 久久影视电视剧凤归四时歌|