こんにちは!セミマサです。
JavaScriptを使ってサイドバーに今どこを読んでいるかを表示してみました。
デモサイト
今回のデモサイトです。
画面サイズ480px以下の場合サイドバーを表示しないようにしているのでPCかタブレットでご確認ください。
今回のスクリプト
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
const heading_list = document.getElementsByTagName('h2'); let heading_top = []; for(let i = 0; i < heading_list.length;i++){ heading_top[i] = heading_list[i].offsetTop; } const side_list =document.getElementsByClassName('side-content'); const present_Location = ()=>{ sidebar_Initialize(); let windowTop = window.scrollY; if(heading_top[0] < windowTop && windowTop < heading_top[1] ){ side_list[0].classList.add('is-active'); }else if(heading_top[1] < windowTop && windowTop < heading_top[2] ){ side_list[1].classList.add('is-active'); }else if(heading_top[2] < windowTop && windowTop <heading_top[3] ){ side_list[2].classList.add('is-active'); }else if(heading_top[3] < windowTop ){ side_list[3].classList.add('is-active'); } } const sidebar_Initialize = ()=>{ for(let i = 0;i<side_list.length;i++){ side_list[i].classList.remove('is-active'); } } const reAssignment = ()=>{ for(let i = 0; i < heading_list.length;i++){ heading_top[i] = heading_list[i].offsetTop; } } window.addEventListener('load', present_Location); window.addEventListener('scroll', present_Location); window.addEventListener('resize',reAssignment); |
・heading_listに見出しのリストを格納
・heading_topに各見出しの位置を格納
・side_listにサイドバーの見出しリストを格納
・ウィンドウが読み込まれた時とスクロールした時にpresent_Location関数を実行します。
・画面のリサイズ時にreAssignment関数を実行します。
present_Location関数
今回のメインとなる関数です。
まずsidebar_Initialize関数を呼び出します。sidebar_Initialize関数については後述します。
windowTopに縦方向のスクロール量を代入し、条件を満たすサイドバーの見出しにis-activeクラスを付与します。
sidebar_Initialize関数
side_list内の各要素からis-activeクラスを取り除く関数です。
reAssignment関数
heading_topに各見出しの位置を再格納する関数です。
おわりに
無事動くものが作れました。