Aspect ratio
Une boîte qui garde sa forme avant le chargement du média, scintille pendant le chargement, fait apparaître le média en fondu et bascule sur un repli en cas d’échec.
pnpm dlx shadcn@latest add https://hextaui.com/r/aspect-ratio.jsonAjoute le composant, les tokens de thème HextaUI et les composants HextaUI dont il dépend.
Ajoutez les tokens de thème à votre CSS global, si ce n’est pas déjà fait.
Installez les dépendances.
pnpm add @base-ui/react @tabler/icons-react class-variance-authority cnCopiez et collez le code suivant dans votre projet.
components/ui/aspect-ratio.tsx components/ui/skeleton.tsx Mettez à jour les chemins d’import selon la configuration de votre projet.
Ratios
ratio accepte un nombre, une chaîne "w/h" ou une chaîne "w:h".
Chargement lent
La boîte garde sa forme et scintille jusqu’à l’arrivée de l’image, qui apparaît ensuite en fondu : rien en dessous ne bouge. Appuyez sur Reload pour le revoir.
Image cassée
Lorsque l’image échoue, le glyphe d’image cassée du navigateur est masqué et une icône de repli s’affiche à la place. Passez fallback pour la remplacer, ou fallback={null} pour ne rien afficher.
Surimpression
Les enfants positionnés de façon absolue se placent par-dessus le média. La boîte ne rogne rien, donc les anneaux de focus des liens en surimpression restent visibles.
Sans placeholder
placeholder={false} désactive le shimmer de chargement, le fondu d’apparition et le contenu de repli, pour le comportement shadcn standard.
Responsive
Remplacez le ratio à un point de rupture avec une classe aspect. Celui-ci est carré sur petit écran et md:aspect-video à partir de md.
Dans une colonne flex centrée
La boîte occupe toute la largeur par défaut : elle remplit la colonne au lieu de s’effondrer à zéro lorsque le parent centre ses enfants.
Contenu texte
Les enfants qui ne sont pas des médias reçoivent la boîte et rien d’autre. Positionnez-les vous-même.
Comme figure
Gardez les légendes en dehors de la boîte pour qu’elles ne modifient pas le ratio.
Ratio invalide
0, les nombres négatifs et les chaînes non analysables se rabattent sur un carré et consignent un avertissement en développement.
De droite à gauche
Les surimpressions positionnées avec des propriétés logiques comme start-3 suivent le sens de lecture.
- La boîte est
aria-busypendant le chargement de son média. - Le contenu de repli est décoratif et masqué aux technologies d’assistance. Le texte
altde l’image reste disponible si elle ne se charge pas : écrivez-en toujours un. - Avec la réduction des animations, le média apparaît sans fondu.
Accepte tous les attributs de l’élément qu’il rend. Un média placé directement à l’intérieur, un <img>, <picture> ou <video>, remplit la boîte avec object-cover et hérite de son rayon.
| Prop | Type | Par défaut |
|---|---|---|
ratio | number | `${number}/${number}` | `${number}:${number}` | 1 |
placeholderAffiche un shimmer pendant le chargement du média et un contenu de repli en cas d’échec. | boolean | true |
fallbackAffiché lorsque le média échoue. null n’affiche rien. | ReactNode | <IconPhotoOff /> |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Description |
|---|---|
data-slot="aspect-ratio" | Ciblez la boîte en CSS. |
data-state | loading, loaded ou error. Défini uniquement lorsque placeholder est activé et que la boîte contient un média. |
aria-busy | Présent pendant le chargement du média. |
--ratio | Le ratio analysé, sous forme de nombre. |
data-slot="aspect-ratio-placeholder" | Le shimmer affiché pendant le chargement ou après une erreur. |
data-slot="aspect-ratio-fallback" | L’enveloppe autour du contenu de repli. |
parseAspectRatio(ratio) convertit tout ratio accepté en nombre, avec 1 par défaut. Utilisez-le pour dimensionner d’autres éléments de la même façon. Les types AspectRatioValue et AspectRatioProps sont également exportés.
- SkeletonDes placeholders qui attendent 150ms avant de s’afficher, prennent la taille exacte du contenu qu’ils enveloppent et l’affichent en fondu sans rien déplacer.
- AccordionDes titres empilés qui révèlent chacun un panneau, avec un mouvement de hauteur réversible en cours de route et des panneaux qui restent consultables par la recherche une fois fermés.
- CarouselDes slides à scroll-snap natif avec inertie au toucher, glisser à la souris, flèches du clavier, points, miniatures et une lecture automatique qui se met en pause au bon moment.
- CollapsibleUn panneau qui s’affiche et se masque avec un mouvement de hauteur réversible en cours de route, sans faire sauter la mise en page.
- ResizableDes panneaux que l’on peut écarter à la main, avec un séparateur discret qui s’éveille au survol, des tailles qui glissent à la réinitialisation ou au repli, et des mises en page persistantes.
- Scroll areaUn défilement natif avec une barre de défilement minimale, des bords qui s’estompent seulement là où il y a plus à voir, et un aperçu facultatif qui coupe le dernier élément en deux.