Menu

Link w nowej karcie w HTML (target _blank)

Dodaj target="_blank" do linku, żeby otwierał się w nowej karcie. Ta strona omawia rel="noopener" i noreferrer, informowanie użytkowników, że link otwiera nową kartę, inne wartości target oraz robienie tego w JavaScript.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

Otwieranie linku w nowej karcie przez target="_blank"

Dodaj target="_blank" do linku. Przeglądarka otworzy cel w nowej karcie i zostawi twoją stronę tam, gdzie była.

To cała technika: target="_blank" na <a> plus rel="noopener", omówiony dalej. Czytelnicy mogą też sami otworzyć dowolny link w nowej karcie przez Ctrl+kliknięcie (Cmd+kliknięcie na Macu) albo kliknięcie środkowym przyciskiem, więc używaj target="_blank" tylko wtedy, gdy opuszczenie strony coś by ich kosztowało, na przykład w połowie wypełniony formularz albo odtwarzany film.

Podglądy na tej stronie otwierają każdy link zewnętrzny w nowej karcie, z target czy bez, bo ramka z przykładem nigdy nie może przejść na inną stronę. Żeby zobaczyć, co zmienia target, zapisz przykład jako plik i otwórz go w przeglądarce.

rel="noopener" i rel="noreferrer"

Strona otwarta przez target="_blank" dostawała kiedyś odwołanie do twojej strony w window.opener i mogła go użyć, żeby przekierować twoją kartę pod inny URL (na przykład na fałszywą stronę logowania). rel="noopener" usuwa to odwołanie.

Wartość relwindow.opener w nowej karcieReferrer wysyłany do nowej strony
brak (stare przeglądarki)Twoja stronaTak
brak (obecne przeglądarki)nullTak
noopenernullTak
noreferrernullNie
openerTwoja stronaTak

Obecne wersje Chrome, Firefoksa i Safari traktują każdy link z target="_blank" jak noopener, chyba że napiszesz rel="opener". Dopisanie rel="noopener" i tak chroni odwiedzających w starszych przeglądarkach i pokazuje intencję w kodzie.

noreferrer dodatkowo blokuje wysyłanie referrera, więc strona, do której linkujesz, nie widzi, skąd przyszedł odwiedzający. To wybór związany z prywatnością, a nie z bezpieczeństwem: używaj go, gdy twój URL ma pozostać prywatny, i pomijaj przy partnerach, którzy muszą widzieć twój ruch.

<!-- Safe, the other site still sees the referral -->
<a href="https://example.com" target="_blank" rel="noopener">Example</a>

<!-- Safe, and the other site does not see where the visit came from -->
<a href="https://example.com" target="_blank" rel="noopener noreferrer">Example</a>

rel przyjmuje kilka wartości oddzielonych spacjami, więc noopener łączy się z wartościami SEO: rel="noopener sponsored" dla płatnego linku, rel="noopener nofollow" dla linku, za który nie ręczysz.

Nowa karta otwierająca się bez ostrzeżenia dezorientuje, zwłaszcza użytkowników czytników ekranu, którzy mogą nie zauważyć zmiany strony. Napisz o tym w linku. Mała ikona pokazuje to widzącym użytkownikom; ukryty tekst mówi to użytkownikom czytników ekranu:

Selektor a[target="_blank"] automatycznie dodaje strzałkę do każdego linku otwierającego nową kartę, więc żadnego nie pominiesz. Ukryty span jest czytany jako część nazwy linku, "accessibility guidelines (opens in a new tab)", ale nie zajmuje miejsca na ekranie.

Automatyczne oznaczanie wszystkich linków zewnętrznych

Selektory atrybutów mogą stylizować linki według ich href. Tutaj każdy link zaczynający się od http dostaje strzałkę, a linki wewnątrz witryny nie:

^= oznacza "zaczyna się od". Selektor tylko stylizuje linki: atrybuty target i rel nadal muszą być w HTML.

Wartości target

target określa, gdzie otwiera się link. Są cztery słowa kluczowe, a każda inna wartość to nazwa:

targetOtwiera link w
_selfTej samej karcie lub ramce. To wartość domyślna.
_blankNowej, nienazwanej karcie
_parentRamce nadrzędnej bieżącej ramki (poza ramkami działa jak _self)
_topCałej karcie, wychodząc ze wszystkich ramek
dowolna nazwa, np. helpKarcie lub ramce o tej nazwie, tworzonej, jeśli nie istnieje

Nazwany cel jest używany ponownie. Każdy link z target="help" otwiera się w tej samej karcie, więc czytelnik, który kliknie pięć linków pomocy, dostaje jedną kartę, a nie pięć. _top przydaje się wewnątrz <iframe>, gdy link ma zastąpić całą stronę, a nie tylko ramkę.

Wszystkie linki w nowej karcie przez element base

<base target="_blank"> w <head> ustawia domyślny cel dla każdego linku i formularza na stronie:

<head>
  <base target="_blank">
</head>
<body>
  <a href="https://example.com">Opens in a new tab</a>
  <a href="/about" target="_self">Opens in this tab</a>
</body>

Własny target linku ma pierwszeństwo przed <base>. Używaj tego rzadko: strona, na której każdy link otwiera nową kartę, jest irytująca w użyciu.

Nowa karta z JavaScript

window.open(url, '_blank') otwiera kartę ze skryptu. Przekaż 'noopener' jako trzeci argument, żeby uzyskać tę samą ochronę co z atrybutem rel. Wtedy window.open zwraca null zamiast odwołania do nowej karty:

Przeglądarki blokują window.open, chyba że jest wywołane w odpowiedzi na kliknięcie lub naciśnięcie klawisza, więc wywołuj je w obsłudze zdarzenia, a nie przy wczytaniu strony czy po timerze. Jeśli cel to URL, który czytelnik mógłby zobaczyć wcześniej, link z target="_blank" jest prostszy i działa bez JavaScript. Sam link omawia strona znacznik a w HTML.

Częste błędy

  • target="blank" bez podkreślnika. To nazwa, a nie słowo kluczowe. Za pierwszym razem nadal otwiera nową kartę, ale potem używa tej samej karty dla każdego innego linku o tej nazwie.
  • target="_new". To również tylko nazwa, z tym samym efektem: jedna, ponownie używana karta.
  • target na każdym linku. Linki wewnętrzne powinny otwierać się w tej samej karcie. Czytelnicy, którzy chcą nowej karty, wiedzą, jak ją otworzyć.
  • Brak informacji, że link otwiera nową kartę. Dodaj ikonę i ukryty tekst.
  • Dodawanie noreferrer do linków partnerskich lub afiliacyjnych, a potem zdziwienie, że partner nie widzi żadnych poleceń.

Najczęściej zadawane pytania

Jak sprawić, żeby link otwierał się w nowej karcie w HTML?

Dodaj target="_blank" do znacznika <a>: <a href="https://example.com" target="_blank" rel="noopener">Example</a>. Przeglądarka otwiera stronę w nowej karcie i zostawia bieżącą stronę otwartą.

Czy przy target="_blank" nadal potrzebuję rel="noopener"?

Obecne wersje Chrome, Firefoksa i Safari automatycznie stosują noopener do linków z target="_blank", więc nowa strona nie może sięgnąć do twojej przez window.opener. Dopisanie rel="noopener" nic nie kosztuje i chroni odwiedzających w starszych przeglądarkach, dlatego większość przewodników stylu nadal tego wymaga.

Czym różni się noopener od noreferrer?

noopener zrywa połączenie między dwiema kartami (window.opener w nowej ma wartość null). noreferrer robi to samo i dodatkowo blokuje wysyłanie adresu twojej strony jako referrera, więc analityka drugiej strony widzi wizytę jako bezpośrednią.

Czy HTML może wymusić otwarcie linku w nowym oknie zamiast karty?

Nie. target="_blank" prosi o nowy kontekst przeglądania, a o tym, czy będzie to karta, czy okno, decydują przeglądarka i ustawienia użytkownika. Obecne przeglądarki otwierają kartę.

Jak otworzyć wszystkie linki na stronie w nowej karcie?

Umieść <base target="_blank"> w <head>. Każdy link bez własnego target otworzy się wtedy w nowej karcie. Dotyczy to też formularzy, więc używaj tego tylko na stronach, na których naprawdę tego chcesz.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ