Favicons — это маленькие иконки, которые отображаются в заголовке вкладки браузера, в закладках и списках истории посещений. Несмотря на кажущуюся простоту, работа с фавиконами в веб-разработке имеет множество нюансов, особенно при динамическом управлении с помощью JavaScript.
Наиболее распространённый способ подключения фавикона к странице —
использование тега <link> в
<head>:
<link rel="icon" type="image/png" href="/favicon.png">
Ключевые атрибуты:
rel="icon" — указывает браузеру, что ресурс является
фавиконом.type="image/png" — MIME-тип изображения.href — путь к файлу иконки.Можно использовать и другие форматы: .ico,
.svg, .gif. Формат .ico
поддерживается всеми браузерами, а .png и .svg
обеспечивают более качественное отображение на дисплеях с высоким
разрешением.
JavaScript позволяет менять фавикон на лету, что используется,
например, для уведомлений или визуальных индикаторов состояния страницы.
Основная техника заключается в изменении атрибута href
элемента <link>.
function changeFavicon(src) {
let link = document.querySelector("link[rel~='icon']");
if (!link) {
link = document.createElement('link');
link.rel = 'icon';
document.head.appendChild(link);
}
link.href = src;
}
// Пример использования
changeFavicon('/new-favicon.png');
Особенности:
<link rel="icon"> отсутствует, необходимо
его создать.link.href = `/favicon.png?v=${Date.now()}`;
Фавиконы могут быть индикатором событий. Например, на почтовых клиентах или мессенджерах иконка может показывать количество новых сообщений.
function notifyFavicon(count) {
const canvas = document.createElement('canvas');
canvas.width = canvas.height = 32;
const ctx = canvas.getContext('2d');
const img = new Image();
img.src = '/favicon.png';
img.onl oad = () => {
ctx.drawImage(img, 0, 0, 32, 32);
ctx.fillStyle = 'red';
ctx.beginPath();
ctx.arc(24, 8, 8, 0, 2 * Math.PI);
ctx.fill();
ctx.fillStyle = 'white';
ctx.font = 'bold 10px sans-serif';
ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
ctx.fillText(count, 24, 8);
changeFavicon(canvas.toDataURL('image/png'));
};
}
Принципы работы:
<canvas> для динамического
формирования иконки.data URL и
присваивается атрибуту href.Мобильные устройства и дисплеи с высокой плотностью пикселей требуют фавиконы разных размеров:
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="48x48" href="/favicon-48x48.png">
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
Особенности:
sizes позволяет браузеру выбрать оптимальный
размер.rel="apple-touch-icon".Фавиконы активно кэшируются браузером. Без специальных мер новые версии иконок могут не отображаться. Практики:
favicon.png?v=2) для
принудительного обновления.Cache-Control и
ETag.<link> вместо изменения существующего помогает обойти
кэш.Иногда требуется создать анимацию на фавиконе, например, индикатор прогресса:
let frame = 0;
const frames = ['/frame1.png', '/frame2.png', '/frame3.png'];
setInterval(() => {
changeFavicon(frames[frame]);
frame = (frame + 1) % frames.length;
}, 500);
Характеристики:
.png для прозрачности, .ico для
старых браузеров.Favicons в JavaScript — это не просто декоративный элемент. Они становятся инструментом визуальной коммуникации с пользователем, позволяя динамически отображать уведомления, состояние приложения или анимированные индикаторы. Корректная работа с кэшированием и использование разных форматов и размеров обеспечивает совместимость и качественное отображение на всех устройствах.