旧ブログ(ISSEN)から移行しました

JavascriptでHTMLのdata属性を取得して、活用してみた。

JavascriptでHTMLのdata属性を取得して、活用してみた。

成岡拓哉
成岡拓哉4分で読めます

はじめに

こんにちは!株式会社TOKOSのフロントエンドエンジニアのタクヤです!
今回のテーマはJavaScriptでHTMLのdata属性を取得して、活用する方法です。

data属性はCSSやJavaScriptから直接取得や参照できるため、CSSとJavaScriptを簡単に連動させることができたり、DOM操作の幅がより広がります。
具体例として、「スクロールすると要素がふわっと下から順番に出てくるアニメーション」を実装しながら簡単に解説していきます。

対象となる方

  • HTMLやCSS、JavaScriptを勉強中の方
  • Web制作でコーディングをしている方
  • JavaScriptでHTMLのdata属性を取得してみたい方

data属性とは

data属性とは、正式にはカスタムデータ属性といい、HTMLの要素に任意の名前をつけたデータを持たせることができるものです。
冒頭でもお話したように、CSSやJavaScriptからこのデータを取得したり参照できます。

書き方はdata-*といった形で、必ずdata-から始まります。
data-endata-namedata-numberのような感じです。

HTML
<div class="c-box" data-number="1" data-time="500"></div>

詳しくはMDNの公式ドキュメントをご覧ください。

HTMLElement: dataset プロパティ - Web API | MDN

dataset は HTMLElement インターフェイスの読み取り専用プロパティで、要素に設定されたすべてのカスタムデータ属性 (data-*) への読み取り/書き込みアクセスを提供します。これは文字列のマップである (DOMStringMap) で、それぞれの data-* 属性の項目です。

developer.mozilla.org

実装

それでは実装に移っていきます。
具体例のスクロールすると要素がふわっと下から順番に出てくるアニメーションを実装するなかで、data属性を使っていきます。

HTML
<p class="c-description">↓下にスクロールしてください↓</p>
<div class="l-container">
  <div class="c-box" data-number="1" data-time="500"></div>
  <div class="c-box" data-number="2" data-time="700"></div>
  <div class="c-box" data-number="3" data-time="900"></div>
</div>

HTMLはこんな感じです。
3つ並んでるdivを作成し、クラス名とdata属性を与えます。
CSSでテキストを指定するためのdata-number、アニメーションに関する時間を指定するためにJavaScriptで取得したいのでdata-timeをそれぞれ指定します。

CSS
.l-container {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  margin-bottom: 200px;
}
 
.c-box {
  align-items: center;
  aspect-ratio: 1 / 1;
  background-color: #4eb99d;
  display: flex;
  justify-content: center;
  margin: 5px;
  min-width: 300px;
  opacity: 0;
  position: relative;
  transform: translateY(100px);
}
 
.c-box::before {
  content: attr(data-number);
  font-size: 40px;
  color: #fafafa;
}
 
.c-box.--active {
  opacity: 1;
  transform: translateY(0);
  transition: 1s;
}
 
.c-description {
  align-items: center;
  display: flex;
  height: 100vh;
  justify-content: center;
  margin-bottom: 200px;
  width: 100vw;
}

HTMLのdata属性data-numberで設定した値を、CSSの疑似要素(::before)のcontentにアクセスしています。

書き方は、attr(data-number)で、「そのCSSセレクタがあたっている要素のdata-number属性を参照する」といった具合です。
これでそれぞれの要素の上に、data-numberで指定した数字が表示されるようになります。

JavaScript
window.addEventListener("scroll", () => {
  document.querySelectorAll(".c-box").forEach((e) => {
    const rect = e.getBoundingClientRect()
    const winHeight = window.innerHeight
    // 要素がビューポート内に入ったら発火
    if (rect.top <= winHeight && rect.bottom >= 0) {
      window.setTimeout(() => {
        e.classList.add("--active")
      }, Number(e.dataset.time))
    }
  })
})

JavaScriptでは、まず.c-boxクラスを持つ要素をすべて取得します。
そして、getBoundingClientRect()を使って要素が画面内に現れたかを判定し、--activeクラスを付与してアニメーションするようにしています。

その際に、HTMLで指定したdata-timeというdata属性の数値をJavaScriptで取得して、アニメーションの開始時間に差が生まれるようにしています。
書き方は、[オブジェクト].dataset.timeです。

これで想定通りのスクロールアニメーションが実装できました。

まとめ

今回は、JavaScriptでHTMLのdata属性を取得して、活用する方法について参考例を用いて解説してきました!
data属性をJavaScriptで取得して活用するのはとても簡単です。
使えるようになればコーディングの幅が広がるのでぜひ使ってみてください。

Web制作におけるJavaScriptの基礎固め学習にはこちらの書籍がおすすめです。
是非ご覧になってJavaScriptの知識を深めていきましょう。

Amazon

Amazon

amzn.to

この記事を書いた人

成岡拓哉
成岡拓哉

TOKOSのフロントエンドエンジニア。企業サイトやLPの制作を担当しています。このブログではWeb制作初学者向けに、実務で役立つ知識を分かりやすく発信しています。ビールが好きです🍺