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

使用CSS动画实现HTML元素震动效果教程

夜伟大大_4377

夜伟大大_4377

发布时间:2025-11-06 12:58:33

|

247人浏览过

|

来源于php中文网

原创

使用CSS动画实现HTML元素震动效果教程

本教程详细介绍了如何利用css的`@keyframes`和`animation`属性为html元素创建逼真的震动效果。文章将从定义震动动画序列、将其应用于特定元素,到通过javascript动态触发动画,提供全面的指导和示例代码,帮助开发者轻松实现网页元素的动态视觉反馈。

核心概念:CSS动画与关键帧

在Web开发中,CSS动画是实现各种动态视觉效果的强大工具。它主要依赖于两个核心机制:

  • @keyframes规则: 用于定义动画序列中的不同阶段。你可以在0%到100%之间设置任意百分比,来指定元素在动画进行到该阶段时的样式。
  • animation属性: 用于将已定义的@keyframes动画应用到HTML元素上,并控制动画的持续时间、播放次数、延迟、方向等行为。

通过巧妙地结合transform属性(如translate和rotate)与@keyframes,我们可以模拟出物体在屏幕上快速、不规则移动的震动效果。

定义震动动画序列

震动效果的精髓在于元素在短时间内进行小幅度的、快速的位移和旋转。我们可以通过@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(x, y) rotate(deg)来改变元素的水平位移(x)、垂直位移(y)和旋转角度。
  • translate的值通常较小(例如1px到3px),以模拟微小的晃动。
  • rotate的值也较小(例如-1deg到1deg),增加震动的随机感。
  • 通过在不同百分比处设置不同的translate和rotate值,元素会在动画过程中呈现出不规则的抖动效果。

应用震动效果到HTML元素

定义好@keyframes后,下一步就是将其应用到你希望震动的HTML元素上。

dmap-jsapi-skill
dmap-jsapi-skill

DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。

下载

基础HTML结构

首先,我们需要一个目标HTML元素,例如一个div:

<!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>
    <link rel="stylesheet" href="style.css">
</head>
<body>

    <div id="myShakeDiv">点击我震动</div>
    <button id="triggerShake">触发震动</button>

    <script src="script.js"></script>
</body>
</html>

CSS样式应用

现在,将@keyframes shake应用到#myShakeDiv。

/* style.css */

#myShakeDiv {
  background-color: #ffcc00;
  height: 100px;
  width: 200px;
  margin: 50px auto;
  display: flex;
  justify-content: center;
  align-items: center;
  font-size: 1.2em;
  border-radius: 5px;
  cursor: pointer;
}

/* 定义震动动画 */
@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); }
}

/* 震动效果的类,用于JavaScript动态添加 */
.shake-active {
  animation: shake 0.5s ease-in-out; /* 0.5秒完成一次震动 */
  animation-iteration-count: 1; /* 仅播放一次 */
}

在上述CSS中:

  • animation: shake 0.5s ease-in-out;:
    • shake:指定要使用的@keyframes名称。
    • 0.5s:动画的持续时间。这意味着整个震动序列将在0.5秒内完成。
    • ease-in-out:动画的速度曲线,使动画开始和结束时较慢,中间较快,增加平滑感。
  • animation-iteration-count: 1;:指定动画播放的次数。设置为1表示动画只会播放一次。如果设置为infinite,则动画会无限循环,持续震动。

关于持续时间与次数的说明: 如果你的需求是“震动持续约3秒”,你可以将animation-duration设置为3s,并将animation-iteration-count设置为1。如果希望在3秒内重复震动多次,你可以将animation-duration设为较短的时间(例如0.2s或0.5s),然后通过计算将animation-iteration-count设置为3s / 0.5s = 6次。

动态触发震动效果(JavaScript控制)

用户通常希望在特定事件(如点击按钮、表单提交失败)发生时才触发震动效果。这时,我们可以结合JavaScript来动态添加或移除CSS类。

JavaScript代码

// script.js

document.addEventListener('DOMContentLoaded', () => {
    const myShakeDiv = document.getElementById('myShakeDiv');
    const triggerButton = document.getElementById('triggerShake');

    // 监听按钮点击事件
    triggerButton.addEventListener('click', () => {
        // 确保每次点击都能触发动画
        // 先移除类,再添加,可以重置动画
        myShakeDiv.classList.remove('shake-active');
        // 强制浏览器重绘(reflow),确保动画能够重新开始
        void myShakeDiv.offsetWidth; 
        myShakeDiv.classList.add('shake-active');
    });

    // 监听动画结束事件,在动画结束后移除类
    myShakeDiv.addEventListener('animationend', () => {
        myShakeDiv.classList.remove('shake-active');
    });

    // 也可以让点击div本身触发震动
    myShakeDiv.addEventListener('click', () => {
        myShakeDiv.classList.remove('shake-active');
        void myShakeDiv.offsetWidth; 
        myShakeDiv.classList.add('shake-active');
    });
});

在上述JavaScript代码中:

  1. 我们获取了目标元素#myShakeDiv和触发按钮#triggerShake。
  2. 当按钮被点击时,我们首先移除shake-active类(如果它存在),然后通过void myShakeDiv.offsetWidth;强制浏览器进行重绘。这一步非常关键,它能确保在类被移除后立即重新添加时,动画能够从头开始播放,而不是被浏览器优化掉。
  3. 接着,我们添加shake-active类,从而触发震动动画。
  4. 我们还监听了animationend事件。当动画播放完毕后,这个事件会被触发,我们就可以移除shake-active类。这样做的目的是让元素在动画结束后恢复到正常状态,等待下一次触发。

注意事项与最佳实践

  • 震动范围与强度: translate和rotate的数值越大,震动效果越剧烈。根据你的设计需求调整这些值。
  • 目标元素: 如果你希望整个“窗口”或页面进行震动,可以将震动效果的CSS类应用到<body>标签或一个覆盖整个视口(viewport)的<div>元素上。例如:
    .full-page-shake {
        animation: shake 0.5s ease-in-out;
        animation-iteration-count: 1;
        /* 确保元素占据整个视口 */
        position: fixed;
        top: 0;
        left: 0;
        width: 100vw;
        height: 100vh;
        z-index: 9999; /* 确保在最上层 */
        pointer-events: none; /* 允许点击穿透 */
    }
  • 动画持续时间: 根据震动效果的预期持续时间调整animation-duration。如果需要快速、短暂的震动,使用0.2s-0.5s;如果需要更长时间的震动,可以增加到1s-3s。
  • 性能考量: CSS动画通常由浏览器进行硬件加速,性能较好。但过度复杂或同时运行大量动画仍可能影响性能。合理使用,避免不必要的动画。
  • 浏览器兼容性: 现代浏览器对CSS animation和@keyframes有良好的支持。在旧版浏览器中可能需要添加浏览器前缀(如-webkit-),但在当前环境下通常不再是必要。

总结

通过本教程,你已经掌握了使用CSS的@keyframes和animation属性来创建和控制HTML元素震动效果的方法。结合JavaScript动态添加和移除CSS类,你可以灵活地在特定事件发生时触发这些视觉效果,从而提升用户体验和界面的交互性。记住,关键在于通过小幅度的translate和rotate变化来模拟不规则的抖动,并根据需求调整动画的持续时间和播放次数。

热门AI工具

更多
DeepSeek

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

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

WorkBuddy

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

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

豆包大模型

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

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

相关专题

更多
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

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

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

0

2026.10.21

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

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

0

2026.10.21

Playwright 入门教程
Playwright 入门教程

Playwright入门专题汇集测试框架安装、VS Code配置、录制脚本、编写首个用例、运行调试及查看报告的已审核文章,帮助初学者搭建端到端测试流程。

0

2026.10.21

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

120

2026.10.16

OpenJDK怎么配置Java开发环境
OpenJDK怎么配置Java开发环境

怎样用OpenJDK搭建开发环境?本专题介绍版本选择、下载安装、环境变量配置和编译运行验证,帮助你理清JDK的作用及基本配置流程,并通过简单程序检查环境是否可用,为后续项目开发做好准备。

80

2026.10.16

OpenJDK怎么部署Java应用
OpenJDK怎么部署Java应用

Java项目开发完成后,怎样部署到目标环境并正常运行?本专题介绍OpenJDK应用部署流程,涵盖运行环境准备、版本兼容检查、应用打包、启动参数配置和日志查看,帮助你理清部署前后的操作顺序,减少环境差异造成的运行问题。

40

2026.10.16

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
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