入力フォーカスとカード選択のためのCSSボーダーカラートランジション

フォーム入力、カード、選択状態のためのCSS transitionによるborder-color変更のアニメーション。borderとoutlineアプローチの比較を学びます。

Common Components

詳細な説明

ボーダーカラーのトランジション

ボーダーカラートランジションは、フォーム入力と選択可能なカードコンポーネントに不可欠です。フォーカス、選択、バリデーション状態について明確な視覚的フィードバックを提供します。

入力フォーカスボーダー

.input {
  border: 2px solid #27272a;
  border-radius: 8px;
  padding: 8px 12px;
  transition: border-color 0.2s ease;
}

.input:focus {
  border-color: #3b82f6;
  outline: none;
}

.input.error {
  border-color: #ef4444;
}

.input.success {
  border-color: #22c55e;
}

選択可能なカードボーダー

.card {
  border: 2px solid transparent;
  border-radius: 12px;
  padding: 16px;
  background-color: var(--surface);
  transition: border-color 0.2s ease,
              box-shadow 0.2s ease;
}

.card:hover {
  border-color: rgba(59, 130, 246, 0.3);
}

.card.selected {
  border-color: #3b82f6;
  box-shadow: 0 0 0 1px rgba(59, 130, 246, 0.2);
}

ボーダー vs box-shadowリング

borderの代わりにbox-shadowを使用すると、box-shadowは要素の寸法に影響しないためレイアウトシフトを回避できます:

.input {
  border: 1px solid #27272a;
  box-shadow: 0 0 0 0 rgba(59, 130, 246, 0);
  transition: border-color 0.2s ease,
              box-shadow 0.2s ease;
}

.input:focus {
  border-color: #3b82f6;
  box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.15);
}

なぜtransparentボーダーから始めるのか

ホバー時にのみボーダーを追加すると、要素がボーダー幅分だけシフトします。同じ幅の透明ボーダーから始めることで、レイアウトシフトを排除できます:

/* 悪い例: レイアウトシフトが発生 */
.card { border: none; }
.card:hover { border: 2px solid blue; }

/* 良い例: レイアウトシフトなし */
.card { border: 2px solid transparent; }
.card:hover { border-color: blue; }

ユースケース

ボーダーカラートランジションは、フォーム入力(フォーカス、エラー、成功状態)、選択可能なカードコンポーネント、トグルボタングループ、料金プラン選択、ボーダーカラーを使用してインタラクティブ状態を伝えるすべてのUI要素に不可欠です。

試してみる — CSS Transition Generator

フルツールを開く