3D 开门效果(铰链旋转门板 CSS 动画)

CSSJS 许可:自研原创

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: ... .9s500-1200ms,配合回弹曲线使用
铰链位置transform-origin: left center改 right 即右开门

兼容性与性能

常见问题

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(缓动曲线)等属性即可,代码中有注释说明。

✍️ 作者与审核