悬停揭示卡片(遮罩滑出 + 3D 翻转两种形态 CSS 源码)
悬停揭示卡片两种形态源码:底部遮罩滑出详情与 3D 翻转揭示背面,纯 CSS 实现,适合作品集、商品卡与团队成员介绍。
效果演示(真实可交互)
下方两张卡片演示两种揭示形态:左为渐变遮罩从底部滑出完整介绍,右为整卡绕 Y 轴 3D 翻转露出背面,悬停均有明显动效。
3D 翻转揭示
悬停翻转 180°
完整代码
HTML 结构:形态一为遮罩滑出,形态二为内层双面结构:
<!-- 形态一:遮罩滑出 -->
<div class="rv-card rv-slide">
<div class="rv-face">…正面内容…</div>
<div class="rv-cover">…遮罩详情…</div>
</div>
<!-- 形态二:3D 翻转 -->
<div class="rv-card rv-flip">
<div class="rv-inner">
<div class="rv-face face-front">…正面…</div>
<div class="rv-face face-back">…背面…</div>
</div>
</div>
核心 CSS:
/* 形态一:遮罩从底部滑入 */
.rv-cover {
position: absolute; inset: 0;
background: linear-gradient(135deg, #6c8cff, #b388ff);
transform: translateY(100%); /* 默认藏在底部 */
transition: transform .45s cubic-bezier(.22, .61, .36, 1);
}
.rv-slide:hover .rv-cover { transform: translateY(0); }
/* 形态二:3D 翻转 */
.rv-flip { perspective: 900px; } /* 父容器提供透视 */
.rv-inner {
position: absolute; inset: 0;
transform-style: preserve-3d; /* 保留子元素 3D 空间 */
transition: transform .6s cubic-bezier(.4, .1, .2, 1);
}
.rv-flip:hover .rv-inner { transform: rotateY(180deg); }
.rv-face { backface-visibility: hidden; } /* 背面隐藏 */
.face-back { transform: rotateY(180deg); } /* 背面预转 180° */
参数说明
| 参数 | 默认值 | 说明 |
|---|---|---|
遮罩位移 translateY(100%) | — | 遮罩初始位置,可改 -100% 为从上方滑入 |
| 遮罩动画时长 | .45s | 滑出速度 |
翻转角度 rotateY(180deg) | — | 可改 360 度获得多圈旋转 |
透视 perspective | 900px | 越小立体感越强,过小会变形 |
| 翻转时长 | .6s | 翻转速度 |
兼容性与性能
- 纯 CSS 实现,
backface-visibility与transform-style: preserve-3d在现代浏览器均稳定支持 - 3D 翻转涉及合成层,建议翻转卡片数量不要过多;Safari 下记得补
-webkit-backface-visibility前缀 - 遮罩滑出只动 transform,性能开销小,适合列表批量使用
- 触屏设备无 hover,建议为遮罩形态同时提供点击切换(配合 JS 加类名)
常见问题
Q: 翻转后背面文字是反的怎么办? 检查 .face-back 是否设置了 transform: rotateY(180deg),没有预转就会出现镜像文字。
Q: 遮罩想从左边滑入? 把 translateY(100%) 换成 translateX(100%),并把 inset: 0 保留即可。
Q: 手机上想看背面内容怎么操作? 触屏没有 hover,可以监听 tap 事件给 .rv-flip 添加一个 .active 类,CSS 用 .rv-flip.active .rv-inner 触发翻转。
Q: 可以商用吗? 可以,粤喵自研原创组件,免费商用无需署名。
常见问题
这个组件可以商用吗?
可以。本组件为粤喵自研原创,可免费用于个人和商业项目,无需署名。
浏览器兼容性如何?
支持所有现代浏览器(Chrome / Firefox / Safari / Edge 最新版本)。旧版 IE 不支持 CSS 动画相关特性。
怎么修改动画参数?
直接调整 CSS 中的 animation-duration(时长)、animation-timing-function(缓动曲线)等属性即可,代码中有注释说明。