
本文详细介绍
了如何利用纯CSS的`@keyframes`动画和少量原生J*aScript代码,实现元素动态、重复的颜色闪烁效果,例如点击按钮后元素从红色闪烁到蓝色再回到红色。这种方法避免了依赖大型第三方库,通过添加和移除CSS类来触发和重置动画,确保了高效、轻量且可重复的动画行为。
在网页开发中,我们经常需要为元素添加动态的视觉效果,例如在用户交互后让元素的颜色进行闪烁。一个常见的需求是,当用户点击按钮时,某个元素能从其原始颜色(如红色)过渡到另一种颜色(如蓝色),然后再平滑地回到原始颜色。
直接使用jQuery的.css()方法结合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属性定义的是当一个CSS属性的值发生变化时,如何平滑地从旧值过渡到新值。当你在同一个事件循环中连续设置属性时,浏览器可能只会应用最后一个状态,或者前一个过渡还没有开始就被新的过渡覆盖。要实现一个按时间序列执行的动画,我们需要更强大的机制。
立即学习“J*a免费学习笔记(深入)”;
解决方案是利用CSS的@keyframes规则来定义一个完整的动画序列,并结合J*aScript来简单地触发和重置这个动画。这种方法将动画逻辑完全封装在CSS中,而J*aScript只负责控制动画的播放,从而实现了职责分离、性能优化且易于维护。
这种方法的核心在于两部分:
首先,我们需要在CSS中定义元素的初始状态,并创建一个@keyframes规则来描述颜色变化的完整序列。
body {
margin: 0;
background-color: #f00; /* 初始背景色:红色 */
display: flex;
min-height: 100vh;
}
/* 按钮样式(可选,仅为示例提供上下文)*/
.my-button {
margin: auto;
background-color: white;
border: none;
border-radius: 3px;
padding: 10px 20px;
transition: .2s;
box-shadow: 1px 1px 4px rgba(0, 0, 0, .5);
}
.my-button:hover {
background-color: #ddd;
}
/* 定义触发动画的类 */
.active {
animation: bganim .6s; /* 应用名为bganim的动画,持续0.6秒 */
}
/* 定义颜色闪烁的关键帧动画 */
@keyframes bganim {
0%, /* 动画开始和结束时 */
100% {
background-color: #f00; /* 红色 */
}
50% {
background-color: #00f; /* 动画中间时:蓝色 */
}
}在上述CSS代码中:
Zapier Agents
Zapier推出的Agents智能体,集成7000+应用程序
103
查看详情
为了让动画在每次点击时都能重新播放,我们需要在动画结束时将触发动画的类移除。
const button = document.querySelector('.my-button');
const other = document.body; // 假设我们要动画的元素是body
button.addEventListener('click', function() {
other.classList.add('active'); // 点击时添加active类,触发动画
});
// 监听动画结束事件
other.addEventListener('animationend', function() {
other.classList.remove('active'); // 动画结束后移除active类,以便下次点击时能重新触发
});这段J*aScript代码做了以下几件事:
为了使上述CSS和J*aScript代码生效,我们需要一个基本的HTML结构:
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>颜色闪烁教程</title>
<link rel="stylesheet" href="style.css"> <!-- 引入你的CSS文件 -->
</head>
<body>
<button class="my-button">点击我</button>
<script src="script.js"></script> <!-- 引入你的J*aScript文件 -->
</body>
</html>将上面提供的CSS和J*aScript代码分别保存到style.css和script.js文件中,并确保在HTML中正确引入。
style.css:
body {
margin: 0;
background-color: #f00; /* 初始背景色:红色 */
display: flex;
min-height: 100vh;
}
.my-button {
margin: auto;
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; /* 添加鼠标手势 */
}
.my-button:hover {
background-color: #ddd;
}
.active {
animation: bganim .6s forwards; /* 添加forwards保持动画结束状态,此处不加也可以因为100%是初始状态 */
}
@keyframes bganim {
0%,
100% {
background-color: #f00;
}
50% {
background-color: #00f;
}
}script.js:
const button = document.querySelector('.my-button');
const other = document.body; // 目标元素,这里是body
button.addEventListener('click', function() {
// 确保在添加类之前移除,以防快速点击导致动画行为异常
if (other.classList.contains('active')) {
other.classList.remove('active');
// 强制浏览器重新计算样式,以便立即重新触发动画
void other.offsetWidth;
}
other.classList.add('active');
});
other.addEventListener('animationend', function() {
other.classList.remove('active');
});在script.js中,我添加了一个额外的检查:if (other.classList.contains('active')) { other.classList.remove('active'); void other.offsetWidth; }。这在某些浏览器或快速点击场景下,可以更可靠地强制动画重新播放。void other.offsetWidth;是一个小技巧,通过请求元素的布局信息来强制浏览器进行一次重绘/回流,从而确保在添加active类时动画能够被正确地重新触发。
通过这种纯CSS动画与J*aScript结合的方法,你可以灵活、高效地实现各种复杂的动态视觉效果,同时保持代码的简洁和高性能。
以上就是使用纯CSS动画与J*aScript高效实现元素颜色闪烁效果的详细内容,更多请关注其它相关文章!
# javascript
# css
# 移除
# 回流
# css属性
# css动画
# ai
# ssl
# 浏览器
# js
# html
# jquery
# java
# 农业营销推广宣传语简短
# 盲盒营销推广文案怎么写
# 银川科技型网站优化排名
# 桐城网站建设哪家强些呀
# 无锡手机网站建设服务
# 抖音seo软件加盟代理
# 拼多多网站建设选择哪个
# 服饰鞋包营销推广
# 舒城营销推广招聘信息在哪里看
# seo 资阳
# 单选
# 这在
# 只会
# 这段
# 这种方法
# 换行
# 的是
# 背景色
# 表单
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
123网页端官方登录页 123邮箱网页版即时通讯服务
解决C#跨线程访问XML对象的异常 安全的并发XML处理模式
手机坏了微信聊天记录怎么导出来 新手机恢复聊天记录技巧
C++中std::thread和std::async的区别_C++并发编程与线程与异步任务比较
KFC邀请码怎么使用领额外优惠_KFC邀请码输入方式与额外优惠代码获取方法
C++ static关键字作用_C++静态成员变量与静态函数
J*aScript与HTML元素交互:图片点击事件与链接处理教程
126邮箱网页在线登录2025_126邮箱网页版入口官方地址
163邮箱网页版入口 163邮箱在线使用
网站体验不好=浪费钱:如何提升-用户体验效果差
网易云音乐闹钟铃声设置教程
win11如何诊断DirectX问题 Win11运行dxdiag工具排查显卡故障【排错】
在J*a中如何实现在线问答与评分系统_问答评分项目开发方法说明
Windows自带的便笺数据如何备份_防止数据丢失的便利贴迁移教程【干货】
使用Google服务账号实现Google Drive API无缝集成与文件访问
怎样设置开机后自动运行某个程序_Windows启动文件夹与任务计划【自动化】
c++20的指定初始化(Designated Initializers)怎么用_c++ C风格结构体初始化
C#中的Record类型有什么优势?C# 9新特性Record与Class的用法区别
抖音号升级成企业资质怎么弄?有什么好处?
Microsoft Edge网页字体太淡看不清怎么办_Microsoft Edge字体渲染优化技巧
优酷下载视频的清晰度怎么选_优酷缓存清晰度设置与选择指南
edge浏览器怎么修改语言为中文_Edge界面语言切换教程
批改网网页版登录 批改网电脑版学生登录入口
Yandex无需登录畅游 俄罗斯搜索引擎最新官网指南
手机远程连接电脑方法
如何用mysql实现客户反馈管理_mysql客户反馈数据库方法
如何在mysql中比较InnoDB和MyISAM区别
向日葵客户端怎么进行语音通话_向日葵客户端语音通话功能使用方法
sublime text 4如何安装_最新版sublime下载与汉化教程
《随手记》备份数据方法
使用VS Code调试Python代码:从入门到精通
发博客与长微博技巧
江苏大剧院会员卡购买步骤
德邦快递收费标准详解
抖音怎么解除第三方绑定_抖音解除第三方平台绑定方法介绍
小米手机屏幕失灵乱跳怎么办 屏幕触控问题自检与临时解决方法【应急】
智学网成绩单查询系统网_智学网学生平台登录
Keras中Convolution2D层及其核心辅助层详解
如何测试您的网站全球打开速度-网站海外测速工
ExcelSCAN与LAMBDA如何创建自定义移动平均函数_SCAN实现任意窗口期移动平均计算
《东方航空》添加乘机人方法
快手缓存清理方法
C++ cast类型转换总结_C++ reinterpret_cast与const_cast的使用
荣耀 Magic10 Pro 系统更新提示失败_荣耀 Magic10 Pro 升级修复
如何发挥新媒体矩阵作用?新媒体矩阵怎么搭建?
安居客移动经纪人怎么设置自动回复?-安居客移动经纪人设置自动回复的方法
汽水音乐官网网页版入口 汽水音乐官网网页版在线入口
J*aScript模拟悬停与点击:自动化网页动态元素交互指南
无人机考证官网 中国民航无人机考证官网登录入口
windows10怎么设置电源按钮_windows10按下电源键功能修改
2025-12-12
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。