Un accordéon d’image est un composant d’interface utilisateur qui diffuse de manière transparente une image d’arrière-plan lorsque l’utilisateur sélectionne (ou survole) chaque panneau, créant un impact visuel ainsi que des informations textuelles.
Portfolio et Galerie : Idéal pour afficher des images et travailler efficacement dans un espace limité.
Section d’introduction des fonctionnalités : vous pouvez expliquer les fonctionnalités du produit et des services dans un format étape par étape avec des images impressionnantes.
Gain de place et impact élevé : contrairement aux curseurs classiques, vous pouvez afficher le contexte global (autres choix) tout en développant les détails en fonction des actions de l’utilisateur.
Utilisation de la pseudo-classe CSS :has() : le mouvement interactif est obtenu en utilisant du CSS pur sans utiliser de JavaScript.
Animation fluide : L’assouplissement à l’aide de cubic-bezier rend l’expansion et la contraction du panneau et l’agrandissement (mise à l’échelle) de l’image naturels et agréables.
Assurer la visibilité : une superposition de dégradé est superposée sur l’image d’arrière-plan pour améliorer la lisibilité du texte blanc.
Vous pouvez régler la hauteur totale de l’accordéon en modifiant la « hauteur ».
Ajouter/supprimer l’élément HTML .ia-panel en fonction du nombre de panneaux.
Veuillez définir l’URL de votre image préférée dans « background-image » de chaque panneau.
<div class="ia-container">
<!-- Panel 1 -->
<label class="ia-panel">
<input type="radio" name="image-accordion" class="ia-radio" checked="checked" />
<div class="ia-bg" style="background-image: url('/assets/bg-1.jpg');"></div>
<div class="ia-overlay"></div>
<div class="ia-content">
<div class="ia-icon">1</div>
<div class="ia-text">
<h3>Sunrise Mountains</h3>
<p>朝焼けに染まる美しい山々の風景。</p>
</div>
</div>
</label>
<!-- Panel 2 -->
<label class="ia-panel">
<input type="radio" name="image-accordion" class="ia-radio" />
<div class="ia-bg" style="background-image: url('/assets/bg-2.jpg');"></div>
<div class="ia-overlay"></div>
<div class="ia-content">
<div class="ia-icon">2</div>
<div class="ia-text">
<h3>Ocean Depths</h3>
<p>深い海の中の静寂と神秘的な光。</p>
</div>
</div>
</label>
<!-- Panel 3 -->
<label class="ia-panel">
<input type="radio" name="image-accordion" class="ia-radio" />
<div class="ia-bg" style="background-image: url('/assets/bg-3.jpg');"></div>
<div class="ia-overlay"></div>
<div class="ia-content">
<div class="ia-icon">3</div>
<div class="ia-text">
<h3>Forest Mist</h3>
<p>霧に包まれた深い森の朝。</p>
</div>
</div>
</label>
<!-- Panel 4 -->
<label class="ia-panel">
<input type="radio" name="image-accordion" class="ia-radio" />
<div class="ia-bg" style="background-image: url('/assets/bg-4.jpg');"></div>
<div class="ia-overlay"></div>
<div class="ia-content">
<div class="ia-icon">4</div>
<div class="ia-text">
<h3>Night Sky</h3>
<p>無数の星が瞬く夜空。</p>
</div>
</div>
</label>
</div>
<style>
.ia-container {
display: flex;
width: 100%;
height: 400px;
gap: 0.75rem;
border-radius: 1rem;
overflow: hidden;
font-family: sans-serif;
}
.ia-panel {
position: relative;
flex: 1;
border-radius: 1rem;
overflow: hidden;
cursor: pointer;
transition: flex 0.6s cubic-bezier(0.25, 1, 0.5, 1);
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
}
.ia-radio {
display: none;
}
.ia-panel:has(.ia-radio:checked) {
flex: 4;
}
.ia-panel:not(:has(.ia-radio:checked)):hover {
flex: 1.2;
}
.ia-bg {
position: absolute;
inset: 0;
background-size: cover;
background-position: center;
transition: transform 0.8s cubic-bezier(0.25, 1, 0.5, 1);
}
.ia-panel:has(.ia-radio:checked) .ia-bg {
transform: scale(1.05);
}
.ia-overlay {
position: absolute;
inset: 0;
background: linear-gradient(to top, rgba(0,0,0,0.8) 0%, rgba(0,0,0,0.2) 50%, rgba(0,0,0,0.1) 100%);
opacity: 0.6;
transition: opacity 0.6s ease;
}
.ia-panel:has(.ia-radio:checked) .ia-overlay {
opacity: 0.8;
background: linear-gradient(to top, rgba(0,0,0,0.9) 0%, rgba(0,0,0,0.3) 50%, rgba(0,0,0,0) 100%);
}
.ia-content {
position: absolute;
bottom: 0;
left: 0;
right: 0;
padding: 1.5rem;
color: white;
display: flex;
align-items: flex-end;
gap: 1rem;
}
.ia-icon {
width: 3rem;
height: 3rem;
border-radius: 9999px;
background: rgba(255, 255, 255, 0.2);
backdrop-filter: blur(8px);
display: flex;
align-items: center;
justify-content: center;
font-weight: 600;
font-size: 1.25rem;
flex-shrink: 0;
}
.ia-text {
opacity: 0;
transform: translateY(20px);
transition: opacity 0.5s ease, transform 0.5s ease;
white-space: nowrap;
overflow: hidden;
width: 0;
}
.ia-panel:has(.ia-radio:checked) .ia-text {
opacity: 1;
transform: translateY(0);
width: 100%;
transition-delay: 0.1s;
}
.ia-text h3 {
margin: 0 0 0.25rem 0;
font-size: 1.25rem;
font-weight: 700;
}
.ia-text p {
margin: 0;
font-size: 0.875rem;
color: rgba(255, 255, 255, 0.8);
}
</style> Ce composant utilise la pseudo-classe :has(), qui est entièrement prise en charge par les navigateurs modernes (dernières versions de Chrome, Edge, Safari et Firefox). Les navigateurs plus anciens peuvent nécessiter le remplacement de classes en utilisant JavaScript comme solution de secours.