当前位置: 首页 > news >正文

CSS动画实战:5分钟搞定微信语音发送震动效果(附完整代码)

CSS动画实战:5分钟实现语音波形震动效果

最近在做一个社交类项目时,产品经理突然提出要在语音消息发送时加入波形动画效果,要求"要有微信那种专业感"。作为前端开发者,我第一反应就是:这得用Canvas吧?但实际研究后发现,纯CSS方案不仅能完美实现,而且代码量少得惊人。下面就把这个高效解决方案分享给大家。

1. 波形动画的核心原理

语音波形动画的本质是通过多个垂直柱状体的高度变化,模拟声波的震动效果。在CSS中实现这种效果,关键在于三个技术点的组合:

  1. Flex布局:用于均匀排列多个波形柱
  2. CSS动画:通过@keyframes控制高度变化
  3. 动画延迟:通过nth-child实现波浪式动画序列

微信的语音发送动画之所以看起来流畅自然,是因为它采用了对称波形变化的设计。中间柱子先动,两侧依次跟随,形成类似声波扩散的效果。

2. 基础HTML结构搭建

我们先构建最简HTML结构,这里使用类微信的对话气泡样式:

<div class="voice-message"> <div class="wave-container"> <div class="wave-bar"></div> <div class="wave-bar"></div> <div class="wave-bar"></div> <!-- 共15个波形柱 --> ... </div> <span>按住说话</span> </div>

提示:实际项目中建议用Vue或React动态生成wave-bar元素,这里为演示简化使用静态HTML

3. CSS样式与动画实现

接下来是核心CSS代码,我们分步骤实现:

3.1 容器基础样式

.voice-message { background: #E2F0FF; border-radius: 24px; padding: 12px 24px; display: inline-flex; align-items: center; gap: 15px; } .wave-container { display: flex; align-items: center; justify-content: space-between; width: 120px; height: 40px; }

3.2 波形柱基础样式

.wave-bar { width: 3px; background: #007AFF; border-radius: 3px; height: 10%; }

3.3 关键帧动画定义

@keyframes wave { 0%, 100% { height: 10%; } 50% { height: 100%; } }

3.4 应用动画并设置延迟

这是最精妙的部分,我们通过nth-child为每个柱子设置不同的动画延迟:

.wave-bar:nth-child(1), .wave-bar:nth-child(15) { animation: wave 1.8s 0.1s infinite ease-in-out; } .wave-bar:nth-child(2), .wave-bar:nth-child(14) { animation: wave 1.8s 0.2s infinite ease-in-out; } /* 中间柱子 */ .wave-bar:nth-child(8) { animation: wave 1.8s 0s infinite ease-in-out; }

4. 性能优化与进阶技巧

基础效果实现后,我们还需要考虑性能和视觉优化:

4.1 硬件加速优化

添加transform属性触发GPU加速:

.wave-bar { transform: translateZ(0); }

4.2 动画参数调优

调整动画曲线使效果更自然:

@keyframes wave { 0%, 100% { height: 10%; animation-timing-function: cubic-bezier(0.3, 0.1, 0.1, 1); } 50% { height: 100%; animation-timing-function: cubic-bezier(0.1, 0.3, 1, 0.1); } }

4.3 响应式适配方案

使用CSS变量和vw单位实现响应式:

.voice-message { --wave-height: 40px; --wave-width: 120px; } @media (max-width: 768px) { .voice-message { --wave-height: 30px; --wave-width: 90px; } }

5. 完整代码实现

以下是可直接使用的完整代码:

<!DOCTYPE html> <html> <head> <style> .voice-message { background: #E2F0FF; border-radius: 24px; padding: 12px 24px; display: inline-flex; align-items: center; gap: 15px; font-family: sans-serif; } .wave-container { display: flex; align-items: center; justify-content: space-between; width: 120px; height: 40px; } .wave-bar { width: 3px; background: #007AFF; border-radius: 3px; height: 10%; transform: translateZ(0); } @keyframes wave { 0%, 100% { height: 10%; animation-timing-function: cubic-bezier(0.3, 0.1, 0.1, 1); } 50% { height: 100%; animation-timing-function: cubic-bezier(0.1, 0.3, 1, 0.1); } } /* 为15个柱子设置动画延迟 */ .wave-bar:nth-child(1), .wave-bar:nth-child(15) { animation: wave 1.8s 0.1s infinite; } .wave-bar:nth-child(2), .wave-bar:nth-child(14) { animation: wave 1.8s 0.2s infinite; } .wave-bar:nth-child(3), .wave-bar:nth-child(13) { animation: wave 1.8s 0.3s infinite; } .wave-bar:nth-child(4), .wave-bar:nth-child(12) { animation: wave 1.8s 0.4s infinite; } .wave-bar:nth-child(5), .wave-bar:nth-child(11) { animation: wave 1.8s 0.5s infinite; } .wave-bar:nth-child(6), .wave-bar:nth-child(10) { animation: wave 1.8s 0.6s infinite; } .wave-bar:nth-child(7), .wave-bar:nth-child(9) { animation: wave 1.8s 0.7s infinite; } .wave-bar:nth-child(8) { animation: wave 1.8s 0s infinite; } </style> </head> <body> <div class="voice-message"> <div class="wave-container"> <div class="wave-bar"></div> <div class="wave-bar"></div> <div class="wave-bar"></div> <div class="wave-bar"></div> <div class="wave-bar"></div> <div class="wave-bar"></div> <div class="wave-bar"></div> <div class="wave-bar"></div> <div class="wave-bar"></div> <div class="wave-bar"></div> <div class="wave-bar"></div> <div class="wave-bar"></div> <div class="wave-bar"></div> <div class="wave-bar"></div> <div class="wave-bar"></div> </div> <span>按住说话</span> </div> </body> </html>

在最近的项目中,这个方案不仅完美满足了产品需求,而且性能测试表现优异——在低端手机上也能保持60fps的流畅动画。最让我意外的是,整个动画实现只用了不到50行CSS代码,比预想的Canvas方案简洁得多。

http://www.jsqmd.com/news/578234/

相关文章:

  • 今日心理学知识2026.4.2
  • Claude Code Windows 常用快捷/命令
  • 天地图三维地名服务集成指南:从Token申请到避坑配置(Cesium 1.80+适用)
  • 保姆级教程:在Windows下用VSCode和STM32CubeProgrammer给Pixhawk4飞控烧写Bootloader
  • 从85分到95+:复盘我在科大奥锐虚拟仿真实验平台踩过的那些‘坑’
  • Open UI5 源代码解析之780:Label.js
  • 3分钟快速获取百度网盘提取码的完整指南
  • 『n8n』调不了免费的LongCat?我不服!
  • 2026年 烘干机厂家推荐排行榜,覆盖香菇木耳果蔬药材米面饲料坚果酒糟化工水产等全品类烘干设备,高效节能技术解析与选购指南 - 品牌企业推荐师(官方)
  • Windows Cleaner终极指南:三步解决C盘爆红,让系统重获新生!
  • 改进超螺旋滑模在开关磁阻电机直接瞬时转矩控制仿真中的魅力
  • 避坑指南:为什么你的requirements.txt总是安装失败?从torch报错学Python依赖管理
  • 2026年 给水设备厂家推荐排行榜,消防稳压/增压给水设备,变频给水设备,物联网检测给水设备及控制柜系统深度解析 - 品牌企业推荐师(官方)
  • 机械键盘连击困扰的终结:KeyboardChatterBlocker如何让我重获流畅打字体验
  • 升压斩波电路的仿真实验里藏着不少有意思的细节。当我在Simulink里同时搭建开环和闭环两个模型时,发现它们的表现就像性格迥异的双胞胎——一个莽撞,一个机灵
  • UE5 C++实战:动态加载资源与类的完整流程(从代码到蓝图)
  • 如何隐藏左侧导航中的特定数据库_过滤规则与匹配隐藏
  • 告别超时烦恼:手把手教你调优CAN-TP/UDS诊断通信中的N_As、N_Bs等关键时间参数
  • 告别模拟器!3步在Windows上直接安装APK文件的终极指南
  • 解锁论文写作新姿势:书匠策AI,你的期刊论文智囊团
  • LangChain实战:如何用ConversationalRetrievalQA构建带记忆的智能问答系统(附完整代码)
  • (22)ArcGIS Pro 联合与标识分析:全范围合并、属性标记,空间叠加双核心工具
  • LZW压缩算法:从原理到实战应用
  • 别急着重装!Stable Diffusion WebUI安装失败后,如何利用现有文件快速恢复(Mac/Windows通用)
  • 3个核心步骤实现Koikatu HF Patch的无缝集成解决方案
  • FedProx实战:如何用Python在异构网络中优化联邦学习(附代码)
  • 告别选择困难:2024年nuScenes榜单上的3D检测算法,单模态vs多模态到底怎么选?
  • 从ZJUCTF那道‘简单’的PHP反序列化题,聊聊魔术方法链的实战利用(附完整EXP)
  • JSP 语法详解
  • 突破品牌壁垒与部署瓶颈:WVP-GB28181-Pro开源监控系统全栈解决方案