LoginSignup
0
0

More than 3 years have passed since last update.

aタグを使ってHTMLでページ内リンクをスムーズスクロールさせる

Last updated at Posted at 2020-12-09

はじめに

タイトルについて記事にしました。
この記事で得る内容は以下の通りです。

・ HTML及び、JavaScriptの知識が増える
・ a要素を使ってHTMLでページ内リンクをスムーズスクロールさせる方法

下記の様に、ヘッダーに各コンテンツのリンク先を掲載する場合です。

screencapture-localhost-3000-2020-12-09-11_17_10.png

haml

リンク先にidを割り振ります。

index.haml
.container-top#HOME
.container-profile#ABOUT
.container-skill#SKILLS
.container-works#WORKS
.container-contact#CONTACT

ヘッダーのa要素に、href属性で先ほど割り振った各リンク先のidを書きます。

index.haml
.header
  %a(href="#HOME") HOME
  %a(href="#ABOUT") ABOUT
  %a(href="#TEXT") TEXT
  %a(href="#WORKS") WORKS
  %a(href="#CONTACT") CONTACT

これでaタグをクリックすると、割り当てたリンク先にスクロールしますが
瞬時にスクロールしてしまい、あまり面白みがない様に感じます。

スムーズスクロールさせるには、CSSを使うか、JavaScriptを使う2種類の方法があります。

html要素にscroll-behavior: smooth;を適用する

導入がとても簡単ですが、ページ内リンクが全てスムーズスクロールになってしまい、スクロール速度の微調整ができません。

index.scss
html {
  scroll-behavior: smooth;
}

JavaScriptでスムーズスクロールさせる

先程のhamlのa要素にクラスsmoothScrollを付与します。

index.haml
.header
  %a.smoothScroll(href="#HOME") HOME
  %a.smoothScroll(href="#ABOUT") ABOUT
  %a.smoothScroll(href="#TEXT") TEXT
  %a.smoothScroll(href="#WORKS") WORKS
  %a.smoothScroll(href="#CONTACT") CONTACT

クラスsmoothScrollがあるか判定し、ない場合は処理を中断します。

scrpit.js
document.addEventListener("click", (e) => {
  const target = e.target;
  if (!target.classList.contains("smoothScroll")) return;
  e.preventDefault();
  const targetId = target.hash;
  document.querySelector(targetId).scrollIntoView({
    behavior: "smooth",
    block: "start",
  });
});

参考:どちらの方法も対応ブラウザがchromeとFirefoxにほぼ限られてしまう点には注意とのことです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0