Les images
Le composant Picture : son chargement, le montage à l’approche du cadre, le mode qui remplit son parent, du contenu dans les coins et au centre, et ce qu’il affiche faute de source.
Le composant Picture
Une image et son attente
<Picture src="https://picsum.photos/640/480" alt="Random landscape" width={ 640 } height={ 480 } className="rounded-box overflow-hidden" onLoad={ () => console.log("Loaded!") }/>Une galerie en briques
Une galerie qui répartit elle-même ses images en colonnes, selon la largeur disponible.
<Masonry columns={ { xs: 2, sm: 2, md: 3, lg: 4 } } gap={ 4 }> <Picture src="https://picsum.photos/400/600" width={ 400 } height={ 600 } loadingAnimation="ring" /> // More pictures with varying heights...</Masonry>Le montage à l’approche du cadre
Une image n’entre dans le DOM qu’en arrivant dans le cadre. Faites défiler pour les voir apparaître une à une.
Avec et sans
Ordinairechargée tout de suitelazyMountchargée au défilementDouze images différées
Chaque image se monte en arrivant dans le cadre, deux cents pixels avant son bord.
#01#02#03#04#05#06#07#08#09#10#11#12lazyRootMargin — L’anticipation du chargement
lazyRootMargin règle de combien de pixels avant le cadre l’image commence à se charger.
lazyRootMargin="0px"au bordlazyRootMargin="200px"par défautlazyRootMargin="500px"bien avant<Picture src="/photo.jpg" width={ 400 } height={ 300 } lazyMount // Only mount when visible lazyRootMargin="200px" // Start loading 200px before visible lazyThreshold={ 0.1 } // Trigger when 10% is visible/>- Les longues galeries — des grilles de vingt images et plus
- Les listes infinies — du contenu chargé au fil du défilement
- Les pages lourdes — pour alléger le DOM au premier rendu
- Le mobile — pour économiser la bande passante et la batterie
Dimensions automatiques et mode « remplir »
fill + aspect-video (16:9)fill + aspect-4/3 (4:3)fill + aspect-square (1:1)fill + aspect-21/9 (21:9)Les quatre cadrages
objectFit="cover"objectFit="contain"objectFit="fill"objectFit="none"<div className="relative aspect-video"> <Picture src="/banner.jpg" alt="Responsive banner" fill // Responsive mode objectFit="cover" // or contain, fill, none onLoad={ (img) => { console.log(img.naturalWidth, img.naturalHeight); } } /></div>Trois mises en pratique
1. Une galerie élastique
Une grille aux proportions égales — ce que demande une série de photographies.
<div className="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4"> { photos.map(photo => ( <div className="relative aspect-square rounded-box overflow-hidden"> <Picture src={ photo.url } alt={ photo.title } fill objectFit="cover" /> </div> )) }</div>2. Un bandeau d’en-tête
Un bandeau pleine largeur, très étiré — ce que demande un en-tête.
Bienvenue sur Oihana Next UI
Une bibliothèque de composants Next.js, libre
<div className="relative aspect-21/9 w-full"> <Picture src="/hero.jpg" alt="Hero" fill priority // Above the fold objectFit="cover" /> <div className="absolute inset-0 ..."> { /* Overlay content */ } </div></div>3. Lire les dimensions
Lire les dimensions naturelles d’une image, pour les traiter ou les afficher.
naturalWidth&naturalHeight— la taille de l’image d’originewidth&height— la taille à laquelle elle s’affiche- De quoi traiter une image, la valider, ou la mesurer
<Picture src={ userUpload } width={ 800 } height={ 600 } onLoad={ (img) => { // Get natural dimensions const width = img.naturalWidth; const height = img.naturalHeight; // Save to database, validate, etc. saveDimensions(width, height); } }/>- La galerie — une grille régulière, avec aspect-square et fill
- Le bandeau — un format large, avec aspect-21/9 et priority
- Les dimensions — onLoad donne la taille naturelle
Du contenu dans les coins
N’importe quel contenu dans les quatre coins d’une image : pastilles, boutons, icônes, texte.
Une fiche produitUne photo et ses donnéesUne annonce immobilièreUne vignette vidéo<Picture src="/product.jpg" width={ 600 } height={ 800 } // Corner content topLeft={ <Badge color="error">-30%</Badge> } topRight={ <Button icon={FavoriteIcon} /> } bottomLeft={ <div>$349</div> } bottomRight={ <Badge>In Stock</Badge> } // Optional dimensions showDimensions dimensionsPosition="bottom-right"/>topLeft— le coin haut gauche — une pastille, une étiquettetopRight— le coin haut droit — un bouton d’actionbottomLeft— le coin bas gauche — un prix, une donnéebottomRight— le coin bas droit — un état, un appel à l’actionshowDimensions— affiche les dimensions naturelles de l’imagedimensionsPosition— où placer la pastille des dimensions
Du contenu au centre
Du contenu au centre d’une image : un bouton de lecture, un titre en surimpression, un appel à l’action.
Une vignette vidéoUn titre en surimpressionLes grands espaces
Une sélection de photographies, depuis 1995
Un contenu réservéContenu réservé
Abonnez-vous pour accéder aux photos et aux vidéos réservées.
Un aperçu agrandissableUne sortie à venirUn appel à l’actionDes images libres de droits
Mille photographies prêtes à l’emploi, sous licence ouverte.
<Picture src="/video-thumbnail.jpg" width={ 800 } height={ 450 } // Center content center={ <Button size="lg" shape="circle"> <PlayIcon /> </Button> } // Can combine with corners topRight={ <Badge>LIVE</Badge> } bottomLeft={ <div>Duration</div> }/>- Les boutons de lecture — une vignette vidéo ou sonore et sa commande
- Les titres — un titre et son bouton, centrés sur l’image
- Les contenus réservés — une invitation à déverrouiller
- Les icônes actives — agrandir, prévisualiser, agir
- Les états — « Bientôt », « Épuisé », et les autres
- Les appels à l’action — un bouton centré, une promotion
Une image par thème
Deux images, et celle qui s’affiche suit le thème.
Un logo selon le thèmeLe thème clair montre la première image, le thème sombre la seconde.
Un bandeau selon le thèmeUn bandeau qui suit le thème
Un produit et sa variante sombreUne illustration, en mode remplir<Picture src="/logo-light.png" // Light mode image dark="/logo-dark.png" // Dark mode image alt="Logo" width={ 400 } height={ 100 } // Works with all Picture features topLeft={ <Badge>New</Badge> } center={ <Button>Click</Button> } showDimensions/>- Une bascule automatique — l’image suit le thème, sans une ligne de JavaScript
- Rien d’exclu — tout le reste du composant continue — les coins, le centre, le mode remplir
- Facultatif — sans la propriété dark, le composant se comporte comme avant
- Une seule image à la fois — c’est le CSS qui décide laquelle se voit
- Pour quoi — un logo, une illustration, un schéma, un bandeau, un produit
Les animations de l’attente
spinnerringdotsbarsballinfinity<Picture loadingAnimation="spinner" // or ring, dots, bars, ball, infinity/>Les tailles de l’attente
xssmmdlgxl<Picture loadingSize="xs" // or sm, md, lg, xl/>Les couleurs de l’attente
primarysecondaryaccenterror<Picture loadingColor="primary" // Any TextColor/>Les images rondes
<Picture src="https://i.pravatar.cc/150?img=1" alt="Avatar" width={ 150 } height={ 150 } className="rounded-full overflow-hidden" imageClassName="object-cover"/>Sans attente affichée
<Picture showLoading={ false } // Disable loading spinner/>Le chargement prioritaire
priority pour les images visibles dès le chargement de la page : un bandeau, tout ce qui est au-dessus de la ligne de flottaison.<Picture priority // Preload this image (disables lazy loading) src="/hero-banner.jpg"/>Sans aucune source : le repli
<Picture fallback = { <span>{ getInitials( name ) }</span> } fallbackColor = { entity.color } // a wash of it behind, the colour itself on the content fill/>