Le web d’aujourd’hui, démontré

Dix démos en direct des capacités des navigateurs modernes.
Manipulez chacune d’elles et observez le code se mettre à jour en temps réel.

Démo 01 — WebGL2

WebGL : calcul de lumière par pixel


Un fragment shader calcule la sortie de chaque pixel à l’aide de champs de distance mathématiques. Cette démo évalue un métachamp à partir de cinq points en orbite plus la position de votre curseur, produisant des surfaces par pure arithmétique. Déplacez-vous dans le frai. Cliquez n’importe où pour déclencher une pulsation. La fenêtre de code affiche les uniforms transmis au GPU à chaque image.

render-loop.js — uniforms en direct
// envoyé à chaque image
gl.uniform2f(u.res, canvas.width, canvas.height);
gl.uniform1f(u.time, 0.00);
gl.uniform2f(u.mouse, 0.00, 0.00);
gl.uniform1f(u.pulse, 0.00);
gl.drawArrays(gl.TRIANGLES, 0, 3);

// dans le shader, le pointeur est un
// centre de plus dans le champ :
// f += (0.06 + pulse * 0.14)
//        / dot(p - mouse, p - mouse)

Démo 02 — CSS

Animations liées au défilement


Les timelines d’animation CSS associent le mouvement à la progression du défilement plutôt qu’au temps de l’horloge. La barre de défilement devient une tête de lecture. Toute l’animation ici utilise une timeline nommée en CSS ; le thread compositeur exécute le mouvement de façon indépendante. JavaScript ne fait que lire et afficher le pourcentage de défilement courant.

01 / SCROLL()

La barre de progression est liée au décalage de défilement de ce conteneur. C’est une animation CSS en pause ; la position de la barre de défilement fait avancer et reculer la tête de lecture.

02 / VIEW()

Chaque élément s’anime ici indépendamment via animation-timeline: view() lorsqu’il franchit la limite de la fenêtre.

03 / SYNTAXE RANGE

animation-range: entry 0% entry 90% restreint l’animation à une phase précise de l’entrée de l’élément.

04 / PERFORMANCE

Les animations s’exécutent sur le thread compositeur, indépendamment de la charge du thread principal. Un JavaScript lourd ne peut pas provoquer de saccades.

05 / DÉGRADATION

Les navigateurs sans animation-timeline reçoivent un style de repli ; un petit script pilote la barre de progression via les événements de défilement.

06 / BIDIRECTIONNEL

Remontez pour inverser. La timeline répond au mouvement dans les deux sens.

scroll-timeline.css
.scroller {
	scroll-timeline: --demo-scroll y;
}

.progress-bar {
	animation: fill linear both;
	animation-timeline: --demo-scroll;
}

.item {
	animation: rise linear both;
	animation-timeline: view();
	animation-range: entry 0% entry 90%;
}

/* progression du défilement : 0% */

Démo 03 — CSS

OKLCH : la couleur en un seul nombre


OKLCH organise la couleur dans un espace perceptuellement uniforme : luminosité, chroma, teinte. Des couleurs de même luminosité paraissent d’une clarté identique à l’œil humain. Une seule propriété personnalisée CSS contrôle toute la palette ci-dessous ; l’échelle de sept teintes et ombres est calculée en direct avec color-mix(). Déplacez le curseur de teinte pour voir le thème se régénérer à partir d’un seul nombre.

palette.css — valeurs en direct
@property --demo-hue {
	syntax: "<number>";
	initial-value: 195;
	inherits: true;
}

.lab {
	--demo-hue: 195;
	--demo-accent: oklch(0.62 0.13 var(--demo-hue));
	/* = oklch(0.62 0.13 195) */
}

.tint {
	background: color-mix(in oklch,
		var(--demo-accent), white 50%);
}

Démo 04 — Typographie

Polices variables : chasse et graisse


Les polices variables encodent tout l’espace de conception d’un caractère dans un seul fichier. Roboto Flex possède plusieurs axes : graisse, chasse, taille optique, grade et inclinaison. Le GPU interpole les formes de lettres entre les masters définis. Ajustez les curseurs — aucun téléchargement de police supplémentaire.

Roboto Flex
specimen.css — axes en direct
@font-face {
	font-family: "Roboto Flex";
	src: url("/fonts/roboto-flex/….woff2")
		format("woff2-variations");
	font-weight: 100 1000;
}

.specimen {
	font-variation-settings:
		"wght" 400,
		"wdth" 100,
		"opsz" 14,
		"GRAD" 0,
		"slnt" 0,
		"XTRA" 468;
}

Démo 05 — CSS

Typographie : text-wrap


CSS offre désormais un contrôle précis du retour à la ligne. text-wrap: balance répartit les mots uniformément entre les lignes, idéal pour les titres. text-wrap: pretty élimine les orphelines — ces mots courts isolés sur la dernière ligne. Cliquez un bouton pour appliquer la valeur au paragraphe.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.

line-breaking.css — en direct
.text {
	text-wrap: wrap;
}

/* Valeurs valides : */
/* text-wrap: wrap;     — défaut */
/* text-wrap: nowrap;   — pas de retour à la ligne */
/* text-wrap: balance;  — longueurs de ligne équilibrées */
/* text-wrap: pretty;   — évite orphelines/veuves */
/* text-wrap: stable;   — retour à la ligne stable */
/* Cliquez un bouton pour tester. */

Démo 06 — CSS + polices variables

Lettrines : emphase typographique avec polices variables


La propriété CSS initial-letter crée une lettrine — la première lettre s’étend sur plusieurs lignes. Combinez-la aux axes de police variable pour un contrôle typographique dynamique. Ajustez la graisse et la chasse pour voir la lettrine se transformer en temps réel.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

drop-cap.css
p::first-letter {
	font-family: "Roboto Flex";
	initial-letter: 3.8;
	font-variation-settings:
		"wght" 700,
		"wdth" 75;
}

Démo 07 — JavaScript + CSS

Transitions de vue : le DOM se métamorphose


L’API View Transitions capture l’ancien état de la page, applique les changements du DOM, capture le nouvel état, puis anime entre les deux avec les animations CSS que vous définissez. Le titre possède un view-transition-name et se métamorphose donc séparément. Les navigateurs non compatibles permutent instantanément, sans animation.

Lorem

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

tabs.js — état en direct
const swap = () => {
	title.textContent = "Lorem";
	// …met à jour le corps du panneau…
};

document.startViewTransition(swap);

/* le titre s'anime grâce à : */
h3 {
	view-transition-name: demo-vt-title;
}

// transitions exécutées : 0

Démo 08 — CSS

:has() — le sélecteur parent


Le sélecteur :has() lit l’état des enfants pour styler les éléments parents. Cette capacité a manqué à CSS pendant des décennies. Ci-dessous, les deux cartes changent de style uniquement selon l’état des champs ; c’est CSS qui fait le travail. JavaScript ne fait que surligner la règle active dans la fenêtre de code. Cochez la case ou saisissez un e-mail.

aucune correspondance
aucune correspondance (champ vide)
has.css — règles actives
.card {
	border-color: var(--border);
}

.card:has(input:checked) {
	border-color: teal;
	translate: 0 -3px;
}

.card:has(input:valid) {
	border-color: green;
}

.card:has(input:invalid) {
	border-color: red;
}

Démo 09 — CSS

Requêtes de conteneur : les composants possèdent leurs points de rupture


Les requêtes de conteneur permettent aux composants de réagir à leurs propres dimensions plutôt qu’à la fenêtre. La boîte en pointillés est le conteneur ; redimensionnez-la en tirant le coin. La carte à l’intérieur applique des règles de mise en page à 320px et 440px de sa largeur. La taille de la fenêtre n’a aucune importance.

Tirez le coin ↘

Une carte, trois mises en page

Empilée sous 320px de largeur de boîte, vignette à gauche au-delà, et passé 440px la vignette grandit et passe à droite. La fenêtre n’y est pour rien.

container.css — largeur en direct
.box { container: demobox / inline-size; }

.card {
	grid-template-columns: 1fr;   /* empilée */
}

@container demobox (min-width: 320px) {
	.card { grid-template-columns: 76px 1fr; }
}

@container demobox (min-width: 440px) {
	.card { grid-template-columns: 1fr 104px; }
	.thumb { order: 2; }   /* vignette → droite */
}

/* largeur du conteneur :  */

Démo 10 — JavaScript

Votre navigateur, audité en direct


Détection de fonctionnalités à l’exécution via CSS.supports() et vérification de l’existence des API. Toutes les sondes ci-dessous ont été exécutées au chargement de la page dans votre navigateur. Vert : pris en charge ; rouge : absent. Cliquez une sonde pour voir le test exact.

Sondage…

probe.js — cliquez une fonctionnalité
Sondage…

Ces techniques sont disponibles pour votre projet dès aujourd’hui.