3D 开门效果(铰链旋转门板 CSS 动画)
3D 开门效果组件:门板绕左侧铰链 3D 旋转打开,露出房间内部,含木质纹理、把手与合页细节,回弹缓动曲线自研实现,点击门板或按钮即可开合。
效果演示(真实可交互)
点击演示区的门板或下方按钮,门会绕左侧铰链 3D 旋转打开,露出藏在门后的「房间内部」。开门动画使用带轻微过冲的回弹缓动曲线,门板会先开过头一点再回正,像真实房门一样有弹性;打开后门把手自动翻面朝向观者,合页细节保留在门框上。
房间内部 · 欢迎光临
点击门板或按钮,门绕左侧铰链 3D 旋转打开,露出房间内部
完整代码
HTML(门框、内部、门板三层结构):
<div class="do3d-scene">
<div class="do3d-frame" id="frame">
<div class="do3d-interior">房间内部</div>
<div class="do3d-door" id="door">
<span class="do3d-handle"></span>
<span class="do3d-hinge"></span>
</div>
</div>
</div>
CSS(开门动画的关键三行):
.do3d-scene { perspective: 1100px; } /* 3D 视距 */
.do3d-door {
transform-origin: left center; /* 铰链位置:门板左边缘 */
transition: transform .9s cubic-bezier(.3, 1.35, .45, 1); /* 回弹曲线 */
}
.do3d-frame.open .do3d-door { transform: rotateY(-102deg); } /* 开门状态 */
JS(点击切换状态,约 10 行):
const frame = document.getElementById('frame');
const btn = document.getElementById('btn');
const toggle = () => {
const open = frame.classList.toggle('open');
btn.textContent = open ? '关上门' : '打开门';
};
door.addEventListener('click', toggle);
btn.addEventListener('click', toggle);
原理拆解:transform-origin: left center 把旋转轴定在门板左缘,模拟铰链;rotateY(-102deg) 让门板绕 Y 轴向外旋开,负角度决定了开门方向(向左开);cubic-bezier(.3, 1.35, .45, 1) 的 Y 值大于 1,产生先过冲再回落的弹性手感。门板内部再叠一层 repeating-linear-gradient 做出竖向木纹,把手与合页用纯 CSS 圆点与径向渐变完成,零图片资源。
参数说明
| 参数 | 位置 | 说明 |
|---|---|---|
| 开门角度 | rotateY(-102deg) | 90-110deg,越大门开得越「平」 |
| 开门方向 | 旋转角度的正负号 | 负值向左开,正值向右开 |
| 回弹强度 | cubic-bezier 的第二、四项 | Y 值超过 1 越多,过冲越明显 |
| 开门时长 | transition: ... .9s | 500-1200ms,配合回弹曲线使用 |
| 铰链位置 | transform-origin: left center | 改 right 即右开门 |
兼容性与性能
- 依赖
transform-origin与perspective,Chrome 12+ / Safari 4+ / Firefox 10+ / Edge 全支持,兼容性极好 - 动画仅 transform 一个属性参与过渡,GPU 合成,无布局与绘制开销
- 门板、把手、合页全部用 CSS 绘制,无图片请求;木纹纹理由 repeating-linear-gradient 生成,可随意换色
- 已内置键盘支持:门板可聚焦,按回车或空格同样触发开合,方便无障碍操作
常见问题
Q: 门开起来没有立体感,像被压扁了? 检查父容器是否设置了 perspective,且该值不要过小(小于 400px 会强烈变形)。另外不要在门板或门框上设置 overflow: hidden,它会裁掉 3D 投影。
Q: 想改成向右开门怎么调? 把 transform-origin 改为 right center,同时把 rotateY(-102deg) 改成正的 rotateY(102deg),把手位置移到门板左侧即可。
Q: 开门后背面内容怎么处理? 门板背面默认显示镜像内容。如果背面需要独立文案,可以给门板加一个 rotateY(180deg) 的子层做「背面面板」,与翻转卡片是同一套思路。
Q: 能商用吗? 可以。本组件为粤喵自研原创实现,免费商用无需署名。
许可与来源
- 许可证:自研原创 —— 粤喵自研原创,可免费用于个人与商业项目,无需署名。查看来源公示与许可清单
- 来源:粤喵团队原创自研(从效果思路到代码实现均为独立完成,未直接复制第三方代码)
- 首次发布:2026-09-01 · 最近更新:2026-09-01
- 修改日志:2026-09-01 首次发布;2026-09-13 补充许可证与来源标注、复制按钮说明与法务页入口
- 纠错:联系页面 / min@cactus.asia,2 个工作日内核实处理
常见问题
这个组件可以商用吗?
可以。本组件为粤喵自研原创,可免费用于个人和商业项目,无需署名。
浏览器兼容性如何?
支持所有现代浏览器(Chrome / Firefox / Safari / Edge 最新版本)。旧版 IE 不支持 CSS 动画相关特性。
怎么修改动画参数?
直接调整 CSS 中的 animation-duration(时长)、animation-timing-function(缓动曲线)等属性即可,代码中有注释说明。