プログラマのための IT 教科書

UI/UX デザインの基礎

この部の 6 / 9 章 ・ 全体で 39 / 76 章 ・ 読了目安 40 分

この章を読むとできるようになること
  • 「なんか使いにくい」を言語化してデザイナーと話せる
  • 空・読み込み中・エラーを含む5つの状態を設計できる
  • 色だけに頼らない、正しい HTML で作れる

「デザインはデザイナーの仕事です」——半分は正しく、半分は間違いです。

実際には、エンジニアが毎日デザインの判断をしています。

□ エラーが起きた時、画面に何と出すか
□ 読み込み中に何を見せるか
□ データが0件の時、真っ白な画面でいいのか
□ ボタンを押した後、押せたことがどう伝わるか
□ この確認ダイアログは本当に必要か

デザインカンプに描かれているのは「うまくいった時」だけです。 それ以外の状態は、たいていエンジニアが決めています。

この章のゴールは、デザイナーになることではありません。 「なんか使いにくい」を言語化でき、デザイナーと同じ言葉で話せるようになることです。

UI と UX は別のもの

混同されがちですが、指しているものが違います。

意味例
UI(User Interface)利用者が触れる部分そのものボタン、フォーム、配色、レイアウト
UX(User Experience)利用者が得た体験の全体目的を達成できたか、迷わなかったか、また使いたいか

UI は UX の一部です。そして——

見た目が美しくても、UX が最悪なことはあります。

美しいが最悪な例:
  □ 送信ボタンが洗練されているが、押した後に何も起きたように見えない
  □ 配色は綺麗だが、エラーの理由が書かれていない
  □ アニメーションが滑らかだが、1操作ごとに0.5秒待たされる
性能は UX である

性能と負荷対策は、デザインの章ではありません。しかし利用者にとって、 「遅い」は「使いにくい」と同じです。

表示に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 にクリックを付けない、が最も効く
<!-- 悪い -->
<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 を手で書かずに、状態から組み立てる話です。

読み終わったら記録しておくと、目次で進み具合が分かります。