欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于vue監(jiān)聽滾動事件實現(xiàn)錨點鏈接平滑滾動的方法

 更新時間:2018年01月17日 16:35:59   作者:GQ++  
本篇文章主要介紹了基于vue監(jiān)聽滾動事件實現(xiàn)錨點鏈接平滑滾動的方法,非常具有實用價值,有興趣的可以了解一下

基于vue監(jiān)聽滾動事件,實現(xiàn)錨點鏈接平滑滾動

近日在做一個vue項目的餐飲模塊,小編需要實現(xiàn)一個菜單列表顯示的功能(如圖所示:左邊為菜單類別,右邊顯示相對應(yīng)的菜品)

小編將此分為三個功能模塊來實現(xiàn)(本來一張動畫就清晰明了,小編太笨,只得口述一下):

1.左邊點擊類別,右邊顯示相應(yīng)類別的菜品列表(平滑滾動)
2.滾動右邊的滾動條,左邊對應(yīng)的顯示當(dāng)前樣式
3.若從別的頁面點擊菜品進來該頁面,則該菜品為指定效果

小編也是vue的初學(xué)者,在閱讀了大量的文章后,其中借鑒http://www.dbjr.com.cn/article/110325.htm 該文章,收到了很多啟發(fā)后,結(jié)合我們的功能加以完善。小編的和借鑒的文章側(cè)重點不同,建議大家在看之前可以先看一下上面的,以便于梳理的更清楚。

:scrollTop(滾動之根本)

在初寫項目的嘗試過程中,小編一直改變的是document.body.scrollTop的值來實現(xiàn)滾動,但是后來逐漸發(fā)現(xiàn)很邪門,有時給其賦值并沒有作用,而且過程也很麻煩,又查閱了一些資料也沒有解決辦法,所以不得已放棄。

之后無意中看到:scrollTop, 便嘗試開始使用vue中的屬性直接進行綁定滾動的變量值,功能實現(xiàn)反而簡單了。下面詳細(xì)講述:

一、組件html結(jié)構(gòu):

結(jié)構(gòu)布局很簡單,在此多說是想給大家講述清楚一點兒右邊菜品的結(jié)構(gòu),方便綁定:scrollTop屬性,小編就踩了這個坑...

注意看注釋::scrollTop 的位置改變菜品列表的scrollTop值,來實現(xiàn)相應(yīng)的滾動

二、實現(xiàn)錨鏈接平滑滾動

該功能是參考之前博主的文章的,方法基本沒改什么,簡單易懂,直接放代碼

jump(index){
    const cateItem = document.querySelectorAll('.cate-item');
    let total = cateItem[index].offsetTop;
    let distance = this.container.scrollTop // 獲取到頂部的距離(this.container便是.cate-list,為了方便存起來了)
    let step = total / 50;
    this.isActive = index; // 菜單列表顯示當(dāng)前樣式
    const _this = this;
    if (total > distance) {
     smoothDown()
    } else {
     let newTotal = distance - total
     step = newTotal / 50
     smoothUp()
    }
    function smoothDown () {
     if (distance < total) {
     distance += step
     _this.scrollTop = distance;
     setTimeout(smoothDown, 10);
     } else {
     _this.scrollTop = total
     }
    }
    function smoothUp () {
     if (distance > total) {
     distance -= step
     _this.scrollTop = distance
     setTimeout(smoothUp, 10)
     } else {
     _this.scrollTop = total
     }
    } 
    }

三、監(jiān)聽滾動事件,修改錨點狀態(tài)

在vue中鉤子函數(shù)監(jiān)聽菜品列表(this.container)的滾動事件,

 mounted(){
   // 監(jiān)聽scroll事件
   const _this = this;
   setTimeout(function(){
    _this.currentStick(); 
    const rightItem = document.querySelectorAll('.cate-item');
    const catelist = document.querySelectorAll('.cate-list')[0];
    var length = rightItem.length;
    var height = rightItem[length-1].offsetHeight;
    var scrollHeight = document.querySelectorAll('.cate-menu-wrapper')[0].offsetHeight;
    // 設(shè)置最后一個類別菜品列表的高度(小于適配器高度的話與適配器等高),不然點擊錨點不能夠置頂
    if(height < scrollHeight){
     rightItem[length-1].style.height = scrollHeight+'px';
    } 
    var arr =[];
    rightItem.forEach(function(v, i){
     arr.push({top: v.offsetTop, height: v.offsetHeight, index: i});
    })
    _this.itemVal = arr; 
    const cateList = document.querySelectorAll('.cate-list')[0];
    cateList.addEventListener('scroll', _this.onScroll);
    _this.container = cateList;
   }, 500)
  },

這里寫的有點啰嗦了,設(shè)置setTimeout延遲是為了能夠獲取到元素(誰有好辦法快推薦給我),為了在滾動中能夠?qū)?yīng)列表顯示錨點當(dāng)前狀態(tài),存了一個數(shù)據(jù)itemAll,存了該菜品類別區(qū)域的scrollTop,索引,高度。(啰嗦,太啰嗦了)

methods: {
 onScroll () {
    var _this = this;
    _this.itemVal.forEach(function(obj, i){
     _this.scrollTop = _this.container.scrollTop;
     if(_this.scrollTop >= obj.top && _this.scrollTop < (obj.top + obj.height-10)){
      // scrollTop的移動位置要在類別的菜品列表中才顯示對應(yīng)錨點的當(dāng)前狀態(tài)
      _this.isActive = obj.index;
     }
    })
   },
}

三、點擊菜品進入頁面,該菜品置頂?shù)穆?lián)動效果(該功能其實有隱藏性的bug,我們項目已取消該功能)

currentStick(){
     const {dishId} = this.$route.query;
     const cateContent = document.querySelectorAll('.cate-content');
     const _this = this;
     cateContent.forEach(function(v, i){
      if(v.id == dishId){
       _this.scrollTop = v.offsetTop; 
      }
     })
   },

該功能用:scrollTop綁定的話便簡單了許多,之前用document.body.scrollTop 設(shè)置值一直沒有作用。

好了,基本上所有的代碼都帖出來了,說的應(yīng)該也詳細(xì)吧(我盡力了),該方法感覺其實還是在操作dom元素和js,枉用vue。但是一時也沒有更好的辦法來實現(xiàn)。

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

相關(guān)文章

  • vue3?+?antv/x6實現(xiàn)流程圖的全過程

    vue3?+?antv/x6實現(xiàn)流程圖的全過程

    隨著互聯(lián)網(wǎng)的發(fā)展,越來越多的應(yīng)用需要實現(xiàn)流程圖的制作,如工作流程圖、電路圖等,文中通過代碼以及圖文將實現(xiàn)的過程介紹的非常詳細(xì),對大家學(xué)習(xí)或者工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-06-06
  • vue如何循環(huán)請求一個接口

    vue如何循環(huán)請求一個接口

    這篇文章主要介紹了vue如何循環(huán)請求一個接口問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • vue3中調(diào)用api接口實現(xiàn)數(shù)據(jù)的渲染以及詳情方式

    vue3中調(diào)用api接口實現(xiàn)數(shù)據(jù)的渲染以及詳情方式

    這篇文章主要介紹了vue3中調(diào)用api接口實現(xiàn)數(shù)據(jù)的渲染以及詳情方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 詳解vue數(shù)組遍歷方法forEach和map的原理解析和實際應(yīng)用

    詳解vue數(shù)組遍歷方法forEach和map的原理解析和實際應(yīng)用

    這篇文章主要介紹了詳解vue數(shù)組遍歷方法forEach和map的原理解析和實際應(yīng)用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • 關(guān)于vue-resource報錯450的解決方案

    關(guān)于vue-resource報錯450的解決方案

    本篇文章主要介紹關(guān)于vue-resource報錯450的解決方案,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • vuex 解決報錯this.$store.commit is not a function的方法

    vuex 解決報錯this.$store.commit is not a function的方法

    這篇文章主要介紹了vuex 解決報錯this.$store.commit is not a function的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • laravel5.3 vue 實現(xiàn)收藏夾功能實例詳解

    laravel5.3 vue 實現(xiàn)收藏夾功能實例詳解

    這篇文章主要介紹了laravel5.3 vue 實現(xiàn)收藏夾功能,本文通過實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2018-01-01
  • vue項目總結(jié)之文件夾結(jié)構(gòu)配置詳解

    vue項目總結(jié)之文件夾結(jié)構(gòu)配置詳解

    這篇文章主要給大家總結(jié)介紹了關(guān)于vue項目之文件夾結(jié)構(gòu)配置的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • vue+eslint+vscode配置教程

    vue+eslint+vscode配置教程

    這篇文章主要介紹了vue+eslint+vscode配置教程,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • Vant實現(xiàn)上傳多個圖片或視頻,更改視頻預(yù)覽圖

    Vant實現(xiàn)上傳多個圖片或視頻,更改視頻預(yù)覽圖

    這篇文章主要介紹了Vant實現(xiàn)上傳多個圖片或視頻,更改視頻預(yù)覽圖,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10

最新評論