1. 过渡 (Transitions) - 平滑的状态变化
过渡是实现动画效果的基础。如果没有过渡,当一个属性改变时(比如 hover
时背景色变化),这个变化会是瞬间完成的,显得很生硬。过渡可以让这个变化在一个设定的时间内平滑地进行。
a. 核心类
类别 | 常用类名 | 说明 |
---|---|---|
启用过渡 | transition | 启用所有可过渡属性的平滑过渡效果。 |
transition-colors , transition-opacity , transition-shadow , transition-transform | 只对特定类型的属性启用过渡,可以进行更精细的控制。通常直接用 transition 就够了。 | |
持续时间 (Duration) | duration-75 , duration-100 , duration-300 , duration-500 , duration-1000 | 控制过渡效果完成所需的时间。duration-300 是一个非常通用的值。单位是毫秒。 |
缓动函数 (Timing Function) | ease-linear , ease-in , ease-out , ease-in-out | 控制过渡的速度曲线。ease-in-out (先慢中快后慢) 是最常用、最自然的。 |
延迟 (Delay) | delay-100 , delay-300 , delay-500 | 控制过渡在触发后延迟多长时间才开始。 |
b. 使用方法
将这些类组合在一起,应用到你希望有动画效果的元素上即可。
黄金法则: 将过渡相关的类(transition
, duration-*
, ease-*
)放在元素的默认状态上,而不是放在 hover:
或 focus:
等状态修饰符里。
示例:一个平滑变色的按钮
<button class="
/* 基础样式 */
py-2 px-4 bg-blue-500 text-white rounded
/* 过渡效果定义 - 在默认状态下设置 */
transition-all duration-300 ease-in-out
/* 悬停时的目标样式 */
hover:bg-red-500
">
悬停看效果
</button>
分析:
transition-all
: 告诉浏览器,所有可过渡的属性(这里是background-color
)都应该平滑过渡。你也可以用transition-colors
进行更精确的控制。duration-300
: 过渡持续 300 毫秒。ease-in-out
: 过渡速度先慢后快再慢。hover:bg-red-500
: 当鼠标悬停时,目标背景色是红色。
因为在默认状态下定义了过渡,所以无论是从蓝色到红色(鼠标移入),还是从红色回到蓝色(鼠标移出),都会有平滑的动画效果。
2. 变换 (Transforms) - 移动、旋转、缩放
变换通常与过渡结合使用,以创建动态的视觉效果。
a. 核心类
类别 | 常用类名 | 说明 |
---|---|---|
启用变换 | transform | 这是一个“标记类”,用于告诉浏览器这个元素可能会有变换,有助于性能优化。通常和 transition 一起使用。 |
缩放 (Scale) | scale-50 , scale-100 , scale-110 | 缩放元素。scale-100 是默认大小。可以分轴缩放:scale-x-125 , scale-y-75 。 |
旋转 (Rotate) | rotate-45 , rotate-90 , rotate-180 | 旋转元素。-rotate-45 表示反向旋转。 |
移动 (Translate) | translate-x-4 , translate-y-1/2 , -translate-x-full | 移动元素。数值可以是比例尺单位,也可以是百分比。 |
倾斜 (Skew) | skew-x-3 , skew-y-6 | 倾斜元素。 |
原点 (Transform Origin) | origin-center , origin-top-left , origin-bottom | 设置变换的原点(例如,从哪里开始旋转或缩放)。 |
b. 使用方法
将变换类与状态修饰符(如 hover
)和过渡类结合。
示例:一个悬停时放大并轻微上移的卡片
<div class="
/* 基础样式 */
p-6 bg-white rounded-lg shadow-md
/* 过渡和变换的定义 */
transition duration-300 ease-in-out transform
/* 悬停时的目标变换样式 */
hover:scale-105 hover:-translate-y-1 hover:shadow-xl
">
<h3 class="text-lg font-bold">交互卡片</h3>
<p class="text-gray-600">悬停在我身上看看效果。</p>
</div>
分析:
transition transform
: 确保了hover
状态下的scale
和translate
变换会平滑进行。hover:scale-105
: 悬停时放大到 105%。hover:-translate-y-1
: 悬停时向上移动0.25rem
。hover:shadow-xl
: 同时,阴影也变得更大,增强立体感。
3. 动画 (Animations) - 预设的关键帧动画
当你需要更复杂、可循环或自启动的动画时,就需要使用 animation
工具类。Tailwind 内置了一些常用的动画,并且可以轻松自定义。
a. 核心类
类别 | 常用类名 | 说明 |
---|---|---|
预设动画 | animate-spin | 持续旋转,常用于加载指示器。 |
animate-ping | 一个向外扩散的波纹,常用于通知或提示。 | |
animate-pulse | 缓慢地淡入淡出,常用于骨架屏(loading skeleton)。 | |
animate-bounce | 上下弹跳,常用于“向下滚动”提示箭头。 | |
动画控制 | motion-safe:* | 当用户在操作系统中开启了“减弱动态效果”时,可以通过这个修饰符来禁用动画,提升可访问性。 |
motion-reduce:* | 与上面类似,用于定义减弱动效时的样式。 |
b. 使用方法
直接将 animate-*
类添加到元素上即可。
示例 1:一个加载中的 Spinner
<div class="
w-16 h-16 border-4 border-dashed border-blue-500 border-t-transparent rounded-full
animate-spin
"></div>
分析:
- 我们先用边框类创建了一个“缺口”的圆环。
- 然后简单地加上
animate-spin
,它就会不停地旋转,形成一个经典的加载动画。
示例 2:一个骨架屏加载效果
<div class="border border-gray-200 shadow rounded-md p-4 max-w-sm w-full mx-auto">
<div class="animate-pulse flex space-x-4">
<div class="rounded-full bg-gray-300 h-10 w-10"></div>
<div class="flex-1 space-y-6 py-1">
<div class="h-2 bg-gray-300 rounded"></div>
<div class="space-y-3">
<div class="grid grid-cols-3 gap-4">
<div class="h-2 bg-gray-300 rounded col-span-2"></div>
<div class="h-2 bg-gray-300 rounded col-span-1"></div>
</div>
<div class="h-2 bg-gray-300 rounded"></div>
</div>
</div>
</div>
</div>
分析:
animate-pulse
应用在父容器上,使其所有子元素中的灰色占位符都产生同步的、缓慢的淡入淡出效果,模拟正在加载内容的感觉。
c. 自定义动画
如果内置动画不满足需求,你可以在 tailwind.config.js
中定义自己的关键帧动画。
// tailwind.config.js
module.exports = {
theme: {
extend: {
keyframes: {
'fade-in-down': {
'0%': {
opacity: '0',
transform: 'translateY(-10px)'
},
'100%': {
opacity: '1',
transform: 'translateY(0)'
},
}
},
animation: {
'fade-in-down': 'fade-in-down 0.5s ease-out'
}
},
},
}
步骤:
- 在
theme.extend.keyframes
中定义一个@keyframes
规则,命名为fade-in-down
。 - 在
theme.extend.animation
中定义一个新的动画类,也叫fade-in-down
,它引用了上面定义的关键帧,并设置了持续时间0.5s
和缓动函数ease-out
。
现在,你就可以在 HTML 中直接使用 animate-fade-in-down
这个类了!
<div class="animate-fade-in-down">
这个元素会从上方淡入。
</div>
总结
- 过渡 (
transition
) 是最基础、最常用的,用于处理状态变化时的平滑效果。记住将过渡定义放在默认状态上。 - 变换 (
transform
) 包括移动、旋转、缩放,通常与过渡结合,为交互增添动态感。 - 动画 (
animation
) 用于预设的、可循环的效果,如加载、提示等。Tailwind 内置了几个实用的动画,并且可以轻松自定义。
通过组合这些工具,你可以用一种声明式、可维护的方式,在 Tailwind CSS 中创造出丰富而流畅的动画体验。
Last updated on