图片折叠面板
开场阶段,挡风玻璃清晰可见,背景图像动态。
HTMLCSS
图像手风琴是一个 UI 组件,当用户选择(或悬停在)每个面板上时,它会无缝地传播背景图像,从而与文本信息一起产生视觉效果。
预览
用例和功能
-
作品集和画廊:非常适合在有限的空间内显示图像和有效地工作。
-
功能介绍部分:您可以通过令人印象深刻的图片以分步的方式解释产品功能和服务功能。
-
节省空间且影响力大:与常规滑块不同,您可以显示整体上下文(其他选择),同时根据用户操作扩展详细信息。
设计和用户体验(Design & UX)的要点
-
使用 CSS
:has()伪类:使用纯 CSS 实现交互移动,无需使用任何 JavaScript。 -
平滑的动画:使用“三次贝塞尔曲线”缓动使面板的膨胀和收缩以及图像的放大(缩放)自然而愉快。
-
确保可见性:渐变叠加层位于背景图像之上,以提高白色文本的可读性。
如何定制(定制指南)
-
您可以通过更改“height”来调整手风琴的整体高度。
-
根据面板数量添加/删除 HTML
.ia-panel元素。 -
请在每个面板的“background-image”中设置您最喜欢的图像 URL。
实现代码(Implementation)
<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> 浏览器支持
该组件使用 :has() 伪类,现代浏览器(最新版本的 Chrome、Edge、Safari 和 Firefox)完全支持该伪类。较旧的浏览器可能需要使用 JavaScript 进行类替换作为后备。