Как создать favicon для сайта в 2025 году
Favicon (фавикон) — небольшая, но значимая часть сайта, отображающаяся во вкладке браузера рядом с названием. Фавикон помогает пользователям быстро узнавать сайт среди множества открытых вкладок и формирует первое визуальное впечатление. В статье рассмотрим, как создать современный favicon с поддержкой SVG, PNG и webmanifest, и почему важно уделить этому внимание даже в 2025 году.
Пришло время переосмыслить то, как мы готовим набор фавиконок для современных браузеров, и прекратить безумие генераторов иконок. В настоящее время разработчикам фронтенда приходится иметь дело с 20+ статичными PNG-файлами только для того, чтобы отобразить крошечный логотип сайта во вкладке браузера или на сенсорном экране. Читайте дальше, чтобы узнать, как использовать более разумный подход и использовать минимальный набор иконок, подходящий для большинства современных потребностей.
Тема favicon оказалась более исчерпывающей, чем можно было бы пожелать, поэтому я также свёл всю статью всего к двум фрагментам кода для тех, кто уже достаточно настрадался и точно знает, что делать. Тем не менее я рекомендую дочитать до конца!
Предельно краткая версия
Вместо десятков иконок вам нужно всего лишь пять иконок и один JSON-файл.
Для браузера, используя HTML:
<link rel="icon" href="/favicon.ico" sizes="32x32">
<link rel="icon" href="/icon.svg" type="image/svg+xml">
<link rel="apple-touch-icon" href="/apple-touch-icon.png"><!-- 180×180 -->
<link rel="manifest" href="/manifest.webmanifest">
И в манифесте (manifest.webmanifest
) вашего веб-приложения:
// manifest.webmanifest
{
"icons": [
{ "src": "/icon-192.png", "type": "image/png", "sizes": "192x192" },
{ "src": "/icon-512.png", "type": "image/png", "sizes": "512x512" }
]
}
Вот и все. Если вы хотите узнать, как я пришёл к этому, на какие компромиссы мне пришлось пойти и как собрать подобный набор с нуля в пошаговом режиме, читайте продолжение статьи.
Длинная версия, где все объясняется
Совершенство достигается не тогда, когда уже нечего добавить, а когда уже нечего отнять.
— Антуан де Сент-Экзюпери, Airman's Odyssey
Концепция favicon, что сокращённо означает "favorite icon", существует с начала 2000-х годов. Все мы видели эти маленькие симпатичные изображения в строке вкладок браузера, помогающие нам различать открытые сайты. Пользователи ожидают, что у вашего сайта будет иконка. Это одна из тех мелочей, которые заставляют других людей воспринимать вас всерьёз.
Даже Apple, у которой всегда были какие-то эстетические претензии к иконкам не из Купертино и которая годами преуменьшала значение фавикон в Safari, наконец сдалась и теперь правильно отображает их на всех своих устройствах.
Если у вас есть веб-сайт, предназначенный для публичного доступа, у него обязательно должен быть фавикон. К сожалению, то, что пользователи воспринимают как одну иконку, на самом деле является их множеством.
Поэтому изнурительную задачу по созданию этих необходимых файлов для постоянно растущего списка экранов и устройств принято перекладывать на генераторы favicon. Никто в здравом уме не захочет тратить часы на их создание вручную. В конце концов, мы здесь для того, чтобы создавать сайты, а не для того, чтобы делать счастливыми разработчиков браузеров.

Как сторонник минималистичного открытого исходного кода, я склонен думать в несколько ином направлении. Какой набор иконок для сайта наиболее эффективен? Какие форматы устарели? Какие типы иконок можно заменить с небольшими компромиссами?
Таким образом, я задался целью создать минимальный список фавикон, способный работать во всех случаях и во всех браузерах — за исключением некоторых крайних случаев. И даже тогда он все равно будет работать, просто не на 100% идеально.
Максимальный набор иконок для сайта
Вместо создания множества изображений разных размеров я решил положиться на SVG и уменьшение размеров в браузере. Если вы беспокоитесь о производительности, я готов рассказать вам все начистоту:
- Браузеры загружают иконки сайта в фоновом режиме, поэтому увеличение размера изображения фавикон не влияет на производительность сайта.
- SVG — это отличный способ уменьшить размер изображений, которые изначально не должны быть растровыми; для многих логотипов итоговый файл будет гораздо меньше, чем PNG.
- В этом минимальном наборе всего три PNG-изображения, и вы можете использовать продвинутые инструменты для оптимизации их размера. Это решает проблему для интернет-пользователей, у которых нет безлимитных тарифных планов.
Теперь я покажу минимальный набор иконок, к которому я пришёл в ходе своих исследований и практики. Этот список должен работать во всех популярных браузерах и устройствах, как старых, так и новых.
I. favicon.ico
для старых браузеров
Файлы ICO имеют структуру каталога и могут содержать файлы с разным разрешением. Рекомендую придерживаться одного изображения 32×32, если только то, которое у вас есть, не будет хорошо масштабироваться до 16×16 (например, оно станет размытым). В таком случае вы можете попросить дизайнера придумать специальную версию логотипа, адаптированную под маленькие пиксельные сетки.
Не мудрите со структурой папок статических ресурсов и кэш-бустеров. Сайт https://example.com
должен содержать фавикон по адресу https://example.com/favicon.ico
. Некоторые инструменты, например, RSS-ридеры, просто запрашивают /favicon.ico
с сервера и не ищут его в других местах.
Нам нужен sizes="32x32"
в <link>
для .ico
файла, чтобы исправить баг Chrome, когда он выбирает ICO файл вместо SVG.
II. Одна SVG-иконка со светлой/тёмной версией для современных браузеров
SVG — это векторный формат, в котором вместо пикселей описываются кривые. При больших размерах он более эффективен, чем растровые изображения. На данный момент 76% браузеров поддерживают SVG-иконки.
Ваша HTML-страница должна содержать тег <link>
в <head>
с rel="icon"
, type="image/svg+xml"
и атрибутами href
, содержащими ссылку на SVG-файл.
SVG - это XML формат, и он может содержать тег <style>
для описания CSS. Как и любой CSS, он может содержать медиа-запросы, например @media (prefers-color-scheme: dark)
. Это позволит вам переключать одну и ту же иконку между светлой и тёмной темами системы.
III. PNG изображение 180x180 для Apple устройств
Apple touch иконка — это изображение, которое будет использоваться устройствами Apple, если вы добавите веб-страницу в качестве ярлыка на домашний экран iPhone или iPad. Ваша HTML-страница должна содержать тег <link rel="apple-touch-icon" href="apple-touch-icon.png">
внутри <head>
.
Начиная с iOS 8+, планшеты iPad требуют изображения с разрешением 180x180. Другие устройства будут уменьшать его, но если мы предоставим источник с достаточно высоким качеством, уменьшение не повредит конечному пользователю (я вернусь к этому позже).
Небольшое примечание: значок Apple touch будет выглядеть лучше, если вы поместите вокруг него отступы в 20px
и добавите немного цвета фона. Для этого можно использовать любой редактор изображений.
IV. Манифест веб-приложения с PNG-иконками 192x192 и 512x512 для Android устройств
- Манифест веб-приложения — это JSON-файл, содержащий все данные, необходимые браузеру для установки вашего сайта в качестве системного приложения. Этот формат появился благодаря инициативе Google по созданию PWA.
- Ваша HTML-страница должна содержать тег
<link rel="manifest" href="path.webmanifest">
со ссылкой на файл манифеста. - В манифесте должно быть поле для иконок, ссылающееся на две иконки: 192x192 для отображения на главном экране и 512x512, которая будет использоваться в качестве заставки во время загрузки PWA.
{
"icons": [
{ "src": "/icon-192.png", "type": "image/png", "sizes": "192x192" },
{ "src": "/icon-512.png", "type": "image/png", "sizes": "512x512" }
]
}
Мы никого не забыли?
Конечно, есть и другие варианты фавикон, некоторые из них малоизвестны, так что давайте посмотрим, как наш набор справится с ними. Возможно, пришло время попрощаться с некоторыми из менее успешных форматов.
Иконка плитки Windows
Раньше Microsoft Edge поддерживал специальный формат иконок для закрепления веб-сайтов в стартовом меню. В последних версиях Windows это больше не требуется.
Закреплённая иконка Safari
Раньше Safari требовал монохромные SVG-значки для закреплённых вкладок. Однако начиная с Safari 12, можно использовать обычный фавикон для закреплённых вкладок. Даже apple.com
больше не использует маск-иконку.
rel="shortcut"
Многие (теперь уже устаревшие) руководства включают favicon.ico
в HTML таким образом:
<link rel="shortcut icon" href="/favicon.ico" sizes="32x32">
Opera Coast
В прошлом Opera Coast, экспериментальный браузер для iOS, требовал специальной иконки размером 228x228. Этот браузер покинул App Store в 2017 году, и я сомневаюсь, что он пережил многочисленные обновления iOS с тех пор.
Теперь, когда мы попрощались с нашими павшими товарищами, давайте посмотрим, как можно создать лучший набор фавиконок для тех, кто ещё стоит на ногах.
Как создать наш максимальный набор favicon
Вот как создать наш идеальный минималистичный набор иконок для сайта за шесть быстрых шагов. Все, что нужно для начала, — это SVG-файл логотипа, который вы хотите использовать.
Шаг 1: Подготовка SVG
Убедитесь, что SVG-изображение квадратное. Откройте исходный файл в системном вьювере и проверьте ширину и высоту изображения. Размер SVG легко изменить с помощью любого SVG-редактора. В Inkscape можно изменить размер документа, выбрав File → Document Properties, а затем отцентрировать логотип с помощью Object → Align and Distribute.
Сохраните файл под именем icon.svg
. Теперь давайте поработаем с нашим SVG и сделаем так, чтобы он хорошо сочетался с современными темами системы. Спросите своего дизайнера, как следует инвертировать цвета для тёмной темы (для черно-белых логотипов вы просто меняете чёрный цвет на белый).
Теперь откройте файл SVG в текстовом редакторе. Найдите <path>
с тёмной или отсутствующей заливкой. Добавьте CSS медиа-запрос, срабатывающий при смене темы и меняющий заливку на нужные вам цвета:
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500">
+ <style>
+ @media (prefers-color-scheme: dark) {
+ .a { fill: #f0f0f0 }
+ }
+ </style>
- <path fill="#0f0f0f" d="…" />
+ <path class="a" fill="#0f0f0f" d="…" />
</svg>
Также можно использовать эту технику медиа-запроса с SVG, чтобы добавить (color-gamut: p3)
к фавикон.
Шаг 2: Создание ICO файла
Откройте файл icon.svg
в редакторе растровой графики. Рекомендую GIMP, он бесплатный и мульти-платформенный.
Выполните преобразование SVG в растр. Установите ширину и высоту равными 32 пикселям. Экспортируйте файл в favicon.ico
, используя 32 bpp, 8-битную альфу, без настроек палитры.
Если у вас нет GIMP, вы можете установить Inkscape и ImageMagick и конвертировать SVG в ICO в терминале:
inkscape ./icon.svg --export-width=32 --export-filename="./tmp.png"
# В линукс/macOs используйте команду
convert ./tmp.png ./favicon.ico
# В Windows используйте команду
magick convert ./tmp.png ./favicon.ico
rm ./tmp.png
Уменьшите размер изображения до 16х16 и проверьте видимость значка. Если он стал слишком размытым, лучше попросить дизайнера сделать отдельную миниатюрную версию логотипа.
Чтобы добавить версию иконки размером 16х16:
- Откройте файл
favicon.ico
с иконкой размером 32x32. - Создайте новый слой размером 16x16.
- Поместите в этот слой версию иконки размером 16x16.
- Экспортируйте файл. GIMP сохранит каждый макет как отдельную версию иконки.
То же самое можно сделать и с помощью ImageMagick:
#В линукс/macOs выполните команду:
convert ./icon-32.png ./icon-16.png ./favicon.ico
#В Windows выполните команду:
magick convert ./icon-32.png ./icon-16.png ./favicon.ico
Шаг 3: Создание PNG-изображений
Снова откройте исходный SVG-файл в редакторе растровой графики и создайте изображение размером 512x512. Экспортируйте его под именем icon-512.png
.
Уменьшите изображение до 192x192 и экспортируйте его в файл icon-192.png
. Теперь уменьшите само изображение до 140x140, а размер холста установите 180x180, а затем экспортируйте его как apple-touch-icon.png
.
Или вы можете сделать то же самое с помощью Inkscape:
inkscape --export-type="png" --export-width=512 --export-filename="./icon-512.png" ./icon.svg
inkscape --export-type="png" --export-width=192 --export-filename="./icon-192.png" ./icon.svg
Шаг 4: Оптимизация PNG и SVG файлов
Лучшим инструментом для оптимизации SVG является SVGO. Чтобы воспользоваться им, выполните команду:
npx svgo --multipass icon.svg
Squoosh — это отличное веб-приложение для оптимизации растровых изображений:
- Откройте файл
icon-512.png
в Squoosh. - Измените настройку "Compress" на "OxiPNG".
- Включите "Reduce palette".
- Установите 64 цвета (Color: 64).
- Сравните "до" и "после", перемещая ползунок. Если вы видите разницу, увеличьте количество цветов.
- Сохраните файл.
Повторите эти действия для icon-192.png
и apple-touch-icon.png
.
Шаг 5: Добавление иконок в HTML
Вам нужно добавить ссылки на favicon.ico
и apple-touch-icon.png
в свой HTML.
Для статического HTML:
<title>My website</title>
+<link rel="icon" href="/favicon.ico" sizes="32x32">
+<link rel="icon" href="/icon.svg" type="image/svg+xml">
+<link rel="apple-touch-icon" href="/apple-touch-icon.png">
Однако мы рекомендуем использовать бандлер для генерации кэш-бустеров (включите хэш файла в имя в качестве метки). Если вы используете Webpack с HtmlWebpackPlugin:
Создайте шаблон
index.html
.Добавьте шаблон в параметры плагина:
new HtmlWebpackPlugin({ template: "./view/index.html" });
Определите HTML-шаблон со ссылками (в примерах используется
HtmlWebpackPlugin
для включения файлов, но это может быть ваш язык шаблонов по желанию):<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>My website</title>
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="icon" href="/favicon.ico" sizes="32x32">
<link rel="icon" type="image/svg+xml" href="<%=
require('./icon.svg').default
%>">
<link rel="apple-touch-icon" href="<%=
require('./apple-touch-icon.png').default
%>"
>
</head>
<body></body>
</html>Используйте
copy-webpack-plugin
для копированияfavicon.ico
без добавления хэша к имени файла.
Бонусный совет: Создайте отдельную иконку для staging
Фавикон — это хороший способ отличить production
окружение от staging
. Я считаю, что использование альтернативной иконки для staging
очень эффективно для предотвращения дорогостоящих случаев путаницы.
Создайте favicon-dev.ico
с тем же логотипом, но инвертируйте цвета (или сделайте что-то, что имеет смысл для вас). Сделайте то же самое для SVG и создайте icon-dev.svg
.
Теперь замените иконки в вашем HTML-шаблоне в зависимости от условия process.env.NODE_ENV === 'production'
:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>My website</title>
<meta name="viewport" content="width=device-width,initial-scale=1">
- <link rel="icon" href="/favicon.ico" sizes="32x32">
+ <link rel="icon" sizes="32x32" href="<%=
+ process.env.NODE_ENV === 'production'
+ ? '/favicon.ico'
+ : require('./favicon-dev.ico').default
+ %>">
<link rel="icon" type="image/svg+xml" href="<%=
- require('./icon.svg').default
+ process.env.NODE_ENV === 'production'
+ ? require('./icon.svg').default
+ : require('./icon-dev.svg').default
%>">
<link rel="apple-touch-icon" href="<%=
require('./apple-touch-icon.png').default
%>">
</head>
<body></body>
</html>
Шаг 6: Создание манифеста веб-приложения
Для статического HTML создайте JSON-файл с именем manifest.webmanifest
:
{
"name": "My website",
"icons": [
{ "src": "/icon-192.png", "type": "image/png", "sizes": "192x192" },
{ "src": "/icon-512.png", "type": "image/png", "sizes": "512x512" }
]
}
Добавьте на него ссылку в HTML:
<title>My website</title>
+<link rel="manifest" href="/manifest.webmanifest">
<link rel="icon" href="/favicon.ico" sizes="32x32">
<link rel="icon" href="/icon.svg" type="image/svg+xml">
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
С Webpack вы можете использовать плагин webpack-pwa-manifest
:
plugins: [
…,
new WebpackPwaManifest({
name: 'My website',
icons: [
{ src: resolve('./icon-192.png'), sizes: '192x192' },
{ src: resolve('./icon-512.png'), sizes: '512x512' }
]
})
]
Спасибо, что дочитали! Как видите, благодаря современным веб-стандартам, задача создания современного набора фавикон становится простой. И хотя выполнение всех шагов вручную не занимает много времени, наличие автоматизированного инструмента для этого сделает всё ещё более удивительным!
Журнал изменений
2023-11-19
- Исправлены команды CLI для генерации ICO и PNG.
2023-07-11
size="any"
для файла ICO был заменён наsizes="32x32"
, чтобы исправить баг, когда Chrome загружал файлы ICO и SVG.
2021-07-19
sizes="any"
было добавлено в файл ICO, чтобы исправить баг, когда Chrome использовал файл ICO вместо SVG.
2021-01-19
- Добавлены команды Inkscape для преобразования SVG в PNG.
2021-01-15
- Добавлены команды ImageMagick для пользователей, у которых нет GIMP.