UI/UX デザインの基礎
この部の 6 / 9 章 ・ 全体で 39 / 76 章 ・ 読了目安 40 分
- 「なんか使いにくい」を言語化してデザイナーと話せる
- 空・読み込み中・エラーを含む5つの状態を設計できる
- 色だけに頼らない、正しい HTML で作れる
「デザインはデザイナーの仕事です」——半分は正しく、半分は間違いです。
実際には、エンジニアが毎日デザインの判断をしています。
□ エラーが起きた時、画面に何と出すか
□ 読み込み中に何を見せるか
□ データが0件の時、真っ白な画面でいいのか
□ ボタンを押した後、押せたことがどう伝わるか
□ この確認ダイアログは本当に必要か
デザインカンプに描かれているのは「うまくいった時」だけです。 それ以外の状態は、たいていエンジニアが決めています。
この章のゴールは、デザイナーになることではありません。 「なんか使いにくい」を言語化でき、デザイナーと同じ言葉で話せるようになることです。
UI と UX は別のもの
混同されがちですが、指しているものが違います。
| 意味 | 例 | |
|---|---|---|
| UI(User Interface) | 利用者が触れる部分そのもの | ボタン、フォーム、配色、レイアウト |
| UX(User Experience) | 利用者が得た体験の全体 | 目的を達成できたか、迷わなかったか、また使いたいか |
UI は UX の一部です。そして——
見た目が美しくても、UX が最悪なことはあります。
美しいが最悪な例:
□ 送信ボタンが洗練されているが、押した後に何も起きたように見えない
□ 配色は綺麗だが、エラーの理由が書かれていない
□ アニメーションが滑らかだが、1操作ごとに0.5秒待たされる
性能と負荷対策は、デザインの章ではありません。しかし利用者にとって、 「遅い」は「使いにくい」と同じです。
表示に3秒かかる美しい画面 < 0.3秒で出る素っ気ない画面
エンジニアが UX に最も大きく貢献できるのは、実は速度です。 デザイナーには手が出せない領域だからです。
使いやすさは、好みではない
「使いやすい」は主観的に見えますが、確立された原則があります。 その中で、実装時に効くものを挙げます。
1. 今どうなっているかが分かる(システム状態の可視性)
✕ ボタンを押した。何も起きない。もう一度押す。二重登録される
○ ボタンを押した。ボタンが「送信中…」になり、押せなくなる。完了後にメッセージが出る
押した結果が見えないのが、最も多いバグです。 これは実装の問題であり、デザインの問題でもあります。
2. 現実世界の言葉で書く
✕ エラーコード: E_VALIDATION_FAILED_0x21
✕ 「不正なリクエストです」
○ 「メールアドレスの形式が正しくありません(例: name@example.com)」
画面に出す文字は、システムの都合ではなく利用者の言葉で書きます。
3. 引き返せる(ユーザーによる制御と自由)
□ 間違えた時に取り消せるか
□ 途中でやめられるか
□ 削除の前に確認があるか、あるいは元に戻せるか
「本当に削除しますか?」——これは効果が薄いことが知られています。 人は読まずに OK を押すからです。
△ 削除前に確認する → 読まずに押される
◎ 削除後に「元に戻す」を出す → 間違えても取り返せる
Gmail の「送信を取り消す」が良い例です。 防ぐより、戻せるようにするほうが強い——この考え方は、後の 間違えられない処理を作るでも出てきます。
4. 一貫性がある
同じ意味のものは、同じ見た目・同じ場所・同じ言葉にします。
✕ ある画面では「保存」、別の画面では「登録」、また別では「確定」
✕ ある画面では右下に主ボタン、別の画面では左下
利用者は、毎回考え直すことになります。
5. 記憶させない(認識 > 想起)
✕ 「先ほど入力した ID を入力してください」
○ 選択肢として一覧から選ばせる
思い出させるより、見せて選ばせるほうが速く、間違いません。
6. エラーからの回復を助ける
✕ 「エラーが発生しました」
○ 「メールアドレスは既に登録されています。ログインしますか?」
エラーメッセージに必要なのは3つです。
1. 何が起きたか
2. なぜ起きたか
3. 次に何をすればいいか ← これが抜けているものが非常に多い
レイアウトの4原則
デザインの教科書(『ノンデザイナーズ・デザインブック』が有名)で必ず出てくる4つです。 これを知っているだけで、素人くささが消えます。
| 原則 | 中身 |
|---|---|
| 近接 | 関係あるものを近くに、無関係なものを離す。余白がグループを作る |
| 整列 | 端を揃える。見えない線に沿わせる |
| 反復 | 同じ要素は同じ見た目を繰り返す |
| 対比 | 重要なものを、はっきり目立たせる。中途半端が一番悪い |
近接 — 余白は「装飾」ではなく「意味」
✕ ラベル
(広い余白)
入力欄 ← どのラベルの入力欄か分かりにくい
○ ラベル
入力欄 ← 近い=関係がある
(広い余白)
ラベル
入力欄
要素の間隔は、関係の強さを表しています。
margin を適当に付けると、意図しない意味が生まれます。
整列 — 揃っていないものは目につく
✕ ┌──────────┐
│ タイトル │
│ 本文が少しずれている │
│ ボタン │
└──────────┘
○ ┌──────────┐
│ タイトル │
│ 本文 │
│ ボタン │
└──────────┘
CSS では、個別に margin を足していくのではなく、
親側で gap を使うと自然に揃います。
新人が作る画面は、ほぼ例外なく詰まりすぎです。
□ 要素同士がくっついている
□ 文字が枠の端にぴったり接している
□ 情報を1画面に詰め込もうとしている
余白を増やすと、それだけで整って見えます。 そして、余白は 4px / 8px / 16px / 24px のように倍数で揃えると破綻しません。
色と文字
色は「意味」で決める
□ 主要な操作 → 目立つ色(1画面に1つが原則)
□ 破壊的な操作 → 赤系
□ 成功 → 緑系
□ 警告 → 黄・橙系
□ それ以外 → 無彩色
「1画面に主ボタンは1つ」 が守られていないと、利用者はどれを押すべきか分かりません。
✕ 必須項目を赤い文字にしただけ
○ 赤くする + 「必須」と書く + アイコンを付ける
日本人男性の約20人に1人は、色の見え方が多数派と異なります。 赤と緑の区別が付きにくい場合、「赤い項目が必須です」は伝わりません。
グラフも同じで、色分けだけの凡例は読めない人がいます。 線の種類を変える、直接ラベルを置く、といった手当てが要ります。
コントラストは測れる
「読みにくい」は感覚ではなく、数値で判定できます。
WCAG(W3C のアクセシビリティ指針)の基準
通常の文字 コントラスト比 4.5:1 以上
大きい文字 3:1 以上
薄いグレーの文字(#999 を白背景に置くなど)は、基準を満たしません。
ブラウザの開発者ツールで色を選ぶと、コントラスト比が表示されます。
文字
以下は経験則としての目安です(WCAG のような適合要件ではありません。 最終的には実機と利用者で確認してください)。
□ 本文は 16px 以上(スマホで小さいと読めない)
□ 行間は 1.5〜1.8 倍(日本語は英語より行間が要る)
□ 1行の長さは 30〜40 文字程度(長すぎると目が戻れない)
□ フォントサイズの種類を増やしすぎない(4〜5段階で足りる)
日本語には単語の区切りに空白がなく、漢字の情報量が多いため、 英語向けの行間設定をそのまま使うと詰まって見えます。
海外製のテンプレートをそのまま使うと読みにくくなるのは、これが理由です。
line-height を上げるだけで、かなり改善します。
状態の設計 — ここがエンジニアの本番
デザインカンプにはたいてい**「データがある、成功した状態」しか描かれていません**。 残りは実装者が決めることになります。
1つの画面には、最低でも5つの状態があります。
| 状態 | 何を見せるか | 手を抜くとどうなるか |
|---|---|---|
| 空(Empty) | まだデータが無い。次に何をすべきかを示す | 真っ白な画面。壊れたと思われる |
| 読み込み中(Loading) | 処理中であること | 固まったと思われ、連打される |
| エラー(Error) | 何が起きたか、次にどうするか | 「エラーが発生しました」だけで詰む |
| 部分的(Partial) | 一部だけ取得できた | 全部エラー扱いにしてしまう |
| 理想(Ideal) | 通常のデータ表示 | ここだけ作って終わりにしがち |
初めて使う人が最初に見るのは、必ず空の状態です。
✕ 「データがありません」
○ 「まだ登録がありません。最初の1件を追加してみましょう」+ 追加ボタン
空の画面は、使い方を教える最高の場所です。 「データがありません」で終わらせるのは、初回体験を捨てているのと同じです。
待ち時間の目安です(厳密な基準ではなく、経験則です)。
□ 100ms 未満 → 何も出さない(点滅がかえって鬱陶しい)
□ 〜1秒 → スピナー
□ 1秒以上 → スケルトン(表示される形の枠)や進捗を出す
□ 10秒以上 → 進捗の割合、キャンセル手段
そして、押したボタンは無効化する。ただし、これは操作感の改善であって、安全策ではありません。
画面側で連打を防ぐ → 誤操作は減る
サーバー側で守る → こちらが本体
利用者は再読み込みできますし、タブを2つ開けますし、通信が切れれば再送もします。 同じ処理が2回届いても結果が壊れないようにするのはサーバー側の責任です (これを冪等といいます。詳しくは 間違えられない処理を作るで扱います)。
フォーム
入力フォームは、最も嫌われる UIです。だからこそ差が出ます。
□ 入力欄は必要最小限にする(1つ減らすごとに完了率が上がる)
□ ラベルはプレースホルダで代用しない(入力すると消えて分からなくなる)
□ 入力形式を勝手に制限しない(電話番号のハイフン、全角半角はこちらで吸収する)
□ エラーは、その項目のすぐ横に出す(上部にまとめて出すと、どれが悪いか分からない)
□ 検証のタイミングは「入力中」ではなく「離れた時」(打っている最中に赤くしない)
□ 入力途中の内容を失わせない(エラーで全部消えるのが最悪)
サーバー側の検証でエラーになった時、入力内容を保持して返すのは実装者の責任です。
10項目を埋めて送信 → エラー → 全部空、という体験をすると、 利用者はその画面を二度と触りたくなくなります。
これは見た目の問題ではなく、完全に実装の問題です。
アクセシビリティ
「障害のある人のための特別対応」ではありません。 誰にとっても使いやすくする話であり、多くは HTML を正しく書くだけで満たせます。
□ 見出しは h1 → h2 の順に使う(見た目のために h3 から始めない)
□ ボタンは <button>、リンクは <a>(div にクリックを付けない)
□ 画像には alt を書く(装飾なら alt="" と明示する)
□ フォームの label と入力欄を紐づける
□ キーボードだけで操作できる(Tab で回れるか、フォーカスが見えるか)
□ 色以外でも情報が伝わる
<!-- 悪い -->
<div onclick="submit()">送信</div>
<!-- 良い -->
<button type="submit">送信</button><button> にすると、キーボードで押せる・読み上げソフトが「ボタン」と認識する・
フォーカスが当たるが全部ついてきます。
<div> で作ると、それを全部自分で実装し直すことになります。
HTML と CSSで扱ったセマンティックな HTMLが、そのままアクセシビリティです。
日本では2024年4月から、民間事業者にも「合理的配慮の提供」が義務化されました。 Web アクセシビリティ自体は努力義務ですが、 公共性の高いサービスでは JIS X 8341-3(WCAG に対応)への準拠が求められることがあります。
詳しくはエンジニアと法律を参照してください。
デザイナーと働く
何を渡され、何を返すか
デザイナーから Figma のデザイン、コンポーネントの定義、遷移の意図
あなたから 技術的な制約、状態の網羅、実データを入れた結果
デザインカンプは、都合のよいデータで作られています。
□ 名前が「山田太郎」ではなく、40文字の会社名だったら
□ 商品名が2行に折り返したら
□ 金額が8桁になったら
□ 一覧が0件だったら / 10000件だったら
□ 画像が無い商品があったら
これらは実装して初めて分かることで、エンジニアにしか報告できません。 「崩れたので勝手に直しました」ではなく、 スクリーンショットを付けて相談するのが最も早い解決です。
デザインシステム
ボタン・入力欄・色・余白のルールをまとめたものです。
□ 同じ用途には同じ部品を使う(勝手に新しいボタンを作らない)
□ 色や余白は、定義されたトークン(変数)から選ぶ
□ 無い部品が必要になったら、追加をデザイナーと相談する
「今回だけ」で作った独自の部品が、後で全部の一貫性を壊します。
デザインを完全に再現しようとして、margin-top: 13px のような値が並ぶことがあります。
✕ カンプの見た目に1pxずつ合わせる
○ 8の倍数などのルールに沿わせ、ずれる時はデザイナーに確認する
カンプは固定幅で描かれています。 実際の画面は幅が変わり、文字量も変わります。 再現すべきなのは、見た目のピクセルではなく意図(何を強調し、何をまとめたか) です。
実務の落とし穴まとめ
| やりがちなこと | どうなるか |
|---|---|
| 理想の状態しか作らない | 空・読込・エラーで画面が壊れる |
| 「エラーが発生しました」とだけ出す | 利用者も、問い合わせを受ける人も何も分からない |
| 送信ボタンを無効化しない | 連打され、二重登録が起きる |
| エラーで入力内容を消す | その機能は二度と使われない |
| 色だけで必須やエラーを示す | 色覚特性のある利用者に伝わらない |
div にクリックを付ける | キーボードで操作できず、読み上げでも分からない |
| 余白を詰める | 情報の関係が読み取れず、素人くさく見える |
| カンプにピクセル単位で合わせる | 実データや画面幅の変化で崩れる |
まとめ
- UI は見た目、UX は体験全体。 そして速さは UX であり、エンジニアの最大の貢献点
- 使いやすさには原則がある。状態の可視化・利用者の言葉・引き返せること・一貫性
- 確認ダイアログより、元に戻せるほうが強い
- 近接・整列・反復・対比。迷ったら余白を増やす
- 色は意味で決め、色だけで情報を伝えない。コントラストは数値で測れる
- 1画面に5つの状態がある。デザインカンプに描かれているのは1つだけ
- エラーメッセージには何が・なぜ・次にどうするかを書く
- アクセシビリティの大半は、正しい HTML を書くことで満たせる
- 実データを入れて崩れたら、スクリーンショット付きで相談する
公式ドキュメント
| 対象 | リンク |
|---|---|
| WCAG 2.2(アクセシビリティ指針) | https://www.w3.org/TR/WCAG22/ |
| WAI-ARIA Authoring Practices(部品の作法) | https://www.w3.org/WAI/ARIA/apg/ |
| MDN: アクセシビリティ | https://developer.mozilla.org/ja/docs/Web/Accessibility |
| Material Design(Google の設計指針) | https://m3.material.io/ |
| Human Interface Guidelines(Apple) | https://developer.apple.com/design/human-interface-guidelines |
| デジタル庁 デザインシステム | https://design.digital.go.jp/ |
| Nielsen Norman Group(ユーザビリティの原典) | https://www.nngroup.com/articles/ten-usability-heuristics/ |
章末問題
一覧画面を実装しました。デザインカンプには、データが10件並んだ状態だけが描かれています。実装する時にまず確認すべきことは何でしょうか?
登録フォームで、必須項目を赤い文字で表示することにしました。この実装の問題は何でしょうか?
次は、ここまでの HTML を手で書かずに、状態から組み立てる話です。