:hover

La pseudo-classe :hover permet de spécifier l'apparence d'un élément au moment où l'utilisateur le survole avec le pointeur, sans nécessairement l'activer. La mise en forme ciblée par cette pseudo-classe peut être surchargée par d'autres pseudo-classes relatives aux liens hypertextes comme :link, :visited, et :active, apparaissant dans des règles subséquentes. Pour décorer les liens tel sans effet de bord problématique, on placera la règle :hover après les règles :link et :visited mais avant la règle :active (l'ordre tot :link:visited:hover:active.

La pseudo-classe :hover peut être appliquée à n'importe quel pseudo-élément.

Les agents utilisateurs visuels comme Firefox, Internet Explorer, Safari, Opera ou Chrome, appliquent les décorations lorsque le curseur passe au-dessus d'un élément.

Note d'utilisation : sur les écrans tactiles, :hover est problématique voire impossible. La pseudo-classe :hover n'est jamais valide, ou seulement pendant un très court instant après avoir touché l'élément. Puisque les appareils à écrans tactiles sont très courants, il est important que les développeurs web ne placent pas de contenu accessible seulement lors du survol, puisque ce contenu sera caché pour les utilisateurs de tels appareils.

Syntaxe

:hover { style properties }

Exemples

:link:hover { outline: dotted red; }

.foo:hover { background: gold; }

Grâce à la pseudo-classe :hover, il est possible de créer des algorithmes de cascade complexes. Cette technique est courante, par exemple, pour créer des menus déroulants uniquement construits avec CSS (pas besoin d'utiliser JavaScript pour ce genre de menus). Pour cela, on utilisera une feuille de style analogue à celle-ci :

div.menu-bar ul ul {
  display: none;
}

div.menu-bar li:hover > ul {
  display: block;
}

Pour un document HTML contenant cette structure :

<div class="menu-bar">
  <ul>
    <li>
      <a href="example.html">Menu</a>
      <ul>
        <li>
          <a href="example.html">Lien</a>
        </li>
        <li>
          <a class="menu-nav" href="example.html">Sous-menu</a>
          <ul>
            <li>
              <a class="menu-nav" href="example.html">Sous-menu</a>
              <ul>
                <li><a href="example.html">Lien</a></li>
                <li><a href="example.html">Lien</a></li>
                <li><a href="example.html">Lien</a></li>
                <li><a href="example.html">Lien</a></li>
              </ul>
            </li>
            <li><a href="example.html">Lien</a></li>
          </ul>
        </li>
      </ul>
    </li>
  </ul>
</div>

Résultat

Spécifications

Spécification État Commentaires
Selectors Level 4
La définition de ':hover' dans cette spécification.
Version de travail Aucune modification significative.
Selectors Level 3
La définition de ':hover' dans cette spécification.
Recommendation Aucune modification significative.
CSS Level 2 (Revision 1)
La définition de ':hover' dans cette spécification.
Recommendation Définition initiale.

Compatibilité des navigateurs

Fonctionnalité Chrome Firefox (Gecko) Internet Explorer Opera Safari
Pour les éléments <a> 0.2 1.0 (1.7 ou moins) 4.0 4.0 2.0.4 (419)[1]
Pour tous les éléments 0.2 1.0 (1.7 ou moins) 7.0 7.0 2.0.4 (419)[1]
Fonctionnalité Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Support simple ? ? ? ? ?

[1]Différents bugs avant

Dans IE8-11, survoler un élément puis faire dérouler la page sans déplacer le pointeur laissera l'élément dans l'état :hover jusqu'à ce que le pointeur soit déplacé. Voir bogue IE 926665.

Dans IE9 (et peut-être même avant), si un élement <table> a un parent avec width avec une valeur non-auto et overflow-x: auto;, et que l'élément <table> contient assez de contenu pour déclencher un retour à la ligne de son parent et que des styles :hover s'appliquent à des éléments dans l'élément table. Alors survoler ces éléments induira une augmentation de la hauteur de l'élément <table>. Voici une démonstration qui déclenche ce bogue. Il est possible de contourner ce bogue en spécifiant min-height: 0%; sur l'élément parent de l'élément <table> (l'unité % doit être spécifiée, les valeur 0 et 0px ne règlent pas le problème). Pour avoir plus de détails, référez-vous au ticket jQuery #10854.

Concernant Safari Mobile pour iOS 7.1.2, tapoter sur un élément cliquable induit son passage à l'état :hover. L'élément restera dans l'état :hover jusqu'à ce qu'un autre élément passe dans l'état :hover.

Voir aussi

Étiquettes et contributeurs liés au document

Étiquettes : 
 Contributeurs à cette page : SphinxKnight, FredB, teoli, tregagnon, ThePrisoner, tcit
 Dernière mise à jour par : SphinxKnight,