← CSS transform-origin 属性 CSS table 表格样式 →

CSS transition-delay 属性

原创 2025-09-09 CSS 已有人查阅

CSS transition-delay 属性详解:精确控制动画延迟时间

概述

transition-delay 是 CSS 过渡动画中的重要属性,用于指定过渡效果开始前的等待时间。通过合理设置延迟时间,开发者可以创建出更加精细和协调的动画序列,提升用户体验和界面动效的专业性。该属性接受秒(s)或毫秒(ms)作为时间单位值。

属性定义

transition-delay 属性定义了在过渡效果开始之前需要等待的时间长度。与 JavaScript 或 Flash 实现的动画不同,CSS 过渡提供了一种声明式的动画实现方式,能够平滑地将元素从一种样式状态渐变到另一种状态。

语法结构

selector {
  transition-delay: time | initial | inherit;
}

属性值说明

  • time:指定延迟时间,单位为秒(s)或毫秒(ms)

  • initial:将属性重置为默认值(0s)

  • inherit:继承父元素的该属性值

基础应用示例

示例1:基础延迟效果

<!DOCTYPE html>
<html>
<head>
<style>
.delay-demo {
  width: 300px;
  margin: 40px auto;
  padding: 30px;
  background-color: #f8f9fa;
  border-radius: 10px;
  text-align: center;
}

.animated-box {
  width: 100px;
  height: 100px;
  background: linear-gradient(135deg, #3498db, #2980b9);
  margin: 20px auto;
  border-radius: 8px;
  transition: all 0.8s ease;
  transition-delay: 0.3s;
  display: flex;
  align-items: center;
  justify-content: center;
  color: white;
  font-weight: bold;
}

.animated-box:hover {
  transform: scale(1.2) rotate(15deg);
  background: linear-gradient(135deg, #e74c3c, #c0392b);
  box-shadow: 0 10px 20px rgba(0, 0, 0, 0.2);
}

.demo-description {
  color: #7f8c8d;
  margin-top: 15px;
  font-size: 14px;
}
</style>
</head>
<body>

<div class="delay-demo">
  <h2 style="color: #2c3e50;">transition-delay 基础示例</h2>
  <div class="animated-box">悬停查看</div>
  <div class="demo-description">动画效果在 0.3 秒延迟后开始</div>
</div>

</body>
</html>

示例2:多属性不同延迟

<!DOCTYPE html>
<html>
<head>
<style>
.multi-delay-container {
  display: flex;
  justify-content: center;
  gap: 30px;
  margin: 50px 0;
  flex-wrap: wrap;
}

.property-card {
  width: 150px;
  height: 150px;
  background: #ecf0f1;
  border-radius: 10px;
  display: flex;
  align-items: center;
  justify-content: center;
  flex-direction: column;
  padding: 15px;
  text-align: center;
  transition: all 0.6s ease;
}

.property-card:hover {
  transform: translateY(-10px);
}

.color-delay {
  background: #3498db;
  color: white;
  transition-property: background-color, transform;
  transition-duration: 0.8s, 0.5s;
  transition-delay: 0.2s, 0s;
}

.color-delay:hover {
  background: #e74c3c;
  transform: translateY(-10px) scale(1.1);
}

.scale-delay {
  background: #2ecc71;
  color: white;
  transition-property: transform, box-shadow;
  transition-duration: 0.7s, 0.4s;
  transition-delay: 0.4s, 0.1s;
}

.scale-delay:hover {
  transform: scale(1.2);
  box-shadow: 0 15px 30px rgba(0, 0, 0, 0.2);
}

.rotate-delay {
  background: #f39c12;
  color: white;
  transition-property: transform, background-color;
  transition-duration: 1s, 0.6s;
  transition-delay: 0.1s, 0.3s;
}

.rotate-delay:hover {
  transform: rotate(15deg);
  background: #9b59b6;
}

.property-label {
  font-weight: 600;
  margin-bottom: 8px;
}

.property-desc {
  font-size: 12px;
  opacity: 0.9;
}
</style>
</head>
<body>

<div style="text-align: center; margin: 40px 0;">
  <h2 style="color: #2c3e50;">多属性不同延迟效果</h2>
  <p style="color: #7f8c8d;">每个属性可以设置独立的延迟时间</p>
</div>

<div class="multi-delay-container">
  <div class="property-card color-delay">
    <div class="property-label">颜色变化</div>
    <div class="property-desc">背景色延迟 0.2s</div>
  </div>
  
  <div class="property-card scale-delay">
    <div class="property-label">缩放效果</div>
    <div class="property-desc">缩放延迟 0.4s</div>
  </div>
  
  <div class="property-card rotate-delay">
    <div class="property-label">旋转效果</div>
    <div class="property-desc">旋转延迟 0.1s</div>
  </div>
</div>

</body>
</html>

实际应用场景

交互动画序列

<!DOCTYPE html>
<html>
<head>
<style>
.animation-sequence {
  max-width: 600px;
  margin: 50px auto;
  padding: 30px;
  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  border-radius: 15px;
  color: white;
}

.sequence-title {
  text-align: center;
  margin-bottom: 30px;
  font-size: 2em;
  opacity: 0;
  transform: translateY(20px);
  transition: all 0.8s ease;
  transition-delay: 0.2s;
}

.sequence-items {
  display: grid;
  gap: 15px;
}

.sequence-item {
  background: rgba(255, 255, 255, 0.1);
  padding: 20px;
  border-radius: 8px;
  backdrop-filter: blur(10px);
  opacity: 0;
  transform: translateX(-30px);
  transition: all 0.6s ease;
}

.sequence-item:nth-child(1) { transition-delay: 0.4s; }
.sequence-item:nth-child(2) { transition-delay: 0.6s; }
.sequence-item:nth-child(3) { transition-delay: 0.8s; }
.sequence-item:nth-child(4) { transition-delay: 1.0s; }

.animation-sequence:hover .sequence-title {
  opacity: 1;
  transform: translateY(0);
}

.animation-sequence:hover .sequence-item {
  opacity: 1;
  transform: translateX(0);
}

.item-header {
  display: flex;
  align-items: center;
  margin-bottom: 10px;
}

.item-icon {
  width: 40px;
  height: 40px;
  background: rgba(255, 255, 255, 0.2);
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  margin-right: 15px;
  font-size: 1.2em;
}

.item-content {
  font-size: 14px;
  line-height: 1.5;
  opacity: 0.9;
}
</style>
</head>
<body>

<div class="animation-sequence">
  <h2 class="sequence-title">代码号学习路径</h2>
  
  <div class="sequence-items">
    <div class="sequence-item">
      <div class="item-header">
        <div class="item-icon">1</div>
        <h3>HTML/CSS 基础</h3>
      </div>
      <div class="item-content">掌握网页结构和样式基础,构建响应式布局</div>
    </div>
    
    <div class="sequence-item">
      <div class="item-header">
        <div class="item-icon">2</div>
        <h3>JavaScript 编程</h3>
      </div>
      <div class="item-content">学习核心编程概念和DOM操作,实现交互功能</div>
    </div>
    
    <div class="sequence-item">
      <div class="item-header">
        <div class="item-icon">3</div>
        <h3>前端框架</h3>
      </div>
      <div class="item-content">掌握现代前端框架,开发复杂单页应用</div>
    </div>
    
    <div class="sequence-item">
      <div class="item-header">
        <div class="item-icon">4</div>
        <h3>项目实战</h3>
      </div>
      <div class="item-content">通过真实项目巩固技能,构建作品集</div>
    </div>
  </div>
</div>

</body>
</html>

加载状态指示器

<!DOCTYPE html>
<html>
<head>
<style>
.loading-indicator {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 200px;
  margin: 50px 0;
}

.loading-dot {
  width: 20px;
  height: 20px;
  margin: 0 8px;
  background: #3498db;
  border-radius: 50%;
  animation: pulse 1.5s infinite ease-in-out;
}

.loading-dot:nth-child(1) { animation-delay: 0s; }
.loading-dot:nth-child(2) { animation-delay: 0.2s; }
.loading-dot:nth-child(3) { animation-delay: 0.4s; }
.loading-dot:nth-child(4) { animation-delay: 0.6s; }
.loading-dot:nth-child(5) { animation-delay: 0.8s; }

@keyframes pulse {
  0%, 100% {
    transform: scale(0.8);
    opacity: 0.5;
  }
  50% {
    transform: scale(1.2);
    opacity: 1;
  }
}

.indicator-content {
  text-align: center;
  margin-top: 30px;
}

.indicator-title {
  color: #2c3e50;
  margin-bottom: 15px;
}

.indicator-desc {
  color: #7f8c8d;
  max-width: 500px;
  margin: 0 auto;
  line-height: 1.6;
}
</style>
</head>
<body>

<div class="indicator-content">
  <h2 class="indicator-title">加载动画序列</h2>
  <p class="indicator-desc">使用 animation-delay 创建连续的动画效果,每个圆点有 0.2 秒的延迟</p>
</div>

<div class="loading-indicator">
  <div class="loading-dot"></div>
  <div class="loading-dot"></div>
  <div class="loading-dot"></div>
  <div class="loading-dot"></div>
  <div class="loading-dot"></div>
</div>

</body>
</html>

负值延迟的特殊效果

<!DOCTYPE html>
<html>
<head>
<style>
.negative-delay-demo {
  max-width: 500px;
  margin: 50px auto;
  padding: 30px;
  background: #f8f9fa;
  border-radius: 10px;
  text-align: center;
}

.demo-box {
  width: 100px;
  height: 100px;
  margin: 20px auto;
  background: #3498db;
  border-radius: 8px;
  transition: all 1s ease;
}

.negative-delay {
  transition-delay: -0.5s;
}

.positive-delay {
  transition-delay: 0.5s;
}

.demo-box:hover {
  transform: translateX(200px) rotate(180deg);
  background: #e74c3c;
  border-radius: 50%;
}

.comparison {
  display: flex;
  justify-content: space-around;
  margin-top: 30px;
}

.comparison-item {
  text-align: center;
  padding: 15px;
}

.comparison-label {
  font-weight: 600;
  color: #2c3e50;
  margin-bottom: 10px;
}

.comparison-desc {
  font-size: 14px;
  color: #7f8c8d;
}
</style>
</head>
<body>

<div class="negative-delay-demo">
  <h2 style="color: #2c3e50;">负值延迟效果对比</h2>
  
  <div class="comparison">
    <div class="comparison-item">
      <div class="comparison-label">负值延迟 (-0.5s)</div>
      <div class="demo-box negative-delay"></div>
      <div class="comparison-desc">动画立即开始,仿佛已经开始了一段时间</div>
    </div>
    
    <div class="comparison-item">
      <div class="comparison-label">正值延迟 (0.5s)</div>
      <div class="demo-box positive-delay"></div>
      <div class="comparison-desc">动画在 0.5 秒后开始</div>
    </div>
  </div>
</div>

</body>
</html>

本节课程知识要点

  1. 基本概念transition-delay 控制过渡动画开始前的等待时间

  2. 时间单位:支持秒(s)和毫秒(ms)两种时间单位

  3. 多值设置:可以为多个过渡属性分别设置不同的延迟时间

  4. 负值效果:负值会让动画立即开始,仿佛已经开始了一段时间

  5. 应用场景:适合创建动画序列、加载效果和交互动画

实用技巧

  1. 性能优化:避免过长的延迟时间影响用户体验

  2. 时序控制:使用多个延迟值创建复杂的动画序列

  3. 回退方案:为不支持 CSS 过渡的浏览器提供降级方案

  4. 无障碍考虑:确保动画效果不会影响可访问性

  5. 调试方法:使用浏览器开发者工具调试延迟时间

浏览器兼容性

transition-delay 属性在现代浏览器中得到良好支持:

  • Chrome 26+

  • Firefox 16+

  • Safari 6.1+

  • Opera 12.1+

  • Edge 12+

对于需要支持旧版浏览器的项目,可以考虑使用 JavaScript 动画库作为备选方案。

通过掌握 transition-delay 属性的使用技巧,开发者可以创建出更加精细和专业的动画效果,提升网页的交互体验和视觉效果。

← CSS transform-origin 属性 CSS table 表格样式 →
分享笔记 (共有 篇笔记)
验证码:
微信公众号