使用纯CSS动画和JavaScript实现元素颜色闪烁效果

使用纯css动画和javascript实现元素颜色闪烁效果

本教程详细讲解如何利用CSS `@keyframes` 动画和少量原生JavaScript,实现点击按钮时元素颜色(例如从红到蓝再回红)的平滑闪烁效果,避免引入大型第三方库。通过动态添加和移除CSS类,我们能精确控制动画的触发与重复,实现高性能且可维护的交互体验。

引言:理解颜色动画的挑战

在网页开发中,我们经常需要实现元素在用户交互时(如点击按钮)进行视觉反馈,其中颜色变化是一种常见的需求。例如,当用户点击一个按钮时,另一个元素需要从红色闪烁到蓝色,然后立即变回红色。

尝试使用jQuery的 .css() 方法配合CSS transition 来实现这种序列动画时,开发者常会遇到困难。直接连续调用 .css() 设置颜色,如先设置为蓝色再设置为红色,会导致浏览器瞬间应用最后一个样式,从而跳过中间的蓝色状态,或者即使有 transition 也可能因为样式被立即覆盖而无法观察到完整的过渡效果。例如:

// 这种方法通常无法实现预期的“先蓝后红”序列动画$(".my-button").click(function() {            $(".other-element").css("transition", "color .3s").css("color", "blue");    // 这一行会立即覆盖上一行设置的蓝色,导致只显示红色    $(".other-element").css("transition", "color .6s").css("color", "red");});

这种方法之所以无效,是因为浏览器在短时间内接收到多个样式指令时,会优先渲染最终的样式。transition 只能处理两个状态之间的平滑过渡,而无法直接定义一个多步的、带有时间序列的复杂动画。为了实现更复杂的动画序列,并且避免引入如jQuery UI animate() 这样的大型库,我们可以转而利用CSS原生的 @keyframes 动画结合少量JavaScript来控制。

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

核心策略:CSS动画与JavaScript类切换

解决上述问题的核心在于将复杂的动画逻辑完全定义在CSS中,然后通过JavaScript在适当的时机动态地添加或移除一个CSS类来触发和重置这个动画。这种方法充分利用了CSS动画的性能优势和JavaScript的事件控制能力。

基本思路:

CSS定义动画: 使用 @keyframes 规则定义一个包含多个颜色状态和时间点的动画序列。CSS定义触发类: 创建一个CSS类,当这个类被添加到元素上时,就应用上面定义的动画。JavaScript控制:监听用户事件(如按钮点击)。在事件触发时,为目标元素添加动画触发类。监听动画结束事件 (animationend),在动画完成后移除该类,以便下次能够再次触发。

实现步骤

下面我们将通过一个具体的例子来演示如何实现点击按钮后,一个元素背景色从红色闪烁到蓝色,再回到红色的效果。

1. HTML结构准备

首先,我们需要一个按钮来触发动画,以及一个目标元素来展示颜色变化。

            CSS动画与JS控制颜色闪烁            

这里我们创建了一个 button 和一个 div 元素。div.other-element 将是我们动画的目标。

2. CSS动画定义

接下来,在 style.css 文件中定义动画和相关样式。

body {    margin: 0;    display: flex;    flex-direction: column; /* 垂直布局 */    align-items: center; /* 水平居中 */    justify-content: center; /* 垂直居中 */    min-height: 100vh;    background-color: #f00; /* 默认背景色为红色 */    font-family: Arial, sans-serif;}.my-button {    background-color: white;    border: none;    border-radius: 3px;    padding: 10px 20px;    transition: .2s;    box-shadow: 1px 1px 4px rgba(0, 0, 0, .5);    cursor: pointer;    margin-bottom: 20px; /* 按钮和动画元素之间的间距 */}.my-button:hover {    background-color: #ddd;}.other-element {    width: 100px;    height: 100px;    background-color: inherit; /* 继承body的默认背景色 */    border: 2px solid #333;    display: flex;    align-items: center;    justify-content: center;    color: #333;    font-weight: bold;}/* 定义动画关键帧 */@keyframes flashColor {    0% { background-color: #f00; }   /* 动画开始时为红色 */    50% { background-color: #00f; }   /* 动画进行到一半时变为蓝色 */    100% { background-color: #f00; }  /* 动画结束时回到红色 */}/* 定义一个类来触发动画 */.active-flash {    animation: flashColor .6s forwards; /* 应用flashColor动画,时长0.6秒,forwards保持动画结束状态 */}

关键点解释:

@keyframes flashColor: 定义了一个名为 flashColor 的动画。0%:动画开始时,背景色为红色 (#f00)。50%:动画进行到一半时,背景色变为蓝色 (#00f)。100%:动画结束时,背景色再次回到红色 (#f00)。.active-flash: 这是一个我们将通过JavaScript动态添加和移除的类。当它被添加到元素上时,animation: flashColor .6s forwards; 就会被应用,触发 flashColor 动画,动画时长为0.6秒。forwards 关键字确保动画结束后元素保持在动画最后一帧的样式(在本例中是红色)。

3. JavaScript控制逻辑

最后,在 script.js 文件中编写JavaScript代码来控制动画的触发。

document.addEventListener('DOMContentLoaded', function() {    const button = document.querySelector('.my-button');    const otherElement = document.querySelector('.other-element'); // 目标元素    // 监听按钮点击事件    button.addEventListener('click', function() {        // 如果动画正在进行,先移除类以重置动画        if (otherElement.classList.contains('active-flash')) {            otherElement.classList.remove('active-flash');            // 强制浏览器重绘以确保动画能立即重新开始            void otherElement.offsetWidth;         }        // 添加类以触发动画        otherElement.classList.add('active-flash');    });    // 监听动画结束事件    otherElement.addEventListener('animationend', function() {        // 动画结束后移除类,以便下次点击时可以重新触发动画        otherElement.classList.remove('active-flash');    });});

关键点解释:

DOMContentLoaded: 确保DOM完全加载后再执行JavaScript。button.addEventListener(‘click’, …): 当按钮被点击时:首先检查 otherElement 是否已经有 active-flash 类。如果有,说明动画可能正在进行或刚刚结束但尚未移除类。我们先移除它,然后通过 void otherElement.offsetWidth; 强制浏览器重绘/回流,这是一种常见的技巧,用于在移除类后立即重新添加类时,确保动画能够重新开始播放而不是被忽略。otherElement.classList.add(‘active-flash’): 为目标元素添加 active-flash 类,从而触发CSS动画。otherElement.addEventListener(‘animationend’, …): 当 flashColor 动画在 otherElement 上播放完毕时,会触发 animationend 事件。otherElement.classList.remove(‘active-flash’): 在动画结束后移除 active-flash 类。这是至关重要的一步,它将元素恢复到动画前的状态(或由 forwards 保持的最终状态),使得下次点击按钮时动画可以再次完整地播放。

工作原理深度解析

这种方法的强大之处在于它巧妙地分离了关注点:

CSS负责“如何动”: @keyframes 精确定义了动画的每一个阶段、持续时间、缓动函数等。这使得动画本身高度可配置和重用。JavaScript负责“何时动”: JavaScript只负责在用户交互发生时,通过添加/移除CSS类来控制动画的开始和结束。

animationend 事件是实现可重复动画的关键。如果没有这个事件监听器来移除 active-flash 类,那么在第一次动画播放完毕后,otherElement 会一直带有 active-flash 类。此时,即使再次点击按钮,因为元素已经有了这个类,浏览器会认为没有发生样式变化,动画就不会再次播放。通过在动画结束后移除该类,我们将元素重置为“未动画”状态,从而为下一次动画做好准备。

与CSS transition 相比,animation 提供了更强大的多步动画控制能力。transition 只能在两个状态之间平滑过渡,而 animation 可以定义任意数量的关键帧,实现复杂的序列效果。

优点与注意事项

优点:

轻量级: 无需引入jQuery UI等大型第三方动画库,减少页面加载负担。高性能: CSS动画由浏览器原生引擎处理,通常比JavaScript驱动的动画更流畅、性能更优。职责分离: 动画样式(CSS)与交互逻辑(JavaScript)清晰分离,代码更易于维护和理解。可重复性: 通过 animationend 事件监听器,动画可以被轻松地多次触发。灵活性: @keyframes 允许定义任意复杂的动画序列,包括颜色、位置、大小、透明度等多种属性的组合变化。

注意事项:

强制重绘: 在JavaScript中,如果需要立即重置并重新播放动画(即在动画结束前再次触发),有时需要强制浏览器重绘或回流。void element.offsetWidth; 是一种常用的技巧,它通过请求元素的布局信息来强制浏览器进行一次重绘。动画时长: 确保 animationend 事件的监听器能够被正确触发。如果动画时长极短或动画被中断,可能会影响 animationend 的可靠性。目标元素: 示例中动画的是背景色,但你可以通过修改 @keyframes 来动画其他CSS属性,如 color (文字颜色)、transform (位移、旋转、缩放) 或 opacity (透明度)。浏览器兼容性: 现代浏览器对CSS Animation的支持良好。对于旧版浏览器,可能需要添加 -webkit- 等前缀,但现在通常不再是必需的。

总结

通过将CSS @keyframes 动画与JavaScript的类切换机制结合,我们能够高效、灵活地实现复杂的元素动画效果,例如本文中的颜色闪烁。这种方法不仅避免了对大型库的依赖,还提升了动画的性能和代码的可维护性。掌握这种模式是现代前端开发中实现丰富用户交互的重要技能。

以上就是使用纯CSS动画和JavaScript实现元素颜色闪烁效果的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
怎么在vs上看html运行效果_vs看html运行效果方法【教程】
上一篇 2025年12月23日 17:44:27
如何用HTML登录微博_用HTML模拟微博登录表单页面【模拟】
下一篇 2025年12月23日 17:44:42

相关推荐

  • RuoYi框架代码生成器如何适配SQL Server数据库?

    RuoYi-SQLServer 代码生成器适配:从 MySQL 到 SQL Server 的迁移 ruoyi框架的sqlserver版本(ruoyi-sqlserver)原本只支持mysql数据库的代码自动生成功能,现在需要将其扩展到sql server。这篇文章将探讨如何修改代码,实现sql se…

    用户投稿 2026年8月28日
    000
  • Yii 框架如何支持 WebSocket 实时通信?

    yii 框架本身不直接支持 websocket,但可以通过扩展实现。1. 安装扩展库(如 yii2-websocket 或 ratchet)。2. 配置 websocket 服务器。3. 实现 websocket 逻辑。通过这些步骤,可以在 yii 中实现实时通信功能。 引言 WebSocket 作…

    2026年8月28日
    000
  • 怎么快速清除谷歌浏览器中的缓存和Cookies

    本文旨在为您提供一种快速清除谷歌浏览器中缓存与Cookies的方法。通过掌握一个简单的快捷操作,您可以直接进入清理界面,高效地管理浏览数据。这个过程不仅有助于解决因数据冗余引起的常见浏览问题,还能有效保护您的个人隐私,整个操作流程非常便捷。 立即进入“高清国产电影网站合集☜☜☜☜☜点击保存”; 立即…

    2026年8月28日
    000
  • 如何解决Laravel批量插入和更新的问题?使用mavinoo/laravel-batch可以!

    可以通过以下地址学习composer:学习地址 在开发laravel项目时,我遇到一个常见但棘手的问题:如何高效地进行批量数据的插入和更新。默认的eloquent模型虽然强大,但对于大批量数据处理,效率往往不尽如人意。我尝试过一些手动优化,但效果有限。直到我发现了mavinoo/laravel-ba…

    用户投稿 2026年8月28日
    000
  • “+普惠、+性能、+智能”:华为“三板斧”破局商业市场全闪落地挑战

    当数字技术与表演艺术在国家戏剧影视艺术教育的最高学府——中央戏剧学院的舞台上交相辉映时,一场数据基础设施的变革徐徐拉开序幕。 在中央戏剧学院“智能艺术教育空间”样板点,华为极简全闪数据中心赋能艺术教学过程的实时采集、在线导播、高清渲染、跨空间分享、互动学习和教学,实现跨校区高效数据互通,高清实时渲染…

    2026年8月28日
    000
  • 谷歌浏览器缓存清理后登录不了账号是什么原因

    当您在清理谷歌浏览器缓存后发现无法自动登录账号,这通常并非由清理缓存直接导致,而是因为在清理过程中,您很可能同时清除了一个名为“Cookie”的关键数据。本文将详细解释这一现象背后的原因,阐明缓存与Cookie的功能区别,并提供解决此问题的正确方法,帮助您理解为何会出现这种情况以及未来如何避免。 立…

    2026年8月28日
    000
  • Laravel 的未来:2024 年新特性与社区趋势

    laravel 在 2024 年将专注于性能优化、api 支持和 ai 集成。1) 性能优化将通过新查询优化器提升响应速度。2) api 支持将简化路由定义,提高可维护性。3) ai 集成将简化数据分析和预测,提升开发者生产力。 引言 Laravel 在 2024 年将会如何发展?这是一个非常值得探…

    2026年8月28日
    000
  • Win7如何更改默认浏览器?

    浏览器是一种能够展示网页服务器或文件系统中的html文档内容,并支持用户与之互动的软件。许多用户的电脑上都安装了多个浏览器,但很少有人了解如何设定默认浏览器。今天,小编就为大家讲解一下如何设置默认浏览器。 如何更改IE浏览器的默认设置 打开IE浏览器,在主界面上找到并点击工具菜单,随后在下拉列表中选…

    2026年8月28日
    000
  • 如何解决PHP单元测试报告生成问题?使用n98/junit-xml库可以!

    可以通过一下地址学习composer:学习地址 在进行php项目开发时,单元测试是确保代码质量和功能正确性的重要环节。然而,当需要生成标准化的junit xml报告时,我遇到了一个难题:如何高效地将测试结果转换为junit xml格式。尝试了多种方法后,我发现n98/junit-xml库能够轻松解决…

    用户投稿 2026年8月28日
    000
  • 如何设置谷歌浏览器自动清理缓存

    许多用户希望能够设置谷歌浏览器在关闭时自动清理缓存,以保持浏览器的整洁和高效。然而,谷歌浏览器本身并未提供一个直接的“关闭时自动清理缓存”的开关。本文将详细介绍实现这一目标的两种主流方法,包括利用浏览器自带的相关功能以及通过安装扩展程序来实现更彻底的自动化清理,帮助您根据自身需求选择最合适的方案。 …

    2026年8月28日
    000
  • Spark vs. Flink — 核心技术点

    Spark vs. Flink — 核心技术点Spark vs. Flink — 核心技术点Spark vs. Flink — 核心技术点Spark vs. Flink — 核心技术点

    引言 Apache Spark 是一个综合性且高效的分布式计算引擎,兼具批处理和流计算能力,利用内存进行并行计算。官方数据表明,Spark的内存计算速度比MapReduce快100倍。作为当前最流行的计算框架,Spark已展现出其卓越的性能。 Apache Flink 是一个分布式大数据处理引擎,提…

    2026年8月28日 用户投稿
    300
  • ThinkPHP 6.x 入门指南:从安装到第一个Hello World

    thinkphp 6.x 是一个基于 php 的开源框架,旨在简化和加速 web 应用的开发过程。1. 安装 thinkphp 6.x:运行 composer create-project topthink/think tp。2. 配置开发环境:编辑 .env 文件,设置数据库连接信息等。3. 编写…

    2026年8月28日
    000
  • Windows + Claude Code + Cursor 安装、配置和激活!揭秘最全指南!

    Windows + Claude Code + Cursor 安装、配置和激活!揭秘最全指南!Windows + Claude Code + Cursor 安装、配置和激活!揭秘最全指南!Windows + Claude Code + Cursor 安装、配置和激活!揭秘最全指南!Windows + Claude Code + Cursor 安装、配置和激活!揭秘最全指南!

    前言 用过ai编程工具的小伙伴,肯定都知道claude。claude 系列模型在编程领域的口碑绝对是佼佼者!很多ai工具都接入claude的模型! 图片 鉴于Claude 系列模型的优秀表现,官方也推出自己的编程工具 Claude Code ,也是收费的。 图片 另外,单独的Claude模型需要一些…

    2026年8月28日 用户投稿
    000
  • 如何解决PHP中字符串语言检测问题?使用lasserafn/php-string-script-language可以!

    可以通过以下地址学习composer:学习地址 在处理一个多语言网站项目时,我遇到了一个棘手的问题:需要准确识别用户输入的文本所属的语言脚本。由于用户来自世界各地,文本中包含了各种语言,如中文、日文、阿拉伯文等。最初,我尝试使用一些手动编写的正则表达式和unicode字符集匹配,但这些方法不仅复杂,…

    用户投稿 2026年8月28日
    000
  • OpenAI等AI公司竞相利用“蒸馏”技术 构建低成本模型

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 全球领先的人工智能公司,包括OpenAI、微软和Meta,正积极采用“模型蒸馏”技术,致力于打造更经济实惠的AI模型,惠及消费者和企业。 DeepSeek公司在中国利用这项技术,基于Meta和阿…

    2026年8月28日
    000
  • Laravel 路由、控制器与视图:快速上手教程

    在 laravel 中,路由、控制器和视图的基本用法和最佳实践包括:1. 定义路由将 http 请求映射到应用逻辑;2. 使用控制器处理请求逻辑;3. 通过视图展示数据给用户。通过这些步骤,你可以创建和管理 laravel 应用,并通过优化和最佳实践提高应用性能。 引言 在 Laravel 这个优雅…

    2026年8月28日
    200
  • ChatGPT的回答不准怎么办_ChatGPT事实核查与优化提问技巧

    ChatGPT回答不准因训练数据局限和模型“幻觉”,需通过交叉验证权威来源进行事实核查,并优化提问的清晰度、具体性与上下文以提升准确率,同时积极反馈错误帮助改进。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ ChatGPT的回答不准?这事…

    2026年8月28日
    000
  • 基于Impala的高性能数仓实践之执行引擎模块

    基于Impala的高性能数仓实践之执行引擎模块基于Impala的高性能数仓实践之执行引擎模块基于Impala的高性能数仓实践之执行引擎模块基于Impala的高性能数仓实践之执行引擎模块

    导读: 本系列文章将结合实际开发和使用经验,聊聊可以从哪些方面对数仓查询引擎进行优化。 Impala是Cloudera开发和开源的数仓查询引擎,以性能优秀著称。除了Apache Impala开源项目,业界知名的Apache Doris和StarRocks、SelectDB项目也跟Impala有千丝万…

    2026年8月28日 用户投稿
    000
  • 如何清理谷歌浏览器特定网站的缓存数据

    当您遇到某个特定网站加载不正常、显示错误或功能失灵时,通常无需清理整个浏览器的缓存。本文将为您详细介绍如何精准地只针对单个网站进行缓存数据清理,这种方法可以有效解决特定网站的问题,同时又不会影响您在其他网站上的登录状态和浏览体验,操作过程十分快捷方便。 立即进入“高清国产电影网站合集☜☜☜☜☜点击保…

    2026年8月28日
    100
  • 中兴努比亚内嵌DeepSeek版本更新 业界首次实现智能联网搜索

    中兴努比亚星云ai迎来重大升级!deepseek版本更新,带来更智能、更便捷的搜索体验。新版deepseek率先实现智能联网搜索,根据使用场景自动判断是否联网,无需手动切换,搜索更流畅。 语音交互功能也已上线,用户只需语音即可轻松启动深度推理和分析。生成的內容支持历史记录查看,并可一键保存到记事本,…

    2026年8月28日
    000

发表回复

登录后才能评论
关注微信