學生問的我寫出來也記錄一下,以往會做這種效果都是用點擊的,也因為有現成的 plugin 所以還沒完整自己寫過,這次有問到要跟下拉式選單怎麼互動我就來弄一下。
首先我下拉式選單跟內容都用 json 產生,利用的原理是抓到指定目標在頁面上的位置,然後讓頁面捲動過去,反之則是判斷現在捲動的位置,讓下拉式選單同步。
let years=[{ year: 1910, id: "y1910" },{ year: 1920, id: "y1920" },{ year: 1930, id: "y1930" }]
然後產出 UI 同時也記錄一下每個區塊的位置:
years.forEach(function(item, index){ $("#select").append(`${item.year}`); $("body").append(`
`); item.scrollTop=$(".fullpage").eq(index).offset().top })
這邊我把 fullpage 在 css 設定高度為 100vh
然後抓下拉式選單選了後要捲動的位置
$("#select").change(function(){ let target=$(this).val(); let scrollTo=$(target).offset().top-30; $("html").animate({ scrollTop: scrollTo }, 700) })
另外則是在頁面捲動時,判斷目前捲動的位置去變換下拉式選單的內容:
$(window).scroll(function(){ let scrollTop=$(this).scrollTop(); let targetVal=years.filter(function(item, index, array){ return scrollTop> (item.scrollTop - 40); }) targetVal.reverse(); let now=""; if(targetVal.length>0){ now="#"+targetVal[0].id; } $("#select").val(now) })
完整程式碼在這邊