纯CSS信封效果核心是transform+perspective+精确transform-origin:盖子需设transform-origin: bottom center(或50% 100%),perspective必须加在父容器并配transform-style: preserve-3d,避免overflow:hidden截断内容及pointer-events失效。
纯 CSS 实现信封效果,核心不靠图片、不依赖 SVG,关键在 transform + perspective + 精确的 transform-origin 控制。多数失败案例,其实是盖子旋转轴没对齐、z-index 层叠错乱,或漏了 backface-visibility: hidden 导致背面穿模。
transform-origin
信封盖(flap)不是绕中心转,是绕底部边缘向上掀开。若不显式指定原点,rotateX() 会默认绕元素中心,结果就是“飘起来”而不是“掀开”。
transform-origin: bottom center 是最常用且稳定的写法(适用于盖子高度占信封 20%~30% 的常见比例)position: absolute 且 top 偏移为负值(比如 top: -15px),则需改用 transform-origin: 50% 100%,避免因定位偏移导致原点计算偏差transform-origin: bottom —— 浏览器兼容性差,Safari 旧版可能失效perspective 必须加在父容器,不能只加在盖子上3D 效果依赖透视投影,但 perspective 只对**后代元素的 3D 变换**生效,加在 .envelope__flap 自身无效。
.envelope)设置 perspective: 800px,单位必须是 px 或 rem,不能是 %100px)会导致翻转形变夸张;太大(如 3000px)则像平面旋转,失去立体感;推荐范围:600px–1200px
transform-style: preserve-3d 到同一容器,否则子元素的 3D 位置会被扁平化overflow: hidden 截断信封打开时,内部信纸(.envelope__body)通常用 transform: translateY() 或 height 动画推出来,但若父容器有 overflow: hidden,内容就会被砍掉。
立即学习“前端免费学习笔记(深入)”;
.envelope 是否意外设置了 overflow: hidden —— 这是最隐蔽的坑,控制台里看不见,但动画卡在半途z-index 确保它在盖子上方,再配合 opacity 和 transform 控制进出display: none/block 切换信纸,会导致过渡中断;改用 visibility: hidden/visible + opacity + transform
cursor 和 pointer-events
信封在 iOS Safari 或部分安卓 WebView 中点不动,大概率是交互层缺失。
cursor: pointer(非必需但能提示用户可交互)pointer-events: none,尤其当信封嵌在轮播图、弹窗或 canvas 上层时transform: scale(0.99) 类似 hack 来触发硬件加速,某些旧版 WebView 会误判为不可点击区域,建议改用 will-change: transform
真正难的不是写出第一个能动的信封,而是让盖子掀开角度刚好、阴影自然、不同屏幕下都不穿帮——这些全靠反复调 transform-origin 坐标和 perspective 值,别信“一套参数通吃”的说法。