过渡和动画

你给按钮添加一个 :hover 颜色,它确实有效,但变化很生硬:一帧是蓝色,下一帧是深蓝色,中间什么都没有。一个细微的淡入淡出会让整个页面感觉不那么生硬。这种淡入淡出就是过渡,一旦你能描述两个状态间的运动,同样的工具就能扩展到悬停效果、浮起的卡片,以及加载时旋转的微调器。本章讲述 CSS 如何移动事物,以及如何在不让页面变得更难用的情况下移动它们。
过渡
**过渡**告诉浏览器在属性从旧值变为新值时对其进行动画处理,而不是生硬地在它们之间切换。你描述两个状态,正常状态和悬停状态,过渡填充中间的帧。
这是一个在悬停时改变颜色的按钮。没有过渡时颜色会生硬跳变;有过渡时会淡入淡出:
.btn {
background: #3b82f6;
transition: background 0.2s; /* 在 0.2 秒内淡入淡出颜色 */
}
.btn:hover {
background: #1d4ed8; /* 动画化到的新状态 */
}你在正常状态上放置 transition,而不是在 :hover 上。这样当鼠标到达时和离开时都会应用。
:hover 上,所以它会往返工作。从 属性和 持续时间开始,你已经有了一个有效的淡入淡出。 变换
**变换**移动、缩放或旋转元素,而不会扰乱周围的任何东西。这是你通常想要动画化的东西,因为它看起来光滑,不会把邻居推到一边。
有三个你会经常使用的:
.card:hover {
transform: translateY(-4px); /* 向上移动 4 像素 */
}
.icon:hover {
transform: scale(1.1); /* 放大到其大小的 110% */
}
.arrow.open {
transform: rotate(90deg); /* 顺时针旋转四分之一圈 */
}translate 移动,scale 调整大小,rotate 旋转。将其中任何一个与过渡配对,你就会得到一个浮起的卡片、一个突出的图标,或一个摇摆打开的箭头。
transform 移动、缩放或旋转元素而不推动其邻居。要记住的三个是 translate 用于移动、scale 用于调整大小,和 rotate 用于旋转。将它与过渡结合,你就会得到一个在悬停时浮起的卡片或一个突出的图标。 关键帧动画
过渡在两个状态间动画化。当你需要超过两个状态,或运动需要重复时,你使用**关键帧动画**。你用 @keyframes 写出步骤,然后用 animation 属性将它们附加到元素上。
加载微调器是经典示例:它永久旋转,所以过渡无法做到。
@keyframes spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
.spinner {
animation: spin 1s linear infinite; /* 运行 spin,每转 1 秒,永久 */
}from 是开始,to 是结束。animation 行说明要运行哪些关键帧、一个周期花多长时间、速度曲线以及重复多少次。infinite 意味着它永远不会停止。
@keyframes 中写出步骤并用 animation 运行它们。微调器是最好的例子:from 在 0 度,to 在 360,用 infinite 循环。animation 行设置哪些关键帧、花多长时间、曲线以及多少次。 尊重用户的运动
不是每个人都想要屏幕上的运动。有些人觉得它分散注意力,对一些人来说,它可能会导致真实的不适或恶心。浏览器让人们在系统设置中请求更少的运动,CSS 可以通过**prefers-reduced-motion** 读取该请求。
将你的动画包裹在检查中,以便它们仅对未要求减少运动的人运行:
@media (prefers-reduced-motion: no-preference) {
.card {
transition: transform 0.2s;
}
}尊重用户的另一半是克制:保持运动简短、微妙,并与阅读器做的事情相关,比如悬停或点击。揭示真实改变的运动有帮助;为了运动本身而运动很快就会疲劳。
prefers-reduced-motion 读取它,仅对未要求减少运动的人运行动画。保持你添加的运动短、微妙,并与阅读器做的事情相关。 动画什么,以及为什么重要
一个会在以后为你节省麻烦的快速规则:当你动画化运动时,动画化 transform 和 opacity,而不是像 width、height、top 或 margin 这样的属性。
/* 平滑:浏览器廉价处理这些 */
.card:hover {
transform: translateY(-4px);
opacity: 0.9;
}原因是 transform 和 opacity 是浏览器最廉价地移动的两个属性,所以基于它们构建的动画即使在较慢的设备上也保持平滑。动画化大小或位置属性使浏览器每帧做更多工作,运动可能会卡顿。当你深入时你会满足完整的原因,但现在养成习惯是值得的。
transform 和 opacity,远离动画化 width、height、top 或 margin。那两个是浏览器移动最廉价的,所以即使在较慢的设备上运动也保持平滑。你会稍后学习完整的为什么,但现在养成习惯是值得的。 
