Je n'allais quand même pas vous laisser comme ça sans m'assurer d'abord que vous aviez bien tout compris !
Énoncé de l'exercice
Imaginez qu'un de vos amis est en train de créer un site et qu'il souhaite faire apparaître du texte subliminal lorsqu'un utilisateur clique sur une image.
Il essaie pendant des heures sans y parvenir et, désespéré, il vient vous voir un soir pour vous demander de l'aide. Voici son code HTML :
Code : HTML 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | <html>
<head>
…
<style type="text/css">
…
div div span { display:none; }
</style>
</head>
<body>
<div id="contenu">
<div class="imagetexte">
<img class="image" src="../image/tikal/1.jpg" alt="apparisseur" /><span class="text">Ceci est un message subliminal…</span>
<div>
</div>
…
</body>
</html>
|
Il a trouvé comment cacher son texte avec ceci :
Code : CSS | div div span { display:none; }
|
Il vous demande maintenant de l'aider à faire apparaître son texte (entre les balises
span) quand on clique sur son image.
En plus, il tient à ce que vous n'utilisiez aucun des mots suivants :
div,
span.
Saurez-vous l'aider ?
Permettez-moi de vous rappelez les six premières règles pour trouver une expression CSS, peut-être que ça pourrait vous servir !
- Se demander si on doit limiter ou non la portée de notre style en ajoutant des conteneurs, sur un ou plusieurs niveaux. Si oui, il faudra faire suivre chaque « parent » d'une espace.
- Savoir sur quel élément on agit (a, span, img, td, div…). Nous ferons référence à cet élément en tant qu'élément déclencheur dans la suite. Il est cependant facultatif de le noter si la classe (ou l'id) est déjà spécifiée à la règle 3.
- Se demander s'il faut spécifier la classe ou l'id de l'élément déclencheur (ce qui limitera la portée de notre style). Si oui, on l'insère entre l'élément déclencheur et la pseudo-classe sans aucune espace (facultatif si l'élément déclencheur est spécifié).
- Savoir quel pseudo-format utiliser et le faire suivre d'une espace pour séparer « l'élément déclencheur » et « l'élément cible ».
- Savoir sur quel élément cible contenu dans l'élément déclencheur on veut appliquer le style. L'élément cible doit impérativement être inclus dans l'élément déclencheur, mais il est facultatif de le spécifier si la classe (ou l'id) est déjà spécifiée à la règle 6.
- Savoir si on veut spécifier une classe ou un id en particulier (qui doit impérativement être contenu dans l'élément déclencheur). Si oui, on l'ajoute à l'élément précédent sans espace (facultatif si l'élément cible est renseigné à la règle 5).
…
… …
… … …
Besoin d'un coup de pouce ?
Secret (cliquez pour afficher)Indice 1 : quand on veut une action relative à un clic, on n'utilise plus :hover !
Indice 2 : vous ne pouvez pas faire référence aux balises par leurs noms génériques, alors essayez avec leurs noms de classe ou d'id !
Solution
Secret (cliquez pour afficher)Code : CSS | #contenu .imagetexte:active .text { display:inline; }
|
Le reste du TP sera grandement simpliste si vous avez bien compris ces explications.
Mais il reste encore plusieurs choses à dire sur le CSS avant que vous ne soyez fin prêts !
Un piège à éviter
Pendant vos tests, vous êtes peut-être tombés sur un cas où les six règles étaient suivies sans pour autant que le style se soit appliqué comme vous l'espériez.
Oui, et je me demandais justement pourquoi !
Je vais vous expliquer un truc que vous devrez garder à l'esprit à l'avenir.
Si par exemple vous cachez, comme dans notre diaporama, une image de cette manière :
Code : CSS | #id_du_div_conteneur .classe_de_notre_image_cachee { display:none; }
|
… et que vous autorisez son affichage grâce à ceci :
Code : CSS | span:hover .classe_de_notre_image_cachee { display:block; }
|
… eh bien, le passage de la souris ne fera pas apparaître votre agrandissement. Pourquoi ?
Parce que pour annuler ou modifier l'effet d'une propriété CSS, il faut impérativement que notre expression soit au moins aussi précise que celle qui a déjà servi à spécifier la propriété de notre élément.
En revanche, si la propriété n'a jamais été spécifiée, alors il n'y a pas de problème.
Tu parles bizarrement d'un coup…

Elle est vachement compliquée ta phrase !
Pas du tout ! En fait, c'est très simple, vous allez voir.
Voici la première fois où la propriété
display de
.classe_de_notre_image_cachee est modifiée :
Code : CSS | #id_du_div_conteneur .classe_de_notre_image_cachee { display:none; }
|
Vous voyez bien qu'avant la
classe de notre image, on spécifie l'
id d'un
div qui contient l'image sur laquelle on applique le style.
Or, au-dessus, en essayant de rendre notre agrandissement visible à l'aide d'un
display:block, nous n'avons pas mentionné l'
id du
div :
Code : CSS | span:hover .classe_de_notre_image_cachee { display:block; }
|
Ça aurait fonctionné avec un code comme celui-ci :
Code : CSS | #id_du_div_conteneur span:hover .classe_de_notre_image_cachee { display:block; }
|
Logique, non ?
Voyons si vous m'avez bien compris (et ne m'en veuillez pas pour les pièges…).
Encore des exercices
Essayez de trouver si l'image s'afficherait au survol de la souris dans les cas suivants et vérifiez la réponse.
L'affichage se ferait-il dans ce cas ?
Code : CSS | div .classe_de_notre_image_cachee { display:none; }
span:hover .classe_de_notre_image_cachee { display:block; }
|
Réponse :
Secret (cliquez pour afficher)Non, parce que la modification de la propriété se fait à partir d'une adresse moins précise !
Il n'est pas fait mention du div dans la deuxième ligne.
L'affichage se ferait-il dans ce cas ?
Code : CSS | div .classe_de_notre_image_cachee { display:none; }
#id_du_div_conteneur span:hover .classe_de_notre_image_cachee { display:block; }
|
Réponse :
Secret (cliquez pour afficher)Oui, parce que la modification de la propriété se fait à partir d'une adresse plus précise !
Stipuler l'id du div est une précision plus grande que d'indiquer simplement que l'image est contenue dans un div.
L'affichage se ferait-il dans ce cas ?
Code : CSS | div#id_du_div_conteneur .classe_de_notre_image_cachee { display:none; }
#id_du_div_conteneur span:hover .classe_de_notre_image_cachee { display:block; }
|
Réponse :
Secret (cliquez pour afficher)Oui, parce que la modification de la propriété se fait à partir d'une adresse aussi précise !
Stipuler l'id du div est, pour CSS, aussi précis que de dire que l'image est contenue dans un div#id_du_div.
Pour terminer, on peut ajouter quelques règles supplémentaires aux six de tout à l'heure.
- Quand une propriété a déjà été appliquée à un élément et que l'on souhaite la modifier, l'adresse doit, en plus d'être valide (nos six règles), être au moins aussi précise que celle qui a été utilisée pour appliquer le style la première fois. Dans le cas contraire, le style ne sera pas appliqué.
- L'id ou la classe d'un élément est une information plus précise que la mention de l'élément sans id ni classe.
- La mention de l'id ou de la classe rend la précision de l'élément inutile pour modifier le style. Mais attention : si une classe est appliquée à deux éléments div et a, par exemple, alors préciser « élément.classe » prend toute son importance dans le cas où l'on souhaite appliquer le style uniquement à l'un ou à l'autre.
En apprendre plus sur le sujet
Nous avons vu beaucoup de choses qui, je le répète, vous seront très utiles. Mais ce n'est en fait qu'une petite partie de ce qu'il faut savoir pour être à l'aise en CSS.
Voici une piste pour les curieux, la
liste non exhaustive des propriétés CSS de
biohazard2. On y apprend plein de choses intéressantes !
Voici également un cours sur les sélecteurs provenant de Wikibooks :
Les sélecteurs CSS.