Фавикон для тёмной темы с помощью SVG

Автор

Чёрный логотип на прозрачном фоне отлично выглядит в светлой вкладке и исчезает в тёмной. ICO не умеет адаптироваться, а SVG-фавикон умеет: внутри него есть CSS-правило, меняющее цвета в зависимости от темы браузера.

Один и тот же символ хорошо виден в светлой и тёмной вкладках браузера
SVG меняет цвета без JavaScript с помощью prefers-color-scheme.

Проблема: один файл, два фона

Браузеры следуют системной теме, поэтому панель вкладок одной и той же страницы у одного посетителя почти белая, а у другого почти чёрная. Одноцветный фавикон, рассчитанный на один фон, теряется на другом.

Многие сайты обходят проблему непрозрачным цветным фоном значка. Это работает, но превращает его в тяжёлое пятно, тогда как крупные бренды часто используют отдельный символ без фона.

Лучше дать браузеру выбрать подходящий вариант. Это возможно без JavaScript и без определения темы на сервере.

Как работает адаптивный SVG

SVG-файл — документ, а не плоская картинка: он может содержать тег style и, следовательно, медиазапросы. Правило prefers-color-scheme: dark внутри него переопределяет заливку контуров, когда браузер использует тёмную тему.

На практике SVG задаёт цвет по умолчанию для светлой темы и правило, заменяющее его в тёмной. Браузер применяет нужный вариант при отрисовке и сразу обновляет вкладку, если посетитель переключает тему.

Механизм не ограничивается инверсией: можно показывать совершенно другой рисунок, например отдельный символ в светлой теме и сплошную эмблему в тёмной.

Объявление SVG рядом с .ico

Объявите SVG через link rel="icon" type="image/svg+xml" href="/favicon.svg". Браузеры с поддержкой формата предпочитают его, а остальные используют favicon.ico в корне как запасной вариант.

Удалять ничего не нужно: оба файла существуют вместе и покрывают разные клиенты. Так прогрессивное улучшение применяется даже к значку размером 32 пикселя.

Есть нюанс: SVG-фавикон должен быть автономным. Внешний шрифт, удалённое изображение или скрипт не загрузятся в этом контексте. Текст нужно преобразовать в контуры.

На что тёмная тема не влияет

Тёмный вариант применяется к фавикону браузера на компьютере. Он не меняет значок Apple Touch, который остаётся непрозрачным PNG, и значки веб-манифеста, которые Android рисует на собственном фоне.

Поддержка тоже не универсальна: браузеры на Chromium и Firefox читают адаптивный SVG, а возможности Safari зависят от версии. Это допустимо, поскольку переход к запасному .ico происходит автоматически.

Поэтому светлый значок следует проектировать как базовый вариант для всех посетителей, а тёмный — как дополнительное улучшение для браузеров, которые умеют его читать.

Первоисточники

Частые вопросы

Может ли favicon.ico поддерживать тёмную тему?

Нет. ICO хранит неизменяемые растровые изображения и ничего не знает о теме. Только SVG может содержать медиазапрос, поэтому современный набор включает оба формата.

Нужны два SVG-файла, светлый и тёмный?

Нет, достаточно одного файла. Оба варианта находятся внутри одного SVG и разделяются медиазапросом prefers-color-scheme. Это позволяет обойтись без лишнего запроса и кода определения темы.

Как проверить отображение в тёмной теме?

Переключите тему операционной системы и перезагрузите вкладку. В генераторе предпросмотры светлой и тёмной вкладок расположены рядом, поэтому переключаться туда и обратно не придётся.

Попробуйте на практике

Генератор бесплатно создаст полный набор за секунды, без отправки изображений на сервер.

Создать фавикон с тёмным вариантом

Что ещё почитать и попробовать

Другие инструменты LFFavicon и руководства с ответами на самые частые вопросы.

Инструменты

Руководства