持续时间与缓动
使用 duration-75 到 duration-1000 控制过渡持续时间,并使用 ease-in、ease-out 和 ease-in-out 设置计时函数。
持续时间与缓动 是 CoddyKit 上的免费 Tailwind CSS Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Tailwind CSS Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Tailwind CSS Academy 课程共包含 4 节课。
本课时的部分内容尚未翻译,以英文显示。
Duration and Timing in Motion Design
Two properties control how a CSS transition feels: duration (how long the animation takes) and timing function (how the animation accelerates and decelerates over that time). Getting these right is the difference between animations that feel snappy and intentional versus those that feel sluggish or mechanical. Tailwind provides utilities for both, making it easy to tune motion feel without custom CSS.
Duration Utilities
Tailwind's duration-* utilities set the CSS transition-duration property. Values range from duration-75 (75ms, very snappy) to duration-1000 (1000ms, one full second). The default duration when you use transition without a duration-* class is 150ms. Most UI interactions should be under 300ms to feel responsive — longer durations are suitable only for dramatic page-level animations.
<!-- Available duration utilities -->
duration-75 → 75ms
duration-100 → 100ms
duration-150 → 150ms (default)
duration-200 → 200ms
duration-300 → 300ms
duration-500 → 500ms
duration-700 → 700ms
duration-1000 → 1000ms
<!-- Example: fast button color change -->
<button class="bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded-lg transition-colors duration-150">
Snappy button
</button>Choosing the Right Duration
Duration should match the perceived size of the change. Small interactions like button hover, focus rings, and link color changes look best at 100–200ms. Medium transitions like dropdown appearing, card expanding, or tooltip fading work well at 200–300ms. Large motions like sidebar sliding in, modal appearing, or page transitions can go up to 300–500ms. Never exceed 500ms for UI transitions — users should never feel like they are waiting for an animation.
<!-- 150ms: button hover (small interaction) -->
<button class="transition-colors duration-150 hover:bg-blue-700">Button</button>
<!-- 200ms: card shadow depth change (medium) -->
<div class="transition-shadow duration-200 hover:shadow-lg">Card</div>
<!-- 300ms: dropdown fade in (larger change) -->
<div class="transition-opacity duration-300 opacity-0 data-open:opacity-100">Dropdown</div>
<!-- 500ms: modal entrance (dramatic) -->
<div class="transition-all duration-500 scale-95 data-open:scale-100">Modal</div>Timing Functions (Easing)
The timing function (or easing function) controls how the animation progress distributes over time. A linear animation moves at constant speed. An ease-in starts slow and accelerates. An ease-out starts fast and decelerates. An ease-in-out starts and ends slow with fast middle. Different interactions feel most natural with different easings — choosing well is a subtle but important detail in polished UI design.
/* Tailwind easing utilities */
ease-linear → cubic-bezier(0, 0, 1, 1) /* constant speed */
ease-in → cubic-bezier(0.4, 0, 1, 1) /* slow start, fast end */
ease-out → cubic-bezier(0, 0, 0.2, 1) /* fast start, slow end */
ease-in-out → cubic-bezier(0.4, 0, 0.2, 1) /* slow start AND end */Using ease-in vs ease-out
The choice between ease-in and ease-out has intuitive meaning: ease-in builds momentum (good for elements that are leaving the screen or collapsing) because they start slow and speed up as they exit. ease-out decelerates (good for elements entering the screen) because they arrive quickly and settle into place smoothly. This mirrors real-world physics — things that stop tend to decelerate, things that start tend to accelerate.
<!-- ease-out: element slides INTO view (decelerates on arrival) -->
<div class="-translate-x-full hover:translate-x-0 transition-transform duration-300 ease-out">
Slides in from left, decelerates to stop
</div>
<!-- ease-in: element exits screen (accelerates on departure) -->
<div class="translate-x-0 hover:translate-x-full transition-transform duration-300 ease-in">
Slides out to right, accelerating as it exits
</div>The ease-in-out Pattern
ease-in-out creates the most natural-feeling motion for most UI animations. It mirrors how physical objects move: starting from rest, building to peak speed, then decelerating back to rest. Use it as your default for any animation that involves elements moving between positions — sidebar slides, modal entrances, card expansions, and accordion toggles all feel most natural with ease-in-out.
<!-- ease-in-out: sidebar slide-in (feels most natural) -->
<aside class="-translate-x-full group-open:translate-x-0
transition-transform duration-300 ease-in-out
fixed left-0 top-0 h-full w-64 bg-white shadow-xl">
Sidebar content
</aside>
<!-- Accordion expand: ease-in-out for natural feel -->
<div class="max-h-0 overflow-hidden group-open:max-h-96
transition-all duration-300 ease-in-out">
Accordion content
</div>Delay Utilities
The delay-* utilities add a pause before the transition begins using the CSS transition-delay property. Delays are useful for staggered animations — making a series of elements appear one after another creates a cascading effect that feels polished. Tailwind provides delays from delay-75 (75ms) to delay-1000 (1000ms). Use delays sparingly on hover interactions — delays that trigger only on hover feel unresponsive to users.
<!-- Staggered card entrance animations -->
<div class="opacity-0 translate-y-4 animate-show" style="animation-delay: 0ms">Card 1</div>
<div class="opacity-0 translate-y-4 animate-show" style="animation-delay: 100ms">Card 2</div>
<div class="opacity-0 translate-y-4 animate-show" style="animation-delay: 200ms">Card 3</div>
<!-- Or with Tailwind delay utilities -->
<div class="... transition delay-0">First item</div>
<div class="... transition delay-100">Second item</div>
<div class="... transition delay-200">Third item</div>Custom Duration and Easing in Config
If your design system requires specific timing values not in Tailwind's defaults — like a duration-250 or a custom cubic-bezier easing — add them in tailwind.config.js. Extend transitionDuration for new duration values and transitionTimingFunction for new easing curves. Custom easing can encode your brand's motion personality, making animations feel recognizably yours.
// tailwind.config.js
module.exports = {
theme: {
extend: {
transitionDuration: {
'250': '250ms',
'400': '400ms',
'2000': '2000ms',
},
transitionTimingFunction: {
'spring': 'cubic-bezier(0.34, 1.56, 0.64, 1)', // overshoots then settles
'smooth': 'cubic-bezier(0.4, 0.0, 0.2, 1)', // material design standard
'sharp': 'cubic-bezier(0.4, 0.0, 0.6, 1)', // sharp accelerate/decelerate
},
},
},
};Transition Timing for Hover Interactions
A useful technique for hover interactions is to have different enter and exit timings. You can achieve this by applying different durations with responsive or state prefixes. Most commonly, hover-in transitions are slightly faster than hover-out transitions — the enter feels snappy and the exit fades more gently. This requires a small amount of custom CSS or JavaScript class manipulation, as Tailwind does not have an 'un-hover' variant built in.
/* CSS: different timing for enter vs exit */
.hover-item {
@apply transition-all duration-300 ease-out; /* exit timing */
}
.hover-item:hover {
@apply duration-150; /* shorter on enter (faster response) */
/* Note: Tailwind generates .hover\:duration-150 for this */
}
<!-- Alternative: use hover:duration-* directly in HTML -->
<div class="transition-colors duration-300 hover:duration-150
bg-gray-100 hover:bg-blue-100">
Fast enter, slow exit
</div>Performance: will-change and transform
For elements that animate frequently, you can hint to the browser to promote them to their own compositor layer using will-change. Tailwind does not have a built-in will-change utility in its core, but you can add one via arbitrary values or a custom utility. However, use will-change: transform sparingly — promoting too many elements wastes memory and can actually slow things down.
@layer utilities {
.will-change-transform {
will-change: transform;
}
.will-change-opacity {
will-change: opacity;
}
}
<!-- Apply to elements that animate very frequently -->
<div class="transition-transform duration-300 will-change-transform
hover:scale-105">
Frequently animated card (promoted layer)
</div>Debugging Transitions in DevTools
Chrome DevTools has excellent transition debugging tools. Open the Animations panel (More tools → Animations) to see all running animations and transitions. You can scrub through the timeline, replay animations at slower speeds (0.25x, 0.5x), and inspect the computed timing function curve. This makes it easy to verify that your duration and easing choices look exactly as intended without needing to hover quickly to catch fast animations.
Quick Check
Test your understanding of transition duration and easing in Tailwind CSS.
Lesson Recap
In this lesson you learned: duration utilities from duration-75 to duration-1000 control how long transitions take, ease-out is best for elements entering the screen and ease-in for elements leaving, and delay-* utilities add pauses before transitions begin, enabling staggered animation effects. Next up we explore Tailwind's built-in keyframe animations for loading and attention patterns.
常见问题解答
「持续时间与缓动」课时是免费的吗?
是的 — 「持续时间与缓动」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Tailwind CSS Academy 课程的其余内容,请升级到 CoddyKit PRO。 Tailwind CSS Academy 课程共包含 4 节课。
「持续时间与缓动」这节课中我会学到什么?
使用 duration-75 到 duration-1000 控制过渡持续时间,并使用 ease-in、ease-out 和 ease-in-out 设置计时函数。 你通过在浏览器中直接运行的动手代码来练习 Tailwind CSS Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Tailwind CSS Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Tailwind CSS Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「持续时间与缓动」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Tailwind CSS Academy 课中编写并运行代码吗?
能。每节 Tailwind CSS Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 过渡实用程序
- 持续时间与缓动
- 内置关键帧动画
- 在配置中创建自定义动画