見出し画像

transitionを:hoverがついたセレクタで指定してもいいのか?

ChatGPT先生に教えてもらったこと。自身の学習用。

技術的には可能ですが、通常は避けたほうが良い場合が多いです。その理由を以下に説明します。


1. 通常の使い方

transitionは、要素に直接設定するのが基本です。

.close { 
 transition: opacity 0.3s ease, transform 0.3s ease; 
 }

こうすると、この要素に対するすべての状態変化(ホバーや他のスタイル変更)がトランジションの対象になります。


2.:hoverセレクタで指定する場合

技術的には次のように書くことができます:

ul.menu li:hover ul.close {
 transition: opacity 0.3s ease, transform 0.3s ease;
 }

このように書きますと、hover状態になったときだけトランジションが適用されます。ホバー解除時にはtransition適用されず、元の状態に即座に戻ります。


なぜ通常は避けるべきですか?

  • トランジションが限定的になる
    :hoverセレクタ内でtransitionを指定すると、ホバー中のスタイル変更にのみトランジションが適用され、ホバー解除時にはトランジションがなくなります。これが
    意図的な場合には問題ありませんが、スタイル全体で継続性を宣告することがあります。

  • 保守性が低くなる
    他のセレクタ(例、:focusJavaScriptを使ったクラス変更)でも同じ動作を再現したい場合、スタイルをもう一度書いても万が一、コードが冗長になります。


どんな場合:hoverに書いていいの?

以下のような状況では問題はありません:

  1. 特定の場所にだけトランジションを適用したい

    • 例: ホバー時のみスムーズなアニメーションが必要で、キャンセル時は即座に消したい。

  2. 他のセレクタと重複しない特定の動作を制御したい

    • 例: ホバー解除後に別のスタイルが適用されるようにしたい。


推奨される使い方

通常は、トランジションは要素自体に設定し、状態(:hoverや:focus)では変化プロパティを指定します。

.close {
 transition: opacity 0.3s ease, transform 0.3s ease;
 opacity: 0;
 transform: scaleY(0);
 } 

ul.menu li:hover ul.close {
 opacity: 1; transform: scaleY(1);
 }

こうすることで、一貫した動作が得られます。


まとめ

  • transitionを:hoverセレクタで指定するのは技術的に可能ですが、通常は避けるべきです。

  • 理由: 他の状態変更と統一しにくく、コードが冗長になりがちです。

  • 状態ごとの変化を管理したい場合には、要素をtransition設定し、状態に応じてプロパティを変更する方が保守性が高いです。


この記事が気に入ったらサポートをしてみませんか?