Бейджи используются для передачи пользователю несрочной информации. Например, они используются для обозначения статуса приложения или количества непрочитанных элементов. Классический способ создания значка приложения — добавить номер к значку. В современных браузерах после установки приложения существует встроенный способ добавить значок к значку приложения на панели задач операционной системы.
Современный способ
Использование метода navigator.setAppBadge()
Метод navigator.setAppBadge()
устанавливает значок на значке, связанном с установленным приложением. Метод принимает необязательный единственный аргумент, который представляет собой целое число, которое будет использоваться в качестве значения значка. Установка числа на 0 удаляет значок приложения. Отсутствие аргумента приводит к появлению общего значка, обычно отображаемого в виде цветной точки.
Классический способ
Добавление номера на фавиконку
Если приложение еще не установлено, вы можете добавить номер на значок. Существует много способов сделать это, например, динамически отрисовав значок значка на холсте с добавленной информацией о значке и отобразив его в виде URL-адреса Blob, или создать изображение SVG с информацией о значке в качестве URL-адреса данных.
Прогрессивное улучшение
В приведенном ниже фрагменте используется пользовательский элемент <favicon-badge></favicon-badge>
, который позволяет разработчику декларативно устанавливать значок на значке, указанном через атрибут src
, передавая целое число в атрибут badge
. Когда пользователь устанавливает приложение, значок «обновляется» до собственного значка операционной системы.
import 'https://unpkg.com/favicon-badge@2.0.0/dist/FavIconBadge.js';
// DOM references.
const favicon = document.querySelector('favicon-badge');
const installButton = document.querySelector('button');
// Feature detection.
const supportsAppBadge = 'setAppBadge' in navigator;
let setAppBadge;
// For the demo simply set the badge between [0, 9].
let i = 0;
const getAppBadgeValue = () => {
if (i > 9) {
i = 0;
}
return i++;
};
// Set the badge on the favicon.
const setAppBadgeFavicon = (value) => {
favicon.badge = value;
};
// Set the native operating system badge.
const setAppBadgeNative = (value) => {
navigator.setAppBadge(value);
}
// If the app is installed and the Badging API is supported,
// set the badge on the native operating system. Else, fall
// back to the favicon.
if (
matchMedia('(display-mode: standalone)').matches &&
supportsAppBadge
) {
setAppBadge = setAppBadgeNative;
} else {
setAppBadge = setAppBadgeFavicon;
}
// Set a new badge every second.
setInterval(() => {
setAppBadge(getAppBadgeValue());
}, 1000);
// If installation is supported…
if ('BeforeInstallPromptEvent' in window) {
let installEvent = null;
const onInstall = () => {
// After installation, "upgrade" to the native operating system badge.
installButton.disabled = true;
installEvent = null;
if (supportsAppBadge) {
favicon.badge = false;
setAppBadge = setAppBadgeNative;
}
};
// …listen for the `beforeinstallprompt` event.
window.addEventListener('beforeinstallprompt', (event) => {
event.preventDefault();
installEvent = event;
installButton.disabled = false;
});
// Deal with installation.
installButton.addEventListener('click', async () => {
if (!installEvent) {
return;
}
installEvent.prompt();
const result = await installEvent.userChoice;
if (result.outcome === 'accepted') {
onInstall();
}
});
// Listen for the `appinstalled` in case the user installs the app manually.
window.addEventListener('appinstalled', (event) => {
onInstall();
});
}
дальнейшее чтение
Демо
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="manifest" href="manifest.json" />
<title>How to create an app badge</title>
<link rel="stylesheet" href="style.css" />
<!-- TODO: Devsite - Removed inline handlers -->
<!-- <script>
if ('serviceWorker' in navigator) {
window.addEventListener('load', async () => {
const registration = await navigator.serviceWorker.register(
'sw.js',
);
console.log(
'Service worker registered for scope',
registration.scope,
);
});
}
</script>
<script src="script.js" type="module"></script> -->
</head>
<body>
<h1>How to create an app badge</h1>
<ol>
<li>
Watch the favicon. You should see a counter that updates each second
integrated into the favicon.
<img
src="../favicon.png"
style="width: 250px; height: auto"
width="528"
height="74"
alt="Favicon with counter."
/>
</li>
<li>
Install the app by clicking the button below. After the installation,
the button is disabled.
<p>
<button disabled type="button">Install</button>
</p>
</li>
<li>
Watch the app icon in your operating system's task bar. You should see a
counter that updates each second as an app badge.
<img
src="../app-badge.png"
style="width: 80px; height: auto"
width="282"
height="388"
alt="App badge with counter."
/>
</li>
</ol>
<favicon-badge src="../favicon.svg" textColor="#fff" badge="" />
</body>
</html>
html {
box-sizing: border-box;
font-family: system-ui, sans-serif;
color-scheme: dark light;
}
*, *:before, *:after {
box-sizing: inherit;
}
body {
margin: 1rem;
}
img {
height: auto;
max-width: 100%;
display: block;
}
import 'https://unpkg.com/favicon-badge@2.0.0/dist/FavIconBadge.js';
// The `