「現在の画面幅を取得する」はレスポンシブUIの出発点です
業務システムやWebアプリケーションでは、 「画面の幅に応じてUIの挙動を変えたい」というニーズが非常に多いです。
- 画面幅が狭いときはサイドバーを自動的に閉じたい
- 一定幅以下ではテーブルをカード表示に切り替えたい
- スマホサイズではボタンを縦並びにしたい
- グラフのラベル数を画面幅に応じて減らしたい
こうした「レスポンシブな挙動」をJavaScriptで制御するための第一歩が、 「現在の画面幅を正しく取得するユーティリティ」です。
この記事では、プログラミング初心者の方にも分かるように、
- 画面幅の「どの値」を使うべきか
- シンプルな取得方法と注意点
- 実務で使える共通ユーティリティの作り方
- ブレークポイントとの連携例
- リサイズイベントとの組み合わせ方(負荷対策も含めて)
をステップバイステップで解説していきます。
まず「どの幅を取るのか」を整理する
画面幅にはいくつか種類があります
JavaScriptで「幅」を扱うとき、実は複数の候補があります。
window.innerWidthブラウザのビューポート(表示領域)の幅。スクロールバーを含む場合もあります。document.documentElement.clientWidth<html>要素のクライアント幅。スクロールバーを除いた値になることが多いです。screen.width物理ディスプレイの幅。ブラウザのウィンドウ幅とは別物です。
レスポンシブUIで一般的に使うのは、 「ビューポートの幅」=window.innerWidth または document.documentElement.clientWidth です。
初心者の方は、まず次のように覚えておくとよいです。
「画面の表示領域の幅を知りたいときは、
window.innerWidthを使う」
シンプルな例:現在の画面幅をコンソールに出す
const width = window.innerWidth;
console.log("現在の画面幅:", width, "px");
JavaScriptこれだけで、今のビューポート幅を取得できます。
ステップ1:現在の画面幅を取得する共通ユーティリティを作る
毎回 window.innerWidth を直接書いてもよいのですが、 業務システムでは「幅の取得ロジック」を共通化しておくと便利です。
基本的なユーティリティ関数
// viewport-utils.js
export function getViewportWidth() {
// 将来の拡張やブラウザ差異を吸収するために関数化しておく
return window.innerWidth || document.documentElement.clientWidth;
}
JavaScript使い方のイメージ
import { getViewportWidth } from "./viewport-utils.js";
const width = getViewportWidth();
console.log("現在の画面幅:", width, "px");
JavaScriptポイント:関数化しておくことで、 「画面幅を知りたいときは必ずこの関数を使う」というルールを作れます。 後から仕様を変えたいときも、この関数だけを修正すれば済みます。
ステップ2:ブレークポイントと組み合わせて「状態」を判定する
画面幅を取得したら、次にやりたくなるのは、
「今はスマホサイズか?タブレットサイズか?PCサイズか?」
という判定です。
ブレークポイントを定義する
CSSのメディアクエリと同じように、JavaScript側でもブレークポイントを定義できます。
// viewport-utils.js
const BREAKPOINTS = {
mobile: 480,
tablet: 768,
desktop: 1024,
};
export function getViewportWidth() {
return window.innerWidth || document.documentElement.clientWidth;
}
export function getViewportCategory() {
const width = getViewportWidth();
if (width <= BREAKPOINTS.mobile) {
return "mobile";
} else if (width <= BREAKPOINTS.tablet) {
return "tablet";
} else if (width <= BREAKPOINTS.desktop) {
return "desktop";
} else {
return "large";
}
}
JavaScript使い方例:カテゴリに応じて挙動を変える
import { getViewportCategory } from "./viewport-utils.js";
const category = getViewportCategory();
console.log("現在の画面カテゴリ:", category);
if (category === "mobile") {
console.log("モバイル向けレイアウトを適用します");
} else if (category === "tablet") {
console.log("タブレット向けレイアウトを適用します");
} else {
console.log("デスクトップ向けレイアウトを適用します");
}
JavaScriptポイント:画面幅そのものだけでなく、 「幅から導かれるカテゴリ(mobile / tablet / desktop)」をユーティリティで判定しておくと、 UIロジック側がシンプルになります。
ステップ3:リサイズイベントと組み合わせて「変化」を検知する
現在の画面幅を一度取得するだけでなく、 「幅が変わったときに処理をしたい」 という場面も多いです。
例えば、
- 画面幅が一定以下になったらサイドバーを自動的に閉じる
- 幅が広くなったらテーブル表示に戻す
- グラフのラベル数を再計算する
などです。
シンプルなリサイズイベントの例
import { getViewportWidth, getViewportCategory } from "./viewport-utils.js";
window.addEventListener("resize", () => {
const width = getViewportWidth();
const category = getViewportCategory();
console.log("画面幅が変わりました:", width, "px", "カテゴリ:", category);
});
JavaScript注意点:リサイズイベントは頻繁に発火します
resize イベントは、ユーザーがウィンドウサイズを変えている間、 非常に高頻度で発火します。
そのたびに重い処理(レイアウト再計算、API呼び出しなど)を行うと、 パフォーマンスに悪影響が出ることがあります。
そこで、 「デバウンス(一定時間内の連続イベントをまとめる)」 というテクニックを使うことがよくあります。
ステップ4:デバウンス付きの画面幅監視ユーティリティを作る
デバウンスの基本的な考え方
デバウンスとは、
「イベントが連続して発生したとき、最後の1回だけ処理する」
という仕組みです。
リサイズイベントに対してデバウンスをかけることで、
- ユーザーがウィンドウを動かしている間は処理を待ち
- 動かし終わったタイミングで1回だけ処理する
という挙動にできます。
デバウンス付きユーティリティの例
// viewport-utils.js
const BREAKPOINTS = {
mobile: 480,
tablet: 768,
desktop: 1024,
};
export function getViewportWidth() {
return window.innerWidth || document.documentElement.clientWidth;
}
export function getViewportCategory() {
const width = getViewportWidth();
if (width <= BREAKPOINTS.mobile) {
return "mobile";
} else if (width <= BREAKPOINTS.tablet) {
return "tablet";
} else if (width <= BREAKPOINTS.desktop) {
return "desktop";
} else {
return "large";
}
}
export function onViewportChange(callback, delay = 200) {
if (typeof callback !== "function") return;
let timerId = null;
const handler = () => {
if (timerId) {
clearTimeout(timerId);
}
timerId = setTimeout(() => {
const width = getViewportWidth();
const category = getViewportCategory();
callback({ width, category });
}, delay);
};
window.addEventListener("resize", handler);
// 初期状態も一度通知しておく
callback({
width: getViewportWidth(),
category: getViewportCategory(),
});
// 解除用の関数を返す
return () => {
window.removeEventListener("resize", handler);
if (timerId) {
clearTimeout(timerId);
}
};
}
JavaScript使い方例:サイドバーの開閉を画面幅に応じて制御する
import { onViewportChange } from "./viewport-utils.js";
document.addEventListener("DOMContentLoaded", () => {
const sidebar = document.getElementById("sidebar");
if (!sidebar) return;
const unsubscribe = onViewportChange(({ width, category }) => {
console.log("画面幅:", width, "カテゴリ:", category);
if (category === "mobile") {
sidebar.classList.add("is-collapsed");
} else {
sidebar.classList.remove("is-collapsed");
}
});
// 例:画面破棄時に解除したい場合
// unsubscribe();
});
JavaScriptポイント:onViewportChange のようなユーティリティを用意しておくと、 「画面幅の変化に応じて何かしたい」というニーズに対して、 毎回 resize イベントとデバウンス処理を書く必要がなくなります。
ステップ5:CSSメディアクエリとの役割分担を意識する
レスポンシブ対応は、CSSだけでもかなりのことができます。
@media (max-width: 768px) {
.sidebar {
display: none;
}
}
では、 「画面幅をJavaScriptで取得する意味は何か?」 という点も整理しておきます。
CSSでやるべきこと
- レイアウト(フレックス方向、グリッド構造など)の切り替え
- フォントサイズや余白の調整
- 要素の表示・非表示(単純なケース)
JavaScriptでやるべきこと
- 画面幅に応じて「ロジック」を変える
- 例:APIのページサイズを変える
- 例:グラフのラベル数を変える
- UI状態を画面幅に応じて変更する
- 例:サイドバーの開閉状態を変える
- 例:コンポーネントの初期状態を変える
ポイント:CSSは「見た目」、JavaScriptは「挙動・ロジック」という役割分担を意識すると、 画面幅取得ユーティリティの使いどころがはっきりします。
ステップ6:業務システムでの具体的な活用シナリオ
最後に、業務・実務で「現在の画面幅を取得するユーティリティ」が役立つ具体例をいくつか挙げます。
例1:一覧画面の表示モード切り替え
- デスクトップではテーブル表示
- モバイルではカード表示
import { getViewportCategory } from "./viewport-utils.js";
function renderList(items) {
const category = getViewportCategory();
if (category === "mobile") {
renderAsCards(items);
} else {
renderAsTable(items);
}
}
JavaScript例2:グラフのラベル数を画面幅に応じて調整
import { getViewportWidth } from "./viewport-utils.js";
function getLabelCount() {
const width = getViewportWidth();
if (width < 600) {
return 5;
} else if (width < 900) {
return 10;
} else {
return 20;
}
}
JavaScript例3:ダッシュボードのウィジェット配置を変える
import { getViewportCategory } from "./viewport-utils.js";
function layoutDashboard() {
const category = getViewportCategory();
if (category === "mobile") {
// 1列レイアウト
} else if (category === "tablet") {
// 2列レイアウト
} else {
// 3列レイアウト
}
}
JavaScriptまとめ:「現在の画面幅を取得するユーティリティ」はレスポンシブな業務UIの土台です
現在の画面幅を取得するJavaScriptユーティリティを整えておくことで、
- 画面幅そのもの(
getViewportWidth) - 幅から導かれるカテゴリ(
getViewportCategory) - 幅の変化をデバウンス付きで監視する仕組み(
onViewportChange)
を共通の形で扱えるようになります。
その結果、
- サイドバーの開閉
- 一覧表示モードの切り替え
- グラフやダッシュボードのレイアウト調整
といったレスポンシブな挙動を、 業務システム全体で一貫したルールのもとに実装できるようになります。
「現在の画面幅を取得する」という一見シンプルなユーティリティは、 「画面サイズに応じてUIとロジックを賢く切り替えるための入り口」です。
この入り口を、きちんとした共通ユーティリティとして整えておくことが、 長期運用される業務Webアプリケーションにとって、とても大切な基盤づくりだと言えます。

