如何实现特定样式卡片:非激活居中/激活时图片上移(Next.js+Tailwind)
实现方案(Tailwind CSS + 纯CSS两种版本)
核心逻辑
- 固定卡片整体高度,确保激活状态下尺寸不变
- 非激活态:利用弹性布局让图片在标题下方的剩余空间自动垂直居中,适配标题动态高度变化
- 激活态:通过位移属性让图片上移,同时用绝对定位放置圆形箭头按钮,不占用额外布局空间
Tailwind CSS 实现代码
// Next.js 组件示例 export default function Card() { return ( <div className="w-64 h-80 bg-white rounded-lg shadow-md relative transition-all duration-300 hover:bg-blue-500 group"> {/* 动态高度标题 */} <h3 className="p-4 text-center text-gray-800 group-hover:text-white transition-colors"> 这是一个可能动态换行的标题内容,长度不固定 </h3> {/* 图片容器 */} <div className="flex-1 flex items-center justify-center p-4 transition-transform duration-300 group-hover:-translate-y-8"> <img src="/your-image.png" alt="卡片图片" className="w-32 h-32 object-contain" /> </div> {/* 激活态箭头按钮 */} <button className="absolute bottom-4 left-1/2 -translate-x-1/2 w-10 h-10 rounded-full bg-white flex items-center justify-center text-blue-500 opacity-0 group-hover:opacity-100 transition-opacity"> ↑ </button> </div> ) }
关键细节
h-80固定卡片高度,避免激活时尺寸变化- 图片容器用
flex-1占据标题剩余的全部空间,配合flex items-center justify-center实现自适应居中 - 激活时通过
group-hover:-translate-y-8让图片上移,腾出底部空间 - 箭头按钮用绝对定位固定在卡片底部,初始隐藏、激活时显示,不影响整体布局
纯HTML+CSS 实现代码
<div class="card"> <h3 class="card-title">这是一个可能动态换行的标题内容,长度不固定</h3> <div class="image-container"> <img src="your-image.png" alt="卡片图片" /> </div> <button class="card-arrow">↑</button> </div>
.card { width: 16rem; height: 20rem; background: #fff; border-radius: 0.5rem; box-shadow: 0 2px 4px rgba(0,0,0,0.1); position: relative; transition: background 0.3s ease; } .card:hover { background: #3b82f6; } .card-title { padding: 1rem; text-align: center; color: #1f2937; transition: color 0.3s ease; } .card:hover .card-title { color: #fff; } .image-container { flex: 1; display: flex; align-items: center; justify-content: center; padding: 1rem; transition: transform 0.3s ease; } .image-container img { width: 8rem; height: 8rem; object-fit: contain; } .card:hover .image-container { transform: translateY(-2rem); } .card-arrow { position: absolute; bottom: 1rem; left: 50%; transform: translateX(-50%); width: 2.5rem; height: 2.5rem; border: none; border-radius: 50%; background: #fff; color: #3b82f6; cursor: pointer; opacity: 0; transition: opacity 0.3s ease; display: flex; align-items: center; justify-content: center; } .card:hover .card-arrow { opacity: 1; }
内容的提问来源于stack exchange,提问作者Daniel_Kamel
相关产品推荐
相关产品推荐

