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

Vue.js實戰(zhàn)之通過監(jiān)聽滾動事件實現(xiàn)動態(tài)錨點

 更新時間:2017年04月04日 16:11:47   作者:WiseWrong  
監(jiān)聽事件是我們在使用vue.js的時候經(jīng)常使用的一個功能,下面這篇文章主要介紹了Vue.js實戰(zhàn)之通過監(jiān)聽滾動事件實現(xiàn)動態(tài)錨點 的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),相信對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。

前言

前幾天工作中在做項目的時候,需要實現(xiàn)一個動態(tài)錨點的效果,具體效果如下:

如果是傳統(tǒng)項目,這個效果就非常簡單。但是放到 Vue 中,就有兩大難題:

      1. 在沒有 jQuery 的 animate() 方法的情況下,如何實現(xiàn)平滑滾動?

      2. 如何監(jiān)聽頁面滾動事件?

在瀏覽了大量文章、進(jìn)行多次嘗試之后,終于解決了這些問題

期間主要涉及到了 setTimeout 的遞歸用法,和 Vue 生命周期中的 mounted

一、錨點實現(xiàn)

在實現(xiàn)平滑滾動之前,得先確?;镜腻^點功能

如果沒有其他要求,直接用 <a href="#id" rel="external nofollow" > 是最簡單粗暴的辦法

但是為了滿足后續(xù)的要求,必須另外想辦法 

首先在父組件(表單)中添加 class="d_jump" 作為鉤子

然后在子組件中添加一個 jump 方法

jump (index) {
 let jump = document.querySelectorAll('.d_jump')
 // 獲取需要滾動的距離
 let total = jump[index].offsetTop
 // Chrome
 document.body.scrollTop = total
 // Firefox
 document.documentElement.scrollTop = total
 // Safari
 window.pageYOffset = total
},

通過 offsetTop 獲取對象到窗體頂部的距離,然后賦值給 scrollTop,就能實現(xiàn)錨點的功能

需要注意的是:各瀏覽器下獲取 scrollTop 有所差異

      Chrome: document.body.scrollTop

      Firefox: document.documentElement.scrollTop

      Safari: window.pageYOffset

二、平滑滾動

僅僅是錨點是不夠的,這樣的跳轉(zhuǎn)十分突兀

為了更好的用戶體驗 ,需要將滾動的過程展現(xiàn)出來

如果有 jQuery 實現(xiàn)平滑滾動就非常簡單:

$('html body').animate({scrollTop: total}, 500);

可惜沒如果~~

在看了好些文章之后,有了一個大概的開發(fā)思路:

將總距離分成很多小段,然后每隔一段時間跳一段

只要每段的時間足夠短,頻次足夠多,在視覺上就是正常的平滑滾動了

// 平滑滾動,時長500ms,每10ms一跳,共50跳
// 獲取當(dāng)前滾動條與窗體頂部的距離
let distance = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop
// 計算每一小段的距離
let step = total / 50
(function smoothDown () {
 if (distance < total) {
 distance += step
  // 移動一小段
 document.body.scrollTop = distance
 document.documentElement.scrollTop = distance
 window.pageYOffset = distance
  // 設(shè)定每一次跳動的時間間隔為10ms
 setTimeout(smoothDown, 10)
 } else {
  // 限制滾動停止時的距離
 document.body.scrollTop = total
 document.documentElement.scrollTop = total
 window.pageYOffset = total
 }
})()

實際情況下,得考慮向上滾動和向下滾動兩種情況,完整的代碼為:

jump (index) {
 // 用 class="d_jump" 添加錨點
 let jump = document.querySelectorAll('.d_jump')
 let total = jump[index].offsetTop
 let distance = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop
 // 平滑滾動,時長500ms,每10ms一跳,共50跳
 let step = total / 50
 if (total > distance) {
 smoothDown()
 } else {
 let newTotal = distance - total
 step = newTotal / 50
 smoothUp()
 }
 function smoothDown () {
 if (distance < total) {
 distance += step
       document.body.scrollTop = distance
 document.documentElement.scrollTop = distance
 window.pageYOffset = distance
 setTimeout(smoothDown, 10)
 } else {
 document.body.scrollTop = total
 document.documentElement.scrollTop = total
 window.pageYOffset = total
 }
 }
 function smoothUp () {
 if (distance > total) {
 distance -= step
       document.body.scrollTop = distance
 document.documentElement.scrollTop = distance
 window.pageYOffset = distance
 setTimeout(smoothUp, 10)
 } else {
 document.body.scrollTop = total
 document.documentElement.scrollTop = total
 window.pageYOffset = total
 }
 } 
 }

三、修改錨點狀態(tài)

在上面展示的效果中,當(dāng)頁面滾動的時候,錨點的激活狀態(tài)會有相應(yīng)的改變

其實這個效果并不難,只需要監(jiān)聽頁面滾動事件,然后根據(jù)滾動條的距離修改錨點狀態(tài)就可以了

但是在 Vue 中,應(yīng)該在什么地方監(jiān)聽滾動事件呢?

mounted: function () {
 this.$nextTick(function () {
 window.addEventListener('scroll', this.onScroll)
 })
 },
 methods: {
 onScroll () {
 let scrolled = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop
    // 586、1063分別為第二個和第三個錨點對應(yīng)的距離
 if (scrolled >= 1063) {
 this.steps.active = 2
 } else if (scrolled < 1063 && scrolled >= 586) {
 this.steps.active = 1
 } else {
 this.steps.active = 0
 }
 }
 }

上面的代碼中,我先寫了一個修改錨點狀態(tài)的方法 onScroll,然后在 mounted 中監(jiān)聽 scroll 事件,并執(zhí)行 onScroll 方法

mounted 是 Vue 生命周期中的一個狀態(tài),在這個狀態(tài)下,$el (vue 實例的根元素)已經(jīng)創(chuàng)建完畢,但還沒有加載數(shù)據(jù)

從結(jié)果上看,也可以在 created 狀態(tài)下監(jiān)聽 scroll 事件

如果對 mounted 和 created 還不夠了解,可以參考官方文檔·生命周期圖示

總結(jié)

上面只能算是一個應(yīng)急之法,而且這種操作 DOM 的方法,并不符合 Vue 的設(shè)計理念,待我研究出更合理更高效的辦法之后,再發(fā)出來分享~

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • Vue使用pdf-lib實現(xiàn)為文件流添加水印并預(yù)覽

    Vue使用pdf-lib實現(xiàn)為文件流添加水印并預(yù)覽

    這篇文章主要為大家詳細(xì)介紹了Vue如何使用pdf-lib實現(xiàn)為文件流添加水印并預(yù)覽的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2023-03-03
  • Vue package.json配置深入分析

    Vue package.json配置深入分析

    這篇文章主要介紹了Vue package.json配置,package.json是每個前端項目都會有的json文件,位于項目的根目錄中。很多腳手架在創(chuàng)建項目的時候會幫我們自動初始化好 package.json
    2023-01-01
  • vue3如何利用自定義指令實現(xiàn)下拉框分頁懶加載

    vue3如何利用自定義指令實現(xiàn)下拉框分頁懶加載

    下拉框一開始請求第一頁的內(nèi)容,滾動到最后的時候,請求第二頁的內(nèi)容,如此反復(fù),直到所有數(shù)據(jù)加載完成,這篇文章主要介紹了vue3如何利用自定義指令實現(xiàn)下拉框分頁懶加載,需要的朋友可以參考下
    2024-07-07
  • 使用electron打包Vue前端項目的詳細(xì)流程

    使用electron打包Vue前端項目的詳細(xì)流程

    這篇文章主要介紹了使用electron打包Vue前端項目的詳細(xì)流程,文中通過圖文結(jié)合的方式給大家介紹的非常詳細(xì),對大家學(xué)習(xí)electron打包Vue有一定的幫助,需要的朋友可以參考下
    2024-04-04
  • vue elementui表格獲取某行數(shù)據(jù)(slot-scope和selection-change方法使用)

    vue elementui表格獲取某行數(shù)據(jù)(slot-scope和selection-change方法使用)

    這篇文章主要介紹了vue elementui表格獲取某行數(shù)據(jù)(slot-scope和selection-change方法使用),本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-01-01
  • Vue使用js-audio-recorder實現(xiàn)錄制,播放與下載音頻功能

    Vue使用js-audio-recorder實現(xiàn)錄制,播放與下載音頻功能

    這篇文章主要為大家詳細(xì)介紹了Vue如何使用js-audio-recorder實現(xiàn)錄制,播放與下載音頻功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2023-12-12
  • vant時間控件使用方法詳解

    vant時間控件使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了vant時間控件的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • vue豎向步驟條方式

    vue豎向步驟條方式

    這篇文章主要介紹了vue豎向步驟條方式,具有很好的參考價值,希望對大家有所幫助,
    2023-12-12
  • element用腳本自動化構(gòu)建新組件的實現(xiàn)示例

    element用腳本自動化構(gòu)建新組件的實現(xiàn)示例

    本文主要介紹了element-ui的用腳本自動化構(gòu)建新組件的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Vue項目部署后首頁白屏問題排查與解決方法

    Vue項目部署后首頁白屏問題排查與解決方法

    在部署 Vue.js 項目時,有時會遇到首頁加載后出現(xiàn)白屏的情況,這可能是由于多種原因造成的,本文將介紹一些常見的排查方法和解決方案,幫助開發(fā)者快速定位問題并解決,感興趣的小伙伴跟著小編一起來看看吧
    2024-08-08

最新評論

伊川县| 磐石市| 柳林县| 旺苍县| 布拖县| 平乐县| 锦州市| 英山县| 濉溪县| 梅河口市| 浦北县| 古田县| 临颍县| 溧阳市| 三台县| 都江堰市| 满城县| 江川县| 岚皋县| 建瓯市| 堆龙德庆县| 宁远县| 海宁市| 固始县| 巴楚县| 丽水市| 蕉岭县| 法库县| 方城县| 镇平县| 丰宁| 安塞县| 新郑市| 常宁市| 永清县| 岳池县| 临颍县| 南宫市| 宁蒗| 张家港市| 道真|