transform mixin 必须显式声明所有前缀,顺序为-webkit-→-ms-→标准属性;rotate/translate/scale 应拆分为独立 mixin;组合多个变换时需合并为单条 transform 声明,避免覆盖;慎用 translateZ(0),仅在明确性能瓶颈时单独调用。
transform mixin 必须显式声明所有前缀,不能只靠 autoprefixer 补全
autoprefixer 只处理标准属性(如
),不会回填
或
这类旧前缀——尤其当你的
配置里包含 iOS 14.5、IE 10 或 Android 4.4 这类仍需手动前缀的环境时,仅靠 autoprefixer 会漏掉关键声明,导致 Safari 旧版白屏或 IE 10 完全不生效。
正确做法是:在 mixin 内部硬编码常用前缀组合,且顺序必须是
→
→ 标准属性。Sass 不做运行时检测,所谓“自动”只是你按目标浏览器列表预设的兜底逻辑。
必须写成:
不要试图用
动态拼接属性名,Sass 4.0+ 会报错:
如果只封装单个变换(如仅
),就别塞进
这个总属性里——避免和后续
、
调用冲突,覆盖掉前面的值
平移/旋转/缩放应拆成独立 mixin,而非一个万能 transform($val)
把所有变换塞进一个
看似灵活,实则破坏可维护性:调用时得记清字符串格式(
),编译后无法被 autoprefixer 识别,也无法做单位校验,更没法单独覆盖某一项(比如想让
在移动端降级为
)。
更稳妥的方式是按原子操作拆分,每个 mixin 只负责一类语义明确的变换:
立即学习
“
前端免费学习笔记(深入)
”;
:生成
+ 所有前缀
:只处理角度,不接受
或
单位混用
:默认
,若需
/
则另写
这样调用清晰:
,CSS 输出也干净,方便调试和 patch。
组合多个 transform 时,必须用单个
声明,不能多次叠加
Sass mixin 展开是文本替换,如果分别
和
,会生成多条
声明,后写的会完全覆盖前写的(浏览器只认最后一条),结果只有旋转生效,平移丢失。
使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
下载
解决方案有两个:
写一个组合 mixin:
,内部用
拼出完整值,例如
更推荐手动组合:在调用点统一写
,把 mixin 当作“值生成器”,比如
返回字符串
,再由你拼进
声明中
注意:Sass 的
在这里危险——
可能在新版 Sass 编译失败;稳妥写法是直接用插值:
,前提是传入的变量已是合法字符串。
慎用
强制 GPU 加速
很多教程建议加
触发硬件加速,但实际场景中它可能引发新问题:iOS Safari 15.4 以下版本在
容器内使用时会导致滚动卡顿;Android Chrome 80+ 对
的渲染路径已优化,强制添加反而增加图层合成开销。
如果你真需要该行为,别把它塞进通用
mixin 里,而是单独封装:
:只输出
仅在明确测出性能瓶颈的组件中调用,比如长列表滚动区域或高频动画容器
避免和
、
等 mixin 混用——
必须和其他
值合并为一条声明,否则会被覆盖
真正影响性能的是 layout 触发条件(如改
、
、
),不是要不要加
。盯着
本身做文章,容易忽略更根本的重排重绘源头。
transform-webkit-transform-ms-transformbrowserslist-webkit--ms-@mixin rotate($deg)-webkit-transform: rotate(#{$deg}); -ms-transform: rotate(#{$deg}); transform: rotate(#{$deg});@if $prop == 'rotate'Invalid CSS after "...form: #{'rotate'}": expected ")", was "(#{$deg})"rotatetransformscaletranslate@mixin transform($val)rotate(45deg) scale(1.2)translateXmargin-left@mixin translate($x, $y: 0)transform: translate(#{$x}, #{$y})@mixin rotate($deg)radgrad@mixin scale($factor)scale(#{$factor})scaleXscaleY@mixin scale-x($factor)@include translate(10px, -5px); @include rotate(-15deg);transform@include translate(...)@include rotate(...)transform@mixin transform-combo($t: (), $r: null, $s: null)transform: #{...}transform: translate(10px, -5px) rotate(-15deg) scale(1.1)transform: translate(...) rotate(...) scale(...)translate(10px, -5px)translate(10px, -5px)transformunquote()#{unquote('translate(10px, -5px)')}transform: #{$t} #{$r} #{$s};transform: translateZ(0)translateZ(0)position: fixedtranslateZtransform@mixin gpu-accelerate-webkit-transform: translateZ(0); transform: translateZ(0);translatescaletranslateZ(0)transformwidthheightleftZtransform