Vue開發(fā)——實(shí)現(xiàn)吸頂效果

因?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í)候就是我們?cè)O(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)的丁眼,那就需要我們?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.判斷頁面滾動(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)完成了礁阁,不過我在測(cè)試過程中發(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>

參考

喜歡的麻煩動(dòng)動(dòng)小手點(diǎn)個(gè)贊來支持我图仓,有不對(duì)的地方歡迎大家指正罐盔,有什么問題也可以在下方留言,我看到后會(huì)第一時(shí)間回復(fù)救崔!謝謝您來看這篇文章惶看!??????

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末捏顺,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子纬黎,更是在濱河造成了極大的恐慌幅骄,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件莹桅,死亡現(xiàn)場離奇詭異昌执,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)诈泼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門懂拾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人铐达,你說我怎么就攤上這事岖赋。” “怎么了瓮孙?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵唐断,是天一觀的道長。 經(jīng)常有香客問我杭抠,道長脸甘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任偏灿,我火速辦了婚禮丹诀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘翁垂。我一直安慰自己铆遭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布沿猜。 她就那樣靜靜地躺著枚荣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪啼肩。 梳的紋絲不亂的頭發(fā)上橄妆,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音疟游,去河邊找鬼呼畸。 笑死,一個(gè)胖子當(dāng)著我的面吹牛颁虐,可吹牛的內(nèi)容都是我干的蛮原。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼另绩,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼儒陨!你這毒婦竟也來了花嘶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤蹦漠,失蹤者是張志新(化名)和其女友劉穎椭员,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體笛园,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡隘击,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了研铆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片埋同。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖棵红,靈堂內(nèi)的尸體忽然破棺而出凶赁,到底是詐尸還是另有隱情,我是刑警寧澤逆甜,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布虱肄,位于F島的核電站,受9級(jí)特大地震影響交煞,放射性物質(zhì)發(fā)生泄漏咏窿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一素征、第九天 我趴在偏房一處隱蔽的房頂上張望翰灾。 院中可真熱鬧,春花似錦稚茅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至绘面,卻和暖如春欺税,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背揭璃。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國打工晚凿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瘦馍。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓歼秽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親情组。 傳聞我的和親對(duì)象是個(gè)殘疾皇子燥筷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 一箩祥、場景 需求:tab需要在劃出視口的時(shí)候吸頂(sticky),方便點(diǎn)擊切換下方內(nèi)容肆氓。 二袍祖、方案 1、采用scro...
    玲兒瓏閱讀 3,023評(píng)論 0 1
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案谢揪? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,754評(píng)論 1 92
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5蕉陋? 答:HTML5是最新的HTML標(biāo)準(zhǔn)。 注意:講述HT...
    kismetajun閱讀 27,486評(píng)論 1 45
  • 內(nèi)容 UI組件 開發(fā)框架 實(shí)用庫 服務(wù)端 輔助工具 應(yīng)用實(shí)例 Demo示例 UI組件 element ★13489...
    秋玄語道閱讀 13,710評(píng)論 3 116
  • 這是我看得最認(rèn)真的兩場足球賽拨扶! 第一場以絕對(duì)優(yōu)勢(shì)贏得比賽6:0凳鬓。 第二場比賽踢得艱難些,還是以3:1的分?jǐn)?shù)贏得比賽...
    西禾兒閱讀 342評(píng)論 0 3