@starting-style 不是标准 css 起始样式机制,2026年4月仍未被任何主流浏览器支持,w3c 已将其从 animations level 4 规范中移除;实际可用方案包括 animation: none + 类切换、@property 声明自定义属性(chromium/safari 支持)、will-change 提示优化。

@starting-style 不是标准 CSS 起始样式机制,目前(2026年4月)未被任何主流浏览器原生支持,它只是 CSS 动画规范中一个已被废弃的草案提案。你看到的文档或教程若提到它,大概率是混淆了 @property、animation: none 或早期实验性实现(如旧版 Chromium 的临时 flag),实际项目中不能依赖。
@starting-style 为什么不能用
- 它曾试图在动画开始前“冻结”元素初始状态,避免首帧闪烁,但因实现复杂、与现有层叠逻辑冲突,W3C 已将其从 Animations Level 4 规范中移除
- 所有当前稳定版浏览器(Chrome 124+、Firefox 125+、Safari 17.4+)完全忽略该 at-rule,写上去既不报错也不生效
- DevTools 中查不到对应解析,
getComputedStyle()也不会受其影响
真正可用的“起始样式”控制方案
你需要的是:让元素在动画触发前保持某种视觉状态,且不闪、不跳、可预测。现实中有三类可靠做法:
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
-
用
animation: none+ 类切换
先给元素设好初始样式(比如opacity: 0; transform: translateY(20px);),再通过添加 class 启动动画:.box { opacity: 0; transform: translateY(20px); } .box.animate { animation: slideIn 0.3s ease-out forwards; }关键点:forwards保证动画结束态保留,none确保初始无动画干扰 -
用
@property声明自定义属性并动画化(仅 Chromium 系列 & Safari 16.4+ 支持)
它能真正控制动画起始值,但需显式注册:@property --my-opacity { syntax: '<number>'; inherits: false; initial-value: 0; } .box { opacity: var(--my-opacity); } .box.animate { --my-opacity: 1; animation: fade 0.3s ease-out; }</number>注意:Firefox 不支持@property,需降级 fallback -
用
will-change: opacity+ 强制重排规避首帧抖动
如果你发现动画第一帧总卡一下,不是因为缺“起始样式”,而是浏览器没提前准备图层:.box { opacity: 0; will-change: opacity; transition: opacity 0.3s; } .box.show { opacity: 1; }will-change提示渲染引擎预分配资源,比空等更稳
容易踩的坑
- 把
style内联写法(<p style="..."></p>)当成“起始样式”——它只是静态样式,和动画生命周期无关 - 在
@keyframes里写0% { ... }就以为是“起始”,但若元素本身已有内联style或高优先级规则,0%仍可能被覆盖 - 依赖 JS 动态插入
<style>@starting-style{...}</style>—— 浏览器压根不解析,白忙活
真正要管住起始态,得靠样式优先级控制 + 动画 fill-mode + 层级提示这三板斧,而不是找一个不存在的语法糖。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










