Les sélecteurs CSS – Partie 6

 
📘 Chapitre 27 : Sélecteurs logiques modernes (131-135)
131. :has() 132. :is() 133. :where() 134. :not() 135. :scope
📙 Chapitre 28 : Pseudo-éléments modernes (136-140)
136. ::file-selector-button 137. ::placeholder 138. ::cue 139. ::part() 140. ::slotted()
📒 Chapitre 29 : Pseudo-classes de temps (141-145)
141. :current() 142. :past 143. :future 144. :playing 145. :paused
📕 Chapitre 30 : Sélecteurs expérimentaux (146-150)
146. :state() 147. :popover-open 148. :has-slotted 149. :modal 150. :backdrop

📗 Chapitre 26 : Sélecteurs CSS de niveau 4

126 Focus visible :focus-visible

📖 Définition : Sélectionne un élément quand il reçoit le focus visible (navigation clavier uniquement).

button:focus-visible {
    outline: 3px solid #3498db;
    outline-offset: 2px;
}
input:focus-visible {
    box-shadow: 0 0 0 3px rgba(52,152,219,0.3);
}
💡 Appuyez sur Tab pour voir l'effet :focus-visible (s'affiche uniquement au clavier)

127 Focus à l'intérieur :focus-within

📖 Définition : Sélectionne un élément lorsqu'un de ses enfants a le focus.

form:focus-within {
    background: #e8f4fd;
    padding: 15px;
    border-radius: 8px;
    transition: all 0.3s;
}
div:focus-within {
    border-left: 3px solid #3498db;
}

128 Invalide après interaction :user-invalid

📖 Définition : Sélectionne les champs invalides après interaction utilisateur.

input:user-invalid {
    border-color: #e74c3c;
    background: #fdebd0;
}
textarea:user-invalid {
    box-shadow: 0 0 0 2px #e74c3c;
}

129 Valide après interaction :user-valid

📖 Définition : Sélectionne les champs valides après interaction utilisateur.

input:user-valid {
    border-color: #2ecc71;
    background: #d5f5e3;
}
input:user-valid::after {
    content: "✓";
    color: #2ecc71;
}

130 État indéterminé :indeterminate

📖 Définition : Sélectionne les cases à cocher dans un état indéterminé.

input:indeterminate {
    outline: 2px solid #f39c12;
    accent-color: #f39c12;
}
progress:indeterminate {
    opacity: 0.5;
}

💡 L'état :indeterminate peut être défini via JavaScript avec element.indeterminate = true.

📘 Chapitre 27 : Sélecteurs logiques modernes

131 Parent contenant :has()

📖 Définition : Sélectionne un élément parent qui contient un certain enfant (parent selector).

article:has(img) {
    background: #e8f4fd;
    padding: 15px;
    border-radius: 8px;
}
li:has(ul) {
    font-weight: bold;
    color: #2c3e66;
}
img Article avec image (fond bleu)
Article sans image (fond blanc)

132 Regroupement :is()

📖 Définition : Regroupe plusieurs sélecteurs avec la spécificité la plus haute.

:is(header, main, footer) p {
    margin: 1em 0;
    line-height: 1.5;
}
:is(.card, .article) :is(h2, h3) {
    color: #2c3e66;
    border-bottom: 2px solid #3498db;
}

Titre dans une carte

133 Regroupement sans spécificité :where()

📖 Définition : Similaire à :is() mais avec une spécificité nulle.

:where(.reset, .base) p {
    margin: 0;
    padding: 0;
}
:where(article, section) h2 {
    font-size: 1.5em;
}

Paragraphe sans marges (spécificité nulle)

💡 Idéal pour des styles par défaut facilement surchargeables.

134 Négation :not()

📖 Définition : Sélectionne les éléments qui ne correspondent pas au sélecteur.

button:not(.primary) {
    background: #95a5a6;
}
input:not([type="submit"]) {
    border: 1px solid #ccc;
}
li:not(:first-child) {
    border-top: 1px solid #ddd;
}

135 Portée :scope

📖 Définition : Représente l'élément qui sert de portée/référence pour les sélecteurs.

.parent :scope {
    border-left: 3px solid #3498db;
    padding-left: 10px;
}
:scope > p {
    font-weight: bold;
}
Élément avec portée

📙 Chapitre 28 : Pseudo-éléments modernes

136 Bouton de fichier ::file-selector-button

📖 Définition : Style le bouton "Parcourir" des champs de type file.

input::file-selector-button {
    background: #2c3e66;
    color: white;
    border: none;
    padding: 8px 16px;
    border-radius: 6px;
    cursor: pointer;
    transition: all 0.3s;
}
input::file-selector-button:hover {
    background: #1a2a4a;
}

137 Placeholder stylisé ::placeholder

📖 Définition : Style le texte indicatif (placeholder) dans les champs.

input::placeholder {
    color: #e74c3c;
    font-style: italic;
    font-size: 0.9em;
}
textarea::placeholder {
    color: #3498db;
    letter-spacing: 1px;
}

138 Sous-titres ::cue

📖 Définition : Style les sous-titres (WebVTT) dans les balises vidéo.

video::cue {
    background: rgba(0,0,0,0.7);
    color: #f1c40f;
    font-size: 1.2em;
}
video::cue(.speaker1) {
    color: #3498db;
}
Exemple de sous-titre stylisé

139 Partie de composant ::part()

📖 Définition : Style des parties exposées d'un Web Component.

custom-element::part(button) {
    background: #3498db;
    border-radius: 8px;
    padding: 8px 16px;
}
custom-element::part(header) {
    font-size: 1.2em;
}
Bouton stylisé via part()

140 Élément distribué ::slotted()

📖 Définition : Style les éléments distribués dans un slot d'un Web Component.

::slotted(p) {
    color: #3498db;
    font-weight: bold;
}
::slotted(.important) {
    background: #f9e79f;
    padding: 5px;
}
Paragraphe distribué dans un slot

📒 Chapitre 29 : Pseudo-classes de temps et médias

141 Élément courant :current()

📖 Définition : Sélectionne l'élément en cours de lecture/d'annotation.

:current(slide) {
    background: #f9e79f;
    border-left: 4px solid #f1c40f;
}
:current(p) {
    font-weight: bold;
}

Diapositive actuellement affichée

142 Élément passé :past

📖 Définition : Sélectionne les éléments déjà passés (dans une chronologie).

:past {
    opacity: 0.5;
    filter: grayscale(0.5);
}
:past slide {
    transform: scale(0.95);
}
Élément déjà traité (exemple)

143 Élément futur :future

📖 Définition : Sélectionne les éléments à venir (dans une chronologie).

:future {
    opacity: 0.3;
}
:future slide {
    transform: scale(0.9);
}
Élément pas encore traité (exemple)

144 En lecture :playing

📖 Définition : Sélectionne les éléments multimédia en cours de lecture.

video:playing {
    border: 2px solid #2ecc71;
    box-shadow: 0 0 10px rgba(46,204,113,0.5);
}
audio:playing {
    background: #d5f5e3;
}
Vidéo en lecture (simulation)

145 En pause :paused

📖 Définition : Sélectionne les éléments multimédia en pause.

video:paused {
    opacity: 0.8;
    filter: brightness(0.9);
}
audio:paused {
    background: #fdebd0;
}
Vidéo en pause (simulation)

📕 Chapitre 30 : Sélecteurs expérimentaux

146 État personnalisé :state()

📖 Définition : Sélectionne les éléments personnalisés en fonction de leurs états internes.

toggle-switch:state(checked) {
    background: #2ecc71;
}
accordion-item:state(expanded) {
    box-shadow: 0 2px 8px rgba(0,0,0,0.1);
}
Toggle switch à l'état "checked"

147 Popover ouvert :popover-open

📖 Définition : Sélectionne les éléments popover lorsqu'ils sont ouverts.

.popover-content:popover-open {
    animation: fadeIn 0.3s ease;
    border: none;
    border-radius: 12px;
    box-shadow: 0 4px 20px rgba(0,0,0,0.2);
}
@keyframes fadeIn {
    from { opacity: 0; transform: scale(0.9); }
    to { opacity: 1; transform: scale(1); }
}
Popover ouvert (simulation)
💡 :popover-open est une nouvelle fonctionnalité CSS pour les popovers natifs.

148 Slot distribué :has-slotted

📖 Définition : Sélectionne les composants contenant des éléments distribués dans un slot.

component:has-slotted(img) {
    border: 2px solid #3498db;
}
component:has-slotted(.important) {
    background: #f9e79f;
}
Composant avec image dans slot

149 Élément modal :modal

📖 Définition : Sélectionne un élément lorsqu'il est dans un état modal (dialog ouvert).

dialog:modal {
    border: none;
    border-radius: 12px;
    box-shadow: 0 4px 20px rgba(0,0,0,0.2);
}
:modal {
    backdrop-filter: blur(4px);
}
Exemple de modal

150 Fond d'écran ::backdrop

📖 Définition : Style l'arrière-plan des éléments modaux ou en plein écran.

dialog::backdrop {
    background: linear-gradient(135deg, rgba(0,0,0,0.7), rgba(0,0,0,0.9));
    backdrop-filter: blur(5px);
}
video:fullscreen::backdrop {
    background: black;
}
Fond modal avec flou (simulation)