Sélecteurs CSS avancés (partie 2)

Jusqu'à présent, un sélecteur CSS se résumait pour nous au nom d'un élément si bien que chaque élément de même nom dans un document Web avait le même style. Il existe des sélecteurs CSS avancés permettant de sélectionner un élément selon sa classe, son identifiant, sa position vis-à-vis d'autres éléments ou bien la valeur de ses attributs.

Sélecteurs d'attribut

Cette catégorie de sélecteurs repose sur l'existence ou la valeur d'un attribut au sein d'un élément.

E[attribute]

Sélecteur des éléments E avec un attribut de nom attribute.

p[lang] {
  font-style: italic;
}
<p lang="fr">
  L'hôtel est situé au centre ville dans une rue calme.
  Mais les chambres sont petites et la décoration
  est vieillote (Dominique, Reims)
</p>

<p lang="en">
  A very charming place, typically French especially
  the breakfast with croissants: a delight! (Judy, Manchester)
</p>

L'hôtel est situé au centre ville dans une rue calme. Mais les chambres sont petites et la décoration est vieillote (Dominique, Reims)

A very charming place, typically French especially the breakfast with croissants: a delight! (Judy, Manchester)

E[attribute=value]

Sélecteur des éléments E dont l'attribut attribute a pour valeur value.

p[lang="en"] {
  font-style: italic;
}
<p lang="fr">
  L'hôtel est situé au centre ville dans une rue calme.
  Mais les chambres sont petites et la décoration
  est vieillote (Dominique, Reims)
</p>

<p lang="en">
  A very charming place, typically French especially
  the breakfast with croissants: a delight! (Judy, Manchester)
</p>

L'hôtel est situé au centre ville dans une rue calme. Mais les chambres sont petites et la décoration est vieillote (Dominique, Reims)

A very charming place, typically French especially the breakfast with croissants: a delight! (Judy, Manchester)

E[attribute*=value]

Sélecteur des éléments Edont l'attribut attribute contient la sous-chaîne value.

E[attribute~=value]

Sélecteur des éléments E dont l'attribut attribute contient le mot value.

Info

Un mot est différent d'une sous-chaîne dans la mesure où il est délimité par des espaces.

E[attribute^=value]

Sélecteur des éléments E dont l'attribut attribute commence par la sous-chaîne value.

E[attribute|=value]

Sélecteur des éléments E dont l'attribut attribute commence par le mot value.

E[attribute$=value]

Sélecteur des éléments E dont l'attribut attribute se termine par la sous-chaîne value.

Exercice

Utilisez des sélecteurs CSS avancés afin de styliser (conformément à l'exemple) le code HTML ci-dessous.

<ul>
  <li><a href="http://www.twitter.com">Twitter</a></li>
  <li><a href="http://www.facebook.com">Facebook</a></li>
  <li><a href="http://www.instagram.com">Instagram</a></li>
</ul>
Correction
li a {
  color: white;
}

li a[href*="twitter"] {
  background-color: rgb(29, 161, 242);
}

li a[href*="facebook"] {
  background-color: rgb(59, 87, 157);
}

li a[href*="instagram"] {
  background-color: black;
}

Pseudo-classes

Ils permettent de sélectionner les éléments en fonction de leur état. Par exemple la pseudo-classe :hover permet de sélectionner l'élément survolé par le pointeur de la souris.

E:not

Sélecteur de tous les éléments sauf l'élément E.

E:first-child

Sélecteur de chaque élément E, premier enfant de leur élément parent.

E:nth-child(n)

Sélecteur de chaque élément E, enfant numéro n de leur élément parent.

Info

Le paramètre n peut être une constante numérique, un mot clé (odd pour désigner un nombre impair ou even pour un nombre pair) ou enfin une expression arithmétique. Par exemple, l'expression 3n désigne tous les multiples de trois, l'expression 5n+1 désigne tous les multiples de cinq plus un.

E:nth-last-child(n)

Sélecteur de chaque élément E, enfant numéro n, en partant du dernier, de leur élément parent.

E:last-child

Sélecteur de chaque élément E, dernier enfant de leur élément parent.

li:first-child {
  text-decoration: overline;
}      

li:nth-child(2) {
  text-decoration: line-through;
}      

li:last-child {
  text-decoration: underline;
}
<ul>
  <li>Un</li>
  <li>Deux</li>
  <li>Trois</li>
</ul>
  • Un
  • Deux
  • Trois

E:only-child

Sélecteur de chaque élément E, enfant unique de leur élément parent.

E:first-of-type

Sélecteur de chaque élément E, premier enfant de ce type de leur élément parent.

E:nth-of-type(n)

Sélecteur de chaque élément E, enfant numéro n de ce type de leur élément parent.

E:nth-last-of-type(n)

Sélecteur de chaque élément E, enfant numéro n de ce type, en partant du dernier, de leur élément parent.

E:last-of-type

Sélecteur de chaque élément E, dernier enfant de ce type de leur élément parent.

E:only-of-type

Sélecteur de chaque élément E, enfant unique de ce type de leur élément parent.

Exercice

Redonnez un peu de couleur à ce slogan un peu terne à l'aide de sélecteurs CSS (sans bien sûr toucher à une seule ligne du code HTML).

<header>
  <p>La Manif Pour Tous</p>
  <p>La Manif Pour Tous</p>
  <p>La Manif Pour Tous</p>
  <p>La Manif Pour Tous</p>
  <p>La Manif Pour Tous</p>
  <p>La Manif Pour Tous</p>
</header>

La Manif Pour Tous

La Manif Pour Tous

La Manif Pour Tous

La Manif Pour Tous

La Manif Pour Tous

La Manif Pour Tous

Correction
p {
  margin: 0;
  font-family: Helvetica, Arial, sans-serif;
  font-variant: small-caps;
  text-decoration: line-through;
  text-align: center;
}

p:first-child {
  background-color: red;
}

p:nth-child(2) {
  background-color: orange;
}

p:nth-child(3) {
  background-color: yellow;
}

p:nth-child(4) {
  background-color: green;
}

p:nth-child(5) {
  background-color: blue;
}

p:last-child {
  background-color: purple;
}

Exercice

Utilisez uniquement deux sélecteurs CSS pour reproduire la mise en page suivante à partir du code HTML fourni.

<h1>My favourite Kubrick's films</h1>

<ul>
  <li>Lolita (1962)</li>
  <li>Dr. Stangelove (1964)</li>
  <li>2001: A Space Odissey (1968)</li>
  <li>A Clockwork Orange (1971)</li>
  <li>The Shining (1980)</li>
  <li>Full Metal Jacket (1987)</li>
  <li>Eyes Wide Shut (1999)</li>
</ul>

My favourite Kubrick's films

  • Lolita (1962)
  • Dr. Stangelove (1964)
  • 2001: A Space Odissey (1968)
  • A Clockwork Orange (1971)
  • The Shining (1980)
  • Full Metal Jacket (1987)
  • Eyes Wide Shut (1999)
Correction
ul {
  margin: 0;
  padding: 0;
}

li {
  list-style-type: none;
  list-style-position: inside;
  color: rgb(38, 38, 38);
}

/*
 * Il est aussi possible d'utiliser un compteur pour sélectionner
 * tous les enfants de rang impair (odd) à l'aide de la syntaxe suivante :
 * 
 * li:nth-child(2n+1) 
 *
 */
li:nth-child(odd) {
  background-color: rgb(218, 217, 227);
  font-style: italic;
}

/*
 * Il est aussi possible d'utiliser un compteur pour sélectionner
 * tous les enfants de rang pair (even) à l'aide de la syntaxe suivante :
 * 
 * li:nth-child(2n) 
 *
 */
li:nth-child(even) {
  background-color: rgb(245, 245, 248);
}

Pseudo-éléments

Ils permettent de sélectionner une portion du contenu d'un élément : la première lettre, la première ligne ou la zone se trouvant au début ou à la fin du contenu.

E::first-letter

Sélecteur de la première lettre de l'élément E.

p::first-letter {
  float: left;
  font-size: 2.5em;
}
<p>
  Look, just because I don't be givin' no man a foot massage
  don't make it right for Marsellus to throw Antwone into a glass
  motherfuckin' house, fuckin' up the way the nigger talks.
  Motherfucker do that shit to me, he better paralyze my ass,
  'cause I'll kill the motherfucker, know what I'm sayin'?
</p>

Look, just because I don't be givin' no man a foot massage don't make it right for Marsellus to throw Antwone into a glass motherfuckin' house, fuckin' up the way the nigger talks. Motherfucker do that shit to me, he better paralyze my ass, 'cause I'll kill the motherfucker, know what I'm sayin'?

E::first-line

Sélecteur de la première ligne de chaque élément E.

p::first-line {
  font-variant: small-caps;
  font-size: 1.25em;
}
<p>
  Look, just because I don't be givin' no man a foot massage
  don't make it right for Marsellus to throw Antwone into a glass
  motherfuckin' house, fuckin' up the way the nigger talks.
  Motherfucker do that shit to me, he better paralyze my ass,
  'cause I'll kill the motherfucker, know what I'm sayin'?
</p>

Look, just because I don't be givin' no man a foot massage don't make it right for Marsellus to throw Antwone into a glass motherfuckin' house, fuckin' up the way the nigger talks. Motherfucker do that shit to me, he better paralyze my ass, 'cause I'll kill the motherfucker, know what I'm sayin'?

E::before

Sélecteur permettant d'insérer du contenu (texte ou image) au début de chaque élément E. Le contenu additionnel est référencé grâce à la propriété content.

E::after

Sélecteur permettant d'insérer du contenu (texte ou image) à la fin de chaque élément E. Le contenu additionnel est référencé grâce à la propriété content.

dfn::before {
  content: "«";
}

dfn::after {
  content: "»";
}
<p>
  Un <dfn>triangle rectangle</dfn> est un triangle avec un angle droit.
</p>
Un «triangle rectangle» est un triangle avec un angle droit.

Exercice

Utilisez des sélecteurs CSS avancés pour reproduire la mise en page suivante à partir du code HTML fourni.

<p lang="fr">
  L'hôtel est situé au centre ville dans une rue calme.
  Mais les chambres sont petites et la décoration est vieillote.
  (Dominique, Reims)
</p>

<p lang="en">
  A very charming place, typically French especially
  the breakfast with croissants: a delight!
  (Judy, Manchester)
</p>

Français L'hôtel est situé au centre ville dans une rue calme. Mais les chambres sont petites et la décoration est vieillote. (Dominique, Reims)

English A very charming place, typically French especially the breakfast with croissants: a delight! (Judy, Manchester)

Correction
p[lang="fr"]::before {
  content: "Français";
  display: block;
  font-variant: small-caps;
  font-size: 0.7em;
  color: lightgrey;
}

p[lang="en"]::before {
  content: "English";
  display: block;
  font-variant: small-caps;
  font-size: 0.7em;
  color: lightgrey;
}

Toujours plus loin...

Si vous voulez tester vos compétences en sélecteurs CSS avancés, je vous recommande l'excellent :
CSS Diner - Where we feast on CSS Selectors!.

Crédits

Les textes utilisés dans les exemples ont été générés à l'aide des outils suivants :