<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>动画 on ZiYang FrontEnd Interview</title><link>https://fe-interview.pangcy.cn/tags/%E5%8A%A8%E7%94%BB/</link><description>Recent content in 动画 on ZiYang FrontEnd Interview</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Thu, 06 Mar 2025 13:07:39 +0800</lastBuildDate><atom:link href="https://fe-interview.pangcy.cn/tags/%E5%8A%A8%E7%94%BB/index.xml" rel="self" type="application/rss+xml"/><item><title>CSS动画实现原理</title><link>https://fe-interview.pangcy.cn/docs/css/css-05/</link><pubDate>Tue, 04 Mar 2025 06:58:34 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/css/css-05/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>该题目主要考察以下核心能力维度：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>CSS动画机制理解&lt;/strong>：区分transition与animation的触发机制、时间线控制与状态管理&lt;/li>
&lt;li>&lt;strong>渲染性能优化&lt;/strong>：掌握合成层提升（composite layer）与GPU加速原理&lt;/li>
&lt;li>&lt;strong>浏览器渲染流程&lt;/strong>：理解重排（reflow）与重绘（repaint）对动画性能的影响&lt;/li>
&lt;/ol>
&lt;p>具体技术评估点：&lt;/p>
&lt;ul>
&lt;li>Transition的被动触发特性与单次动画逻辑&lt;/li>
&lt;li>Animation的关键帧控制与循环能力&lt;/li>
&lt;li>will-change属性触发的图层优化策略&lt;/li>
&lt;li>浏览器渲染线程与合成器（compositor）的协作机制&lt;/li>
&lt;/ul>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>&lt;strong>执行流程对比&lt;/strong>：Transition（状态变化驱动）vs Animation（时间轴驱动）&lt;/li>
&lt;li>&lt;strong>关键帧动画&lt;/strong>：@keyframes规则与动画阶段控制&lt;/li>
&lt;li>&lt;strong>合成层优化&lt;/strong>：will-change的图层提升机制&lt;/li>
&lt;/ol>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>&lt;strong>Transition工作机制&lt;/strong>：&lt;br>
当CSS属性变更时，浏览器自动计算起始值与结束值之间的插值。适用于简单状态切换，如悬停效果。执行流程：属性改变 → 计算过渡曲线 → 逐帧渲染。仅支持两个状态，通过&lt;code>transition-property&lt;/code>指定目标属性。&lt;/p>
&lt;p>&lt;strong>Animation工作机制&lt;/strong>：&lt;br>
通过&lt;code>@keyframes&lt;/code>定义包含多个关键帧的动画序列，由&lt;code>animation&lt;/code>属性触发。浏览器预先生成动画轨迹，支持循环、暂停等控制。执行流程：关键帧解析 → 构建动画时间线 → 独立于JS事件循环的渲染更新。&lt;/p>
&lt;p>&lt;strong>will-change优化原理&lt;/strong>：&lt;br>
通过提示浏览器提前为元素创建独立的合成层（composite layer），将动画交给GPU处理，避免布局计算与重绘。例如设置&lt;code>will-change: transform;&lt;/code>会使元素进入离屏位图缓存，后续的transform/acity变化可跳过主线程直接由合成器处理。&lt;/p>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>误用transition实现多阶段动画，导致代码复杂度失控&lt;/li>
&lt;li>滥用will-change引发内存泄漏（未及时移除）&lt;/li>
&lt;li>混淆animation-timing-function与transition-timing-function的作用阶段&lt;/li>
&lt;/ol>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>Transition与Animation的核心差异体现在触发机制与控制维度。Transition依赖样式变化触发（如:hover），仅支持两点间插值；而Animation通过关键帧定义完整时间轴的动画序列，可循环执行。例如点击按钮的渐显效果适合用transition，而复杂的加载动画需用animation。&lt;/p>
&lt;p>@keyframes通过百分比定义动画阶段：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="7625839" class="language-css ">
 &lt;code>@keyframes slide {
 0% { transform: translateX(-100%); }
 50% { opacity: 0.5; }
 100% { transform: translateX(0); }
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>配合&lt;code>animation: slide 2s ease-in-out infinite&lt;/code>实现循环滑动。&lt;/p></description></item><item><title>滚动驱动动画实现</title><link>https://fe-interview.pangcy.cn/docs/css/css-33/</link><pubDate>Tue, 04 Mar 2025 06:58:34 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/css/css-33/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>&lt;strong>核心能力维度&lt;/strong>：CSS动画原理/现代浏览器API运用/性能优化意识&lt;/p>
&lt;ol>
&lt;li>&lt;strong>滚动驱动动画规范&lt;/strong>：对Scroll-driven Animations提案的理解深度&lt;/li>
&lt;li>&lt;strong>CSS与JS方案对比&lt;/strong>：浏览器渲染机制差异（主线程 vs 合成器线程）&lt;/li>
&lt;li>&lt;strong>API运用能力&lt;/strong>：animation-timeline与view()的实战配置&lt;/li>
&lt;li>&lt;strong>视口检测机制&lt;/strong>：基于元素位置的动画触发逻辑&lt;/li>
&lt;li>&lt;strong>性能优化认知&lt;/strong>：对比滚动监听方案的重绘重排控制&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>Scroll-driven Animations &amp;gt; animation-timeline &amp;gt; view() &amp;gt; scroll() &amp;gt; JavaScript滚动监听&lt;/p>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>
&lt;p>&lt;strong>animation-timeline&lt;/strong>：&lt;br>
将动画时间轴绑定到滚动进度而非默认时间轴，支持两种类型：&lt;/p>
&lt;ul>
&lt;li>&lt;code>scroll()&lt;/code>：绑定到滚动容器的滚动进度&lt;/li>
&lt;li>&lt;code>view()&lt;/code>：绑定到元素与视口的交叉进度&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>view()函数&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>参数：&lt;code>view(axis=block, start=0%, end=100%)&lt;/code>&lt;/li>
&lt;li>当元素进入/离开指定视口范围时触发动画进程&lt;/li>
&lt;li>示例：&lt;code>view(block 25% 75%)&lt;/code>表示元素在块轴向进入25%-75%视口范围时触发&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>执行流程&lt;/strong>：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="a994080" class="language- ">
 &lt;code>滚动事件 → 浏览器计算滚动偏移量 → 更新相关CSS Timeline → 触发动画合成器更新 → GPU渲染&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;/li>
&lt;/ol>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>混淆&lt;code>view()&lt;/code>的起始点定义与Intersection Observer的thresholds&lt;/li>
&lt;li>未考虑浏览器兼容性导致降级方案缺失&lt;/li>
&lt;li>过度依赖JS轮询造成主线程卡顿&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>&lt;strong>核心API说明&lt;/strong>：&lt;br>
Scroll-driven Animations通过&lt;code>animation-timeline&lt;/code>属性关联滚动时间轴，其中：&lt;/p>
&lt;ul>
&lt;li>&lt;code>scroll()&lt;/code>绑定滚动容器进度，需配合&lt;code>scroll-timeline&lt;/code>定义滚动轴&lt;/li>
&lt;li>&lt;code>view()&lt;/code>基于元素与视口的交叉状态驱动动画&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>视口进入动画示例&lt;/strong>：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="ba37079" class="language-css ">
 &lt;code>@keyframes slide-in {
 from { transform: translateX(-100%); }
 to { transform: translateX(0); }
}

.box {
 animation: slide-in 1ms; /* 占位值，实际时长由滚动决定 */
 animation-timeline: view(block 20% 80%);
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>&lt;strong>滚动进度条动画&lt;/strong>：&lt;/p></description></item></channel></rss>