CSS动画实现HTML元素抖动效果教程

CSS动画实现HTML元素抖动效果教程

本教程详细介绍了如何利用css的`@keyframes`和`animation`属性为html元素创建逼真的抖动效果。文章不仅涵盖了抖动动画的css定义、持续时间、重复次数等控制方法,更深入探讨了如何通过javascript动态添加/移除css类,实现“函数式”按需触发抖动效果,并提供了完整的代码示例和最佳实践建议。

理解CSS动画与抖动效果

在网页开发中,CSS动画是实现各种动态视觉效果的强大工具。抖动效果(Shake Animation)通过快速、小幅度的位移和旋转,模拟物体受到冲击或震动时的状态。要实现这种效果,我们主要依赖CSS的@keyframes规则来定义动画的各个阶段,以及animation属性来控制动画的播放方式。

核心原理:CSS @keyframes 定义抖动

@keyframes规则允许我们定义动画在不同时间点的样式。对于抖动效果,我们会在动画的0%到100%之间,通过transform属性不断改变元素的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中:

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

0%到100%代表动画的整个时间线。transform: translate(x, y)用于使元素在水平和垂直方向上进行小幅度的位移。transform: rotate(deg)用于使元素进行小幅度的旋转。通过组合这些微小的、不规则的变化,即可形成视觉上的抖动效果。

应用动画到HTML元素

定义好@keyframes后,我们需要使用animation属性将其应用到目标HTML元素上。animation是一个简写属性,可以同时设置多个动画相关的子属性,包括:

animation-name: 指定要播放的@keyframes名称(例如shake)。animation-duration: 动画持续时间(例如0.5s表示0.5秒)。animation-timing-function: 动画的缓动函数(例如ease-in-out)。animation-delay: 动画开始前的延迟时间。animation-iteration-count: 动画播放次数(例如infinite无限次,或具体数字)。animation-direction: 动画是否应该轮流反向播放。animation-fill-mode: 动画结束后或开始前的状态。

基础示例:持续抖动

为了演示抖动效果,我们可以创建一个简单的div元素,并为其添加样式。

      HTML元素抖动效果      body {      display: flex;      justify-content: center;      align-items: center;      min-height: 100vh;      margin: 0;      background-color: #f0f0f0;    }    #myDiv {      background-color: #3498db;      height: 150px;      width: 150px;      display: flex;      justify-content: center;      align-items: center;      color: white;      font-size: 1.2em;      font-family: sans-serif;      border-radius: 8px;      box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);      /* 应用抖动动画 */      animation: shake 0.5s infinite; /* 动画名称 shake, 持续0.5秒, 无限次重复 */    }    @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和CSS类。

步骤1:定义一个包含动画的CSS类

首先,创建一个CSS类(例如is-shaking),它只在需要抖动时才被应用。我们将动画的持续时间设置为3秒,并只播放一次。

/* ... (之前的 @keyframes shake 保持不变) ... */.is-shaking {  animation: shake 0.1s ease-in-out 0s 30; /* 0.1s 持续时间,重复30次 = 3秒 */  /* 或者更精确地控制总时长,例如 */  /* animation: shake 3s forwards; */ /* 3秒总时长,动画结束后停留在最终状态 */}

注意:

animation: shake 0.1s ease-in-out 0s 30; 意味着每次抖动周期是0.1秒,重复30次,总共持续3秒。animation: shake 3s forwards; 意味着整个抖动动画持续3秒,并且forwards会使元素在动画结束后保持最后一帧的样式。选择哪种方式取决于你希望抖动是快速重复还是平滑过渡。为了更接近真实的“抖动”,通常选择快速重复小周期。

步骤2:使用JavaScript动态添加/移除CSS类

接下来,我们使用JavaScript来控制这个is-shaking类的添加和移除。

      动态触发HTML元素抖动      body {      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      min-height: 100vh;      margin: 0;      background-color: #f0f0f0;      font-family: sans-serif;    }    #myDiv {      background-color: #3498db;      height: 150px;      width: 150px;      display: flex;      justify-content: center;      align-items: center;      color: white;      font-size: 1.2em;      border-radius: 8px;      box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);      margin-bottom: 20px;      transition: transform 0.05s ease-out; /* 添加一个小的过渡,让抖动停止时更自然 */    }    button {      padding: 10px 20px;      font-size: 1em;      cursor: pointer;      background-color: #28a745;      color: white;      border: none;      border-radius: 5px;      transition: background-color 0.3s ease;    }    button:hover {      background-color: #218838;    }    /* 抖动动画的 @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); }    }    /* 触发抖动效果的CSS类 */    .is-shaking {      animation: shake 0.1s ease-in-out 0s 30; /* 0.1秒一个周期,重复30次,总计3秒 */    }    
点击按钮抖动我
const myDiv = document.getElementById('myDiv'); const shakeButton = document.getElementById('shakeButton'); const shakeDuration = 3000; // 抖动持续时间,单位毫秒 (3秒) shakeButton.addEventListener('click', () => { // 检查是否已经在抖动,避免重复触发 if (!myDiv.classList.contains('is-shaking')) { myDiv.classList.add('is-shaking'); // 添加抖动类 // 在指定时间后移除抖动类,停止动画 setTimeout(() => { myDiv.classList.remove('is-shaking'); }, shakeDuration); } });

在上述JavaScript代码中:

我们获取了目标div元素和触发按钮。为按钮添加了一个点击事件监听器。当按钮被点击时,我们首先检查myDiv是否已经包含is-shaking类,以防止动画在进行中被重复触发。如果不在抖动,就通过myDiv.classList.add(‘is-shaking’)添加该类,从而启动CSS动画。使用setTimeout函数,在shakeDuration(3000毫秒,即3秒)后,通过myDiv.classList.remove(‘is-shaking’)移除该类,停止抖动动画。

抖动整个窗口

如果需要让整个HTML窗口(或页面内容)抖动,可以将is-shaking类应用到body元素或一个包裹了所有页面内容的顶级div上。例如:

  
/* CSS */#page-wrapper {  /* 确保它占据整个视口 */  min-height: 100vh;  width: 100vw;  /* 其他样式 */}#page-wrapper.is-shaking {  animation: shake 0.1s ease-in-out 0s 30;}
// JavaScriptconst pageWrapper = document.getElementById('page-wrapper');// ... 像上面一样控制 pageWrapper 的 class

注意事项与最佳实践

性能优化: 在CSS动画中,使用transform属性(如translate、rotate、scale)通常比改变top、left、margin等属性具有更好的性能,因为它能利用GPU加速。本教程的抖动效果正是基于transform。用户体验: 抖动效果可能会对某些用户造成不适,特别是那些对运动敏感或有前庭系统障碍的用户。应谨慎使用,并考虑提供关闭动画的选项,或者仅在特定、非关键的交互中使用。动画时长与频率: 抖动效果不宜过长或过于频繁。3秒是一个相对合理的持续时间。过长的抖动会分散用户注意力,甚至引起烦躁。目标选择: 确定抖动的目标是特定元素、容器还是整个页面。对整个页面进行抖动应特别小心,因为它会影响所有内容的可读性。浏览器兼容性: 现代浏览器对CSS @keyframes和animation的支持非常好,但在非常老的浏览器中可能需要添加浏览器前缀(如-webkit-),不过现在已不常见。

总结

通过本教程,我们学习了如何利用CSS的@keyframes定义复杂的抖动动画,并使用animation属性将其应用到HTML元素。更重要的是,我们掌握了如何结合JavaScript,通过动态添加和移除CSS类的方式,实现按需、可控地触发抖动效果,这使得动画在用户交互中变得更加灵活和实用。在实际开发中,请务必权衡动画的视觉效果与用户体验,确保其能为产品增色而非造成干扰。

以上就是CSS动画实现HTML元素抖动效果教程的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1592881.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Next.js 13 中服务器组件获取 Next-Auth 会话数据的最佳实践
上一篇 2026年5月10日 10:31:25
Go语言中高效生成素数:Sieve of Atkin算法详解与实现
下一篇 2026年5月10日 10:31:27

相关推荐

  • 调试时元素点击事件消失怎么办?

    调试时维护元素点击事件 在浏览器中进行调试时,当打开开发者工具元素检查器(如 F12)时,元素的某些事件(如点击)可能会消失。这会给调试带来不便,尤其是当需要对这些事件进行测试时。 为了解决这个问题,可以使用以下方法: 使用事件侦听器: 在代码中添加事件侦听器,即使在调试器打开时也会触发这些事件: …

    2026年5月10日
    000
  • html如何制作搜索框_使用HTML表单元素制作搜索框【表单】

    需用HTML表单构建搜索功能:一、用type=”search”的input创建单行框,设name和placeholder,建议嵌入method=”get”的form;二、用label显式关联input提升可访问性;三、用button配合JS实现自定义搜…

    2026年5月10日
    000
  • Go语言中高效生成素数:Sieve of Atkin算法详解与实现

    本文旨在详细介绍在go语言中高效生成指定范围内素数的sieve of atkin算法。文章首先阐明了素数的定义及传统判断方法的不足,进而引入并解释了sieve of atkin算法的核心原理,包括其基于二次形式的素数筛选机制。最后,提供了一个完整的go语言实现示例,并对代码的关键部分进行解析,帮助读…

    2026年5月10日
    000
  • Next.js 13 中服务器组件获取 Next-Auth 会话数据的最佳实践

    Next.js 13 中服务器组件获取 Next-Auth 会话数据的最佳实践Next.js 13 中服务器组件获取 Next-Auth 会话数据的最佳实践Next.js 13 中服务器组件获取 Next-Auth 会话数据的最佳实践Next.js 13 中服务器组件获取 Next-Auth 会话数据的最佳实践

    在 Next.js 13 中,从客户端组件(使用 useSession)向服务器组件传递 next-auth 会话数据并非最佳实践。推荐的方法是直接在服务器组件中使用 getServerSession 来安全、高效地获取会话信息,从而避免不必要的客户端请求和架构复杂性,优化应用的性能和数据流。 理解…

    2026年5月10日 用户投稿
    000
  • Python字典数据结构优化与值提取实践

    本文旨在探讨Python中字典数据结构的常见误用,并提供优化方案,特别是在需要提取字典值进行进一步处理(如排序)时。通过一个生日管理应用的具体案例,我们将演示如何正确构建字典,从而简化值的访问和操作,避免因不当结构导致的困扰,并提升代码的可读性和效率。 1. 理解Python字典及其核心用途 Pyt…

    2026年5月10日
    000
  • JS如何实现图表展示

    选择合适的JS图表库需根据项目需求、易用性、性能、定制性和授权等因素综合考虑。Chart.js轻量易用,适合简单图表;ECharts功能强大,适合复杂可视化;D3.js灵活但学习成本高;Highcharts适合商业项目但需付费。数据准备通常为JSON或数组格式,通过配置选项在canvas中渲染图表。…

    2026年5月10日
    000
  • 解决Bootstrap中Div宽度与高度不一致问题:以表格与导航为例

    本文旨在解决在Bootstrap布局中,当包含text-nowrap属性的表格内容溢出时,导致导航div与表格div宽度不匹配,以及如何统一它们高度的问题。我们将深入探讨表格默认行为与容器限制之间的冲突,并提供通过引入可滚动包装器来同步宽度,以及调整内边距来匹配高度的专业解决方案。 理解宽度不匹配的…

    2026年5月10日
    000
  • 将 Pandas 与面向对象编程相结合:构建可维护的数据分析流程

    本文探讨了在数据分析中使用 Pandas 结合面向对象编程 (OOP) 的方法。面对日益复杂的数据处理任务,传统的函数式编程可能难以维护。通过将数据结构封装成类,并利用 OOP 的设计模式,可以提高代码的可读性、可维护性和可扩展性。本文将介绍如何利用 OOP 思想来组织 Pandas 数据处理流程,…

    2026年5月10日
    000
  • js 如何用pluck提取对象数组的某个属性

    使用原生javascript的map方法是提取对象数组属性最推荐的方式,它通过遍历数组并对每个元素执行回调函数来生成新数组,代码简洁且符合函数式编程理念;2. lodash库的_.map方法也可实现该功能,尤其在已使用lodash的项目中可提升可读性和链式调用便利性,但需注意_.pluck已被弃用;…

    2026年5月10日
    000
  • Go语言代码格式化:gofmt与制表符的官方推荐

    go语言官方推荐使用`gofmt`工具自动格式化代码,其默认缩进方式为制表符(tabs)。本文将详细阐述go语言的缩进规范,解释`gofmt`如何确保代码风格一致性,并指导开发者如何遵循官方建议,以提升代码可读性和团队协作效率。 Go语言在设计之初就非常注重代码的简洁性、可读性和一致性。为了达到这一…

    2026年5月10日
    000
  • HTMLnav语义化怎么设计_HTML导航栏的语义化标签选择与布局方法

    使用nav标签定义导航区域,结合ul和li构建结构,通过aria-label和aria-current提升可访问性,保持语义化与响应式设计统一,增强SEO与用户体验。 在构建网页时,HTML导航栏的语义化设计不仅能提升代码可读性,还能增强网页的可访问性和SEO效果。合理使用语义化标签,让浏览器和辅助…

    2026年5月10日
    000
  • 云原生中的金丝雀发布如何自动化?

    金丝雀发布自动化通过集成工具链与策略编排,实现流量控制、监控判断与流程编排闭环。1. 利用Istio VirtualService或Argo Rollouts等工具动态分流;2. 通过Prometheus与Spinnaker ACA分析指标并量化评分;3. 在CI/CD流水线中嵌入声明式发布策略,自…

    2026年5月10日
    000
  • 深入解析head标签中常用的头部标签

    深入解析head标签中常用的头部标签深入解析head标签中常用的头部标签深入解析head标签中常用的头部标签深入解析head标签中常用的头部标签

    标签的内容必须与当前文档有关,并且不应该过长,中文页面请尽量控制在 30 个字符(包括空格)以内。 2、 标签 标签用于为页面中所有相对链接指定一个基本链接,当您设置了基本链接后,当前页面中的所有相对链接都会使用这个基本链接作为前缀,如下例所示: 标签演示 视频教程 入门教程 上面的示例中第一个 标…

    2026年5月10日 用户投稿
    000
  • XML 数据解析:PHP 中提取 XML 节点键的完整指南

    本文详细介绍了如何使用 PHP 解析 XML 数据并提取所有节点键。通过结合 SimpleXMLElement 和递归函数,可以有效地遍历 XML 结构,获取包括嵌套节点在内的所有键名。文章提供了一个完整的代码示例,展示了如何实现这一功能,并解释了关键步骤和注意事项。无论您是处理简单的 XML 文件…

    2026年5月10日
    000
  • PHP格式化表单输入数据的技巧_PHP格式化表单输入数据的实用技巧

    首先去除空白并统一大小写,再过滤特殊字符,接着验证邮箱格式,最后标准化电话号码。具体为:使用trim()和preg_replace()清理空格,strtolower()或ucwords()统一大小写,htmlspecialchars()和strip_tags()防止XSS,filter_var()验…

    2026年5月10日
    000
  • 实现前端数据按用户ID过滤:方法、局限与最佳实践

    本文探讨如何在前端JavaScript中根据当前登录用户ID过滤并显示特定数据,例如只显示用户创建的职位列表。我们将提供具体的代码实现,并深入分析前端过滤存在的安全与性能隐患,最终强调后端数据过滤作为更专业、更安全的最佳实践。 1. 前端数据过滤需求与现有问题 在web应用开发中,常见需求之一是根据…

    2026年5月10日
    000
  • 币安binanceapp官方下载安装 币安2025安卓最新版本入口地址

    币安binanceapp官方下载安装 币安2025安卓最新版本入口地址币安binanceapp官方下载安装 币安2025安卓最新版本入口地址币安binanceapp官方下载安装 币安2025安卓最新版本入口地址币安binanceapp官方下载安装 币安2025安卓最新版本入口地址

    币安(Binance)是全球领先的数字资产交易平台之一,为用户提供安全、稳定、便捷的数字货币交易服务。它支持多种主流及新兴的数字资产,并提供丰富的交易工具和功能。 本文将为您提供币安2025安卓最新版本的官方下载入口,您只需点击文中给出的下载链接,即可获取官方正版app安装包,开启您的数字资产之旅。…

    2026年5月10日 用户投稿
    000
  • FloppyPepe:2025年在Solana上展现实用性的模因币

    忘记短暂的炒作吧!floppypepe(fppe)在 solana 上将模因魔力与创作者工具结合,正成为有望实现百倍增长的有力竞争者。这会是下一个模因传奇吗? 加密市场的模因币狂热远未结束,但规则正在改变。Solana 充满活力的生态系统正在孕育新一代模因币,而 FloppyPepe(FPPE)正引…

    2026年5月10日
    000
  • php怎么用php打开手机_PHP移动端访问与响应式设计方法教程

    答案:通过PHP实现移动设备兼容需检测用户代理、使用响应式模板、路由移动内容及优化性能。1. 利用HTTP_USER_AGENT识别移动设备并加载适配模板;2. 结合Bootstrap等框架与PHP动态填充内容,确保HTML具备响应式布局;3. 通过PHP路由将移动用户导向专用页面如mobile_h…

    2026年5月10日
    200
  • CSS导航栏精确对齐:移除列表默认左侧内边距的实用指南

    本文旨在解决网页导航栏链接因浏览器默认样式导致左侧不对齐的问题。核心在于理解并重置元素自带的padding-inline-start内边距,而非仅调整元素的样式。通过简单的CSS规则,即可实现导航链接与页面其他内容的完美对齐,提升页面布局的精确性和专业性。 在网页布局中,尤其是构建导航栏时,开发者经…

    2026年5月10日
    200

发表回复

登录后才能评论
关注微信