スムーススクロールを作った 01

最近、仕事に使うライブラリーとかテンプレート的なものを少しずつ改良していっている一環で、スムーススクロールのライブラリを作ってみた。

機能

  • aタグのhref=”#”に指定したアンカーIDのブロックにスクロール。
  • スクロールの種類を自動設定と、時間・イージングを設定できる2種類用意。
  • スクロール完了時にonCompleteに渡した関数を実行できる。
  • 任意のタイミングでスクロールイベント実行できる。
  • XY軸両方に対応。(デフォルトはY)
  • aタグのdata属性に、data-offset-yなどを指定することで、追加のオフセットを指定できる。
    スマートフォン用にdata-offset-y-spも指定できる。
  • そのブレークポイントも指定できる。

使い方 インスタンス生成とサンプル

簡単設定

インスタンスを生成すれば、自動的にhref=”#●●”にy軸のみスクロール。

const pageScrollTo = new PageScrollTo();

See the Pen Page Scroll To 01(v1.4) – 1 by s4ec (@ShinjiY) on CodePen.

ヘッダーの高さ、スクロール時間、イージング、xy軸を設定した場合

  • ヘッダー要素のIDを指定することで、position:fixedを使用時にスクロールの到着位置にヘッダーが重ならないようにする。
  • 時間とイージングは同時に設定する。イージングは時間を設定しないと無効。
	const pageScrollTo = new PageScrollTo({
		offsetYElement: '#header',
		duration: 1500,
		ease: 'easeInOutCubic',
		axis: 'xy'
	});

下のサンプルでは、Block 01のリンクにdata-offset-y=”70″ data-offset-y-sp=”80″を指定してみた。

See the Pen Page Scroll To 01(v1.4) – 2 by s4ec (@ShinjiY) on CodePen.

任意のタイミングでスクロールさせる

scrollTo()メソッドを使う。第二引数にはスクロール終了に実行される関数を渡すことができる。

const pageScrollTo = new PageScrollTo();

// 1病後にスクロール
setTimeout(() => {
    pageScrollTo.scrollTo('#block04', () => {
        console.log('任意 スクロールEND');
    });
}, 1000);

その他の設定できること

const pageScrollTo = new PageScrollTo({
    offsetYElement: '#header', // オフセットY要素(id)(ヘッダーなどの高さを考慮する場合)
    offsetXElement: '#side', // オフセットX要素(id)(サイドバーなどの横幅を考慮する場合)
    maxAmount: 80, // 最大移動量 animationType01 のみ
    breakPoint: 800, // ブレークポイント(〜800px、801px〜)
    duration: 1000, // 移動時間ミリ秒(整数、0はnull扱い) animationType02 のみ
    ease: 'easeInOutCubic',// イージング ※ durationが設定されている時のみ使用 animationType02 のみ デフォルトはeaseOutQuart
    onComplete: () => false, // スクロール完了時のコールバック関数
    axis: 'y', // スムーススクロールを適応する軸(x or y or xy)
});

durationを設定しなければ、自動設定のanimationType01になる。

イージングはとりあえず以下の3つだけ用意した。

  • easeInOutCubic
  • easeOutExpo
  • easeOutQuart

今後改良したいこと

  • あまりテストしてないので、実際使っていく途中でバグが結構ありそう。なのでそれらの修正。
  • 個人的には必要ないと思うけど、ブロック要素にheightとoverflowを指定して、内容をスクロールさせる事にも、余裕があったら対応。
ページの先頭へ