パスワード強度メーター Password Strength

パスワードの強度をリアルタイムに可視化するインジケーター。

使用場面: 会員登録やパスワード変更時にセキュリティレベルを表示する場合 採用例: 1Password, Dropbox

ライブデモ

  • 8文字以上
  • 大文字を含む
  • 数字を含む
  • 特殊文字を含む

ソースコード

<div class="demo-pwstrength">
  <label class="demo-pwstrength-label" for="demo-pw-input">パスワード</label>
  <div class="demo-pwstrength-wrap">
    <input class="demo-pwstrength-input" id="demo-pw-input" type="password" placeholder="パスワードを入力..." />
    <button class="demo-pwstrength-toggle" type="button" aria-label="パスワードを表示">
      <svg class="demo-pwstrength-eye" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/><circle cx="12" cy="12" r="3"/></svg>
    </button>
  </div>
  <div class="demo-pwstrength-bar">
    <div class="demo-pwstrength-segment"></div>
    <div class="demo-pwstrength-segment"></div>
    <div class="demo-pwstrength-segment"></div>
    <div class="demo-pwstrength-segment"></div>
  </div>
  <div class="demo-pwstrength-info">
    <span class="demo-pwstrength-level"></span>
  </div>
  <ul class="demo-pwstrength-rules">
    <li class="demo-pwstrength-rule" data-rule="length">8文字以上</li>
    <li class="demo-pwstrength-rule" data-rule="upper">大文字を含む</li>
    <li class="demo-pwstrength-rule" data-rule="number">数字を含む</li>
    <li class="demo-pwstrength-rule" data-rule="special">特殊文字を含む</li>
  </ul>
</div>
.demo-pwstrength { max-width: 320px; }
.demo-pwstrength-label { display: block; font-size: 13px; font-weight: 600; color: #333; margin-bottom: 6px; }
.demo-pwstrength-wrap { position: relative; }
.demo-pwstrength-input {
  width: 100%; padding: 10px 40px 10px 12px; border: 2px solid #d1d5db; border-radius: 8px;
  font-size: 14px; outline: none; transition: border-color 0.2s, box-shadow 0.2s;
  box-sizing: border-box;
}
.demo-pwstrength-input:focus {
  border-color: var(--ui-primary);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--ui-primary) 20%, transparent);
}
.demo-pwstrength-toggle {
  position: absolute; right: 8px; top: 50%; transform: translateY(-50%);
  background: none; border: none; cursor: pointer; color: #9ca3af; padding: 4px;
}
.demo-pwstrength-toggle:hover { color: #6b7280; }
.demo-pwstrength-bar { display: flex; gap: 4px; margin-top: 8px; }
.demo-pwstrength-segment {
  flex: 1; height: 5px; border-radius: 3px; background: #e5e7eb;
  transition: background 0.3s;
}
.demo-pwstrength-info { margin-top: 6px; min-height: 18px; }
.demo-pwstrength-level { font-size: 12px; font-weight: 600; }
.demo-pwstrength-rules { list-style: none; padding: 0; margin: 10px 0 0; display: flex; flex-direction: column; gap: 4px; }
.demo-pwstrength-rule {
  font-size: 12px; color: #9ca3af; padding-left: 20px; position: relative;
  transition: color 0.2s;
}
.demo-pwstrength-rule::before {
  content: ''; position: absolute; left: 0; top: 3px;
  width: 12px; height: 12px; border-radius: 50%; border: 2px solid #d1d5db;
  transition: border-color 0.2s, background 0.2s;
}
.demo-pwstrength-rule.pass { color: #333; }
.demo-pwstrength-rule.pass::before {
  border-color: var(--ui-primary); background: var(--ui-primary);
}
(function(){
  var input = document.querySelector('#demo-pw-input');
  var toggle = document.querySelector('.demo-pwstrength-toggle');
  var segments = document.querySelectorAll('.demo-pwstrength-segment');
  var level = document.querySelector('.demo-pwstrength-level');
  var rules = { length: /.{8,}/, upper: /[A-Z]/, number: /[0-9]/, special: /[^A-Za-z0-9]/ };
  var labels = ['', '弱い', 'やや弱い', '強い', 'とても強い'];
  var colors = ['', '#ef4444', '#f59e0b', 'var(--ui-primary)', '#10b981'];
  toggle.addEventListener('click', function() {
    var isPassword = input.type === 'password';
    input.type = isPassword ? 'text' : 'password';
    this.setAttribute('aria-label', isPassword ? 'パスワードを隠す' : 'パスワードを表示');
  });
  input.addEventListener('input', function() {
    var val = this.value;
    var score = 0;
    Object.keys(rules).forEach(function(key) {
      var el = document.querySelector('[data-rule="' + key + '"]');
      var pass = rules[key].test(val);
      if (pass) score++;
      el.classList.toggle('pass', pass);
    });
    if (!val) score = 0;
    segments.forEach(function(s, i) {
      s.style.background = i < score ? colors[score] : '#e5e7eb';
    });
    level.textContent = val ? labels[score] : '';
    level.style.color = colors[score] || '';
  });
})();

AIプロンプト

Basic
パスワード強度メーターをHTML/CSS/JSで作ってください。入力に応じて4段階のバーで強度を表示します。
Custom
以下の仕様でパスワード強度メーターを実装してください。
- 4段階の強度バー(弱い/やや弱い/強い/とても強い)
- 条件チェックリスト(8文字以上、大文字、数字、特殊文字)
- プライマリカラー: #2563eb
- パスワード表示/非表示トグル
- リアルタイムのアニメーション付き評価
- 各条件クリア時のチェックマーク表示
Advanced
アクセシビリティ対応のパスワード強度メーターを実装してください。
- aria-valuenow / aria-valuemax で強度をスクリーンリーダーに通知
- role="progressbar" による強度バーのセマンティクス
- aria-live="polite" でリアルタイムフィードバック
- zxcvbn ライクな辞書ベースの強度判定
- パスワード漏洩チェック(Have I Been Pwned API連携)
- パスワード生成機能
- コピーボタン付き
- モバイル対応のレスポンシブレイアウト