Texte✨ Premium

Optical Size

L'axe opsz de Fraunces adapte les détails typographiques selon la taille : empattements, contrastes et interlettres varient de 9 à 144, en CSS pur.

CSSopszTypography

Vous aurez accès à la démo interactive avec un compte gratuit.

Cet effet fait partie d'Effect.Labs — 811 effets vanilla, une partie gratuite, une partie premium. Texte comprend 56 effets, dont 4 gratuits. Découvrir la catégorie →

3 exemples d'usage

Revue numérique — Manchette et chapeau d'article — Optical Size exemple 1

① Revue numérique — Manchette et chapeau d'article

QuandUne page article ou une revue en ligne qui juxtapose un titre display large, un chapeau en sous-titre et quelques lignes de corps dans la même famille typographique.
PourquoiMontrer opsz 144 (titre), opsz 48 (chapeau) et opsz 9 (corps) côte à côte illustre sans explication que la coupe display est trop agressive en petit corps — et vice versa.
Réglagesopsz 144 / wght 700 pour le titre (2rem), opsz 48 / wght 500 pour le chapeau (1rem), opsz 9 / wght 400 pour le texte courant (0,75rem). Séparateur horizontal fin entre les niveaux.
Design system — Spécimen de police variable — Optical Size exemple 2

② Design system — Spécimen de police variable

QuandUne page de documentation de design system ou un Storybook qui documente la hiérarchie typographique et les axes de police pour les développeurs et designers de l'équipe.
PourquoiLes étiquettes <code>.vf-opsz-tag</code> affichent la valeur opsz active de chaque niveau — démo pédagogique plug-and-play copiable directement dans une doc de design tokens.
RéglagesStructure 3 niveaux (opsz 144 / 48 / 9) encadrée dans une carte avec bordure subtile. Adapter les textes à la hiérarchie de titres du design system cible.
Landing page SaaS — Grande accroche et introduction — Optical Size exemple 3

③ Landing page SaaS — Grande accroche et introduction

QuandUn hero de landing page où le titre display (> 40px) et le paragraphe d'introduction (16–18px) coexistent dans la même famille typographique sur fond sombre.
PourquoiUne seule police variable couvre display et corps — un seul fichier font, deux dessins optiquement optimisés. Gain à la fois de performance réseau et de cohérence visuelle.
Réglagesopsz 144 pour l'accroche (2rem, wght 800 possible), opsz 9 pour le corps (0,85rem, wght 300 pour la légèreté). Le wght peut varier indépendamment sans alourdir le chargement.

Comment ça marche

L'effet repose sur la propriété CSS font-variation-settings, qui expose les axes d'une police variable. L'axe standardisé "opsz" (optical size) produit deux dessins distincts selon sa valeur : une valeur basse génère une coupe texte (traits ouverts, empattements larges, contraste réduit) ; une valeur haute génère une coupe display (empattements acérés, contraste stroke élevé, interlettres plus serrés). Aucun JavaScript, aucune image — une règle CSS par niveau de taille suffit.

Fraunces est une police variable serif dont l'axe opsz s'étend de 9 à 144 et l'axe wght de 100 à 900. À opsz 144 / wght 700, les empattements sont fins et contrastés, taillés pour un titre en display. À opsz 9 / wght 400, les traits s'ouvrent et les empattements s'élargissent pour rester lisibles en petit corps. La valeur opsz 48 constitue un niveau intermédiaire naturel pour les sous-titres.

Trois classes CSS appliquent chacune une paire de valeurs précise. .vf-opsz-large fixe font-variation-settings: "opsz" 144, "wght" 700 sur un corps de 2rem. .vf-opsz-medium fixe "opsz" 48, "wght" 500 à 1rem. .vf-opsz-small fixe "opsz" 9, "wght" 400 à 0.75rem. Les trois niveaux sont empilés dans .vf-opsz-scene (flex-column, gap: 20px, centrage horizontal). Juxtaposés, ils révèlent que l'axe opsz est un redesign adaptatif des formes, pas un simple zoom.

Les étiquettes .vf-opsz-tag utilisent Recursive avec font-variation-settings: "MONO" 1 — la police passe en rendu monospace sans changer de famille. Elles affichent la valeur opsz active de chaque couche et portent un badge violet semi-transparent (rgba(139,92,246,.15)) pour rester discrètes tout en informant.

Accessibilité

  • Aucune animation : l'effet est entièrement statique (pur CSS, zéro requestAnimationFrame). prefers-reduced-motion est sans objet — aucun mouvement à réduire.
  • Contraste texte principal : blanc (#ffffff) sur fond noir (#0a0a0f) — ratio ≥ 7:1, WCAG AAA. Le texte .vf-opsz-small à rgba(255,255,255,.5) atteint ~4,6:1 AA à la taille rendue (≥ 12px).
  • Les <span class="vf-opsz-tag"> sont lus par les lecteurs d'écran (ex. : « opsz 144 »). S'ils sont purement décoratifs, ajouter aria-hidden="true" sur chaque span.
  • Aucun élément interactif dans la structure de base — pas de tabulation requise. Aucun focus trap introduit si un composant parent est cliquable.
  • Fallback typographique : font-family: Fraunces, serif — si la police variable n'est pas chargée, le texte reste lisible en serif système sans erreur JS ni crash visuel.

Compatibilité navigateur

Nécessite font-variation-settings (polices variables CSS) — supporté dans tous les navigateurs modernes depuis 2018. Zéro dépendance JS.

Chrome 66+✓ Complet
Firefox 62+✓ Complet
Safari 11+✓ Complet
Edge 79+✓ Complet
Mobile iOS 11+✓ Complet
Android Chrome✓ Complet

Si Fraunces n'est pas chargée, le navigateur affiche la police <code>serif</code> système — le texte reste lisible mais la démonstration de l'axe opsz est perdue. Charger Fraunces depuis Google Fonts (<code>opsz,wght@9..144,100..900</code>) garantit le rendu attendu.

Le code

Structure HTML à coller dans votre page (CSS + JS disponibles avec un compte premium) :

index.html — structure
<div class="vf-opsz-scene">
  <div class="vf-opsz-row">
    <div class="vf-opsz-large">Titre display
      <span class="vf-opsz-tag">opsz 144</span>
    </div>
  </div>
  <div class="vf-opsz-row">
    <div class="vf-opsz-medium">Sous-titre
      <span class="vf-opsz-tag">opsz 48</span>
    </div>
  </div>
  <div class="vf-opsz-row">
    <div class="vf-opsz-small">Texte courant — corps adapté à la lecture
      <span class="vf-opsz-tag">opsz 9</span>
    </div>
  </div>
</div>
🔒 Débloquer le code complet — à partir de 2,99 € le 1er mois

HTML + CSS + JS complet, prêt à coller — avec des centaines d'effets premium.

Personnaliser

Options passées à l'API ou attributs data-* :

Option / propriétéDéfautEffet
font-variation-settings: "opsz" 144 144 Valeur display dans .vf-opsz-large — plage valide Fraunces : 9–144. Réduire à 72 pour un display plus doux.
font-variation-settings: "opsz" 48 48 Valeur intermédiaire dans .vf-opsz-medium — descendre à 24–30 pour un h3 ou une légende.
font-variation-settings: "opsz" 9 9 Valeur body dans .vf-opsz-small — optimisé pour ≈ 12px. Monter à 14 pour des corps 16–18px.
font-variation-settings: "wght" (par niveau) 700 / 500 / 400 Graisse indépendante par niveau, librement ajustable sans impacter l'opsz. Ex. : wght 900 pour un display très gras.
font-size (.vf-opsz-large) 2rem Taille CSS du niveau display — augmenter à 3–4rem pour un hero plein écran. Fraunces supporte de très grands corps sans perte de qualité.
font-family: Fraunces, serif Fraunces Remplacez par toute police variable possédant un axe opsz (Literata, Newsreader, Source Serif 4…). La plage de l'axe varie selon la police.
gap (.vf-opsz-scene) 20px Espacement vertical entre les 3 niveaux typographiques dans le conteneur flex-column.

FAQ

Oui. L'effet repose sur Fraunces, police variable Google Fonts avec axe opsz (9–144) et wght (100–900). Chargez-la via : <link href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,100..900&display=swap" rel="stylesheet">. Les étiquettes utilisent Recursive (axe MONO) — omettez-les si vous n'en avez pas besoin.
Un vrai redesign. L'axe opsz modifie les coordonnées des glyphes : à opsz 9, les empattements s'élargissent, les traits fins s'ouvrent et les contrastes se réduisent pour compenser l'effet optique du petit corps. À opsz 144, les empattements s'affinent et les contrastes s'amplifient pour l'impact display. Ce n'est pas un redimensionnement CSS — les formes changent effectivement.
font-variation-settings est animable en CSS (transition: font-variation-settings 0.4s ease) et en JavaScript (el.style.fontVariationSettings = '"opsz" 72, "wght" 600'). Le navigateur interpole les valeurs d'axe frame par frame — utile pour un hover qui fait glisser un titre d'opsz 48 vers opsz 144.