Images
Une image (avec ou sans légende / source / description).
Classes du composant
Modificateurs de tailles
image--sm: Smallimage--md: Mediumimage--lg: Largeimage--xl: Extra-large
Modificateurs de ratio
1-1: 1/14-3: 4/316-9: 16/9ième9-16: 9/16ième
Modificateurs de disposition
horizontal: La légende est à côté de l'imagevertical: La légende est sous l'image
Commentaires
Exemples
<kuik:image image="${image}" size="md" ratio="4-3"/>
<kuik:image image="${image}" size="md" ratio="16-9" layout="horizontal">
Légende de l'image
<cite class="image__source">Image libre de droit</cite>
</kuik:image>
Size
sm
Une description plus longue de ce que représente le média source: Picsum photos
(c) Kosmos 2024
md
Une description plus longue de ce que représente le média source: Picsum photos
(c) Kosmos 2024
lg
Une description plus longue de ce que représente le média source: Picsum photos
(c) Kosmos 2024
xl
Une description plus longue de ce que représente le média source: Picsum photos
(c) Kosmos 2024
Layout
horizontal
Une description plus longue de ce que représente le média source: Picsum photos
(c) Kosmos 2024
vertical
Une description plus longue de ce que représente le média source: Picsum photos
(c) Kosmos 2024
vertical
Une description plus longue de ce que représente le média source: Picsum photos
(c) Kosmos 2024
ratio
16-9
4-3
1-1
3-4
9-16
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" trimDirectiveWhitespaces="true" %>
<%@ taglib prefix="kuik" uri="kuik" %>
<kuik:heading size="lg" skin="a" title="Size" level="3" />
<p>
<kuik:heading size="lg" title="sm" level="4" />
<kuik:image image="${imageViewModel[0]}" size="sm">
Une photo en noir et blanc<br>Une description plus longue de ce que représente le média
<cite class="image__source">source: Picsum photos<br>(c) Kosmos 2024</cite>
</kuik:image>
</p>
<p>
<kuik:heading size="lg" title="md" level="4" />
<kuik:image image="${imageViewModel[0]}" size="md">
Une photo en noir et blanc<br>Une description plus longue de ce que représente le média
<cite class="image__source">source: Picsum photos<br>(c) Kosmos 2024</cite>
</kuik:image>
</p>
<p>
<kuik:heading size="lg" title="lg" level="4" />
<kuik:image image="${imageViewModel[0]}" size="lg">
Une photo en noir et blanc<br>Une description plus longue de ce que représente le média
<cite class="image__source">source: Picsum photos<br>(c) Kosmos 2024</cite>
</kuik:image>
</p>
<p>
<kuik:heading size="lg" title="xl" level="4" />
<kuik:image image="${imageViewModel[0]}" size="xl">
Une photo en noir et blanc<br>Une description plus longue de ce que représente le média
<cite class="image__source">source: Picsum photos<br>(c) Kosmos 2024</cite>
</kuik:image>
</p>
<kuik:heading size="lg" skin="a" title="Layout" level="3" />
<p>
<kuik:heading size="lg" title="horizontal" level="4" />
<kuik:image image="${imageViewModel[0]}" size="sm" layout="horizontal">
Une photo en noir et blanc<br>Une description plus longue de ce que représente le média
<cite class="image__source">source: Picsum photos<br>(c) Kosmos 2024</cite>
</kuik:image>
</p>
<p>
<kuik:heading size="lg" title="vertical" level="4" />
<kuik:image image="${imageViewModel[0]}" size="sm" layout="vertical">
Une photo en noir et blanc<br>Une description plus longue de ce que représente le média
<cite class="image__source">source: Picsum photos<br>(c) Kosmos 2024</cite>
</kuik:image>
</p>
<p>
<kuik:heading size="lg" title="vertical" level="4" />
<kuik:image image="${imageViewModel[5]}" size="sm" layout="vertical" blurfill="true">
Une photo en noir et blanc<br>Une description plus longue de ce que représente le média
<cite class="image__source">source: Picsum photos<br>(c) Kosmos 2024</cite>
</kuik:image>
</p>
<kuik:heading size="lg" skin="a" title="ratio" level="3" />
<p>
<kuik:heading size="lg" title="16-9" level="4" />
<kuik:image image="${imageViewModel[0]}" ratio="16-9"/>
</p>
<p>
<kuik:heading size="lg" title="4-3" level="4" />
<kuik:image image="${imageViewModel[1]}" ratio="4-3"/>
</p>
<p>
<kuik:heading size="lg" title="1-1" level="4" />
<kuik:image image="${imageViewModel[2]}" ratio="1-1"/>
</p>
<p>
<kuik:heading size="lg" title="3-4" level="4" />
<kuik:image image="${imageViewModel[3]}" ratio="3-4"/>
</p>
<p>
<kuik:heading size="lg" title="9-16" level="4" />
<kuik:image image="${imageViewModel[4]}" ratio="9-16"/>
</p>
| Name | Type | Required | Description |
|---|---|---|---|
| image | fr.kosmos.web.kore.attributes.interfaces.Image | true | L'image |
| size | java.lang.String | false | Taille (défaut : sm) |
| layout | java.lang.String | false | Disposition (défault : vertical) |
| ratio | java.lang.String | false | Ratio de l'image (défaut : 16-9) |
| fit | java.lang.String | false | Mode d'affichage de l'image (défaut : contain) |
| blurfill | java.lang.Boolean | false | Remplir l'espace vide avec la même image floutée |
| imagestyle | java.lang.String | false | Styles personnalisés pour l'image |
| imageclasses | java.lang.String | false | Classes pour l'élément image (img) |
| figureclasses | java.lang.String | false | Classes pour l'élément englobant (figure) |
$prefix: 'image';
$prefix-illustration: 'image-illustration';
$prefix-caption: 'image-caption';
.image {
@include custom-color-fill($prefix, true);
@include custom-color-stroke($prefix, true);
@include custom-border($prefix, true);
@include custom-gap($prefix, true);
@include custom-padding($prefix, true);
display: var(--disp, block) grid;
margin: 0; // reset figure user agent style
overflow: hidden;
&:not(:has(.u-media-blur-fill)) {
width: fit-content;
}
}
.image__illustration {
img {
@include custom-border-radius($prefix-illustration, true);
}
}
.image__caption {
@include custom-color-content($prefix-caption, true);
@include custom-typo($prefix-caption, true);
@include custom-padding($prefix-caption, true);
min-width: 100%;
width: min-content;
}
.image--horizontal {
grid-template-columns: repeat(2, minmax(50%, 1fr));
}
.image--vertical {
grid-auto-flow: row;
}
.image--sm, .image--md, .image--lg, .image--xl {
@include custom-border($prefix);
@include custom-gap($prefix);
.image__caption {
@include custom-padding($prefix-caption);
@include custom-border-radius($prefix-caption);
}
.image__illustration {
img {
@include custom-border-radius($prefix-illustration);
}
}
}
.images-grid {
display: var(--images-grid-display);
gap: var(--space-2);
}
*:has(> .images-grid) {
container-type: inline-size;
}
.images-grid__item {
align-content: center;
background-color: var(--images-grid-item-fill);
block-size: var(--images-grid-item-block-size);
border-radius: var(--images-grid-item-radius);
flex-grow: var(--images-grid-item-grow);
min-inline-size: calc(2 * var(--images-grid-item-padding) + 1lh);
overflow: hidden;
padding: var(--images-grid-item-padding);
text-align: center;
}
.images-grid__image {
--images-grid-image-width: auto;
--images-grid-image-height: auto;
height: var(--images-grid-image-height);
object-fit: var(--images-grid-image-object-fit);
object-position: center;
vertical-align: top;
width: var(--images-grid-image-width);
}
@container (width >= #{$screen-xs}) {
.images-grid--gallery::after {
content: '';
flex-grow: 10; // value with best results
}
}
.images-grid--contain {
--images-grid-image-object-fit: contain;
}
.images-grid--cover {
--images-grid-image-object-fit: cover;
}
.images-grid--gallery {
--images-grid-display: flex;
--images-grid-item-block-size: var(--size-40);
--images-grid-item-grow: 1;
--images-grid-item-padding: var(--space-0);
--images-grid-item-radius: var(--radius-md);
flex-wrap: wrap;
.images-grid__image {
max-block-size: 100%;
min-inline-size: 100%;
}
}
.images-grid--pills {
--images-grid-display: flex;
--images-grid-item-block-size: auto;
--images-grid-item-fill: var(--color1-40);
--images-grid-item-grow: 0;
--images-grid-item-padding: var(--space-2);
--images-grid-item-radius: var(--radius-infinite);
flex-wrap: wrap;
}
.images-grid--table {
--images-grid-display: grid;
--images-grid-item-block-size: var(--size-40);
--images-grid-item-fill: var(--white);
--images-grid-item-padding: var(--space-8);
--images-grid-item-radius: var(--radius-md);
grid-template-columns: repeat(auto-fill, minmax(var(--size-60), 1fr));
.images-grid__image {
max-block-size: 100%;
max-inline-size: 100%;
}
}
<%@ tag pageEncoding="UTF-8" trimDirectiveWhitespaces="true" dynamic-attributes="dynattrs" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="kuik" uri="kuik" %>
<%@ tag import="fr.kosmos.web.kore.utils.IconUtil" %>
<%@ attribute name="image" required="true" type="fr.kosmos.web.kore.attributes.interfaces.Image" description="L'image" %>
<%@ attribute name="size" required="false" type="java.lang.String" description="Taille (défaut : sm)" %>
<%@ attribute name="layout" required="false" type="java.lang.String" description="Disposition (défault : vertical)" %>
<%@ attribute name="ratio" required="false" type="java.lang.String" description="Ratio de l'image (défaut : 16-9)" %>
<%@ attribute name="fit" required="false" type="java.lang.String" description="Mode d'affichage de l'image (défaut : contain)" %>
<%@ attribute name="blurfill" required="false" type="java.lang.Boolean" description="Remplir l'espace vide avec la même image floutée" %>
<%@ attribute name="imagestyle" required="false" type="java.lang.String" description="Styles personnalisés pour l'image" %>
<%@ attribute name="imageclasses" required="false" type="java.lang.String" description="Classes pour l'élément image (img)" %>
<%@ attribute name="figureclasses" required="false" type="java.lang.String" description="Classes pour l'élément englobant (figure)" %>
<c:if test="${not empty pageScope.image}">
<c:if test="${empty pageScope.size}">
<c:set var="size" value="sm" />
</c:if>
<c:if test="${empty pageScope.layout}">
<c:set var="layout" value="vertical" />
</c:if>
<c:set var="figureClassesAttr" value="image image--${pageScope.size} image--${pageScope.layout} ${figureclasses}"/>
<c:if test="${not empty pageScope.ratio}">
<c:set var="ratioClasses" value="u-ratio-${pageScope.ratio}" />
</c:if>
<c:if test="${not empty pageScope.imagestyle}">
<c:set var="imageStyleAttr">style="<c:out value="${pageScope.imagestyle}" />"</c:set>
</c:if>
<c:if test="${pageScope.blurfill}">
<c:set var="blurFillClasses" value="u-media-blur-fill" />
<c:set var="styleAttr">style="--src: url(<c:out value="${pageScope.image.url}" />)"</c:set>
</c:if>
<c:set var="classes" value="u-media-center ${pageScope.blurFillClasses} ${pageScope.ratioClasses}" />
<c:set var="attributes">
<c:forEach items="${dynattrs}" var="a">
<c:choose>
<c:when test="${a.key == 'class'}">
<c:set value="${classes} ${a.value}" var="classes"/>
</c:when>
<c:otherwise>${a.key}="${a.value}" </c:otherwise>
</c:choose>
</c:forEach>
</c:set>
<c:set var="fitClass">
<c:choose>
<c:when test="${pageScope.fit eq 'cover'}">u-media-cover</c:when>
<c:otherwise>u-media-contain</c:otherwise>
</c:choose>
</c:set>
<c:set var="imageclasses" value="${pageScope.imageclasses} ${pageScope.fitClass}" />
<figure class="${pageScope.figureClassesAttr}" ${pageScope.attributes}>
<c:out value="${pageScope.mode}" />
<div class="image__illustration ${pageScope.classes}" ${pageScope.styleAttr}>
<c:choose>
<c:when test="${IconUtil.isSvg(image.url)}">
<kuik:svg class="${pageScope.imageclasses}" source="${image.url}" title="${image.alt}" />
</c:when>
<c:otherwise>
<img
class="${pageScope.imageclasses}"
src="<c:out value="${pageScope.image.url}" />"
alt="<c:out value="${pageScope.image.alt}" />"
${pageScope.imageStyleAttr}
loading="lazy"
>
</c:otherwise>
</c:choose>
</div>
<jsp:doBody var="body"/>
<c:if test="${not empty fn:trim(pageScope.body)}">
<figcaption class="image__caption">
${pageScope.body}
</figcaption>
</c:if>
</figure>
</c:if>