The CSS Podcast - 002: Selectors
Si vous souhaitez que du texte soit plus grand et rouge uniquement s'il s'agit du premier paragraphe d'un article, comment procéder ?
<article>
<p>I want to be red and larger than the other text.</p>
<p>I want to be normal sized and the default color.</p>
</article>
Vous utilisez un sélecteur CSS pour trouver cet élément spécifique et appliquer une règle CSS, comme suit.
article p:first-of-type {
color: red;
font-size: 1.5em;
}
Le CSS vous fournit de nombreuses options pour sélectionner des éléments et leur appliquer des règles, allant du très simple au très complexe, pour vous aider à résoudre des situations comme celle-ci.
Composantes d'une règle CSS
Pour comprendre le fonctionnement des sélecteurs et leur rôle dans le CSS, il est important de connaître les différentes parties d'une règle CSS. Une règle CSS est un bloc de code contenant un ou plusieurs sélecteurs et une ou plusieurs déclarations.
Dans cette règle CSS, le sélecteur est .my-css-rule
, qui recherche tous les éléments de la page avec une classe my-css-rule
.
Trois déclarations sont contenues dans les accolades.
Une déclaration est une paire de propriété et de valeur qui applique des styles aux éléments correspondant aux sélecteurs.
Une règle CSS peut contenir autant de déclarations et de sélecteurs que vous le souhaitez.
Sélecteurs simples
Le groupe de sélecteurs le plus simple cible les éléments HTML, ainsi que les classes, les ID et d'autres attributs pouvant être ajoutés à une balise HTML.
Sélecteur universel
Un sélecteur universel (également appelé caractère générique) correspond à n'importe quel élément.
* {
color: hotpink;
}
Cette règle fait en sorte que le texte de chaque élément HTML de la page soit rose vif.
Sélecteur de type
Un sélecteur de type correspond directement à un élément HTML.
section {
padding: 2em;
}
Cette règle fait en sorte que chaque élément <section>
ait un 2em
de padding
sur toutes les faces.
Sélecteur de classe
Un élément HTML peut comporter un ou plusieurs éléments définis dans son attribut class
.
Le sélecteur de classe correspond à tous les éléments auxquels cette classe est appliquée.
<div class="my-class"></div>
<button class="my-class"></button>
<p class="my-class"></p>
Tout élément auquel la classe est appliquée sera de couleur rouge:
.my-class {
color: red;
}
Notez que .
n'est présent que dans le CSS et pas dans le code HTML.
En effet, le caractère .
indique au langage CSS de faire correspondre les membres de l'attribut de classe.
Il s'agit d'un modèle courant en CSS, où un caractère spécial ou un ensemble de caractères est utilisé pour définir des types de sélecteurs.
Un élément HTML dont la classe est .my-class
sera toujours mis en correspondance avec la règle CSS ci-dessus, même s'il possède plusieurs autres classes, comme suit:
<div class="my-class another-class some-other-class"></div>
En effet, le CSS recherche un attribut class
qui contient la classe définie, plutôt que de correspondre exactement à cette classe.
Sélecteur d'ID
Un élément HTML avec un attribut id
doit être le seul élément d'une page avec cette valeur d'ID.
Vous sélectionnez des éléments à l'aide d'un sélecteur d'ID comme suit:
#rad {
border: 1px solid blue;
}
Ce CSS appliquerait une bordure bleue à l'élément HTML dont la valeur id
est rad
, comme suit:
<div id="rad"></div>
Tout comme le sélecteur de classe .
, utilisez un caractère #
pour demander au CSS de rechercher un élément correspondant à l'id
qui le suit.
Sélecteur d'attribut
Vous pouvez rechercher des éléments qui possèdent un attribut HTML spécifique ou une valeur spécifique pour un attribut HTML à l'aide du sélecteur d'attribut.
Demandez au CSS de rechercher des attributs en encapsulant le sélecteur entre crochets ([ ]
).
[data-type='primary'] {
color: red;
}
Ce CSS recherche tous les éléments dont l'attribut est data-type
et dont la valeur est primary
, comme suit:
<div data-type="primary"></div>
Au lieu de rechercher une valeur spécifique de data-type
, vous pouvez également rechercher des éléments avec l'attribut présent, quelle que soit sa valeur.
[data-type] {
color: red;
}
<div data-type="primary"></div>
<div data-type="secondary"></div>
Le texte de ces deux éléments <div>
sera rouge.
Vous pouvez utiliser des sélecteurs d'attributs sensibles à la casse en ajoutant un opérateur s
à votre sélecteur d'attribut.
[data-type='primary' s] {
color: red;
}
Cela signifie que si un élément HTML avait un data-type
de Primary
au lieu de primary
, il n'obtiendrait pas de texte rouge.
Vous pouvez faire l'inverse (non-sensibilité à la casse) à l'aide d'un opérateur i
.
En plus des opérateurs de casse, vous avez accès à des opérateurs qui correspondent à des parties de chaînes dans les valeurs d'attribut.
/* A href that contains "example.com" */
[href*='example.com'] {
color: red;
}
/* A href that starts with https */
[href^='https'] {
color: green;
}
/* A href that ends with .com */
[href$='.com'] {
color: blue;
}
Sélecteurs de regroupement
Un sélecteur ne doit pas nécessairement correspondre à un seul élément. Vous pouvez regrouper plusieurs sélecteurs en les séparant par des virgules:
strong,
em,
.my-class,
[lang] {
color: red;
}
Cet exemple étend le changement de couleur aux éléments <strong>
et <em>
.
Il est également étendu à une classe nommée .my-class
et à un élément doté d'un attribut lang
.
Vérifier vos connaissances
Tester vos connaissances sur les sélecteurs simples
* {}
Quel type de sélecteur simple est utilisé dans l'extrait ci-dessus ?
[]
est utilisé pour les sélecteurs simples d'attribut.#
est utilisé pour les sélecteurs simples ID.*
est le sélecteur simple universel..
est utilisé pour les sélecteurs simples de classe.div {}
Quel type de sélecteur simple est utilisé dans l'extrait ci-dessus ?
.
est utilisé pour les sélecteurs simples de classe.element
est utilisé pour les sélecteurs simples de type.[]
sont utilisés pour les sélecteurs simples d'attribut.#
est utilisé pour les sélecteurs simples ID.Pseudo-classes et pseudo-éléments
Le CSS fournit des types de sélecteurs utiles qui se concentrent sur l'état spécifique de la plate-forme, par exemple lorsqu'un élément est en survol, des structures à l'intérieur d'un élément ou des parties d'un élément.
Pseudo-classes
Les éléments HTML se trouvent dans différents états, soit parce qu'ils sont utilisés, soit parce que l'un de leurs éléments enfants se trouve dans un état donné.
Par exemple, un utilisateur peut pointer sur un élément HTML avec le pointeur de la souris ou sur un élément enfant.
Dans ce cas, utilisez la pseudo-classe :hover
.
/* Our link is hovered */
a:hover {
outline: 1px dotted green;
}
/* Sets all even paragraphs to have a different background */
p:nth-child(even) {
background: floralwhite;
}
Pour en savoir plus, consultez le module sur les pseudo-classes.
Pseudo-élément
Les pseudo-éléments diffèrent des pseudo-classes, car au lieu de répondre à l'état de la plate-forme, ils agissent comme s'ils inséraient un nouvel élément avec CSS.
Les pseudo-éléments sont également syntaxiquement différents des pseudo-classes, car au lieu d'utiliser un seul deux-points (:
), nous utilisons un double deux-points (::
).
.my-element::before {
content: 'Prefix - ';
}
Comme dans la démonstration ci-dessus, où vous avez ajouté un préfixe au libellé d'un lien avec le type de fichier, vous pouvez utiliser le pseudo-élément ::before
pour insérer du contenu au début d'un élément ou le pseudo-élément ::after
pour insérer du contenu à la fin d'un élément.
Les pseudo-éléments ne se limitent pas à l'insertion de contenu.
Vous pouvez également les utiliser pour cibler des parties spécifiques d'un élément.
Par exemple, supposons que vous ayez une liste.
Utilisez ::marker
pour styliser chaque puce (ou numéro) de la liste.
/* Your list will now either have red dots, or red numbers */
li::marker {
color: red;
}
Vous pouvez également utiliser ::selection
pour styliser le contenu mis en surbrillance par un utilisateur.
::selection {
background: black;
color: white;
}
Pour en savoir plus, consultez le module sur les pseudo-éléments.
Vérifier vos connaissances
Tester vos connaissances sur les pseudo-sélecteurs
Combien de deux-points les sélecteurs de pseudo-éléments utilisent-ils ?
:
est utilisé pour cibler des pseudo-classes.::
sont utilisés pour cibler les pseudo-éléments.p:hover { background: white; color: black; }
Quel type de sélecteur pseudo est utilisé dans l'extrait ci-dessus ?
:
est utilisé pour cibler des pseudo-classes.::
sont utilisés pour cibler les pseudo-éléments.Sélecteurs complexes
Vous avez déjà vu un large éventail de sélecteurs, mais vous aurez parfois besoin d'un contrôle plus précis avec votre CSS. C'est là que les sélecteurs complexes interviennent.
À ce stade, n'oubliez pas que, bien que les sélecteurs suivants nous offrent plus de puissance, nous ne pouvons sélectionner que des éléments enfants en cascade vers le bas. Nous ne pouvons pas cibler vers le haut et sélectionner un élément parent. Nous verrons ce qu'est la cascade et son fonctionnement dans une leçon ultérieure.
Combinateurs
Un combinateur se trouve entre deux sélecteurs.
Par exemple, si le sélecteur était p > strong
, le combinator est le caractère >
.
Les sélecteurs qui utilisent ces combinateurs vous aident à sélectionner des éléments en fonction de leur position dans le document.
Combinateur de descendants
Pour comprendre les combinateurs descendants, vous devez d'abord comprendre les éléments parent et enfant.
<p>A paragraph of text with some <strong>bold text for emphasis</strong>.</p>
L'élément parent est le <p>
qui contient du texte.
Cet élément <p>
contient un élément <strong>
, ce qui rend son contenu en gras.
Comme il se trouve dans <p>
, il s'agit d'un élément enfant.
Un combinateur descendant nous permet de cibler un élément enfant.
Un espace () est utilisé pour indiquer au navigateur de rechercher des éléments enfants:
p strong {
color: blue;
}
Cet extrait sélectionne tous les éléments <strong>
qui sont des éléments enfants d'éléments <p>
uniquement, et les rend bleus de manière récursive.
Cet effet est mieux visualisé dans l'exemple ci-dessus, à l'aide du sélecteur de combinateur, .top div
.
Cette règle CSS ajoute une marge intérieure à gauche à ces éléments <div>
.
Étant donné que le combinateur est récursif, la même marge intérieure sera appliquée à tous les éléments <div>
qui se trouvent dans .top
.
Examinez le panneau HTML de cette démonstration pour voir comment l'élément .top
comporte plusieurs éléments enfants <div>
qui, à leur tour, comportent des éléments enfants <div>
.
Combinateur de frère suivant
Vous pouvez rechercher un élément qui suit immédiatement un autre élément en utilisant un caractère +
dans votre sélecteur.
Pour ajouter de l'espace entre les éléments empilés, utilisez le combinator "next sibling" pour ajouter de l'espace uniquement si un élément est un frère d'un élément enfant de .top
.
Vous pouvez ajouter une marge à tous les éléments enfants de .top
à l'aide du sélecteur suivant:
.top * {
margin-top: 1em;
}
Le problème est que, comme vous sélectionnez tous les éléments enfants de .top
, cette règle crée potentiellement un espace supplémentaire inutile.
Le combinateur de frère suivant, associé à un sélecteur universel, vous permet non seulement de contrôler les éléments qui reçoivent un espace, mais aussi d'appliquer un espace à n'importe quel élément.
Cela vous offre une certaine flexibilité à long terme, quels que soient les éléments HTML qui apparaissent dans .top
.
Combinateur de frères et sœurs ultérieurs
Un combinator ultérieur est très semblable à un sélecteur de frère suivant.
Toutefois, au lieu d'utiliser un caractère +
, utilisez un caractère ~
.
La différence est qu'un élément doit simplement suivre un autre élément avec le même parent, plutôt que d'être l'élément suivant avec le même parent.
Ce combinateur ultérieur offre un peu moins de rigidité, ce qui est utile dans des contextes comme l'exemple ci-dessus, où nous modifions la couleur d'un bouton personnalisé lorsque la case à cocher associée a l'état :checked
.
Combinateur enfant
Un combinator enfant (également appelé descendant direct) vous permet de mieux contrôler la récursion fournie par les sélecteurs de combinator.
En utilisant le caractère >
, vous limitez le sélecteur de combinateur à s'appliquer uniquement aux enfants directs.
Prenons l'exemple précédent sur le sélecteur de frère suivant. L'espace est ajouté à chaque frère suivant, mais si l'un de ces éléments comporte également des éléments frères suivants en tant qu'enfants, cela peut entraîner un espacement supplémentaire indésirable.
Pour atténuer ce problème, modifiez le sélecteur de frère suivant pour intégrer un combinator enfant: > * + *
.
La règle ne s'appliquera désormais qu' aux enfants directs de .top
.
Sélecteurs composés
Vous pouvez combiner des sélecteurs pour augmenter la spécificité et la lisibilité.
Par exemple, pour cibler les éléments <a>
, qui ont également une classe .my-class
, écrivez ce qui suit:
a.my-class {
color: red;
}
Cela n'appliquerait pas de couleur rouge à tous les liens et ne l'appliquerait qu'à .my-class
if il s'agissait d'un élément <a>
.
Pour en savoir plus, consultez le module de spécificité.
Vérifier vos connaissances
Tester vos connaissances sur les sélecteurs complexes
Parmi les symboles suivants, lequel n'est pas un combinator de sélecteur ?
section.awesome { border: 1px solid hotpink; }
Le sélecteur ci-dessus est un exemple de...