Un acordeón de imágenes es un componente de la interfaz de usuario que distribuye perfectamente una imagen de fondo cuando el usuario selecciona (o pasa el cursor sobre) cada panel, creando un impacto visual junto con información textual.
Portafolio y Galería: Ideal para mostrar imágenes y trabajar de manera efectiva en espacios limitados.
Sección de introducción de características: Puede explicar las características del producto y del servicio en un formato paso a paso con imágenes impresionantes.
Ahorro de espacio y alto impacto: a diferencia de los controles deslizantes normales, puede mostrar el contexto general (otras opciones) mientras expande los detalles según las acciones del usuario.
Uso de pseudoclase CSS :has(): El movimiento interactivo se logra usando CSS puro sin usar JavaScript.
Animación suave: La facilitación con cubic-bezier hace que la expansión y contracción del panel y la ampliación (ampliación) de la imagen sean naturales y agradables.
Garantizar la visibilidad: se superpone una superposición de degradado encima de la imagen de fondo para mejorar la legibilidad del texto blanco.
Puede ajustar la altura total del acordeón cambiando la “altura”.
Agregar/eliminar el elemento HTML .ia-panel según el número de paneles.
Configure la URL de su imagen favorita en la “imagen de fondo” de cada panel.
<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> Este componente utiliza la pseudoclase :has(), que es totalmente compatible con los navegadores modernos (últimas versiones de Chrome, Edge, Safari y Firefox). Los navegadores más antiguos pueden requerir el reemplazo de clases utilizando JavaScript como alternativa.