transform: scaleY(0) 配合 transition 不生效主因是 display: none 中断动画,须改用 visibility: hidden + opacity: 0 或纯 transform 控制显隐;需设 transform-origin: top、避免 height 过渡、启用硬件加速(will-change)、慎用父级 transform;移动端需用 :focus-within 或 JS 替代 :hover;文字模糊可改用 translateY + opacity 缓解。
下拉菜单用
配合
为什么经常不生效
因为
对
元素完全无效,而多数人习惯在隐藏时写
—— 这会直接中断过渡动画。必须全程保持元素在文档流中(比如用
+
或仅靠
控制显隐)。
推荐做法是:初始状态设为
、
、
,展开时移除这些,并确保父容器有
防止内容溢出。
别在切换中修改
,否则
立刻失效
要配合
,否则缩放中心偏移导致“往上缩”或错位
若菜单含子项或 padding,
不固定,就别用
过渡——它无法从
平滑到
如何让
滑出效果真正“平滑”,而不是卡顿或跳变
关键在两点:触发硬件加速 + 避免 layout 触发。直接对
和
做过渡,浏览器会走合成层,性能好;一旦混入
、
、
或伪类内容变化,就可能强制重排(reflow),造成掉帧。
实操建议:
立即学习
“
前端免费学习笔记(深入)
”;
给下拉容器加
(仅在 hover/focus 激活前加,避免常驻开销)
过渡属性写全:例如
—— 第一个贝塞尔曲线专为“先快后慢再回弹”的滑出感优化
确保父级没有
(如
或
),否则子元素的
会受其影响而偏移
触发的下拉菜单在移动端点按失效怎么办
CSS
在多数触摸设备上只在首次点击后短暂触发,且无“悬停”概念,所以纯
下拉在手机上基本不可用。必须引入 JavaScript 控制类名,或改用
配合
。
使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
下载
轻量解法(无需 JS):
给菜单父容器加
用
替代
,例如:
同时保留
供桌面端使用,形成自然降级:
注意:iOS Safari 对
支持良好(iOS 15.4+),但旧版需 JS fallback。
为什么菜单滑出后文字模糊或出现锯齿
这是
导致的亚像素渲染问题,尤其在非整数缩放比(如 125% 缩放)或 Retina 屏上明显。根本原因是 scaleY(0) → scaleY(1) 过程中,浏览器对字体做非均匀缩放,破坏了 hinting。
缓解方式有限但有效:
给下拉菜单加
,强制启用 GPU 合成,减少模糊
避免对含文字的容器直接做
,改用
+
(但要预估最大高度,且动画不如 transform 流畅)
更稳妥的做法:用
替代
,配合
,例如从
到
,视觉上仍是“滑出”,但文字不缩放
真正要兼顾平滑、兼容和清晰,
+
是比
更少坑的选择,尤其当菜单内容以文本为主时。
transform: scaleY(0)transitiontransformdisplay: nonedisplay: nonevisibility: hiddenopacity: 0transformtransform: scaleY(0)opacity: 0visibility: hiddenoverflow: hiddendisplaytransitiontransform: scaleY(0)transform-origin: topheightheightheight: 0height: autotransformtransformopacitymarginpaddingheightwill-change: transform, opacitytransition: transform 0.25s cubic-bezier(0.34, 1.56, 0.64, 1), opacity 0.25s easetransformscalerotatetransform-origin:hover:hover:hover:focus-withintabindextabindex="0"&:focus-within:hover.menu:focus-within .dropdown { transform: scaleY(1); opacity: 1; visibility: visible; }:hover.menu:hover .dropdown, .menu:focus-within .dropdown { ... }:focus-withintransform: scaleY()backface-visibility: hiddenscaleYmax-heightoverflow: hiddentransform: translateY()scaleYopacitytransform: translateY(-10px)transform: translateY(0)translateYopacityscaleY