Tab Out 浏览器插件:Web Audio API 合成 Swoosh 关闭音效 + 纯 JS 彩纸粒子物理实战
【免费下载链接】tab-outKeep tabs on your tabs. Turn your New tabs page into a mission control, so you can close them easily. Built for people who open too many tabs and never close them.项目地址https://gitcode.com/gh_mirrors/ta/tab-out点击查看免费下载Tab Out 是一个 Chrome 浏览器插件把新标签页变成所有已打开标签页的管控台按域名分组、一键清理关闭标签时还会播放一声清脆的 Swoosh 音效并炸出彩纸粒子。这篇文章带你拆透这两个爽点背后的技术——它不依赖任何音频文件也不依赖任何动画库音效由Web Audio API 实时合成彩纸由纯 JavaScript 手写粒子物理驱动。全部实现都集中在 extension/app.js 里代码量极小非常适合新手学习。 文中所有代码链接都指向仓库内的真实源码你可以边读边对照全程无需复制粘贴任何代码。先看效果再看源码在哪在 Tab Out 里点一次Close all N tabs你会经历这么一套连招 一声短促的嗖——Swoosh 卡片中心炸开 17 片彩纸先抛起、后下落、渐渐淡出✨ 卡片整体缩小淡出屏幕下方弹出 Toast 提示这三件事都由 extension/app.js 里的三个核心函数完成行号可以直接跳转查看功能函数源码位置Swoosh 合成音效playCloseSound()app.js#L298-L338彩纸粒子系统shootConfetti(x, y)app.js#L347-L412卡片关闭动画animateCardOut(card)app.js#L420-L431为什么不用现成的 mp3 文件和彩纸库因为这是一个零服务端、零依赖的纯插件见 extension/manifest.json作者坚持能用几十行原生 API 解决的绝不引入一个文件。下面逐个拆解。Swoosh 关闭音效Web Audio API 四步合成法很多人以为嗖的音效一定来自音频文件其实它完全可以用数学公式算出来。playCloseSound() 的做法可以概括为四步合成第 1 步用随机数制造白噪声白噪声听起来像沙沙声——它就是把每秒几万个随机数直接当声音样本播放。代码先用AudioContext创建一个 0.25 秒的缓冲ctx.createBuffer然后循环填充随机样本。第 2 步给噪声画上包络让它像风掠过裸白噪声又响又硬难听。代码给每个样本乘上一个包络envelope前 10% 的时间音量快速爬升快起音剩下 90% 按 1.5 次方的曲线平滑衰减。这一步让噪声从白噪音变成了空气流动。第 3 步带通滤波器扫频制造嗖的感觉 这是整个音效的灵魂。噪声通过一个BiquadFilter 带通滤波器而滤波器的中心频率在 0.25 秒内从4000Hz 指数下滑到 400HzexponentialRampToValueAtTime。高频→低频的滑动正是你听到嗖——时那种音调下滑的听感来源Q 值 2.0则让滤波曲线足够聚焦声音干净不浑浊。第 4 步增益控制音量用完即释放最后用一个GainNode把整体音量压在 0.15不吵人再指数衰减到接近零随后把噪声源 → 滤波器 → 增益 → 扬声器四个节点串成一条流水线播放。播放完 500ms代码还会主动ctx.close()释放音频上下文——对插件这种随时可能被调用的场景避免资源泄漏是个好习惯。整段调用外裹了一层try/catch如果浏览器不支持 Web Audio就静默失败绝不影响关闭功能本身。 小结playCloseSound的配方 白噪声 包络 扫频带通 音量衰减。把这四条曲线叠在一起嗖就诞生了。同样的思路可以合成门轴声、翻页声、雨声——都是 Web Audio API 的基本功。彩纸粒子物理requestAnimationFrame 手写积分器关掉标签时炸开的彩纸由 shootConfetti(x, y) 实现。它没有用任何库就是一个 60 帧/秒的手写粒子模拟拆开看一共五个要素要素实现方式粒子数量固定 17 片保证爆炸感又不卡顿外观8 色暖色调琥珀 / 鼠尾草 / 石板 / 玫瑰圆形与 2px 圆角方块各占一半尺寸随机 5–11px初始速度随机角度 0–360° × 随机速率 60–180纵向额外向上偏置 -80先抛起再落下重力恒定 200位置公式y vy·t ½·g·t²——中学物理的匀加速运动直接照搬生命周期随机 700–900ms后半程透明度线性归零时间到直接el.remove()几个值得偷师的小细节方块会自旋圆片不会。只有方形粒子叠加了rotate(elapsed × 200deg)因为圆旋转根本看不出来——写粒子特效时只画看得见的运动是省性能的关键。用transform移动而不是left/top。粒子用position: fixed钉在屏幕坐标每帧只改transform和opacity浏览器可以走合成器层动画更顺滑。闭包保存每个粒子的物理状态。角度、速度、重力都定义在粒子自己的作用域里requestAnimationFrame回调里就地更新粒子寿命结束即从 DOM 移除没有全局数组要维护天然无内存泄漏。️pointer-events: none让彩纸飘过按钮时完全不干扰点击体验细节很加分。一次关闭动作的完整编排音效和彩纸不是各自为政的它们被统一编排进插件的事件委托体系里——整个 app.js 只有一个挂在document上的点击监听器用data-action属性分发所有按钮行为。几个触发点对照关闭单个标签close-single-tab先调 playCloseSound()再在标签条中心调 shootConfetti()标签条缩小淡出整组关闭close-domain-tabs音效 animateCardOut() 在卡片中心炸彩纸卡片 300ms 内缩小消失一键清空全部标签close-all-open-tabs一次音效每张卡片都各炸一簇彩纸app.js#L1423-L1429像多米诺骨牌一样依次倒下场面最壮观卡片淡出的.closing样式由 extension/style.css 里的 CSS transition 完成见 style.css#L263关闭后若页面已无标签还会弹出Inbox zero, but for tabs的空状态彩蛋app.js#L450-L471。给新手的学习价值这套效果组合拳最值得借鉴的不是某个炫酷技巧而是**零依赖的工程取舍**声音不用文件——Web Audio API 四步合成一个 mp3 都不带动画不用库——一个requestAnimationFrame闭包就是完整的粒子物理引擎资源用完即走——音频上下文 500ms 后关闭粒子到期即删 DOM插件长时间挂着也不漏内存优雅降级——try/catch包住音频不支持就静默跳过核心功能不受影响。如果你想在自己的项目里复刻关闭/删除/完成这类交互的爽感直接对照 extension/app.js#L298-L412 这段 115 行的源码就够了先学会用噪声扫频合成 Swoosh再把初速度 重力 生命周期三件套搬进你的粒子系统就能得到一套体积几乎为零、手感却很精致的交互反馈。赞分享【免费下载链接】tab-outKeep tabs on your tabs. Turn your New tabs page into a mission control, so you can close them easily. Built for people who open too many tabs and never close them.项目地址https://gitcode.com/gh_mirrors/ta/tab-out点击查看免费下载相关推荐突破浏览器限制code-server音频输出全方案与Web Audio API实战指南突破浏览器限制code server音频输出全方案与Web Audio API实战指南 引言云端编码的无声痛点 你是否曾在使用code server进行远程后端开发工具Web通达信缠论指标插件K线结构快速可视化通达信缠论指标插件K线结构快速可视化 这款开源的通达信缠论指标插件是一个加载到通达信行情软件的动态库组件把一段K线序列加工成顶底分型、线段连线、中枢区间框和金融科技如何用Web Audio API打造专业音频效果从入门到精通的滤波器实战指南如何用Web Audio API打造专业音频效果从入门到精通的滤波器实战指南 Web Audio API是现代前端开发中处理音频的强大工具它允许开发者在浏览前端文档创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

如何用NyaTerm实现远程文件传输零卡顿:SFTP文件浏览器与自动上传完全指南

如何用NyaTerm实现远程文件传输零卡顿:SFTP文件浏览器与自动上传完全指南

【免费下载链接】nyaterm A modern remote terminal workspace 项目地址: https://gitcode.com/gh_mirrors/ny/nyaterm 点击查看 免费下载 在远程服务器上搬运文件,是不是还停留在"开个窗口敲 scp、再开个窗口看日志"的阶段?开源项…

2026/10/14 1:25:45 阅读更多 →
MATLAB 2FSK调制解调仿真与误码率分析:从课程设计到工程实践

MATLAB 2FSK调制解调仿真与误码率分析:从课程设计到工程实践

简介:一份基于MATLAB7.0完成2FSK二进制频移键控调制解调系统设计与仿真的课程设计文档,面向通信工程及相关专业学生,适合需要完成同类课题或理解数字调制机理的读者。文档完整呈现了系统实现方案,涵盖信源随机比特流生成、开关法调…

2026/10/13 1:44:06 阅读更多 →
深入理解Linux进程退出、等待与替换机制

深入理解Linux进程退出、等待与替换机制

如果你学过几天 Linux 系统编程,一定写过或看过这样的代码:fork 出一个子进程,然后在子进程里调用 exec 家族函数去跑另一个程序,父进程再用 wait 等着收尸。但很多人写是写出来了,心里其实没有完全搞清楚这三步各自在…

2026/10/13 1:39:54 阅读更多 →

最新新闻

组合导航中的杆臂效应与外参标定:从原理到工程实践

组合导航中的杆臂效应与外参标定:从原理到工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 1:43:13 阅读更多 →
单相逆变器下垂控制原理与工程实践

单相逆变器下垂控制原理与工程实践

1. 项目概述:下垂控制在单相逆变器并机中的核心价值在分布式发电系统中,多台逆变器并联运行是提升系统容量和可靠性的关键技术。传统控制方法在并联运行时往往面临环流问题、功率分配不均等挑战。下垂控制通过模拟同步发电机的调频特性,实现了…

2026/10/14 1:43:13 阅读更多 →
医美CRM客户生命周期管理:从咨询到复购的数据主干网

医美CRM客户生命周期管理:从咨询到复购的数据主干网

简介:宏脉医美系统使用手册是一份面向医疗美容机构运营管理人员、前台接待、咨询顾问及信息化实施人员的标准化操作指南,聚焦客户数据规范化采集、新老客户精准识别与全流程业务协同管理,切实解决医美行业客户信息分散、填写不全、跨部门衔接…

2026/10/14 1:43:13 阅读更多 →
串口通信稳定性实践:分帧、超时与断线重连机制详解

串口通信稳定性实践:分帧、超时与断线重连机制详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 1:43:13 阅读更多 →
支腿反力与静态稳定性:吊装安全计算模块全解析

支腿反力与静态稳定性:吊装安全计算模块全解析

干吊装这行越久,越明白一个道理:绝大多数事故都不是“胆大胡来”造成的,而是“以为没问题”造成的。尤其是支腿反力和整车静态稳定性这两件事,现场最容易漏算,也最容易在临界工况上出问题。支腿反力大一点、重心偏一点…

2026/10/14 1:43:13 阅读更多 →
北航机试工程思维:输入解析、缓存优化与格式鲁棒性

北航机试工程思维:输入解析、缓存优化与格式鲁棒性

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 1:42:11 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →