前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
首页程序员面试题库CSS keyframes 不可插值属性 display 处理
CSS动画与视觉

关键帧动画里写了 display 这种不可插值的属性,浏览器会怎么处理?

不可插值的属性在关键帧之间不会平滑过渡,浏览器会在时间轴到达关键帧的那一刻直接跳变。比如从 display: block 到 display: none,不会有中间状态,到了那个时间点就瞬间切换。

前端进阶之旅 · 一题精讲更新于 2026.09.29
CSS#动画与视觉#动画
先看核心答案读代码示例
理解线索

可插值与不可插值的区别

  1. 可插值属性opacity、transform、颜色等,浏览器能算出中间值,平滑过渡
  2. 不可插值属性display、font-family 等,没有中间状态,只能跳变
  3. 特殊离散属性visibility 虽然离散,但规范规定 visible 一侧会「赢」,直到动画结束才切走

判断一个属性能不能做动画,关键看 MDN 上该属性的 Animation type。写着 discrete 的就是跳变,写着 by computed value 或具体插值方式的才能平滑过渡。

核心回答

先记住这个答案

浏览器做关键帧动画时,会在相邻两个关键帧之间对属性值做插值。opacity 从 1 到 0,中间能算出 0.5,所以是平滑的。但 display: block 和 display: none 之间没有中间状态,浏览器算不出「半个 block」,所以只能在关键帧时间点直接跳变。这就是不可插值属性的处理方式:到了该切的时刻,瞬间换成新值。

  • 不可插值属性在关键帧时间点瞬间跳变,没有中间值
  • display 是离散值,不会平滑插值
  • visibility 有特殊的离散切换规则
  • allow-discrete 可参与离散过渡

display 的跳变时机

很多人以为 display 会在两个关键帧的正中间跳变,其实不是。规范规定:离散属性的值会在前一个关键帧的区间内保持,直到下一个关键帧的时间点才切换。

比如 0% 是 display: block,100% 是 display: none,那整个动画过程中元素都是 block,直到动画结束的最后一刻才变成 none。这个行为其实是有用的——它让你可以在动画期间对元素做 opacity 淡出,动画结束后再用 display: none 彻底移除。

淡出后隐藏的写法CSS
@keyframes fade-out {
  from {
    opacity: 1;
    display: block;
  }
  to {
    opacity: 0;
    display: none;  /* 动画结束时才跳变 */
  }
}
.leaving {
  animation: fade-out 300ms forwards;
}

opacity 平滑地从 1 过渡到 0,整个过程中 display 一直是 block(因为跳变发生在最后一刻)。动画结束后 forwards 保持最终帧的值,元素变成 display: none,从布局中移除。

visibility 的特殊待遇

visibility 也是离散值,只有 visible 和 hidden 两种状态。但规范对它做了特殊处理:只要起止帧中有一边是 visible,整个过渡期间元素都保持 visible,直到动画结束才切成 hidden。

这个行为和 display 类似,但 visibility: hidden 的元素仍然占据布局空间,display: none 不占。所以淡出动画用哪个取决于你是否需要保留占位。

新规范的 transition-behavior

以前 display 完全不能参与 transition,写 transition: display 300ms 毫无效果。新规范引入了 transition-behavior: allow-discrete,加上之后浏览器就会用和关键帧动画一样的跳变时机来处理过渡。

配合 @starting-style 规则可以给元素第一次出现时设定初始样式,实现「元素从 display: none 变为 block 时淡入」的效果。Chrome 117 和 Safari 17.4 已经支持,Firefox 也已跟进。

回答前,多想一步

容易答错的地方

以为所有属性都能做关键帧动画
只有可插值属性才能平滑过渡。font-family、position、display 这类属性都是离散的,写进 @keyframes 不会报错,但只会跳变。面试时说清「可插值」和「离散」的区别就够了。
把 display 跳变和 visibility 跳变搞混
display: none 会让元素完全脱离文档流,不占空间。visibility: hidden 只是视觉上隐藏,空间还在。两者在动画中的跳变时机虽然类似,但对布局的影响完全不同。
试着用自己的话回答

面试官还会怎么问?

怎么判断一个 CSS 属性是不是可插值的?

查 MDN 文档,每个属性页面都有 Animation type 字段。写 discrete 的是离散跳变,写 by computed value、length、color 之类的是可插值。没有文档的时候,想一想两个值之间有没有合理的中间态,没有就是离散的。

想让弹窗淡出后从 DOM 流里消失,不用 JavaScript 怎么做?

用 @keyframes 同时写 opacity 和 display。opacity 负责淡出,display: none 写在 to 帧里,动画结束后靠 animation-fill-mode: forwards 保持最终状态。这样元素淡出完毕后就自动不占空间了。

@property 注册的自定义属性能不能让离散值变成可插值?

不能。@property 只能让浏览器知道自定义属性的类型从而进行插值,但前提是那个类型本身得是可插值的。注册成 <length> 或 <color> 就能插值,但没有一个类型能把 block 和 none 变成连续的。

从一道题,走向一组知识

把知识连起来

动画与视觉

transform 里同时写 translate、rotate、scale,顺序不同结果为什么不一样?

transform 是典型的可插值属性,多个变换函数在关键帧之间会逐个做数值插值,和 display 的跳变形成对比。

动画与视觉

怎么用 CSS 让文字显示渐变色?

background-clip 也是不可插值的离散属性,想对渐变文字做动画只能换思路,和 display 碰到的问题一样。

参考资料

  • CSS:动画与视觉参考资料

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. display 的跳变时机
  3. visibility 的特殊待遇
  4. 新规范的 transition-behavior
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑