能,但必须写在全局作用域的<style>中,不可嵌套、不可带点号或数字开头,名称大小写需与animation-name严格一致,scoped样式中会失效。

keyframes 能不能写在 <style> 里?
能,但必须是全局作用域的 <style>,不能套在任何选择器内部,也不能写在内联 属性里。浏览器只认顶层声明的 @keyframes 规则,嵌套或缩进都会直接忽略。
@keyframes 必须用 name 而不是选择器语法
常见错误是把它当 CSS 类写,比如 @keyframes .fade-in 或 @keyframes #slide —— 这会静默失效。name 必须是合法标识符:只能含字母、数字、下划线、短横线,且不能以数字开头。
-
@keyframes fadeIn✅ -
@keyframes fade-in✅ -
@keyframes .fadeIn❌(带点号) -
@keyframes 1slide❌(数字开头)
动画名大小写敏感,且需和 animation-name 严格一致
定义时用 @keyframes slideUp,调用时就得写 animation-name: slideUp。写成 slideup 或 SlideUp 都不会触发动画,控制台也不报错,排查起来特别隐蔽。
示例:
立即学习“前端免费学习笔记(深入)”;
<style>
@keyframes bounce {
from { transform: translateY(0); }
to { transform: translateY(-20px); }
}
.bounce-element {
animation-name: bounce; /* 必须完全匹配,包括大小写 */
animation-duration: 0.3s;
}
</style>内部 style 标签中 keyframes 的兼容性没问题,但别混用 scoped
纯 HTML 页面里 <style> 中的 @keyframes 在所有现代浏览器都支持(包括 IE10+)。但如果用的是 Vue 单文件组件里的 <style scoped>,那里面的 @keyframes 会被自动加上属性选择器前缀,导致无效 —— 这时候得提出来放到非 scoped 的 <style> 块里。
容易被忽略的一点:keyframes 本身不参与 CSS 作用域隔离,但它引用的自定义属性(比如 var(--anim-delay))在 scoped 环境下可能拿不到值,得额外处理。










