Activer la personnalisation native d’un select
HTML
<select class="ui-select">
<option>Option 1</option>
<option>Option 2</option>
</select>
Propriétés, sélecteurs et pseudo‑éléments modernes.
<select class="ui-select">
<option>Option 1</option>
<option>Option 2</option>
</select>
<select class="theme-select">
<option>Light</option>
<option>Dark</option>
</select>
.ui-select {
appearance: base-select;
}
Variantes possibles : base-select, base-button, base-listbox.
<select class="ui-select">
<option>A</option>
<option>B</option>
</select>
.ui-select::picker(select) {
background: #111;
color: #fff;
border-radius: 8px;
}
.ui-select::picker(select) {
background: #fff;
border: 1px solid #ccc;
}
Variantes possibles : ::picker(select), ::picker(list), ::picker(option), ::picker(button).
.ui-select::picker-icon {
color: #ff0066;
width: 1rem;
height: 1rem;
}
Variantes possibles : couleur, taille, rotation.
.ui-select::checkmark { color: #ff0066; }
Variantes possibles : couleur, taille, police.
.ui-select selectedcontent { font-weight: 700; }
Variantes possibles : couleur, graisse, taille.
<select class="ui-select">
<option>
<img src="flag-fr.svg"> France
</option>
<option>
<img src="flag-de.svg"> Allemagne
</option>
</select>
Variantes possibles : images, SVG, icônes, structure interne.
<select class="ui-select" anchor-name="--sel">
<option>A</option>
</select>
<div class="picker"></div>
.picker {
position-anchor: --sel;
top: anchor(bottom);
}
Variantes possibles : anchor(top), anchor(bottom), anchor(center), anchor-size().
<div class="picker"></div>
.picker {
position-area: block-end;
position-try-order: flip-block, flip-inline;
}
.picker { position-try-fallbacks: block-start, inline-end; }
Variantes possibles : flip-block, flip-inline, block-start, block-end.
<div class="card">
<span class="badge">Nouveau</span>
</div>
.card:has(.badge) { border: 1px solid #ff0066; }
<label class="row">
<input type="checkbox" checked>
<span>Option</span>
</label>
.row:has(input:checked) {
background: #111;
color: #fff;
}
Variantes possibles : :has(:focus), :has(img), :has(a:hover).
<button class="btn-primary">OK</button>
<button class="btn-secondary">Annuler</button>
button:is(.btn-primary, .btn-secondary) { padding: 0.5rem 1rem; }
Variantes possibles : :is(a, button), :is(h1, h2, h3).
<form class="form">
<input>
<textarea>
</form>
.form :where(input, textarea) { border: 1px solid #ccc; }
nav :where(a, button) { font-size: 0.875rem; }
Variantes possibles : :where() avec n’importe quel groupe.
<button class="btn primary">OK</button>
<button class="btn danger">Supprimer</button>
.btn:not(.danger, .warning) { opacity: 0.8; }
li:not(.active, .disabled) { cursor: pointer; }
<ul>
<li class="item">A</li>
<li class="item">B</li>
<li class="item special">C</li>
</ul>
li:nth-child(2 of .item) { color: #ff0066; }
Variantes possibles : nth-child(), nth-last-child(), nth-of-type(), nth-last-of-type() avec “of selector”.
<p dir="rtl">Hello</p>
p:dir(rtl) { text-align: right; }
Variantes possibles : :dir(ltr), :dir(rtl).
<p lang="fr">Bonjour</p>
p:lang(fr) { font-style: italic; }
Variantes possibles : :lang(fr), :lang(en), :lang(de), etc.
<ul>
<li class="row">A</li>
<li class="row">B</li>
<li class="row">C</li>
<li class="row">D</li>
</ul>
.row:nth-child(odd) { background: #111; }
.row:nth-child(even) { background: #222; }
.row:nth-child(2n) { background: #111; }
.row:nth-child(2n+1) { background: #222; }
.row:nth-child(3n+1) { background: #111; }
.row:nth-child(3n+2) { background: #222; }
.row:nth-child(3n+3) { background: #333; }
<details class="faq">
<summary>Question</summary>
<p>Réponse</p>
</details>
.faq:open { border-color: #ff0066; }
Variantes possibles : details:open, dialog:open, select:open.
<button popovertarget="info">Info</button>
<div id="info" popover>Texte</div>
[popover]:popover-open { opacity: 1; }
Variantes possibles : :popover-open sur tout élément popover.
<dialog class="box" modal>…</dialog>
dialog:modal { backdrop-filter: blur(8px); }
Variantes possibles : dialog:modal uniquement.
<input type="email" class="field" required>
.field:user-valid { border-color: #00cc66; }
<input type="text" class="field" pattern="[A-Za-z]+">
<input type="email" class="field" required>
.field:user-invalid { border-color: #ff0033; }
<input type="number" min="10" max="20" class="field">
Variantes possibles : :user-invalid, :user-valid.
<input type="number" min="0" max="100" class="num">
.num:in-range {
color: #00cc66;
}
.num:out-of-range {
color: #ff0033;
}
Variantes possibles : :in-range, :out-of-range.
<input type="email" class="auto">
.auto:autofill {
background: #fff8cc;
}
Variantes possibles : :autofill uniquement.
<my-card></my-card>
my-card:defined {
opacity: 1;
}
Variantes possibles : tout custom element avec :defined.
<section id="bloc" class="zone">…</section>
<a href="#bloc">Aller</a>
.zone:target-within {
outline: 2px solid #ff0066;
}
Variantes possibles : :target-within uniquement.
<button class="btn">OK</button>
.btn:focus-visible {
outline: 2px solid #00b3ff;
}
Variantes possibles : :focus-visible, :focus-within.
<div class="group">
<input>
</div>
.group:focus-within {
border-color: #ff0066;
}
Variantes possibles : :focus-within uniquement.
<ul>
<li>Item</li>
</ul>
li::marker {
color: #ff0066;
font-size: 1.2rem;
}
li::marker { content: "→ "; }
Variantes possibles : couleur, taille, content.
<p>Texte avec errur</p>
::spelling-error { text-decoration: underline red wavy; }
Variantes possibles : ::spelling-error, ::grammar-error.
::grammar-error { background: #cce0ff; }
Variantes possibles : couleur, soulignement, fond.
<p class="txt">Texte</p>
::highlight(selection) {
background: #ff0066;
color: #fff;
}
Variantes possibles : ::highlight(name) avec plusieurs styles.
<p id="zone">Texte ciblé</p>
<a href="#zone">Aller</a>
::target-text {
background: #ff0066;
color: #fff;
}
Variantes possibles : fond, contour, couleur.
<input type="file" class="file">
.file::file-selector-button {
background: #111;
color: #fff;
padding: 0.5rem 1rem;
}
Variantes possibles : couleur, padding, border.
<details class="faq">
<summary>Titre</summary>
<p>Texte</p>
</details>
.faq::details-content { padding: 1rem; }
Variantes possibles : padding, fond, bordure.
<dialog class="modal">…</dialog>
dialog::backdrop { backdrop-filter: blur(8px); }
Variantes possibles : blur, opacity, couleur, background.
<my-card part="header"></my-card>
my-card::part(header) { font-weight: 700; }
Variantes possibles : ::part(name) pour chaque zone.
<my-box>
<span slot="label">Texte</span>
</my-box>
my-box::slotted(span) { color: #ff0066; }
Variantes possibles : ::slotted(tag), ::slotted(.class).
<button class="btn" anchor-name="--trigger">Ouvrir</button>
.btn { anchor-name: --trigger; }
<div class="icon" anchor-name="--icon"></div>
Variantes possibles : anchor-name: --id; plusieurs ancres possibles.
<button class="btn" anchor-name="--trigger"></button>
<div class="panel">Menu</div>
.panel { position-anchor: --trigger; }
<div class="tooltip">Info</div>
.tooltip { position-anchor: --trigger; }
Variantes possibles : position-anchor: --id; un seul anchor par élément.
<button class="btn" anchor-name="--trigger"></button>
<div class="panel"></div>
.panel {
top: anchor(bottom);
left: anchor(center);
}
Variantes possibles : anchor(top), anchor(bottom), anchor(left), anchor(right), anchor(center).
<button class="btn" anchor-name="--trigger"></button>
<div class="panel"></div>
.panel { width: anchor-size(width); }
Variantes possibles : anchor-size(width), anchor-size(height).
<button class="btn" anchor-name="--trigger"></button>
<div class="menu"></div>
.menu { position-area: block-end; }
Variantes possibles : block-start, block-end, inline-start, inline-end.
<div class="menu"></div>
.menu { position-try-order: flip-block, flip-inline; }
Variantes possibles : flip-inline, flip-block.
<div class="menu"></div>
.menu { position-try-fallbacks: block-start, inline-end; }
Variantes possibles : block-start, block-end, inline-start, inline-end.
<div class="page" id="home">Accueil</div>
<div class="page" id="about">À propos</div>
::view-transition-old(page) { opacity: 0; }
<div class="page" id="home">Accueil</div>
<div class="page" id="about">À propos</div>
::view-transition-new(page) { opacity: 1; }
Variantes possibles : opacity, transform, filter.
<img src="photo1.jpg" class="img" view-transition-name="photo">
<img src="photo2.jpg" class="img" view-transition-name="photo">
::view-transition-group(photo) {
animation-duration: 0.4s;
}
Variantes possibles : group(name) pour chaque élément animé.
<img src="photo-old.jpg" class="img" view-transition-name="photo">
<img src="photo-new.jpg" class="img" view-transition-name="photo">
::view-transition-image-pair(photo) { mix-blend-mode: normal; }
::view-transition-image-pair(photo) { filter: brightness(1.2); }
Variantes possibles : blend-mode, filter, opacity.
<a href="/about" class="link">Aller</a>
<div class="page" id="home">Accueil</div>
<div class="page" id="about">À propos</div>
html { view-transition-name: page; }
Variantes possibles : view-transition-name sur n’importe quel élément.
<div class="page">…</div>
::view-transition-group(page) {
animation-duration: 0.5s;
animation-timing-function: ease-out;
}
::view-transition-group(page) { animation-timing-function: linear; }
Variantes possibles : ease, ease-in, ease-out, linear, cubic-bezier(0, 0, 1, 1).
<div class="card" view-transition-name="card">Card</div>
::view-transition-old(card) {
opacity: 0;
transform: scale(0.95);
}
::view-transition-new(card) {
opacity: 1;
transform: scale(1);
}
<div id="box" class="stateA" view-transition-name="box">Box</div>
::view-transition-old(box) { opacity: 0; }
::view-transition-new(box) { opacity: 1; }
<a href="#zone">Aller</a>
<div id="zone">Contenu</div>
html { scroll-behavior: smooth; }
.panel { scroll-behavior: smooth; }
Variantes possibles : auto, smooth.
<div class="slider">
<div class="slide">1</div>
<div class="slide">2</div>
</div>
.slider {
scroll-snap-type: x mandatory;
overflow-x: auto;
display: flex;
}
.slide { scroll-snap-align: start; }
Variantes possibles : start, center, end.
<div class="zone">Contenu</div>
.zone { overscroll-behavior: contain; }
Variantes possibles : auto, contain, none.
<div class="scrollbox">…</div>
.scrollbox::scroll-marker { background: #ff0066; }
Variantes possibles : couleur, taille (support limité).
<div class="scrollbox">…</div>
.scrollbox::scroll-button { color: #ff0066; }
Variantes possibles : couleur uniquement (support limité).
<div class="thumb"></div>
.thumb {
aspect-ratio: 16 / 9;
background: #333;
}
Variantes possibles : 1/1, 4/3, 3/2, 21/9.
<img src="image.jpg" class="cover">
.cover {
width: 100%;
height: 200px;
object-fit: cover;
}
Variantes possibles : cover, contain, fill, none, scale-down.
<img src="image.jpg" class="top">
.top { object-position: top; }
Variantes possibles : top, bottom, left, right, center.
<div class="grid">
<div>A</div>
</div>
.grid {
display: grid;
place-content: center;
}
.grid { place-items: end; }
Variantes possibles : start, center, end, stretch.
<div class="box">
<p>Texte</p>
</div>
@container (min-width: 300px) {
.box p { font-size: 1.2rem; }
}
@container style(--theme: dark) {
.box { background: #111; }
}
Variantes possibles : size queries, style queries.
<div class="zone">
<div id="item">Item</div>
</div>
.zone { scroll-padding: 2rem; }
<h1 class="title">Titre</h1>
.title { font-size: clamp(1.5rem, 2vw, 2.5rem); }
.box { width: clamp(200px, 50vw, 800px); }
Variantes possibles : clamp(min, préféré, max).
<div class="panel"></div>
.panel { width: min(100%, 600px); }
.panel { padding: min(5vw, 2rem); }
Variantes possibles : min() sur width, height, padding, margin.
<div class="hero"></div>
.hero { height: max(50vh, 300px); }
.hero { margin-top: max(2rem, 5vh); }
Variantes possibles : max() sur height, margin, padding.
<div class="box"></div>
.box { width: calc(100% - 2rem);}
.box { height: calc(50vh + 100px); }
Variantes possibles : +, -, *, /.
<div class="rotate"></div>
.rotate { transform: rotate(sin(45deg) * 1turn); }
.rotate { transform: translateX(cos(30deg) * 50px); }
Variantes possibles : sin(), cos(), tan(), asin(), acos(), atan().
<div class="pattern"></div>
.pattern { width: calc(100px % 30); }
.pattern { height: calc(200px % 40); }
Variantes possibles : % dans calc().
<div class="round"></div>
.round { width: round(33.33px, 10px); }
.round { width: round(5.5rem, 1rem); }
Variantes possibles : round(valeur, multiple).
<div class="sg"></div>
.sg { margin-left: calc(sign(-20px) * 10px); }
.sg { margin-left: calc(sign(50px) * 5px); }
Variantes possibles : sign() retourne -1, 0 ou 1.
<div class="hyp"></div>
.hyp { width: hypot(3px, 4px); }
.hyp { height: hypot(10px, 10px); }
Variantes possibles : hypot(a, b).
<div class="pow"></div>
.pow { width: pow(2, 3); }
.pow { width: pow(4, 2); }
Variantes possibles : pow(base, exposant).
<div class="sq"></div>
.sq { width: sqrt(49px); }
.sq { width: sqrt(100px); }
Variantes possibles : sqrt(valeur).