1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ReactのuseRefでDOM操作をマスターしよう①

Last updated at Posted at 2025-08-31

useRefとは

Reactを使用した開発では、基本的に仮想DOMと状態管理 によってUIを操作します。しかし、時には「実際のDOM要素そのもの」にアクセスしたいケースがあります。そこで登場するのが useRef です。

今回は、DOMの情報をuseRefを使用してどのような値が取得できるのかをコンソールログを読み解きながら解説します。

useRefでDOM要素を参照する基本

まず、useRefでDOMを参照する基本的な書き方をおさらいしておきましょう。

import { useRef, useEffect } from "react";

export default function App() {
  const divRef = useRef<HTMLDivElement>(null);

  useEffect(() => {
    if (divRef.current) {
      console.log(divRef.current); // 実際のDOM要素が出力される
    }
  }, []);

  return <div ref={divRef}>Hello useRef!</div>;
}

このとき、divRef.current には 実際のDOM要素が格納されます。

コンソールログから見える「DOMの全貌」

実際に console.log(divRef.current) をすると、以下のように膨大な情報が表示されます。ピックアップしてみると

1.サイズや位置

要素の幅・高さ

divRef.current?.offsetWidth   // 要素の幅(border含む)
divRef.current?.offsetHeight  // 要素の高さ(border含む)

パディング込みのサイズ

divRef.current?.clientWidth   // パディング込みの幅(スクロールバー除く)
divRef.current?.clientHeight  // パディング込みの高さ(スクロールバー除く)

親要素からの位置

divRef.current?.offsetTop     // 親要素からのY座標
divRef.current?.offsetLeft    // 親要素からのX座標

スクロール関連

divRef.current?.scrollTop     // 縦方向のスクロール量
divRef.current?.scrollLeft    // 横方向のスクロール量
divRef.current?.scrollHeight  // 全体の高さ
divRef.current?.scrollWidth   // 全体の幅

2.クラスや属性

クラス情報

divRef.current?.className   // 要素に設定されているクラス名(文字列)
divRef.current?.classList   // 要素に設定されているクラス一覧

属性情報

divRef.current?.id          // 要素のID
divRef.current?.attributes  // 要素に設定されている属性ノードの一覧
divRef.current?.dataset     // data-* 属性の情報

3.テキストやHTML

テキスト系

divRef.current?.innerText    // 表示されているテキスト(改行・スタイルを考慮)
divRef.current?.textContent  // 生のテキスト(改行や非表示要素も含む)

HTML系

divRef.current?.innerHTML    // 子要素を含むHTML文字列

4. イベントハンドラ

イベントハンドラ参照

divRef.current?.onmouseover   // マウスオーバーイベント(デフォルトは null)
divRef.current?.onmouseleave  // マウスリーブイベント(デフォルトは null)
divRef.current?.onprogress    // プログレスイベント(デフォルトは null)

イベントリスナーの追加

divRef.current?.addEventListener("click", () => {
  alert("クリックされました!");
});

5. スタイル情報

スタイル参照

divRef.current?.style.backgroundColor  // インラインスタイルに直接アクセス

const style = getComputedStyle(divRef.current!) 
style.fontSize // 実際にブラウザで解釈されたフォントサイズ

6. フォーム

フォーム要素

inputRef.current?.value    // 入力値
inputRef.current?.checked  // チェックボックスの状態
inputRef.current?.files    // アップロードされたファイル

フォーカスや操作

divRef.current?.focus()          // フォーカスを当てる
divRef.current?.blur()           // フォーカスを外す
divRef.current?.scrollIntoView() // 要素までスクロール

7. その他 代表的な値・機能

親子関係

divRef.current?.parentElement      // 親要素
divRef.current?.children           // 子要素一覧
divRef.current?.firstElementChild  // 最初の子要素

位置計測

const rect = divRef.current?.getBoundingClientRect()
rect?.top    // 要素の上端位置
rect?.left   // 要素の左端位置
rect?.width  // 要素の幅
rect?.height // 要素の高さ

注意点

Reactの基本は状態管理と仮想DOMです。
そのため、useRefで直接DOMを操作するのは 例外的な用途に限定するのがおすすめです。
むやみに操作するとReactの再レンダリングの仕組みと衝突し、意図しない挙動になることがあります。

まとめ

useRef を使うと 実際のDOM要素 を参照できる
サイズ・位置・クラス・属性・イベントなど DOMの全情報を取得可能

Reactの基本はあくまで宣言的なUI操作ですが、「どうしても DOM に触りたいとき」こそ useRef の出番 です。

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?