如果你曾经花几个小时设计了一个极简的深灰色 Logo,却发现它在 Chrome 的深色模式标签页中完全消失了,你就会懂这种痛。浏览器可不在乎你的品牌视觉规范,它们只关心如何渲染自己的 UI。如果你的图标融入了背景,用户就会在打开的 40 多个标签页中彻底找不到你的网站。

我们通常只在排版时严格考虑对比度。但 Favicon 是关键的 UI 导航元素。它们需要遵循严格的 Favicon 对比度指南,才能在不可预测的浏览器主题中保持清晰。让我们来修复你那“隐形”的图标吧。

图标测试的准备工作

开始之前不需要太多准备。只需拿出你当前的 Favicon 文件(最好是矢量版本),并在另一个标签页中打开一个标准的 WCAG 对比度检查工具。我们的目标是:图标与常见的浏览器 UI 背景之间至少达到 3:1 的对比度。

第一步:摸清浏览器标签页的底色

在计算对比度之前,你需要知道参照物是什么。浏览器标签页的背景可不是纯白或纯黑的。

如果你的 Favicon 是纯黑色(#000000),它在 Chrome 浅色模式下看起来非常锐利。但在 Chrome 深色模式下,对比度会骤降到惨不忍睹的 1.1:1。它会完全隐形。

第二步:计算并调整你的对比度

提取你图标的主色调十六进制代码。将其放入对比度检查工具中,与 #202124 进行对比。如果得分低于 3.0,你的图标就存在辨识度问题。

GitHub 在这方面处理得非常出色。他们默认的章鱼猫 Logo 是黑色的。在深色模式下,他们并没有简单粗暴地将整个 Logo 反转为纯白色(那看起来会很刺眼且丢失细节),而是切换成了一个白色的剪影。这保证了在任何深色标签页上都能获得远超 4.5:1 的对比度。

你需要决定你的策略:是使用会变色的动态 SVG,还是使用带有保护性背景的单一静态图片?

第三步:实现动态 SVG 修复方案

最优雅的解决方案是使用内嵌 CSS 的 SVG Favicon。这允许你的图标实时响应用户的系统偏好设置。这也是整体Favicon 无障碍设计的核心组成部分。

以下是你需要嵌入到 SVG 文件中的确切代码结构:

<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'>
  <style>
    .icon { fill: #1A1A1A; }
    @media (prefers-color-scheme: dark) {
      .icon { fill: #F8F9FA; }
    }
  </style>
  <path class='icon' d='M50 10 L90 90 L10 90 Z' />
</svg>

将其保存为 favicon.svg 并在 HTML 中引入。当浏览器切换到深色模式时,SVG 会瞬间从深灰色翻转为米白色,保持完美的对比度。

第四步:通用的降级策略

并非所有浏览器都支持 SVG Favicon(说的就是你,老版本的 Safari)。你仍然需要一个 PNG 或 ICO 文件作为降级方案。由于 PNG 无法使用 CSS 媒体查询,你需要一个能在浅色和深色背景下都通过对比度测试的单一设计。

我最喜欢的技巧是“保护性描边”。在你的深色图标周围添加 1px 或 2px 的半透明白色描边(比如 rgba(255, 255, 255, 0.8))。在浅色标签页上,描边是隐形的。在深色标签页上,描边就像一个光环,创造出清晰的边界,从而通过 3:1 的对比度要求。

或者,你可以将透明 Logo 放在一个纯色的圆角矩形底板内。只要确保该背景色与 #F1F3F4 和 #202124 都有良好的对比度即可。如果你想完美匹配网站的头部颜色,请阅读我们的Favicon 配色方案匹配指南。

需要避免的常见陷阱

永远不要在动态图标中使用纯黑(#000000)或纯白(#FFFFFF)。纯色在现代 OLED 屏幕上会引起视觉疲劳,并且经常与浏览器用于活动标签页的微妙渐变发生冲突。坚持使用偏黑和偏白的颜色。

此外,避免依赖纤细复杂的线条。1px 的线条可能在数学上通过了对比度测试,但当它在浏览器标签页中缩小到 16x16 像素时,抗锯齿处理会把它模糊成一团泥。

一旦你准备好了高对比度的 SVG 和降级用的 PNG,你就可以把它们扔进 Mzu favicondl,生成你的服务器所需的确切尺寸和 ICO 格式。看得见的标签页才是会被点击的标签页——别让糟糕的对比度毁了你的心血。