Firefoxでフォームコントロールのフォーカスリングが白くフラッシュする問題を修正

shoelace-style/webawesome

Firefoxでダークモード時にフォームコントロールへフォーカスすると、フォーカスリングが一瞬白く光るバグを修正しました。outline プロパティ全体をトランジションさせる代わりに outline-color のみをアニメーションさせ、初期値として透明なアウトラインを常時適用することで、ブラウザのシステムスタイルからの補間を回避しています。

背景

Firefoxのダークモードで <wa-input> をクリックすると、フォーカスリングが白く点滅してからブランドカラーに遷移するという視覚的なノイズが発生していました。issue #2074 として報告されたこのバグは、Shoelace の sl-input と比較すると特に目立ちました。Shoelace ではフォーカスカラーがスムーズにフェードインするのに対し、Webawesome では白いフラッシュが挟まる状態でした。

この現象はFirefox固有の挙動に起因します。Firefoxは outline プロパティ全体をトランジション対象にすると、フォーカス前の「システムデフォルトのアウトライン色(白やシステムカラー)」からカスタムカラーへと補間しようとします。フォーカスリングが未定義の状態から突然適用される設計だったため、Firefoxがシステムスタイルを補間の起点として使用してしまっていました。

技術的な変更

修正の核心は「アウトラインを常時存在させ、色だけをアニメーションさせる」パターンへの統一です。inputnumber-inputselecttextarea の各コンポーネントスタイルと native.css の計5ファイルが同一の方針で変更されています。

変更前: outline ショートハンドプロパティ全体をトランジション対象としており、フォーカス時にアウトラインを丸ごと設定していました。

transition:
  background-color var(--wa-transition-normal),
  border var(--wa-transition-normal),
  outline var(--wa-transition-fast);

&:focus-within {
  outline: var(--wa-focus-ring);
  outline-offset: var(--wa-focus-ring-offset);
}

変更後: 常時 transparent なアウトラインを初期値として設定し、フォーカス時は outline-color だけを切り替えます。

transition:
  background-color var(--wa-transition-normal),
  border-color var(--wa-transition-normal),
  outline-color var(--wa-transition-fast);

outline: var(--wa-focus-ring-style) var(--wa-focus-ring-width) transparent;
outline-offset: var(--wa-focus-ring-offset);

&:focus-within {
  outline-color: var(--wa-color-focus);
}

あわせて border ショートハンドから border-color への変更も行われています。border 全体をトランジションさせると border-widthborder-style も補間対象になるため、こちらも同様の理由でカラーのみに絞っています。

inputnumber-input では、Shadow DOM の :host(:focus)outline: none を追加する変更も含まれています。これはホスト要素自体にブラウザがデフォルトのフォーカスアウトラインを描画することを防ぐためです。フォーカスリングの描画は内部の .text-field / .number-field 要素側で制御するため、ホスト要素側のアウトラインは不要です。

設計判断

「アウトラインを常時存在させ、色のみをアニメーションする」 アプローチが採用されました。

トランジションは「値Aから値Bへの補間」であるため、起点となるAの値が明示されていないとブラウザはシステムデフォルトを参照します。transparent を初期値として明示することで、Firefoxが補間の起点にシステムカラーを使用する余地をなくしています。outline-color: transparent はレンダリングコストがほぼゼロである一方、この問題を根本から解消できます。

ショートハンドプロパティ(borderoutline)からロングハンドの border-coloroutline-color へ移行する判断も一貫しています。ショートハンドをトランジション対象にすると、変化させる意図のないプロパティ(width・style)まで補間対象に含まれ、意図しない副作用のリスクが生じます。カラーのみを明示的にトランジションさせる設計は、ブラウザ間の挙動差異を制御するうえでも堅牢です。

まとめ

Firefoxのシステムスタイル補間という落とし穴に対し、「アウトラインを常時保持し色だけを変化させる」という明快な解法が採用されました。ショートハンドから個別プロパティへの移行という小さな変更が、ブラウザ固有の挙動差異を排除し、全フォームコントロールで一貫した視覚的体験をもたらしています。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
af62b6a1

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

リード文(総論)、背景・技術的な変更・設計判断(各論)、まとめ(結論)という「総論→各論→結論」の3部構成が明確に適用されており、非常に分かりやすいです。

カスタムMarkdown構文 ⚠ WARNING

シンタックスハイライト・GitHubリンク記法の正確性

GitHubのPR番号とIssue番号のリンク記法は正しく使用されています。しかし、コードブロックにファイル名が指定されておらず(例: ```css:packages/webawesome/src/components/input/input.styles.ts)、どのファイルのコード例か不明確です。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

CSSのトランジションやShadow DOM、ブラウザ固有の挙動といった専門的なトピックを扱っており、対象読者であるエンジニアに適した技術レベルと表現です。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクションが「総論→各論」で構成され、各段落がトピックセンテンスで始まっているため、非常に読みやすく構成されています。1段落1トピックの原則も守られています。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事内で引用されている変更前後のコードブロックは、提供されたDiff情報と正確に一致しています。また、`:host(:focus)`に関する説明もDiffの内容を正しく反映しています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「ショートハンドプロパティ」「ロングハンドプロパティ」「トランジション」「補間」など、CSS関連の技術用語が正確かつ適切な文脈で使用されています。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

Firefoxがシステムデフォルトのスタイルから色を補間しようとすることが問題の原因であるという説明は、PRのDescriptionと一致しており、技術的に正確です。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

記事内のすべての主張(Firefoxでのバグ、Shoelaceとの比較、修正対象ファイルなど)は、PRのDescription、Diff、関連Issueの内容によって裏付けられています。ハルシネーションは見られません。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR番号(#2229)とIssue番号(#2074)が正確に記載・リンクされています。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事のタイトル「Firefoxでフォームコントロールのフォーカスリングが白くフラッシュする問題を修正」は、PRのタイトル「Fix flashy outlines in Firefox」の内容をより具体的に、かつ正確に表現しています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

記事の内容はすべてPRとその関連情報に基づいており、バージョンサポート情報やリリース日程といったPR外の知識の追記はありません。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

記事内には時間表現に関する曖昧な記述やPR情報との矛盾はなく、事実を正確に伝えています。