Obsah
HTML tag <a> - Anchor (odkaz)
Základní informace
Tag <a> (anchor) je HTML element používaný k vytváření hypertextových odkazů. Je to jeden z nejzákladnějších a nejdůležitějších prvků HTML, který umožňuje propojení mezi webovými stránkami a vytváření hyperlinků - základního stavebního kamene webu.
Základní syntaxe
Jednoduchý příklad
Hlavní atributy
href (Hypertext Reference)
Nejdůležitější atribut určující cíl odkazu.
Absolutní URL
<a href="https://www.example.com">Absolutní odkaz</a> <a href="http://www.example.com/page.html">Odkaz s protokolem</a>
Relativní URL
<!-- Relativní k aktuální stránce --> <a href="page.html">Stránka ve stejné složce</a> <a href="subfolder/page.html">Stránka v podsložce</a> <a href="../page.html">Stránka o úroveň výš</a> <a href="/page.html">Relativní k root</a>
Speciální hodnoty href
<!-- E-mail odkaz --> <a href="mailto:info@example.com">Pošlete email</a> <a href="mailto:info@example.com?subject=Dotaz&body=Dobrý den">Email s předvyplněním</a> <!-- Telefon --> <a href="tel:+420123456789">Zavolat</a> <!-- SMS --> <a href="sms:+420123456789">Poslat SMS</a> <a href="sms:+420123456789?body=Ahoj">SMS s textem</a> <!-- Prázdný href (JavaScript) --> <a href="#">Odkaz nikam</a> <a href="javascript:void(0)">Prázdný odkaz</a> <!-- Data URI --> <a href="data:text/plain;base64,SGVsbG8gV29ybGQh">Data odkaz</a> <!-- Blob URL --> <a href="blob:https://example.com/uuid">Blob odkaz</a>
target
Určuje, kde se otevře cílová stránka.
<!-- Otevře v nové záložce/okně --> <a href="page.html" target="_blank">Nová záložka</a> <!-- Otevře ve stejném okně (výchozí) --> <a href="page.html" target="_self">Stejné okno</a> <!-- Otevře v rodičovském frame --> <a href="page.html" target="_parent">Rodičovský frame</a> <!-- Otevře v celém okně (zruší všechny frames) --> <a href="page.html" target="_top">Celé okno</a> <!-- Otevře ve specifickém pojmenovaném okně/frame --> <a href="page.html" target="nazevOkna">Pojmenované okno</a>
Bezpečnostní poznámka pro target=„_blank“:
<!-- Doporučeno: přidat rel="noopener noreferrer" --> <a href="https://external-site.com" target="_blank" rel="noopener noreferrer"> Bezpečný odkaz do nové záložky </a>
Důvody:
noopener - zabraňuje přístupu k window.opener (bezpečnost)
noreferrer - neposílá Referer hlavičku (soukromí)
download
Nutí prohlížeč stáhnout soubor místo jeho otevření.
<!-- Stáhne soubor s původním názvem --> <a href="document.pdf" download>Stáhnout PDF</a> <!-- Stáhne soubor s vlastním názvem --> <a href="document.pdf" download="muj-dokument.pdf">Stáhnout s vlastním názvem</a> <!-- Funguje i s obrázky --> <a href="image.jpg" download="fotka.jpg">Stáhnout obrázek</a>
Omezení:
Funguje pouze pro same-origin URL nebo data: URI Cross-origin soubory se stáhnou s původním názvem Některé prohlížeče mohou atribut ignorovat
rel (Relationship)
Definuje vztah mezi aktuálním dokumentem a cílovým zdrojem.
<!-- Bezpečnostní --> <a href="external.com" rel="noopener">Bez přístupu k opener</a> <a href="external.com" rel="noreferrer">Bez referer hlavičky</a> <a href="external.com" rel="nofollow">SEO: nesledovat odkaz</a> <!-- Navigační --> <a href="next.html" rel="next">Další stránka</a> <a href="prev.html" rel="prev">Předchozí stránka</a> <!-- Zdroje --> <a href="author.html" rel="author">Autor</a> <a href="license.html" rel="license">Licence</a> <a href="help.html" rel="help">Nápověda</a> <!-- Vyhledávání --> <a href="search.html" rel="search">Vyhledávání</a> <!-- Alternativy --> <a href="page-de.html" rel="alternate" hreflang="de">Deutsche Version</a> <!-- Externí odkaz --> <a href="external.com" rel="external">Externí odkaz</a> <!-- Sponzorovaný odkaz (SEO) --> <a href="sponsor.com" rel="sponsored">Sponzorovaný odkaz</a> <!-- UGC (User Generated Content) pro SEO --> <a href="user-content.html" rel="ugc">Uživatelský obsah</a> <!-- Kombinace více hodnot --> <a href="external.com" rel="noopener noreferrer nofollow">Bezpečný externí odkaz</a>
type
Určuje MIME typ cílového zdroje (nápověda pro prohlížeč).
<a href="document.pdf" type="application/pdf">PDF dokument</a> <a href="video.mp4" type="video/mp4">Video</a> <a href="image.jpg" type="image/jpeg">Obrázek</a> <a href="data.json" type="application/json">JSON data</a>
hreflang
Specifikuje jazyk cílové stránky.
<a href="page-en.html" hreflang="en">English version</a> <a href="page-de.html" hreflang="de">Deutsche Version</a> <a href="page-cs.html" hreflang="cs">Česká verze</a> <a href="page-en-US.html" hreflang="en-US">American English</a>
title
Poskytuje doplňující informace o odkazu (tooltip).
<a href="page.html" title="Podrobné informace o produktu">Produkt</a> <a href="external.com" title="Otevře se v novém okně">Externí odkaz</a>
Poznámka: Title by neměl duplikovat text odkazu a neměl by být jediným zdrojem důležité informace (není přístupný na touch zařízeních).
ping
URL pro ping notifikace při kliknutí (trackování).
<a href="page.html" ping="https://analytics.example.com/track">Trackovaný odkaz</a> <!-- Více ping URLs --> <a href="page.html" ping="https://track1.com https://track2.com">Multi-track</a>
Bezpečnost: Mnoho uživatelů a prohlížečů blokuje ping tracking.
referrerpolicy
Kontroluje, kolik informací se pošle v Referer hlavičce.
<a href="external.com" referrerpolicy="no-referrer">Bez referer</a> <a href="external.com" referrerpolicy="origin">Pouze origin</a> <a href="external.com" referrerpolicy="strict-origin">Strict origin</a> <a href="external.com" referrerpolicy="no-referrer-when-downgrade">Default</a>
Možné hodnoty:
no-referrer - nepošle referer
origin - pošle pouze origin (doména)
same-origin - referer pouze pro same-origin
strict-origin - origin pouze přes HTTPS
unsafe-url - celou URL (nebezpečné)
Kotvení (Anchory na stránce)
Tag <a> se původně jmenoval „anchor“ (kotva) právě kvůli možnosti vytvářet kotvy na stránce.
Moderní způsob - pomocí id
<!-- Vytvoření kotvy --> <h2 id="sekce1">Sekce 1</h2> <p>Obsah sekce...</p> <!-- Odkaz na kotvu --> <a href="#sekce1">Přejít na Sekci 1</a> <!-- Odkaz na kotvu na jiné stránce --> <a href="page.html#sekce1">Sekce 1 na jiné stránce</a> <!-- Plná URL s kotvou --> <a href="https://example.com/page.html#sekce1">Absolutní odkaz s kotvou</a>
Starý způsob - pomocí name (deprecated)
<!-- NE - zastaralé, nepoužívat! --> <a name="sekce1"></a> <!-- ANO - moderní způsob --> <div id="sekce1"></div>
Plynulé scrollování
<!-- CSS pro plynulé scrollování --> <style> html { scroll-behavior: smooth; } </style> <a href="#top">Plynule nahoru</a>
Scroll na začátek stránky
<!-- Scroll na začátek (top) --> <a href="#top">Nahoru</a> <a href="#">Nahoru (alternativa)</a> <!-- ID na začátku dokumentu --> <body id="top"> <!-- obsah --> </body>
Stylování odkazů
CSS pseudo-třídy
/* Neznavštívený odkaz */ a:link { color: blue; text-decoration: underline; } /* Navštívený odkaz */ a:visited { color: purple; } /* Hover (myš nad odkazem) */ a:hover { color: red; text-decoration: none; cursor: pointer; } /* Focus (např. Tab navigace) */ a:focus { outline: 2px solid orange; } /* Aktivní (během kliknutí) */ a:active { color: darkred; } /* Doporučené pořadí: LVHFA (LoVe HAte) / / :link → :visited → :hover → :focus → :active */
Odstranění podtržení
a { text-decoration: none; } /* Podtržení pouze při hoveru */ a:hover { text-decoration: underline; }
Stylování podle atributů
/* Externí odkazy */ a[href^="http"] { color: green; } /* PDF odkazy */ a[href$=".pdf"] { color: red; } a[href$=".pdf"]::after { content: " 📄"; } /* Email odkazy */ a[href^="mailto:"] { color: blue; } a[href^="mailto:"]::before { content: "✉ "; } /* Odkazy s target="_blank" */ a[target="_blank"]::after { content: " ↗"; } /* Download odkazy */ a[download] { font-weight: bold; }
Tlačítkový styl
.button-link { display: inline-block; padding: 10px 20px; background-color: #007bff; color: white; text-decoration: none; border-radius: 5px; transition: background-color 0.3s; } .button-link:hover { background-color: #0056b3; }
Přístupnost (Accessibility)
Základní pravidla
1. Smysluplný text odkazu
<!-- ŠPATNě --> <a href="article.html">Klikněte zde</a> <a href="article.html">Více</a> <a href="article.html">Zde</a> <!-- DOBřE --> <a href="article.html">Přečtěte si celý článek o HTML</a> <a href="article.html">Kompletní návod na HTML odkazy</a>
2. Rozlišitelnost od okolního textu
/* Špatně - pouze barva */ a { color: blue; text-decoration: none; } /* Dobře - barva + podtržení nebo jiný vizuální prvek */ a { color: blue; text-decoration: underline; }
3. Dostatečná velikost klikací oblasti
/* Minimálně 44x44px pro touch zařízení */ a { display: inline-block; min-height: 44px; min-width: 44px; padding: 10px; }
ARIA atributy
<!-- Popis pro screen readery --> <a href="document.pdf" aria-label="Stáhnout roční zprávu 2024 ve formátu PDF"> Stáhnout zprávu </a> <!-- Označení aktuální stránky --> <nav> <a href="home.html">Domů</a> <a href="about.html" aria-current="page">O nás</a> <a href="contact.html">Kontakt</a> </nav> <!-- Externí odkaz s upozorněním --> <a href="external.com" aria-label="Externí odkaz - otevře se v novém okně" target="_blank"> Externí web </a> <!-- Skrytý text pro screen readery --> <a href="next.html"> Další <span class="sr-only">(Stránka 2 z 10)</span> </a>
Viditelný focus indikátor
/* NIKDY neodstraňujte outline bez náhrady! */ /* Špatně / a:focus { outline: none; / Znepřístupňuje web pro klávesnicovou navigaci */ } /* Dobře */ a:focus { outline: 2px solid #007bff; outline-offset: 2px; } /* Nebo vlastní styl */ a:focus { box-shadow: 0 0 0 3px rgba(0, 123, 255, 0.5); }
Skip links
<!-- Odkaz pro přeskočení navigace (první element v body) --> <a href="#main-content" class="skip-link">Přeskočit na hlavní obsah</a> <!-- CSS --> <style> .skip-link { position: absolute; top: -40px; left: 0; background: #000; color: #fff; padding: 8px; text-decoration: none; z-index: 100; } .skip-link:focus { top: 0; } </style> <!-- Cíl odkazu --> <main id="main-content"> <!-- hlavní obsah stránky --> </main>
JavaScript a události
Event listeners
<a href="page.html" id="myLink">Odkaz</a> <script> // Základní click event document.getElementById('myLink').addEventListener('click', function(e) { e.preventDefault(); // Zruší výchozí akci (navigaci) console.log('Odkaz byl kliknut'); // Vlastní logika if (confirm('Opravdu chcete pokračovat?')) { window.location.href = this.href; } }); // Pravé tlačítko myši document.getElementById('myLink').addEventListener('contextmenu', function(e) { e.preventDefault(); console.log('Pravé tlačítko na odkazu'); }); // Střední tlačítko myši (otevře v nové záložce) document.getElementById('myLink').addEventListener('auxclick', function(e) { if (e.button === 1) { // Střední tlačítko console.log('Střední tlačítko - otevře se v nové záložce'); } }); </script>
Inline JavaScript (nedoporučuje se)
<!-- onclick --> <a href="page.html" onclick="alert('Kliknuto'); return false;">Klikni</a> <!-- Více akcí --> <a href="page.html" onclick="doSomething(); doSomethingElse(); return false;"> Odkaz s akcemi </a> <!-- Volání funkce --> <a href="#" onclick="myFunction(); return false;">Zavolat funkci</a> <script> function myFunction() { console.log('Funkce byla zavolána'); } </script>
Poznámka: Inline JavaScript se nedoporučuje kvůli:
Porušení separace concerns (struktura vs. chování) Bezpečnostním rizikům (XSS) Obtížnější údržbě Content Security Policy issues
Programová navigace
// Navigace v JavaScriptu window.location.href = 'page.html'; // Otevření v nové záložce window.open('page.html', '_blank'); // Programové kliknutí na odkaz document.getElementById('myLink').click(); // Simulace kliknutí s event const link = document.getElementById('myLink'); const clickEvent = new MouseEvent('click', { bubbles: true, cancelable: true, view: window }); link.dispatchEvent(clickEvent);
Tracking a analytics
<a href="external.com" onclick="ga('send', 'event', 'Outbound Link', 'click', 'external.com');"> Externí odkaz s GA tracking </a> <!-- Modernější způsob s data atributy --> <a href="external.com" data-track="outbound" data-label="external"> Externí odkaz </a> <script> document.querySelectorAll('a[data-track]').forEach(link => { link.addEventListener('click', function(e) { // Tracking logika gtag('event', this.dataset.track, { 'label': this.dataset.label, 'url': this.href }); }); }); </script>
Pokročilé techniky
Obrázek jako odkaz
<!-- Základní --> <a href="page.html"> <img src="image.jpg" alt="Popisný text obrázku"> </a> <!-- S title pro tooltip --> <a href="page.html" title="Přejít na detailní stránku"> <img src="thumbnail.jpg" alt="Náhled produktu"> </a> <!-- Odstranění borderu kolem obrázku --> <style> a img { border: none; display: block; /* Odstraní spacing pod obrázkem */ } </style>
Složitější obsah v odkazu
<!-- Blokový odkaz s více elementy --> <a href="article.html" class="card-link"> <article class="card"> <img src="thumbnail.jpg" alt="Náhled"> <h3>Nadpis článku</h3> <p>Krátký popis článku...</p> <span class="read-more">Číst více →</span> </article> </a> <style> .card-link { display: block; text-decoration: none; color: inherit; } .card-link:hover .card { box-shadow: 0 4px 8px rgba(0,0,0,0.1); transform: translateY(-2px); transition: all 0.3s; } </style>
Poznámka: Odkaz může obsahovat téměř jakýkoliv obsah, ale NESMÍ obsahovat interaktivní elementy (jiné odkazy, tlačítka, formulářová pole).
Tlačítko vs. odkaz
<!-- ODKAZ - pro navigaci --> <a href="page.html">Přejít na stránku</a> <!-- TLAČÍTKO - pro akce --> <button type="button" onclick="doAction()">Provést akci</button> <!-- ŠPATNĚ - odkaz pro akci bez navigace --> <a href="#" onclick="doAction(); return false;">Provést akci</a> <!-- ŠPATNĚ - tlačítko stylované jako odkaz pro navigaci --> <button onclick="window.location='page.html'">Přejít na stránku</button>
Pravidlo:
Odkaz (<a>) = navigace, změna URL
Tlačítko (<button>) = akce bez změny URL
Rozšiřitelné odkazy s data atributy
<a href="product.html" data-product-id="12345" data-category="electronics" data-price="999"> Produkt </a> <script> document.querySelectorAll('a[data-product-id]').forEach(link => { link.addEventListener('click', function(e) { const productId = this.dataset.productId; const category = this.dataset.category; const price = this.dataset.price; // Logika s daty console.log(`Produkt ${productId} za ${price} Kč`); }); }); </script>
Lazy loading pro odkazy
<!-- Prefetch - načte stránku do cache --> <link rel="prefetch" href="next-page.html"> <!-- Preload - načte s vyšší prioritou --> <link rel="preload" href="important-page.html" as="document"> <!-- JavaScript prefetch při hoveru --> <script> const links = document.querySelectorAll('a[href]'); links.forEach(link => { link.addEventListener('mouseenter', function() { const url = this.href; const prefetchLink = document.createElement('link'); prefetchLink.rel = 'prefetch'; prefetchLink.href = url; document.head.appendChild(prefetchLink); }, { once: true }); }); </script>
SPA (Single Page Application) odkazy
<nav> <a href="/home" data-spa-link>Domů</a> <a href="/about" data-spa-link>O nás</a> <a href="/contact" data-spa-link>Kontakt</a> </nav> <script> // Zachycení kliknutí pro SPA routing document.addEventListener('click', function(e) { const link = e.target.closest('a[data-spa-link]'); if (link) { e.preventDefault(); const url = link.getAttribute('href'); // History API history.pushState(null, '', url); // Načtení obsahu (AJAX, fetch, atd.) loadPage(url); } }); // Podpora tlačítek zpět/vpřed window.addEventListener('popstate', function() { loadPage(window.location.pathname); }); function loadPage(url) { // Fetch a rendering logika console.log('Loading page:', url); } </script>
Bezpečnost
XSS (Cross-Site Scripting)
<!-- NEBEZPEČNÉ - nikdy nedůvěřujte user inputu! --> <?php $userInput = $_GET['url']; echo "<a href='$userInput'>Odkaz</a>"; // Útočník může použít: ?url=javascript:alert(document.cookie) ?> <!-- BEZPEČNÉ - escapování --> <?php $userInput = htmlspecialchars($_GET['url'], ENT_QUOTES, 'UTF-8'); echo "<a href='$userInput'>Odkaz</a>"; ?> <!-- JEŠTĚ LEPŠÍ - validace URL --> <?php $userInput = filter_var($_GET['url'], FILTER_VALIDATE_URL); if ($userInput !== false) { echo "<a href='" . htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8') . "'>Odkaz</a>"; } ?>
Tabnabbing útok
<!-- ZRANITELNÉ --> <a href="https://evil-site.com" target="_blank">Škodlivý odkaz</a> <!-- Škodlivá stránka může změnit window.opener.location --> <script> // Na evil-site.com: if (window.opener) { window.opener.location = 'https://phishing-site.com'; } </script> <!-- BEZPEČNÉ - používat rel="noopener" --> <a href="https://external-site.com" target="_blank" rel="noopener noreferrer"> Bezpečný odkaz </a>
Open Redirect zranitelnost
<!-- ZRANITELNÉ --> <a href="/redirect?url=<?= $_GET['next'] ?>">Pokračovat</a> <!-- Útočník: /redirect?url=https://evil.com --> <!-- BEZPEČNÉ - whitelist povolených domén --> <?php $allowedDomains = ['example.com', 'subdomain.example.com']; $url = parse_url($_GET['next']); if (in_array($url['host'], $allowedDomains)) { echo "<a href='/redirect?url=" . htmlspecialchars($_GET['next']) . "'>Pokračovat</a>"; } ?>
Phishing ochrana
<!-- Zobrazení skutečné URL před kliknutím --> <a href="https://real-site.com" onmouseover="document.getElementById('url-display').textContent = this.href"> Bezpečný odkaz </a> <div id="url-display" style="font-size: 0.8em; color: gray;"></div> <!-- Varování před externími odkazy --> <script> document.querySelectorAll('a[href^="http"]').forEach(link => { if (!link.href.includes(window.location.hostname)) { link.addEventListener('click', function(e) { if (!confirm(`Chystáte se opustit náš web a přejít na:\n${this.href}\n\nPokračovat?`)) { e.preventDefault(); } }); } }); </script>
SEO (Search Engine Optimization)
Základní SEO pravidla
1. Popisný text odkazu (anchor text)
<!-- Špatně --> <a href="product.html">klikněte zde</a> <a href="product.html">více informací</a> <!-- Dobře --> <a href="product.html">iPhone 15 Pro Max 256GB černý</a> <a href="article.html">Kompletní průvodce HTML odkazy v roce 2024</a>
2. Rel atributy pro SEO
<!-- nofollow - nepředávat PageRank --> <a href="untrusted.com" rel="nofollow">Nedůvěryhodný odkaz</a> <!-- sponsored - placený odkaz --> <a href="sponsor.com" rel="sponsored">Náš sponzor</a> <!-- ugc - User Generated Content --> <a href="user-page.html" rel="ugc">Uživatelský příspěvek</a> <!-- Kombinace --> <a href="external.com" rel="nofollow noopener">Externí + nofollow</a>
