Zmienić tytuł strony w JavaScript jest bardzo prosto – wystarczy przypisać nowy tekst do właściwości document.title albo zaktualizować zawartość znacznika <title> w DOM.
To wystarczy, aby tworzyć zarówno proste, jak i rozbudowane efekty „zmieniającej się zakładki” – od liczników powiadomień po subtelne przypomnienia po przełączeniu karty.
Dlaczego tytuł zakładki jest ważny?
Tytuł strony (tekst w znaczniku <title>) to nie tylko kosmetyczny detal:
- jest wyświetlany jako tekst zakładki w przeglądarce,
- pojawia się w wynikach wyszukiwania jako główny nagłówek linku,
- jest pierwszą informacją, którą odczytuje wiele czytników ekranu,
- trafia do historii przeglądania i listy „Ulubionych”.
Dlatego manipulowanie tytułem z JavaScript nie jest tylko „bajerem”, ale może realnie wpływać na:
- użyteczność – np. pokazanie liczby nieprzeczytanych wiadomości w tytule;
- dostępność – jasne informowanie o aktualnym stanie aplikacji;
- SEO – choć współczesne wyszukiwarki radzą sobie z JS, wciąż warto zachować umiar i logikę.
Jak przeglądarka „zna” tytuł strony?
Podstawowy tytuł ustawiasz w HTML:
<head>
<title>Moja pierwsza strona</title>
</head>
JavaScript ma do niego dostęp przez obiekt document – to reprezentacja bieżącej strony w modelu DOM.
Najważniejsza właściwość w tym kontekście to document.title — zawiera aktualny tytuł dokumentu i pozwala go zmieniać.
Aby odczytać bieżący tytuł, użyj:
console.log(document.title); // np. "Moja pierwsza strona"
Aby zmienić tytuł, przypisz do właściwości nową wartość:
document.title = 'Nowy tytuł strony';
Takie przypisanie aktualizuje zarówno document.title, jak i zawartość znacznika <title> w DOM.
Podstawy – zmiana tytułu strony w czystym JavaScript
Najprostszy przykład
Jedna linia wystarczy:
document.title = 'Witamy na naszej stronie!';
To wszystko – po wykonaniu tego kodu tekst zakładki w przeglądarce zostanie zaktualizowany.
Możesz też użyć zmiennej:
const newTitle = 'Panel administracyjny';
document.title = newTitle;
Ten sposób jest zalecany, gdy tytuł zależy od danych z serwera lub od języka interfejsu.
Zmiana tytułu po załadowaniu strony
Aby mieć pewność, że DOM jest gotowy, poczekaj na załadowanie strony:
window.addEventListener('load', () => {
document.title = 'Strona gotowa do użycia';
});
Alternatywa: manipulacja znacznikiem <title>
Zamiast document.title możesz bezpośrednio sięgnąć do elementu <title> i zmienić jego zawartość:
const newPageTitle = 'Tytuł ustawiony przez DOM';
document.querySelector('title').textContent = newPageTitle;
Różnice pomiędzy podejściami przedstawia tabela:
| Sposób | Zalety | Kiedy używać |
|---|---|---|
document.title = '...' |
krótki, prosty, wspierany w każdym normalnym środowisku JS | 99% przypadków, kod produkcyjny |
document.querySelector('title')… |
spójny z inną manipulacją DOM | gdy i tak pracujesz bezpośrednio na DOM |
W praktyce do zmiany tytułu po prostu używaj document.title – jest bardziej czytelne i idiomatyczne.
Zmiana tytułu w reakcji na zdarzenia użytkownika
Dynamiczny tytuł ma sens głównie wtedy, gdy reaguje na konkretne zdarzenia – kliknięcia, wysłanie formularza, zmianę zakładki itd.
Przykład – przycisk zmieniający tytuł
Poniżej prosty przykład bez alert, bardziej przyjazny dla UX:
<button id="btn-hello">Ustaw tytuł: Hello World!</button>
<button id="btn-test">Ustaw tytuł: Test</button>
<script>
function changeTitle(newTitle) {
document.title = newTitle; // zmieniamy tytuł zakładki
}
document.getElementById('btn-hello')
.addEventListener('click', () => changeTitle('Hello World!'));
document.getElementById('btn-test')
.addEventListener('click', () => changeTitle('Test'));
</script>
Powiązanie tytułu z danymi (np. liczba powiadomień)
Przykład (bez backendu) symulujący liczbę nowych wiadomości:
let unreadCount = 0;
const baseTitle = 'Skrzynka odbiorcza';
function updateTitle() {
if (unreadCount > 0) {
document.title = `(${unreadCount}) ${baseTitle}`;
} else {
document.title = baseTitle;
}
}
// Symulacja nadejścia nowych wiadomości
setInterval(() => {
unreadCount++;
updateTitle();
}, 5000);
Taki schemat – liczba w nawiasie na początku tytułu – stosuje wiele serwisów pocztowych i komunikatorów.
Zmiana tytułu, gdy użytkownik przełącza zakładki
Częsty „bajer” (ale też praktyczne rozwiązanie) to zmiana tytułu, gdy użytkownik opuści naszą kartę. Można go zrealizować dzięki Page Visibility API, które udostępnia zdarzenie visibilitychange i właściwość document.hidden.
Wykrywanie aktywności zakładki
Najprostszy sposób wykrycia, czy karta jest aktywna, wygląda tak:
document.addEventListener('visibilitychange', function () {
console.log(document.hidden); // true/false
});
Drugi tytuł, gdy użytkownik jest „poza kartą”
Na bazie tego zdarzenia możesz zmieniać tytuł oraz – jeśli chcesz – faviconę. Prosty przykład bez jQuery:
const originalTitle = document.title;
const awayTitle = 'Hej, wróć do nas!';
document.addEventListener('visibilitychange', () => {
const isPageHidden = document.hidden;
if (isPageHidden) {
document.title = awayTitle;
} else {
document.title = originalTitle;
}
});
Opcjonalnie – „tytuł powitalny” tylko na chwilę
Możesz dodać powitalny komunikat tylko na kilka sekund po powrocie użytkownika:
const originalTitle = document.title;
const awayTitle = 'Wciąż tu jesteśmy 🙂';
const welcomeBackTitle = 'Miło, że wróciłeś!';
document.addEventListener('visibilitychange', () => {
if (document.hidden) {
document.title = awayTitle;
} else {
document.title = welcomeBackTitle;
setTimeout(() => {
document.title = originalTitle;
}, 2000); // po 2 sekundach wróć do normalnego tytułu
}
});
„Zmieniający się tytuł zakładki” – animacje i efekty
Starsze przykłady w sieci pokazują tzw. „biegający” tytuł, w którym tekst przesuwa się jak na pasku informacyjnym. Technicznie to tylko pętla setTimeout zmieniająca fragment tekstu w document.title.
Przykład inspirowany takim podejściem:
const fullTitle = 'Witamy na naszym portalu! ';
let position = 0;
function scrollTitle() {
document.title = fullTitle.substring(position) + fullTitle.substring(0, position);
position = (position + 1) % fullTitle.length;
setTimeout(scrollTitle, 200); // zmiana co 200 ms
}
scrollTitle();
Uwaga – ryzyko dla dostępności i UX
Choć efekt może wyglądać efektownie:
- migający / animowany tytuł może drażnić użytkowników,
- częste zmiany tytułu są uciążliwe dla osób korzystających z czytników ekranu,
- zbyt szybkie animacje mogą być problemem dla osób z nadwrażliwością na ruch.
Z perspektywy dostępności (WCAG) wszelkie ruchome elementy powinny mieć możliwość zatrzymania i nie powinny rozpraszać przesadnie uwagi. Tytuł zakładki to element wyjątkowo istotny – nadużywanie animacji jest kiepską praktyką.
Jeśli chcesz użyć takich efektów:
- stosuj je bardzo oszczędnie,
- poważnie rozważ, czy korzyść przewyższa koszt dla użytkownika,
- nie wykorzystuj animacji tytułu do przekazywania kluczowych informacji – te powinny znaleźć się w treści strony (np. w regionie
aria-live).
Zmiana tytułu w aplikacjach SPA i frameworkach
W prostych stronach statycznych wystarczy pojedynczy skrypt. W aplikacjach z routerem (SPA) tytuł powinien zmieniać się przy zmianie widoku / trasy.
React – document.title lub React Helmet
W React możesz ustawić stały tytuł w głównym index.html albo dynamicznie aktualizować document.title w komponentach. W komponentach funkcyjnych najprościej zrobić to w useEffect (aby nie zmieniać tytułu przy każdym renderze):
import { useEffect } from 'react';
function ProfilePage() {
useEffect(() => {
document.title = 'Profil użytkownika';
}, []);
return <h1>Profil</h1>;
}
W większych projektach warto sięgnąć po React Helmet (lub nowsze odpowiedniki), aby deklaratywnie definiować tytuł i metadane w JSX.
Inne SPA (Vue, Angular, własny router)
Typowy schemat jest podobny: nasłuchujesz zmiany trasy w routerze, a następnie – na podstawie konfiguracji – ustawiasz document.title.
Prosty przykład w formie pseudo-kodu:
router.onRouteChange((route) => {
document.title = route.meta.title || 'Aplikacja';
});
W wielu projektach meta-informacje o tytule przypisuje się do definicji trasy (np. meta: { title: 'Koszyk' }).
Dobre praktyki – dostępność i projektowanie tytułów
Tytuł strony jest kluczowy dla orientacji użytkownika – traktuj go jak nawigacyjny drogowskaz.
Tytuł opisuje zawartość
Upewnij się, że tytuł precyzyjnie opisuje aktualną zawartość lub widok.
W aplikacjach z wieloma ekranami stosuj schemat: Nazwa widoku | Nazwa aplikacji (np. Koszyk | Sklep XYZ).
Ogranicz częstotliwość zmian
Zadbaj o rozsądną częstotliwość aktualizacji:
- unikaj zmiany tytułu co kilkaset milisekund (animacje, liczniki „co sekundę”),
- gdy musisz pokazać np. żywy licznik, rozważ przeniesienie go do treści strony, a w tytule aktualizuj go rzadziej lub w ogóle,
- użytkownicy czytników ekranu mogą mieć kłopot z ciągle zmieniającą się informacją na poziomie tytułu.
Nie polegaj wyłącznie na tytule
Jeżeli przekazujesz ważną informację (np. „sesja wygasła”, „masz nowe wiadomości”):
- pokaż ją w głównym obszarze treści (nagłówek, komunikat),
- rozważ użycie
aria-livedla dynamicznych komunikatów, - tytuł potraktuj jako uzupełnienie (np. liczba powiadomień).
Kontrast i długość tytułu
Stawiaj na zwięzłość – zbyt długi tytuł będzie ucięty na zakładce i w wynikach wyszukiwania.
Dbaj o priorytetyzację – najważniejszą informację umieść na początku (np. liczbę powiadomień lub nazwę widoku).
SEO i kwestie techniczne
Współczesne wyszukiwarki potrafią odczytywać tytuły zmienione JavaScriptem, ponieważ renderują stronę podobnie jak przeglądarka.
Mimo to pamiętaj o kilku zasadach:
- domyślny tytuł w HTML – zawsze ustaw sensowny tytuł w znaczniku
<title>w dokumencie bazowym; - JS do uszczegółowienia – używaj dynamicznych zmian raczej do doprecyzowania (np. dodanie liczby powiadomień) niż do całkowitej podmiany znaczenia strony;
- unikaj „spamerskich” praktyk – ciągłe zmiany tytułów z nadmiarem słów kluczowych są złym sygnałem jakości.
Jeśli korzystasz z SSR (Next.js, Nuxt itp.), główny tytuł generuj na serwerze, a JS używaj tylko do delikatnych modyfikacji po stronie klienta.
Gotowe „przepisy” do wklejenia
Ustawienie tytułu po załadowaniu strony
Skorzystaj z nasłuchiwania zdarzenia load:
window.addEventListener('load', () => {
document.title = 'Strona załadowana';
});
Funkcja pomocnicza do zmiany tytułu
Prosta funkcja i przykład użycia:
function setPageTitle(title) {
document.title = title;
}
// użycie
setPageTitle('Panel użytkownika');
Tytuł z liczbą powiadomień
Szablon z licznikiem nieprzeczytanych elementów:
const baseTitle = 'Forum';
let unread = 0;
function updateTitle() {
document.title = unread > 0 ? `(${unread}) ${baseTitle}` : baseTitle;
}
// przykład aktualizacji
function addNotification() {
unread++;
updateTitle();
}
Zmiana tytułu przy przełączaniu zakładek
Wersja minimalna z Page Visibility API:
const originalTitle = document.title;
const awayTitle = 'Wracaj do nas :)';
document.addEventListener('visibilitychange', () => {
if (document.hidden) {
document.title = awayTitle;
} else {
document.title = originalTitle;
}
});
Prosta animacja tytułu (używaj ostrożnie)
Pętla z setTimeout przesuwająca tekst:
const fullTitle = 'Animowany tytuł zakładki ';
let pos = 0;
function animateTitle() {
document.title = fullTitle.substring(pos) + fullTitle.substring(0, pos);
pos = (pos + 1) % fullTitle.length;
setTimeout(animateTitle, 250);
}
animateTitle();
Zmiana tytułu strony w JavaScript jest banalnie prosta technicznie – cała magia sprowadza się do document.title. Prawdziwe wyzwanie polega na tym, aby używać tej możliwości z głową – wspierać nawigację, poprawiać doświadczenie i nie utrudniać życia użytkownikom, w tym osobom korzystającym z technologii asystujących.






