📖 読了目安 約19分
この記事の目次

画面設計書の読み方

画面設計書は、ユーザーが操作する画面の見た目と動作を定義したドキュメントです。フロントエンド実装やテスト実施で必ず参照します。

画面設計書とは

役割

  • 画面の**見た目(レイアウト)**を定義
  • 各項目のデータ仕様を定義
  • 入力チェックのルールを定義
  • ボタン押下時の動作と遷移先を定義

いつ使うか

場面 使い方
UI実装時 レイアウト、項目配置の確認
バリデーション実装時 入力チェックルールの確認
テスト実施時 期待動作の確認
仕様確認時 画面の動きを確認

画面設計書の構成

よくある構成要素

項目 内容 確認ポイント
基本情報 画面ID、画面名、バージョン 最新版か確認
画面概要 この画面の目的 何をする画面か
画面レイアウト 項目の配置図 見た目のイメージ
項目定義 各項目のデータ仕様 型、桁数、必須
入力チェック バリデーションルール エラーメッセージ
ボタン動作 ボタン押下時の処理 遷移先、API呼び出し
備考 補足事項 特殊な動作

読み方の流れ

flowchart TD
    A[1. 基本情報を確認] --> B[2. 画面概要で目的を理解]
    B --> C[3. レイアウトで見た目を把握]
    C --> D[4. 項目定義で詳細を確認]
    D --> E[5. 入力チェックを整理]
    E --> F[6. ボタン動作で処理フローを理解]
    F --> G[7. 備考で補足事項を確認]

【サンプル】画面設計書の実例

実際の画面設計書がどのようなものか、簡略化したサンプルで見てみましょう。

画面設計書サンプル:ユーザー登録画面

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
画面設計書
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

■ 基本情報
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
画面ID      : SCR-001
画面名      : ユーザー登録画面
作成日      : 2024/01/15
更新日      : 2024/02/20
バージョン  : 1.2

■ 画面概要
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
新規ユーザーがアカウントを作成するための画面。
メールアドレス、パスワード、氏名を入力して登録する。

■ 画面レイアウト
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

┌─────────────────────────────────────────┐
│              ユーザー登録                │  ← ①タイトル
├─────────────────────────────────────────┤
│                                          │
│  メールアドレス *                        │  ← ②入力項目
│  ┌────────────────────────────────┐    │
│  │                                  │    │
│  └────────────────────────────────┘    │
│  ※半角英数字で入力してください           │  ← ③補足説明
│                                          │
│  パスワード *                            │
│  ┌────────────────────────────────┐    │
│  │ ●●●●●●●●                     │    │
│  └────────────────────────────────┘    │
│  ※8文字以上、英数字混合                  │
│                                          │
│  パスワード(確認) *                    │
│  ┌────────────────────────────────┐    │
│  │ ●●●●●●●●                     │    │
│  └────────────────────────────────┘    │
│                                          │
│  氏名 *                                  │
│  ┌────────────────────────────────┐    │
│  │                                  │    │
│  └────────────────────────────────┘    │
│                                          │
│  電話番号                                │  ← ④任意項目(*なし)
│  ┌────────────────────────────────┐    │
│  │                                  │    │
│  └────────────────────────────────┘    │
│                                          │
│      ┌─────────┐   ┌─────────┐         │
│      │  登録    │   │ キャンセル│        │  ← ⑤ボタン
│      └─────────┘   └─────────┘         │
│                                          │
└─────────────────────────────────────────┘

■ 項目定義
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

| No | 項目名 | 項目ID | データ型 | 桁数 | 必須 | 初期値 |
|----|--------|--------|----------|------|------|--------|
| 1 | メールアドレス | email | 文字列 | 256 | ○ | なし |
| 2 | パスワード | password | 文字列 | 64 | ○ | なし |
| 3 | パスワード(確認) | password_confirm | 文字列 | 64 | ○ | なし |
| 4 | 氏名 | name | 文字列 | 100 | ○ | なし |
| 5 | 電話番号 | phone | 文字列 | 15 | - | なし |

■ 入力チェック
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

| No | 項目名 | チェック内容 | エラーメッセージ |
|----|--------|--------------|------------------|
| 1 | メールアドレス | 必須チェック | メールアドレスを入力してください |
| 2 | メールアドレス | 形式チェック | メールアドレスの形式が正しくありません |
| 3 | メールアドレス | 重複チェック | このメールアドレスは既に登録されています |
| 4 | パスワード | 必須チェック | パスワードを入力してください |
| 5 | パスワード | 桁数チェック(8文字以上) | パスワードは8文字以上で入力してください |
| 6 | パスワード | 形式チェック(英数字混合) | パスワードは英字と数字を含めてください |
| 7 | パスワード(確認) | 一致チェック | パスワードが一致しません |
| 8 | 氏名 | 必須チェック | 氏名を入力してください |
| 9 | 電話番号 | 形式チェック | 電話番号の形式が正しくありません |

■ ボタン動作
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

| ボタン名 | ボタンID | 動作 | 遷移先 |
|----------|----------|------|--------|
| 登録 | btn_register | 入力チェック→API呼び出し→登録処理 | 登録完了画面(SCR-002) |
| キャンセル | btn_cancel | 確認ダイアログ表示→トップへ戻る | トップ画面(SCR-000) |

■ 処理シーケンス
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

【登録ボタン押下時】
1. 画面で入力チェック実行(No.1,2,4,5,6,7,8,9)
2. エラーがあれば該当項目にエラーメッセージ表示
3. エラーがなければAPI呼び出し(POST /api/users)
4. API側で重複チェック(No.3)
5. 登録成功→登録完了画面へ遷移
6. 登録失敗→エラーメッセージ表示

■ 備考
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- パスワードは入力中もマスク表示(●)する
- 登録ボタンは必須項目が全て入力されるまで非活性
- 更新履歴:v1.1 電話番号項目追加、v1.2 パスワード確認追加

読むときのチェックポイント

確認する箇所 確認すること この例での確認結果
基本情報 バージョンは最新か? v1.2(更新日2024/02/20)
項目定義 桁数はどれくらいか? メールは256文字、氏名は100文字
入力チェック どのタイミングでチェックするか? 登録ボタン押下時(重複チェックはAPI側)
ボタン動作 次の画面はどこか? 成功→SCR-002、キャンセル→SCR-000
備考 特殊な動作はあるか? 必須未入力時はボタン非活性

よくある疑問と確認ポイント

Q: 「必須項目が全て入力されるまで非活性」とは?

実装方法の確認が必要です。

  • リアルタイムでチェックするのか
  • フォーカスアウト時にチェックするのか
  • 空文字かどうかだけ見るのか

不明なら先輩に確認しましょう。

Q: 「メールアドレスの重複チェック」はいつ行うか?

処理シーケンスを見ると「API側で」とあるので、サーバー側で実施します。

  • 画面側:形式チェックまで
  • サーバー側:重複チェック

Q: パスワード確認欄の入力チェックはどう実装する?

入力チェックNo.7「パスワードが一致しません」でエラーにします。

  • パスワード欄と確認欄を比較
  • 不一致なら確認欄にエラー表示

画面設計書でよくある落とし穴

落とし穴 対策
桁数制限を見落とす 項目定義の桁数を確認して実装
入力チェックのタイミングを間違える 処理シーケンスでタイミングを確認
備考を読み飛ばす 必ず備考まで目を通す
古いバージョンを見ている 更新日を確認する習慣をつける
エラーメッセージを自作する 設計書のメッセージをそのまま使う

質問例:画面設計書について確認するとき

画面設計書SCR-001について確認させてください。

項目定義No.5の電話番号について、
「形式チェック」とありますが、許容するフォーマットを教えてください。
- ハイフンあり:03-1234-5678
- ハイフンなし:0312345678
- 括弧あり:03(1234)5678

どの形式を許容しますか?

【実践】画面設計書から実装を考える

サンプルの画面設計書から、実際にどう実装するかを考えてみましょう。

ステップ1:HTMLの構造を決める

項目定義を見て、HTMLのフォーム構造を決めます。

<form id="registerForm">
  <!-- No.1: メールアドレス(必須、256文字) -->
  <div class="form-group">
    <label for="email">メールアドレス <span class="required">*</span></label>
    <input type="email" id="email" name="email"
           maxlength="256" required>
    <span class="hint">半角英数字で入力してください</span>
    <span class="error" id="email-error"></span>
  </div>

  <!-- No.2: パスワード(必須、64文字) -->
  <div class="form-group">
    <label for="password">パスワード <span class="required">*</span></label>
    <input type="password" id="password" name="password"
           maxlength="64" required>
    <span class="hint">8文字以上、英数字混合</span>
    <span class="error" id="password-error"></span>
  </div>

  <!-- No.3: パスワード確認(必須) -->
  <div class="form-group">
    <label for="password_confirm">パスワード(確認) <span class="required">*</span></label>
    <input type="password" id="password_confirm" name="password_confirm"
           maxlength="64" required>
    <span class="error" id="password_confirm-error"></span>
  </div>

  <!-- No.4: 氏名(必須、100文字) -->
  <div class="form-group">
    <label for="name">氏名 <span class="required">*</span></label>
    <input type="text" id="name" name="name"
           maxlength="100" required>
    <span class="error" id="name-error"></span>
  </div>

  <!-- No.5: 電話番号(任意、15文字) -->
  <div class="form-group">
    <label for="phone">電話番号</label>
    <input type="tel" id="phone" name="phone"
           maxlength="15">
    <span class="error" id="phone-error"></span>
  </div>

  <div class="button-group">
    <button type="submit" id="btn_register">登録</button>
    <button type="button" id="btn_cancel">キャンセル</button>
  </div>
</form>

ステップ2:バリデーションを実装する

入力チェック欄を見て、JavaScriptでバリデーションを実装します。

// 画面設計書の「入力チェック」をもとに実装
function validateForm() {
  let isValid = true;
  clearErrors();

  // No.1: メールアドレス - 必須チェック
  const email = document.getElementById('email').value;
  if (!email) {
    showError('email', 'メールアドレスを入力してください');
    isValid = false;
  }
  // No.2: メールアドレス - 形式チェック
  else if (!isValidEmail(email)) {
    showError('email', 'メールアドレスの形式が正しくありません');
    isValid = false;
  }

  // No.4: パスワード - 必須チェック
  const password = document.getElementById('password').value;
  if (!password) {
    showError('password', 'パスワードを入力してください');
    isValid = false;
  }
  // No.5: パスワード - 桁数チェック(8文字以上)
  else if (password.length < 8) {
    showError('password', 'パスワードは8文字以上で入力してください');
    isValid = false;
  }
  // No.6: パスワード - 形式チェック(英数字混合)
  else if (!hasLetterAndNumber(password)) {
    showError('password', 'パスワードは英字と数字を含めてください');
    isValid = false;
  }

  // No.7: パスワード確認 - 一致チェック
  const passwordConfirm = document.getElementById('password_confirm').value;
  if (password !== passwordConfirm) {
    showError('password_confirm', 'パスワードが一致しません');
    isValid = false;
  }

  // No.8: 氏名 - 必須チェック
  const name = document.getElementById('name').value;
  if (!name) {
    showError('name', '氏名を入力してください');
    isValid = false;
  }

  // No.9: 電話番号 - 形式チェック(任意項目だが入力時はチェック)
  const phone = document.getElementById('phone').value;
  if (phone && !isValidPhone(phone)) {
    showError('phone', '電話番号の形式が正しくありません');
    isValid = false;
  }

  return isValid;
}

// ヘルパー関数
function isValidEmail(email) {
  return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
}

function hasLetterAndNumber(str) {
  return /[a-zA-Z]/.test(str) && /[0-9]/.test(str);
}

function isValidPhone(phone) {
  // ハイフンあり・なし両対応(設計書で確認が必要)
  return /^[\d-]+$/.test(phone);
}

ステップ3:ボタン動作を実装する

ボタン動作欄を見て、イベントハンドラを実装します。

// 登録ボタン押下時
document.getElementById('btn_register').addEventListener('click', async (e) => {
  e.preventDefault();

  // 1. 画面で入力チェック実行
  if (!validateForm()) {
    return;  // エラーがあれば処理中断
  }

  // 2. API呼び出し
  try {
    const response = await fetch('/api/users', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify(getFormData())
    });

    if (response.ok) {
      // 5. 登録成功 → 登録完了画面へ遷移
      window.location.href = '/register-complete';  // SCR-002
    } else {
      // 6. 登録失敗 → エラーメッセージ表示
      const error = await response.json();
      showApiError(error);
    }
  } catch (error) {
    showError('form', 'システムエラーが発生しました');
  }
});

// キャンセルボタン押下時
document.getElementById('btn_cancel').addEventListener('click', () => {
  // 確認ダイアログ表示
  if (confirm('入力内容が破棄されます。よろしいですか?')) {
    // トップへ戻る
    window.location.href = '/';  // SCR-000
  }
});

ステップ4:備考の特殊動作を実装する

備考欄を見て、追加の動作を実装します。

// 備考:必須項目が全て入力されるまで登録ボタン非活性
function updateButtonState() {
  const email = document.getElementById('email').value;
  const password = document.getElementById('password').value;
  const passwordConfirm = document.getElementById('password_confirm').value;
  const name = document.getElementById('name').value;

  const allFilled = email && password && passwordConfirm && name;
  document.getElementById('btn_register').disabled = !allFilled;
}

// 各必須項目にイベントリスナーを設定
['email', 'password', 'password_confirm', 'name'].forEach(id => {
  document.getElementById(id).addEventListener('input', updateButtonState);
});

// 初期状態でボタンを非活性に
document.addEventListener('DOMContentLoaded', () => {
  document.getElementById('btn_register').disabled = true;
});

設計書と実装の対応を意識する

上記のコードでは、設計書のどの項目に対応しているかをコメントで明記しています。レビュー時に「設計書のNo.5のチェックはどこで実装していますか?」と聞かれたときに答えられるようにしておきましょう。


関連ドキュメント