动态角标 Favicon 生成 - 数字气泡提醒
在 Favicon 上叠加未读消息数量的数字角标,生成相应 JS 代码。
UD5工具箱
Intersection Observer API 是浏览器原生提供的异步观察接口,用于监测目标元素与祖先元素(或视口)的交叉状态。它能够高效地报告元素何时进入或离开视口,而无需依赖频繁的 scroll 事件轮询。
核心优势在于:异步非阻塞——回调在浏览器空闲时执行,不会阻塞主线程;性能优越——避免了 getBoundingClientRect() 导致的强制回流;代码简洁——声明式API让代码更易维护。
传统的 scroll 事件方案存在几个关键问题:
getBoundingClientRect() 会强制浏览器重新计算布局,造成性能瓶颈。Intersection Observer 在浏览器内部使用优化后的算法,异步执行回调,性能可提升数倍,尤其适合无限滚动、懒加载等场景。
threshold 参数有什么作用?threshold 定义目标元素可见比例达到多少时触发回调。取值范围 0.0 到 1.0:
[0, 0.5, 1],在多个比例节点分别触发回调。对于无限滚动,通常使用 0 或 0.1,确保在观察点刚出现时就触发加载,提供流畅体验。
rootMargin 如何设置?有什么实际用途?rootMargin 用于扩展或收缩观察容器的范围,语法与 CSS margin 类似:'top right bottom left'。
常见设置:rootMargin: '0px 0px 200px 0px' 表示在视口底部下方扩展 200px 的观察区域。
实际用途:提前触发加载。比如设置 200px 的底部边距,当观察点距离视口底部还有 200px 时就触发回调,让用户在滚动到底部之前就能看到新内容加载完成,消除等待感,提升用户体验。
⚠️ 注意:值必须是像素或百分比单位,不能省略单位(如 '200' 无效,必须 '200px')。
当初始加载的内容高度不足以填满视口时,观察点元素始终在视口内,Intersection Observer 会持续触发回调,导致短时间内大量加载请求。解决方案:
document.body.scrollHeight 与 window.innerHeight,若内容不足则继续加载。isLoading 标志位,加载中不允许重复触发。本演示工具已内置这些保护机制,您可以调整加载数量和延迟来观察效果。
Intersection Observer API 在现代浏览器中获得广泛支持:Chrome 51+、Firefox 55+、Safari 12.1+、Edge 15+、Opera 38+。覆盖了约 97% 的全球用户。
对于需要兼容旧版浏览器(如 IE11)的场景,可以使用官方 polyfill:intersection-observer npm 包,或从 CDN 引入。Polyfill 会自动降级为使用 getBoundingClientRect() 和滚动事件。
unobserve() 和 disconnect() 的区别?unobserve(target):停止观察指定的单个目标元素。适合在某个元素加载完成后取消对其的观察。disconnect():停止观察该 Observer 实例上的所有目标元素。适合页面卸载或完全停止无限滚动时使用。在无限滚动场景中,当所有数据加载完毕后,应调用 observer.unobserve(sentinel) 停止观察,避免不必要的回调。如果页面需要完全清理,则使用 observer.disconnect()。
以下是一个精简但完整的实现示例:
// 创建观察器实例
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
// 当观察点进入视口且不在加载中
if (entry.isIntersecting && !isLoading) {
loadMoreContent(); // 触发加载
}
});
}, {
threshold: 0.1, // 10%可见即触发
rootMargin: '0px 0px 200px 0px' // 提前200px触发
});
// 开始观察哨兵元素
const sentinel = document.querySelector('#sentinel');
observer.observe(sentinel);
// 加载更多内容的函数
async function loadMoreContent() {
isLoading = true;
showSpinner();
const data = await fetchData(); // 异步获取数据
if (data.length === 0) {
observer.unobserve(sentinel); // 无更多数据,停止观察
showEndMessage();
} else {
appendCards(data); // 渲染新内容到DOM
}
hideSpinner();
isLoading = false;
}
unobserve(),否则回调持续触发。'200px' 而非 '200'。requestIdleCallback。1.0 时,若元素比视口大则永远不会触发,应注意元素尺寸。isLoading 标志位防止重复请求。在 Favicon 上叠加未读消息数量的数字角标,生成相应 JS 代码。
演示元素进入视口时触发懒加载和曝光埋点,并展示当前可见比例。
输入日期和数值,生成类似GitHub贡献图的年度热力图,可自定义颜色和统计。
从任意分布中抽取样本并绘制均值分布直方图,随着样本量增大趋近正态分布。
调用设备联系人选择界面,获取用户选中的联系人信息(需支持环境)。
粘贴 assetlinks.json 内容,检查是否符合 TWA 打包要求,帮助将 PWA 上架应用商店。
输入字符串并使用 URL.canParse() 判断是否为有效 URL,不抛出异常。
快速生成PWA所需的manifest.json文件,填写应用名、图标、主题色、启动网址等字段。
比较不同 DOM 插入方法的执行速度,可视化渲染耗时,帮助选择最优动态内容更新策略。
选择表A和表B的样本数据,查看INNER/LEFT/RIGHT/FULL JOIN的韦恩图与实际输出结果。
选择文件夹并上传,保留相对路径,以树形结构展示所有文件并读取内容。
选择 hook 类型(pre-commit、pre-push 等),填入要执行的命令,生成钩子脚本。
选择一个 Emoji,生成 16x16 和 32x32 的 .ico 及 PNG 文件,快速用作网站图标。
创建 ArrayBuffer,用不同 TypedArray 视图读写,观察字节布局和大小端差异。
从内置库随机选取主流浏览器的User-Agent字符串,一键复制用于请求头。
输入PlantUML描述,转换为简单的UML图像预览(基于内置编码器)。
嵌套的彩色方块,点击内层观察事件传播顺序,直观理解addEventListener的第三个参数。
点击屏幕转瓶,指针指向谁谁接受真心话或大冒险的挑战。
设置目标日期,生成一个精巧的倒计时代码片段,可嵌入任何网页。
模板化记录团队成员昨日完成、今日计划与阻塞项,支持导出Markdown便于分享。
请求Idle Detection权限,监测用户是否离开或处于空闲状态,实时更新状态。
生成高颜值的液态泼溅背景图,提供CSS代码或直接下载作为网站容器背景。
填写项目名称、描述、安装步骤等,实时预览并生成完整的 Markdown 格式 README。
粘贴Shadow DOM代码,直观预览封装组件内部的CSS作用域及其对外界的影响。
团队成员在会前用温度计匿名标情绪,汇总显示利于主持人引导。
通过填写项目名称、描述、安装步骤等基础信息,自动生成结构化的 README.md 文件。
使用多个哈希函数和位数组,演示布隆过滤器的添加和查询,计算误判率。
模拟接收包含一次性密码的短信,展示 navigator.credentials.get({otp}) 如何自动提取 OTP 并填入表单。
选择一个 Emoji 作为图标,生成标准尺寸的 .ico 和 PNG 文件,直接用作网站 Favicon。
在线Unix时间戳与标准日期时间互转,支持秒/毫秒级时间戳,显示GMT和本地时间。