1. ASHIRIのふろんとあれ、なんだっけぇ
  2. なんだっけぇ一覧
  3. HTML/CSS
  4. 今更ながらスムーススクロール。まさかのCSS1行でもスムーススクロールが可能になった!?

今更ながらスムーススクロール。まさかのCSS1行でもスムーススクロールが可能になった!?

CATEGORY : HTML/CSS
今更ながらスムーススクロール。まさかのCSS1行でもスムーススクロールが可能になった!? 今更ながらスムーススクロール。まさかのCSS1行でもスムーススクロールが可能になった!?
今回は今更感はありますが、CSSのみでスムーススクロールができるプロパティ【scroll-behavior】をご紹介させていただきます。レガシーな時代よりフロント業務に携わる我々世代には驚きのプロパティですね。またせっかくなので、CSSだけのご紹介ですと味気ない記事となりますので、今更jQueryと今更JavaScriptのスムーススクロールの実現方法もご紹介させていただきます。
目次

    scroll-behaviorプロパティとは?

    scroll-behaviorプロパティは、結論からいいますとJSの力を使うことなく、CSSのみでスムーススクロールを実現できるプロパティです。scroll-behaviorのオプション指定も簡単です。

    
    html {
      scroll-behavior: smooth;
    }
    

     

    オプションについて

    • auto : スクロールというか、HTML5以前のアニメーションのない通常のアンカー動作

    • smooth : 遷移先へスムーススクロール動作

    • instant : 挙動はautoと同じ?必要なオプションだったのかな・・

     

    対応ブラウザについて

    当たり前の事ではありますが、最新ブラウザがサポート対象です。

     

    使用時の注意点

    速度やイージングの指定・調整はできませんが、あくまでjavaScriptやjQueryなく、CSSたった1行でスムーススクロールをサイト内に取り入れる事ができるので十分な動作かと思います。またURLにアンカーがつきます。アンカーを付与したくない・クライアントチェックでペケとなる場合は、Jsライブラリか生のjavaScriptでスクロールを設置したほうがよいでしょう。

     

    JSライブラリ【jQuery】でスムーススクロール

    せっかくですので、CSSのscroll-behaviorプロパティだけでなく、従来より利用されている
    jQueryによるスムーススクロールアニメーションについても紹介させていただきます。

    
    $(function(){
      $('a[href^="#"]').click(function(){
        event.preventDefault();
        var speed = 400;
        var href= $(this).attr("href");
        var target = $(href == "#" || href == "" ? 'html' : href);
        var targetY = target.offset().top;
        $('body,html').animate({scrollTop:targetY}, speed, 'swing');
        return false;
      });
    });

     

    よくある書き方です。scroll-behaviorプロパティとの違いは、速度や移動先の止まる高さを調整できる点ですね。ちなみに止まる高さを調整したい場合は、.offset()で取得した移動数値に高さ分引き算するだけです。下記に記載しておきます。
    ヘッダーをfixedとして、ナビゲーションをページ内追走する場合に取り入れる事はよくある手法ですね。

     

    
      $(function(){
        $('a[href^="#"]').click(function(){
          event.preventDefault();
          var speed = 400;
          var adjustment = 0;// 移動先調整用
          var href= $(this).attr("href");
          var target = $(href == "#" || href == "" ? 'html' : href);
          var targetY = target.offset().top - adjustment;
          $('body,html').animate({scrollTop:targetY}, speed, 'swing');
          return false;
        });
      });

     

     

    【javaScript】でスムーススクロール

    せっかくですので、CSSのscroll-behaviorプロパティだけでなく、javaScriptによるスムーススクロールについても紹介させていただきます。

    
    const smoothScrolls = document.querySelectorAll('a[href^="#"]');
    smoothScrolls.forEach((smoothScroll) =>{
      smoothScroll.addEventListener('click', (e) => {
        e.preventDefault();
        let href = smoothScroll.getAttribute('href');
        let targetSec = document.querySelector(href);
        const sectionTop = targetSec.getBoundingClientRect().top;
        const currentLoc = window.scrollY;
        const target = sectionTop + currentLoc;
        window.scrollTo({
          top: target,
          behavior: 'smooth',
        });
      });
    });

     

    以前Reactのアプリ開発時に、スムーススクロールを入れる事がありました。scroll-behaviorで楽勝楽勝と進めているとあるあるの仕様変更からのヘッダーfixedによる高さ調整の壁にあたりJSだなと。。
    作業中、脱jQueryの波はどんどん迫ってくるなと感じました。念のため、上記のjQueryと同じヘッダーの高さ分を調整する場合は下記になります。

     

    
    const smoothScrolls = document.querySelectorAll('a[href^="#"]');
    smoothScrolls.forEach((smoothScroll) =>{
      smoothScroll.addEventListener('click', (e) => {
        e.preventDefault();
        let href = smoothScroll.getAttribute('href');
        let targetSec = document.querySelector(href);
        const sectionTop = targetSec.getBoundingClientRect().top;
        const currentLoc = window.scrollY;
        const adjustment = 0;// 移動先調整用
        const target = sectionTop + currentLoc - adjustment;
        window.scrollTo({
          top: target,
          behavior: 'smooth',
        });
      });
    });

     

     

    まとめ

    いかがでしたでしょうか。今回はスムーススクロールについて紹介させていただきました。CSS1行で実現できるスムーススクロールアニメーション。技術の進歩を感じます。

    以上となります。できる限りわかりやすく伝えようとしても書くのは難しいです。
    コードや記事の書き方について気になるところがあれば、アドバイスいただけると嬉しいです。

     

    今更ながらスムーススクロール。まさかのCSS1行でもスムーススクロールが可能になった!?
    CATEGORY : HTML/CSS

    アシリソリューション

    アシリソリューション

    アシリ・ソリューション

    要件定義からブラッシュアップ/実装運用まで一貫して担当。また内部対策を中心に、GTM・GA4・Looker Studioと分析・改善案の策定も進めています。北緯43度マルチエンジニア

    最近のなんだっけぇ

    1. 【javascript基礎】自動見積フォームの仕組みを理解する

      【javascript基礎】自動見積フォームの仕組みを理解する

    2. 【Node基礎】APIエンドポイントの保護を理解する

      【Node基礎】APIエンドポイントの保護を理解する

    3. 【Node基礎】RESTful API を理解する

      【Node基礎】RESTful API を理解する

    4. 【Vue基礎】Vue Routerのネストを理解する

      【Vue基礎】Vue Routerのネストを理解する

    5. 【Vue基礎】v-onディレクティブを理解する

      【Vue基礎】v-onディレクティブを理解する

    6. 【Vue基礎】v-modelディレクティブを理解する

      【Vue基礎】v-modelディレクティブを理解する

    1. API
    2. computed
    3. css
    4. ECMA
    5. javascript
    6. jquery
    7. Node
    8. php
    9. reactive
    10. reduce メソッド
    11. ref
    12. sass
    13. SSH
    14. v-bind
    15. v-on
    16. Vue
    17. Vディレクティブ
    18. wordpress
    19. セキュリティ対策
    20. 入れ子
    21. 繰り返し処理
    22. 関数