动态角标 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贡献图的年度热力图,可自定义颜色和统计。
从任意分布中抽取样本并绘制均值分布直方图,随着样本量增大趋近正态分布。
调用设备联系人选择界面,获取用户选中的联系人信息(需支持环境)。
输入字符串并使用 URL.canParse() 判断是否为有效 URL,不抛出异常。
快速生成PWA所需的manifest.json文件,填写应用名、图标、主题色、启动网址等字段。
选择表A和表B的样本数据,查看INNER/LEFT/RIGHT/FULL JOIN的韦恩图与实际输出结果。
从内置库随机选取主流浏览器的User-Agent字符串,一键复制用于请求头。
输入PlantUML描述,转换为简单的UML图像预览(基于内置编码器)。
嵌套的彩色方块,点击内层观察事件传播顺序,直观理解addEventListener的第三个参数。
点击屏幕转瓶,指针指向谁谁接受真心话或大冒险的挑战。
设置目标日期,生成一个精巧的倒计时代码片段,可嵌入任何网页。
模板化记录团队成员昨日完成、今日计划与阻塞项,支持导出Markdown便于分享。
请求Idle Detection权限,监测用户是否离开或处于空闲状态,实时更新状态。
生成高颜值的液态泼溅背景图,提供CSS代码或直接下载作为网站容器背景。
粘贴Shadow DOM代码,直观预览封装组件内部的CSS作用域及其对外界的影响。
团队成员在会前用温度计匿名标情绪,汇总显示利于主持人引导。
模拟接收包含一次性密码的短信,展示 navigator.credentials.get({otp}) 如何自动提取 OTP 并填入表单。
选择一个 Emoji 作为图标,生成标准尺寸的 .ico 和 PNG 文件,直接用作网站 Favicon。
在线Unix时间戳与标准日期时间互转,支持秒/毫秒级时间戳,显示GMT和本地时间。
设定储蓄目标金额,每次记录存入金额,环形图显示完成百分比,激励达成财务目标。
利用浏览器Crypto API生成密码学安全的随机字节序列及对应的整数和十六进制。
展示象限仪座、英仙座等著名流星雨的年度极大日期与ZHR。
提供每段应该写什么的提示,辅助填写个性化的求职信内容。
随机将行业、技术和目标用户拼接,生成充满槽点的奇葩创业点子,仅供娱乐。
输入正则表达式,检测潜在的指数级回溯陷阱,避免服务器性能被恶意输入拖垮。
以节点图展示链表的插入、删除、反转等操作,直观理解指针变化。
将普通英文转换为《我的世界》中附魔台显示的标准银河字母(Standard Galactic Alphabet)。
输入Base32密钥手动生成6位动态验证码,兼容Google Authenticator,前端算法实现不联网。