部品を選ぶ
この場面の困り事と、そのまま使えるコード。全16件。 足りなければ、行末のページへ進む。
このページの中だけを絞ります。ページは移りません。
ボタンとリンクのどちらを使うか迷う
画面が移動するならリンク、その場で何かが起きるならボタン。見た目ではなく動作で決める。ボタンとリンク
<a href="/about">詳しく見る</a>
<button type="button">設定を保存</button>ボタンの種類をいくつ用意するか
主・副・控えめの3種で足りる。1画面に主ボタンは1つ。ボタンとリンク
.button--primary { background: var(--color-accent-text); color: var(--color-on-accent); }
.button--secondary { border-color: var(--color-accent-text); } /* 枠は地に対して 3:1 */
.button--ghost { background: transparent; color: var(--color-text-muted); }ボタンの文言が決まらない
押すと何が起きるかを書く。「送信」より「見積もりを依頼する」。UXライティング
<button type="submit">見積もりを依頼する</button>押せる大きさをいくつにするか
44×44を目安にする。WCAG 2.2 の下限は24×24。見た目が小さくても当たり判定を広げれば足りる。ボタンとリンク
.icon-button { position: relative; } /* 見た目は小さいまま */
.icon-button::after {
content: "";
position: absolute;
inset: 50% auto auto 50%;
inline-size: 2.75rem;
block-size: 2.75rem;
translate: -50% -50%;
}
/* 基底の .button は 44px を持っている。広げるのは小さく見せる的だけ */選択肢をどの部品で出すか迷う
2〜5個で全部見せたいならラジオ、6個以上ならセレクト、複数選べるならチェックボックス。選択
<!-- 2〜5個 -->
<fieldset><legend>プラン</legend><label><input type="radio" name="plan"> 基本</label></fieldset>
<!-- 6個以上 -->
<label>都道府県 <select name="pref"></select></label>トグルとチェックボックスのどちらか
その場で即座に反映されるならトグル、保存を押して確定するならチェックボックス。選択
<!-- 即反映 -->
<label><input type="checkbox" role="switch"> 通知を受け取る</label>
<!-- 保存で確定 -->
<label><input type="checkbox" name="opt"> メール配信に同意</label>モーダルとドロワーのどちらにするか
作業を止めてよいならモーダル、元の画面を見ながら操作させたいならドロワー。迷ったらページ遷移。重ねる
<dialog class="modal">...</dialog>
<aside class="drawer" hidden>...</aside>モーダルを閉じたあと操作位置を見失う
閉じたときに、開く前にフォーカスがあった要素へ戻す。押した場所に戻れないと現在地を見失う。キーボードで使える
const trigger = document.activeElement;
dialog.showModal();
dialog.addEventListener('close', () => trigger.focus());通知が見落とされる、または、うるさい
気づかなくてよいものは控えめに出し、操作を止めるべきものだけ読み上げにも割り込ませる。知らせる
<div role="status" aria-live="polite" class="toast">保存しました</div>
<div role="alert" aria-live="assertive" class="alert">入力内容を確認してください</div>トーストを何秒で消すか
読む時間+2秒。消えると困る情報はトーストに載せない。知らせる
const ms = text.length * 50 + 2000;
setTimeout(() => toast.remove(), ms);データが0件のときの画面がない
読み込み中・空・エラー・正常の4つを必ず作る。空の画面には最初の操作への導線を置く。4つの状態
<section class="empty-state" aria-labelledby="empty-title">
<h2 id="empty-title">まだデータがありません</h2>
<a class="button button--primary" href="/new">最初の1件を追加</a>
</section>読み込み中の表示をどうするか
回転する印より、これから出る形をかたどった枠のほうが待ち時間を短く感じる。4つの状態
<div class="skeleton" aria-busy="true" aria-label="読み込み中">
<div class="skeleton__line"></div>
<div class="skeleton__line"></div>
</div>タブとアコーディオンのどちらにするか
同時に1つだけ見せたいならタブ、複数を開いて見比べたいならアコーディオン。ナビゲーション
<!-- 1つだけ -->
<div role="tablist">...</div>
<!-- 複数開く -->
<details><summary>詳細</summary>...</details>パンくずは必要か
階層が3段以上あるなら置く。1〜2段なら戻る導線で足りる。ナビゲーション
<nav aria-label="パンくず">
<ol><li><a href="/">ホーム</a></li><li aria-current="page">料金</li></ol>
</nav>ページ送りと無限スクロールのどちらか
探して戻るならページ送り、眺めるだけなら無限スクロール。フッターに用があるなら無限にしない。ナビゲーション
<nav aria-label="ページ送り">
<a href="?page=1">前</a> <span aria-current="page">2</span> <a href="?page=3">次</a>
</nav>カードにするかリストにするか
画像が主役ならカード、比べさせるならリスト。カードは1画面に入る数が減る。構図のパターン
.list { display: flex; flex-direction: column; gap: var(--space-3); }
.cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr)); gap: var(--space-5); }この場面の値をまとめて決めるなら作業台へ。和文の予約ページに載せて、幅と明暗を替えて確かめてから CSS を持ち帰る: 影
この場面で貼れるもの#
答えを読んだら、ここから完成形を持ち帰れます。