3D 卡片翻转 + 鼠标跟随倾斜特效(纯 CSS + JS)
3D 卡片翻转(hover 翻转 180°)+ 鼠标跟随倾斜(tilt 视差)两种特效,含 translate3d/perspective 原理解析,复制即用。
效果演示(真实可交互)
鼠标移上来
卡片会跟随你的鼠标倾斜
完整代码
特效一:hover 3D 翻转(纯 CSS)
<div class="flip-card">
<div class="flip-inner">
<div class="flip-front">正面 😺</div>
<div class="flip-back">背面 🎨</div>
</div>
</div>
.flip-card {
width: 260px; height: 160px;
perspective: 1000px; /* 父级给透视,翻转才有立体感 */
}
.flip-inner {
width: 100%; height: 100%;
position: relative;
transition: transform .6s;
transform-style: preserve-3d; /* 保留 3D 子元素 */
}
.flip-card:hover .flip-inner { transform: rotateY(180deg); }
.flip-front, .flip-back {
position: absolute; inset: 0;
display: flex; align-items: center; justify-content: center;
border-radius: 16px; backface-visibility: hidden; /* 背面隐藏 */
}
.flip-front { background: #1c2029; color: #e8e8e8; }
.flip-back { background: #6c8cff; color: #fff; transform: rotateY(180deg); }
特效二:鼠标跟随倾斜(JS tilt)
<div id="tilt">把鼠标放上来</div>
#tilt {
width: 260px; height: 160px; border-radius: 16px;
background: linear-gradient(135deg, #1c2029, #232a3d);
transition: transform .12s ease-out;
will-change: transform; cursor: pointer;
}
const card = document.getElementById('tilt');
card.addEventListener('mousemove', (e) => {
const r = card.getBoundingClientRect();
const x = (e.clientX - r.left) / r.width;
const y = (e.clientY - r.top) / r.height;
const rx = (0.5 - y) * 18; // 倾斜角度,可调
const ry = (x - 0.5) * 18;
card.style.transform = `perspective(800px) rotateX(${rx}deg) rotateY(${ry}deg)`;
});
card.addEventListener('mouseleave', () => {
card.style.transform = 'perspective(800px) rotateX(0) rotateY(0)';
});
原理说明
- perspective:透视距离,值越小 3D 效果越强(600-1000px 较自然)
- rotateX/rotateY:绕 X/Y 轴旋转,鼠标位置映射为角度(本例最大 ±18°)
- preserve-3d:让子元素在 3D 空间定位,翻转卡片必须加
- backface-visibility: hidden:翻转后隐藏背面,实现「换面」效果
- will-change: transform:提前告知浏览器做合成优化,避免卡顿
参数调节
| 参数 | 说明 |
|---|---|
* 18(角度) | 越大倾斜越明显,建议 10-25 |
transition: .12s | 跟随灵敏度,越小越跟手 |
perspective: 800px | 透视强度 |
翻转时长 .6s | 翻转速度 |
常见问题
Q: 手机上能用吗? 鼠标跟随特效是桌面专属;3D 翻转在触屏上通过 tap 触发(:active 或点击切换类名)。
Q: 卡顿怎么办? 确认加了 will-change: transform,且不要对卡片内部做重排操作(如频繁改文字)。
Q: 可以商用吗? 可以,本组件为粤喵自研原创,免费商用无需署名。
常见问题
这个组件可以商用吗?
可以。本组件为粤喵自研原创,可免费用于个人和商业项目,无需署名。
浏览器兼容性如何?
支持所有现代浏览器(Chrome / Firefox / Safari / Edge 最新版本)。旧版 IE 不支持 CSS 动画相关特性。
怎么修改动画参数?
直接调整 CSS 中的 animation-duration(时长)、animation-timing-function(缓动曲线)等属性即可,代码中有注释说明。