讲师中心 微信公众号
AI工具推荐 视频效率加速

使用CSS动画为HTML元素创建震动效果教程

落雪小哥_6734

落雪小哥_6734

发布时间:2025-11-10 09:24:18

|

346人浏览过

|

来源于php中文网

原创

使用CSS动画为HTML元素创建震动效果教程

本教程详细讲解如何利用css的`@keyframes`规则和`animation`属性,为html元素实现逼真的震动视觉效果。文章将涵盖动画定义、属性配置、以及通过javascript动态触发动画的方法,并提供完整的示例代码和注意事项,帮助开发者轻松为网页增添交互性。

1. 理解CSS动画核心:@keyframes与animation

CSS动画主要通过两个核心概念实现:@keyframes规则和animation属性。

  • @keyframes规则:用于定义动画序列的各个阶段。您可以在其中指定动画在不同时间点(通常以百分比表示,从0%到100%)的CSS属性值。这些属性值之间的过渡将由浏览器平滑地完成。
  • animation属性:用于将一个或多个@keyframes动画应用到HTML元素上。它是一个简写属性,可以设置动画的名称、持续时间、时间函数、延迟、迭代次数、方向、填充模式和播放状态。

通过组合这两者,我们可以创建从简单的悬停效果到复杂页面过渡的各种动态视觉体验。

2. 定义震动动画序列

震动效果通常涉及元素的微小位移(translate)和旋转(rotate),以模拟不规则的晃动。以下是一个经典的震动效果@keyframes定义:

@keyframes shake {
  0% { transform: translate(1px, 1px) rotate(0deg); }
  10% { transform: translate(-1px, -2px) rotate(-1deg); }
  20% { transform: translate(-3px, 0px) rotate(1deg); }
  30% { transform: translate(3px, 2px) rotate(0deg); }
  40% { transform: translate(1px, -1px) rotate(1deg); }
  50% { transform: translate(-1px, 2px) rotate(-1deg); }
  60% { transform: translate(-3px, 1px) rotate(0deg); }
  70% { transform: translate(3px, 1px) rotate(-1deg); }
  80% { transform: translate(-1px, -1px) rotate(1deg); }
  90% { transform: translate(1px, 2px) rotate(0deg); }
  100% { transform: translate(1px, -2px) rotate(-1deg); }
}

在这个@keyframes shake定义中:

立即学习“前端免费学习笔记(深入)”;

  • 我们定义了动画从0%到100%的十一个关键帧。
  • 每个关键帧都使用了transform属性来同时改变元素的translate(位移)和rotate(旋转)值。
  • translate(x, y) 使元素在水平和垂直方向上移动。
  • rotate(deg) 使元素旋转指定的角度。
  • 通过在不同百分比处设置微小且不规则的位移和旋转,我们创建了一种随机晃动的视觉效果。

3. 应用动画属性

为了实现可控的震动效果(例如持续3秒),我们需要在CSS中定义一个类,将@keyframes shake动画应用到目标元素上。

.shake-active {
  animation-name: shake; /* 指定要使用的 @keyframes 动画名称 */
  animation-duration: 3s; /* 动画持续时间为3秒 */
  animation-timing-function: ease-in-out; /* 动画速度曲线,可根据需要调整 */
  animation-iteration-count: 1; /* 动画播放次数为1次 */
  animation-fill-mode: forwards; /* 动画结束后保持最后一个关键帧的样式 */
}

/* 示例元素的样式,非震动效果必需 */
#myElement {
  background-color: lightcoral;
  height: 150px;
  width: 150px;
  margin: 50px;
  display: flex;
  justify-content: center;
  align-items: center;
  font-size: 1.2em;
  color: white;
  font-weight: bold;
}
  • animation-name: shake;: 引用我们之前定义的@keyframes shake动画。
  • animation-duration: 3s;: 设置动画总时长为3秒,满足了3秒最大持续时间的要求。
  • animation-timing-function: ease-in-out;: 定义动画的速度曲线,这里使用先加速后减速,使震动感觉更自然。
  • animation-iteration-count: 1;: 确保动画只播放一次。如果需要无限循环,可以设置为infinite。
  • animation-fill-mode: forwards;: 动画结束后,元素会保持其在动画最后一个关键帧时的样式,而不是立即回到初始状态。这对于一些动画效果可能很重要。

4. 动态触发震动效果

要实现“像函数一样随时调用”震动效果,我们可以结合JavaScript来动态添加和移除包含动画属性的CSS类。

Html2md
Html2md

使用 Readability + Turndown 将 HTML 页面转换为干净的、Agent 友好的 Markdown。去除导航栏、广告、页脚、Cookie 横幅、社交按钮等干扰元素。支持 URL...

下载
function triggerShake(elementId) {
  const element = document.getElementById(elementId);
  if (element) {
    // 确保在重新添加类之前移除旧的动画类,以允许动画再次播放
    element.classList.remove('shake-active');
    // 强制浏览器重绘以重置动画(通过获取一个属性)
    void element.offsetWidth;
    // 添加类以触发动画
    element.classList.add('shake-active');

    // 动画结束后移除类,以便下次可以再次触发
    // 注意:这里的3000ms应与CSS中的animation-duration匹配
    setTimeout(() => {
      element.classList.remove('shake-active');
    }, 3000);
  }
}

这段JavaScript代码的工作原理:

  1. triggerShake(elementId) 函数接收一个元素的ID。
  2. 它首先移除shake-active类,这是为了确保如果元素已经在震动或刚震动完,可以重新触发动画。
  3. void element.offsetWidth; 这一行是一个小技巧,强制浏览器重新计算元素的布局,从而“重置”动画状态,使得即使类被立即添加回来,动画也能从头开始播放。
  4. 然后,它添加shake-active类,这会立即应用CSS动画并开始震动。
  5. setTimeout 函数在3000毫秒(即动画持续时间)后移除shake-active类。这确保了动画只播放一次,并且元素在动画结束后恢复到没有震动效果的状态,为下一次触发做好准备。

5. 完整示例代码

将HTML、CSS和JavaScript结合起来,形成一个完整的可运行示例:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>HTML元素震动效果教程</title>
  <style>
    body {
      font-family: Arial, sans-serif;
      display: flex;
      flex-direction: column;
      justify-content: center;
      align-items: center;
      min-height: 100vh;
      margin: 0;
      background-color: #f0f2f5;
    }

    /* 震动动画的关键帧定义 */
    @keyframes shake {
      0% { transform: translate(1px, 1px) rotate(0deg); }
      10% { transform: translate(-1px, -2px) rotate(-1deg); }
      20% { transform: translate(-3px, 0px) rotate(1deg); }
      30% { transform: translate(3px, 2px) rotate(0deg); }
      40% { transform: translate(1px, -1px) rotate(1deg); }
      50% { transform: translate(-1px, 2px) rotate(-1deg); }
      60% { transform: translate(-3px, 1px) rotate(0deg); }
      70% { transform: translate(3px, 1px) rotate(-1deg); }
      80% { transform: translate(-1px, -1px) rotate(1deg); }
      90% { transform: translate(1px, 2px) rotate(0deg); }
      100% { transform: translate(1px, -2px) rotate(-1deg); }
    }

    /* 应用震动动画的CSS类 */
    .shake-active {
      animation-name: shake;
      animation-duration: 3s;
      animation-timing-function: ease-in-out;
      animation-iteration-count: 1;
      animation-fill-mode: forwards;
    }

    /* 示例元素的样式 */
    #myElement {
      background-color: #4CAF50; /* 绿色背景 */
      height: 150px;
      width: 150px;
      margin: 30px 0;
      display: flex;
      justify-content: center;
      align-items: center;
      font-size: 1.2em;
      color: white;
      font-weight: bold;
      border-radius: 8px;
      box-shadow: 0 4px 8px rgba(0,0,0,0.2);
      transition: background-color 0.3s ease; /* 添加过渡效果 */
    }

    #myElement:hover {
        background-color: #45a049; /* 悬停变深 */
    }

    button {
      padding: 10px 20px;
      font-size: 1em;
      cursor: pointer;
      background-color: #008CBA; /* 蓝色按钮 */
      color: white;
      border: none;
      border-radius: 5px;
      box-shadow: 0 2px 4px rgba(0,0,0,0.2);
      transition: background-color 0.3s ease;
    }

    button:hover {
      background-color: #007bb5;
    }
  </style>
</head>
<body>

  <h1>HTML元素震动效果演示</h1>

  <div id="myElement">点击按钮震动我</div>

  <button onclick="triggerShake('myElement')">触发震动</button>

  <script>
    function triggerShake(elementId) {
      const element = document.getElementById(elementId);
      if (element) {
        // 1. 移除旧的动画类,确保动画可以重新播放
        element.classList.remove('shake-active');
        // 2. 强制浏览器重绘以重置动画
        void element.offsetWidth; // 触发回流
        // 3. 添加类以触发动画
        element.classList.add('shake-active');

        // 4. 动画结束后移除类,以便下次可以再次触发
        // 这里的3000ms应与CSS中的animation-duration匹配
        setTimeout(() => {
          element.classList.remove('shake-active');
        }, 3000);
      }
    }
  </script>

</body>
</html>

6. 拓展与注意事项

全屏震动效果

如果目标是让整个HTML窗口看起来震动,可以将shake-active类应用到<body>元素,或者创建一个覆盖整个视口的div并对其应用动画。

/* 应用于body的全屏震动 */
body.shake-active {
  animation-name: shake;
  animation-duration: 3s;
  animation-timing-function: ease-in-out;
  animation-iteration-count: 1;
  animation-fill-mode: forwards;
}

然后通过JavaScript document.body.classList.add('shake-active'); 来触发。

性能考量

CSS transform属性(包括translate和rotate)的动画通常是高性能的,因为它们可以通过GPU加速。这意味着它们不会引起布局或绘制的重排,从而提供更流畅的动画体验。避免对width, height, margin, padding等属性进行动画,这些属性会触发昂贵的布局计算。

用户体验与无障碍性

  • 适度使用:震动效果应谨慎使用,过度或频繁的震动可能会分散用户注意力,甚至引起不适。
  • 提供控制:对于长时间或剧烈的动画,考虑提供一个选项让用户可以停止或禁用动画,特别是对于有前庭系统敏感性或运动障碍的用户。
  • 媒体查询:可以使用@media (prefers-reduced-motion)媒体查询来检测用户是否偏好减少动画,并相应地调整或禁用震动效果。

动画持续时间与迭代

  • animation-duration:根据所需效果调整动画持续时间。较短的时间会产生更急促的震动,较长的时间则更平缓。
  • animation-iteration-count:设置为1表示播放一次,设置为infinite表示无限循环。通过JavaScript动态控制类,可以灵活实现单次播放或多次播放。

7. 总结

通过本教程,您已经掌握了如何使用CSS的@keyframes规则和animation属性来创建HTML元素的震动效果,并学会了如何结合JavaScript动态地触发和控制这些动画。这种方法不仅功能强大,而且性能优异,是为网页添加丰富交互性和视觉反馈的有效手段。在实际应用中,请务必考虑用户体验和无障碍性,以提供最佳的浏览体验。

热门AI工具

更多
AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

相关专题

更多
counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3188

2023.11.20

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

636

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

371

2025.11.27

function是什么
function是什么

function是函数的意思,是一段具有特定功能的可重复使用的代码块,是程序的基本组成单元之一,可以接受输入参数,执行特定的操作,并返回结果。本专题为大家提供function是什么的相关的文章、下载、课程内容,供大家免费下载体验。

3140

2023.08.04

js函数function用法
js函数function用法

js函数function用法有:1、声明函数;2、调用函数;3、函数参数;4、函数返回值;5、匿名函数;6、函数作为参数;7、函数作用域;8、递归函数。本专题提供js函数function用法的相关文章内容,大家可以免费阅读。

534

2023.10.07

margin在css中是啥意思
margin在css中是啥意思

在CSS中,margin是一个用于设置元素外边距的属性。想了解更多margin的相关内容,可以阅读本专题下面的文章。

857

2023.12.18

css中的padding属性作用
css中的padding属性作用

在CSS中,padding属性用于设置元素的内边距。想了解更多padding的相关内容,可以阅读本专题下面的文章。

2892

2023.12.07

Playwright 测试失败怎么办
Playwright 测试失败怎么办

Playwright测试失败专题汇集超时、定位器匹配、浏览器提前关闭、依赖与插件配置、文件上传、SSL及Docker启动等故障文章,并介绍通过截图、报告和Trace定位错误。

0

2026.10.21

Playwright 页面操作指南
Playwright 页面操作指南

Playwright页面操作专题汇集元素定位、点击与输入、等待响应、多页面切换、Iframe、事件监听及文件处理的已审核文章,便于按操作场景查阅示例与常见问题。

0

2026.10.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 1.5万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 6万人学习

CSS教程
CSS教程

共754课时 | 98.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn