Как добавить favicon
Как подключить favicon в проекте: HTML, Next.js, Nuxt.js, React, Vue.js и SvelteKit. Пошаговая установка с примерами кода.
Перед началом
Сначала соберите favicon на главной странице и скачайте полный ZIP. В архиве все нужные размеры.
После скачивания распакуйте ZIP: внутри файлы значка. Положите их в public проекта (для SvelteKit — static, для чистого HTML — корень сайта).
Когда файлы на месте, добавьте HTML-ссылки по инструкции для вашего фреймворка.
Установка во фреймворках
Чистый HTML
Положите все файлы favicon в корень сайта (или в public, если это генератор статики), затем добавьте ссылки в секцию head HTML-файла:
<link rel="icon" type="image/x-icon" sizes="16x16 32x32 48x48" href="/favicon.ico">
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<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="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png">
<link rel="icon" type="image/png" sizes="180x180" href="/favicon-180x180.png">
<link rel="icon" type="image/png" sizes="192x192" href="/favicon-192x192.png">
<link rel="icon" type="image/png" sizes="512x512" href="/favicon-512x512.png">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">Next.js
Положите файлы в public, затем добавьте метаданные в app/layout.tsx или pages/_document.tsx:
// app/layout.tsx (App Router)
import type { Metadata } from 'next'
export const metadata: Metadata = {
icons: {
icon: [
{ url: '/favicon.ico', sizes: '16x16 32x32 48x48' },
{ url: '/favicon-16x16.png', sizes: '16x16', type: 'image/png' },
{ url: '/favicon-32x32.png', sizes: '32x32', type: 'image/png' },
{ url: '/favicon-48x48.png', sizes: '48x48', type: 'image/png' },
{ url: '/favicon-96x96.png', sizes: '96x96', type: 'image/png' },
{ url: '/favicon-180x180.png', sizes: '180x180', type: 'image/png' },
{ url: '/favicon-192x192.png', sizes: '192x192', type: 'image/png' },
{ url: '/favicon-512x512.png', sizes: '512x512', type: 'image/png' },
{ url: '/favicon.svg', type: 'image/svg+xml' },
],
apple: [
{ url: '/apple-touch-icon.png', sizes: '180x180', type: 'image/png' },
],
},
}Или используйте компонент next/head в Pages Router:
// pages/_document.tsx (Pages Router)
import Head from 'next/head'
export default function Document() {
return (
<Head>
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
<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="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png" />
<link rel="icon" type="image/png" sizes="180x180" href="/favicon-180x180.png" />
<link rel="icon" type="image/png" sizes="192x192" href="/favicon-192x192.png" />
<link rel="icon" type="image/png" sizes="512x512" href="/favicon-512x512.png" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
</Head>
)
}Nuxt.js
Положите файлы в public, затем настройте nuxt.config.ts или app.vue:
// nuxt.config.ts
export default defineNuxtConfig({
app: {
head: {
link: [
{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' },
{ rel: 'apple-touch-icon', sizes: '180x180', href: '/apple-touch-icon.png' },
{ rel: 'icon', type: 'image/png', sizes: '16x16', href: '/favicon-16x16.png' },
{ rel: 'icon', type: 'image/png', sizes: '32x32', href: '/favicon-32x32.png' },
{ rel: 'icon', type: 'image/png', sizes: '48x48', href: '/favicon-48x48.png' },
{ rel: 'icon', type: 'image/png', sizes: '96x96', href: '/favicon-96x96.png' },
{ rel: 'icon', type: 'image/png', sizes: '180x180', href: '/favicon-180x180.png' },
{ rel: 'icon', type: 'image/png', sizes: '192x192', href: '/favicon-192x192.png' },
{ rel: 'icon', type: 'image/png', sizes: '512x512', href: '/favicon-512x512.png' },
{ rel: 'icon', type: 'image/svg+xml', href: '/favicon.svg' },
],
},
},
})Или используйте useHead в app.vue:
// app.vue
<script setup>
useHead({
link: [
{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' },
{ rel: 'apple-touch-icon', sizes: '180x180', href: '/apple-touch-icon.png' },
{ rel: 'icon', type: 'image/png', sizes: '16x16', href: '/favicon-16x16.png' },
{ rel: 'icon', type: 'image/png', sizes: '32x32', href: '/favicon-32x32.png' },
{ rel: 'icon', type: 'image/png', sizes: '48x48', href: '/favicon-48x48.png' },
{ rel: 'icon', type: 'image/png', sizes: '96x96', href: '/favicon-96x96.png' },
{ rel: 'icon', type: 'image/png', sizes: '180x180', href: '/favicon-180x180.png' },
{ rel: 'icon', type: 'image/png', sizes: '192x192', href: '/favicon-192x192.png' },
{ rel: 'icon', type: 'image/png', sizes: '512x512', href: '/favicon-512x512.png' },
{ rel: 'icon', type: 'image/svg+xml', href: '/favicon.svg' },
],
})
</script>React (Create React App / Vite)
Положите файлы в public, затем обновите public/index.html:
<!-- public/index.html -->
<head>
<link rel="icon" type="image/x-icon" href="%PUBLIC_URL%/favicon.ico" />
<link rel="apple-touch-icon" sizes="180x180" href="%PUBLIC_URL%/apple-touch-icon.png" />
<link rel="icon" type="image/png" sizes="16x16" href="%PUBLIC_URL%/favicon-16x16.png" />
<link rel="icon" type="image/png" sizes="32x32" href="%PUBLIC_URL%/favicon-32x32.png" />
<link rel="icon" type="image/png" sizes="48x48" href="%PUBLIC_URL%/favicon-48x48.png" />
<link rel="icon" type="image/png" sizes="96x96" href="%PUBLIC_URL%/favicon-96x96.png" />
<link rel="icon" type="image/png" sizes="180x180" href="%PUBLIC_URL%/favicon-180x180.png" />
<link rel="icon" type="image/png" sizes="192x192" href="%PUBLIC_URL%/favicon-192x192.png" />
<link rel="icon" type="image/png" sizes="512x512" href="%PUBLIC_URL%/favicon-512x512.png" />
<link rel="icon" type="image/svg+xml" href="%PUBLIC_URL%/favicon.svg" />
</head>Vue.js (Vite)
Положите файлы в public, затем обновите index.html:
<!-- index.html -->
<head>
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
<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="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png" />
<link rel="icon" type="image/png" sizes="180x180" href="/favicon-180x180.png" />
<link rel="icon" type="image/png" sizes="192x192" href="/favicon-192x192.png" />
<link rel="icon" type="image/png" sizes="512x512" href="/favicon-512x512.png" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
</head>SvelteKit
Положите файлы в static, затем обновите src/app.html:
<!-- src/app.html -->
<head>
<link rel="icon" type="image/x-icon" href="%sveltekit.assets%/favicon.ico" />
<link rel="apple-touch-icon" sizes="180x180" href="%sveltekit.assets%/apple-touch-icon.png" />
<link rel="icon" type="image/png" sizes="16x16" href="%sveltekit.assets%/favicon-16x16.png" />
<link rel="icon" type="image/png" sizes="32x32" href="%sveltekit.assets%/favicon-32x32.png" />
<link rel="icon" type="image/png" sizes="48x48" href="%sveltekit.assets%/favicon-48x48.png" />
<link rel="icon" type="image/png" sizes="96x96" href="%sveltekit.assets%/favicon-96x96.png" />
<link rel="icon" type="image/png" sizes="180x180" href="%sveltekit.assets%/favicon-180x180.png" />
<link rel="icon" type="image/png" sizes="192x192" href="%sveltekit.assets%/favicon-192x192.png" />
<link rel="icon" type="image/png" sizes="512x512" href="%sveltekit.assets%/favicon-512x512.png" />
<link rel="icon" type="image/svg+xml" href="%sveltekit.assets%/favicon.svg" />
</head>