ホバーで背景色とテキスト色が反転するボタン、実装したことありますか?
一見シンプルな動作ですが、書き方によって後から「バリアント追加のたびにホバーも書く」負債になるか、「初期色を宣言するだけでホバーがついてくる」設計になるかが決まります。
この記事では3つの実装パターンを比較しながら、CSSカスタムプロパティを活かした保守しやすい書き方を解説します。
目次
❌ パターン1:色を直書き
See the Pen ❌ パターン1:色を直書き by ito web制作 (@ito-web) on CodePen.
.c-btn {
background-color: #1a56db;
color: #ffffff;
}
@media (any-hover: hover) {
.c-btn:hover {
background-color: #ffffff;
color: #1a56db;
}
}🙂 パターン2:カスタムプロパティ使用(微妙)
See the Pen 🙂 パターン2:カスタムプロパティ使用(惜しい) by ito web制作 (@ito-web) on CodePen.
:root {
--color-primary: #1a56db;
--color-secondary: #639922;
--color-white: #ffffff;
}
.c-btn {
background-color: var(--color-primary);
color: var(--color-white);
}
@media (any-hover: hover) {
.c-btn:hover {
background-color: var(--color-white);
color: var(--color-primary);
}
}
/* バリアントごとにこれが必要になる… */
.c-btn--secondary {
background-color: var(--color-secondary);
color: var(--color-white);
}
@media (any-hover: hover) {
.c-btn--secondary:hover {
background-color: var(--color-white);
color: var(--color-secondary);
}
}カスタムプロパティを導入したことで色の一元管理はできていますが、まだ課題が残ります。
👍 パターン3:ローカル変数で入れ替え
See the Pen Untitled by ito web制作 (@ito-web) on CodePen.
:root {
--color-primary: #1a56db;
--color-secondary: #639922;
--color-white: #ffffff;
}
.c-btn {
--btn-bg: var(--color-primary);
--btn-txt: var(--color-white);
background-color: var(--btn-bg);
color: var(--btn-txt);
transition: background-color 0.2s, color 0.2s;
}
@media (any-hover: hover) {
.c-btn:hover {
--btn-bg: var(--color-white);
--btn-txt: var(--color-primary);
}
}
/* これだけでホバーも完成する */
.c-btn--secondary {
--btn-bg: var(--color-secondary);
}background-color や color のプロパティ自体はそのままに、カスタムプロパティの値だけをホバーで上書きするのがポイントです。
まとめ比較
| 色変更の手間 | バリアント追加 | 可読性 | |
|---|---|---|---|
| ❌ 直書き | 4箇所修正 | ホバーも毎回必要 | 低 |
| 🙂 カスタムプロパティ(惜しい) | 1箇所で済む | ホバーも毎回必要 | 中 |
| 👍 ローカル変数で入れ替え | 1箇所で済む | 初期色だけでOK | 高 |
