HTML & CSS

Посилання та зображення в HTML

Детальний розбір тегів <a>, <img>, <picture>, <figure> за специфікацією HTML Living Standard: типи посилань, адаптивні зображення, карти, доступність та SEO.

Посилання та зображення в HTML

Навіщо гіперпосилання змінили світ

1989 рік. Тім Бернерс-Лі пише пропозицію для CERN і формулює концепцію, яка перевернула спосіб поширення знань. Ключова ідея проста і геніальна: документи повинні посилатися один на одного. Не копіювати інформацію — а посилатися на неї.

Цей принцип, який ми сьогодні сприймаємо як даність — клікабельне посилання в тексті — лежить в основі Всесвітньої павутини. Без тегу <a> інтернет був би набором ізольованих сторінок-островів.

Тег <img> з'явився пізніше — у 1993 році в браузері Mosaic. Марк Андрессен запропонував елемент, що дозволяв вбудовувати зображення безпосередньо в текст. До цього в «мережі» були лише слова.

Сьогодні ми розберемо обидва елементи так, як їх визначає HTML Living Standard (WHATWG) — актуальна жива специфікація, яку підтримують всі сучасні браузери.


Тег <a> — Гіперпосилання

Що каже специфікація

За визначенням HTML Living Standard, елемент <a> (anchor — якір) представляє гіперпосилання або заповнювач для нього. Якщо присутній атрибут href — це гіперпосилання. Якщо href відсутній — це заповнювач (placeholder), де посилання могло бути.

Content model (модель вмісту за специфікацією):<a> є transparent (прозорим) елементом — він успадковує модель вмісту від свого батьківського елемента. Це означає, що всередині <a> дозволено те ж саме, що дозволено в батьку, за винятком інтерактивного вмісту.
<!-- <a> всередині <p> (flow content) → може містити фразований вміст -->
<p>Відвідайте <a href="https://example.com">наш сайт</a>.</p>

<!-- <a> всередині <ul> (list context) → НЕ може містити <li> -->
<!-- ❌ Це неправильно: -->
<a href="/"><li>Головна</li></a>

<!-- ✅ Правильно: -->
<li><a href="/">Головна</a></li>

Атрибут href — адреса посилання

href (Hypertext Reference — гіпертекстове посилання) визначає URL, на який веде посилання.

Абсолютна адреса — повна URL із протоколом:

<a href="https://developer.mozilla.org">MDN Web Docs</a>
<a href="https://www.youtube.com/watch?v=dQw4w9WgXcQ">YouTube відео</a>

Зверніть увагу: завжди використовуйте https:// — не http://. Сучасні браузери блокують mixed-content (змішаний вміст).

Атрибут target — де відкрити посилання

  • target="_blank" — відкриває посилання в новій вкладці або вікні. Найпоширеніше значення для зовнішніх посилань.
  • target="_self" — відкриває в поточній вкладці (поведінка за замовчуванням).
  • target="_parent" — відкриває в батьківському фреймі. Якщо фрейму немає — поводиться як _self.
  • target="_top" — відкриває в найвищому контексті перегляду (весь браузер). Використовується для виходу з iframe-вкладення.

Безпека: rel="noopener noreferrer"

Відкриваючи посилання з target="_blank"безrel, ви надаєте новій вкладці доступ до батьківської сторінки через window.opener. Це класична вразливість — Tab Napping: шкідливий сайт може непомітно переадресувати вашу вкладку.
<!-- ❌ Небезпечно: нова вкладка має доступ window.opener -->
<a href="https://external-site.com" target="_blank">Сторонній сайт</a>

<!-- ✅ Безпечно: window.opener = null -->
<a href="https://external-site.com" target="_blank" rel="noopener noreferrer"> Сторонній сайт </a>

Розшифровка rel для посилань:

ЗначенняЩо означає
noopenerНова вкладка не має доступу до window.opener
noreferrerНе передавати заголовок Referer (не показувати звідки прийшов користувач)
nofollowПошукові роботи не мають слідувати цьому посиланню (для платних чи недовірених посилань)
externalСемантична мітка: це посилання веде на зовнішній ресурс
prev / nextПопередня/наступна сторінка в серії (для пагінації)
authorПосилання на автора
licenseПосилання на ліцензію контенту
Сучасні браузери (Chrome 88+, Safari 12.1+) автоматично встановлюють noopener для target="_blank". Але явне зазначення rel="noopener noreferrer" — це найкраща практика для сумісності з усіма браузерами.

Атрибут title — підказка

<a href="https://www.w3.org/TR/html52/" title="HTML 5.2 — специфікація W3C"> Специфікація HTML5 </a>
<!-- При наведенні курсора браузер показує підказку з title -->
title на посиланні не є заміною для доступного тексту. Скринрідери поводяться з ним по-різному — одні зачитують, інші ігнорують. Основний текст посилання має бути зрозумілим без підказки.

Доступний текст посилання

Це один із найважливіших аспектів якісного HTML. Скринрідери зчитують список усіх посилань на сторінці, і людина з вадами зору має розуміти кожне посилання без контексту навколишнього тексту.

❌ Погано

<p>Прочитайте нашу статтю <a href="/article">тут</a>.</p>

<a href="/download">Натисніть тут</a>
<a href="/more">Детальніше</a>

Скринрідер оголосить: "тут", "Натисніть тут", "Детальніше" — без жодного контексту.

✅ Добре

<p>Прочитайте нашу статтю <a href="/article">Вступ до HTML5</a>.</p>

<a href="/download">Завантажити PDF-звіт (2.3 МБ)</a>
<a href="/products/camera">Детальніше про Canon EOS R6</a>

Скринрідер розуміє кожне посилання окремо.

Посилання із зображенням

Коли посилання містить тільки зображення (без тексту), атрибут alt у <img> виконує роль тексту посилання:

<!-- alt зображення = текст посилання -->
<a href="/home">
    <img src="logo.svg" alt="Головна сторінка компанії Acme" />
</a>

<!-- ❌ Порожній alt = посилання без тексту для скринрідера -->
<a href="/home">
    <img src="logo.svg" alt="" />
</a>

Тег <img> — Зображення

Що каже специфікація

<img> (image — зображення) — void element (порожній елемент): він не має закриваючого тегу і не може містити вміст. За специфікацією WHATWG, <img> є embedded content (вбудований вміст) та phrasing content (фрагментний контент).

Обов'язкові атрибути:

<!-- src і alt є обов'язковими за специфікацією -->
<img src="photo.jpg" alt="Опис зображення" />
Відсутність атрибута alt є порушенням специфікації HTML і помилкою доступності. Валідатор W3C позначить це як помилку.

Атрибут alt — альтернативний текст

alt (alternative text) — це текстова альтернатива для зображення. Він використовується:

  • Скринрідерами для озвучення зображення
  • Браузером, якщо зображення не завантажилось
  • Пошуковими системами для індексування

Три сценарії використання alt:

Зображення несе інформацію — опишіть її:

<!-- Описуйте зміст, а не вигляд -->
<img src="evacuation-map.png" alt="Схема евакуації: вихід ліворуч від ліфта, сходи в кінці коридору" />

<!-- Для зображення з текстом — передайте текст -->
<img src="sale-banner.jpg" alt="Знижки до 50% на всі товари. Тільки до 31 грудня!" />

<!-- Фотографія людини -->
<img src="ceo.jpg" alt="Марія Коваленко, генеральний директор компанії TechUA" />

Атрибути розміру: width та height

Завжди вказуйте width і height у пікселях. Це критично для запобігання зміщенню вмісту (CLS — Cumulative Layout Shift):

<!-- ✅ Браузер резервує місце для зображення до його завантаження -->
<img src="product-photo.jpg" alt="Навушники Sony WH-1000XM5 у чорному кольорі" width="800" height="600" />

<!-- ❌ Без розмірів: сторінка «стрибає» при завантаженні -->
<img src="product-photo.jpg" alt="Навушники Sony" />
width і height в HTML — власні розміри зображення (intrinsic dimensions). CSS може змінити відображувані розміри, але атрибути допомагають браузеру заздалегідь обчислити пропорції.

Атрибут loading — завантаження зображень

<!-- eager (за замовчуванням): завантажити негайно -->
<img src="hero.jpg" alt="Герой-банер" loading="eager" />

<!-- lazy: відкласти завантаження до наближення до viewport -->
<img src="below-fold-photo.jpg" alt="Фото нижче відгину" loading="lazy" />

Правило використання:

  • loading="lazy" — для всіх зображень нижче лінії відгину (below the fold)
  • loading="eager" — для зображень у верхній частині сторінки (hero, логотип)
loading="lazy" — нативна реалізація без JavaScript. Браузер сам вирішує, коли завантажити зображення. Підтримка: Chrome 76+, Firefox 75+, Safari 15.4+.

Атрибут decoding — декодування

<!-- async: декодувати асинхронно (не блокувати рендеринг) -->
<img src="large-photo.jpg" alt="Велике фото" decoding="async" />

<!-- sync: декодувати синхронно (рідко потрібно) -->
<img src="critical-chart.png" alt="Критичний графік" decoding="sync" />

<!-- auto: браузер вирішує (за замовчуванням) -->
<img src="photo.jpg" alt="Фото" decoding="auto" />

Формати зображень: коли що використовувати

Loading diagram...
graph TD
    Q{\"Що зображую?\"}
    Q -->|Фото, складне зображення| F{\"Потрібна прозорість?\"}
    Q -->|Іконка, схема, логотип| SVG[\"SVG\nВекторний формат\nМасштабується без втрат\"]
    Q -->|Анімація| GIF_W{\"Потрібна якість?\"}

    F -->|Ні| WEBP_J{\"Максимальна якість?\"}
    F -->|Так| WEBP_T[\"WebP або AVIF\nПрозорість + стиснення\"]

    WEBP_J -->|Так| JPEG[\"JPEG / WebP\nДобра якість та розмір\"]
    WEBP_J -->|Ні, мінімальний розмір| AVIF[\"AVIF\nНайкраще стиснення\nМенша підтримка\"]

    GIF_W -->|Якість важлива| WEBP_A[\"WebP (анімований)\nЗамінює GIF\"]
    GIF_W -->|Не важлива| GIF[\"GIF\nШирока підтримка\"]

    style SVG fill:#3b82f6,color:#fff
    style JPEG fill:#10b981,color:#fff
    style AVIF fill:#f59e0b,color:#fff
    style WEBP_T fill:#10b981,color:#fff
    style WEBP_A fill:#10b981,color:#fff
    style GIF fill:#64748b,color:#fff
ФорматПрозорістьАнімаціяСтисненняПідтримкаРекомендація
JPEGДобре✅ ВсіФото без прозорості
PNGПомірне✅ ВсіСкріншоти, точні кольори
WebPВідмінне✅ СучасніЗамінює JPEG та PNG
AVIFНайкраще⚠️ ЧастковоМайбутнє, поки з fallback
SVGВектор✅ ВсіІконки, логотипи, схеми
GIF✅ (1 біт)Погане✅ ВсіУникайте — використовуйте WebP

<picture> — адаптивні зображення

Елемент <picture> (picture) дозволяє браузеру обрати найбільш відповідне зображення з набору варіантів. Це відповідь на дві проблеми:

  1. Art direction — різні зображення для різних розмірів екрана (обрізка, інша композиція)
  2. Format switching — сучасний формат для тих, хто підтримує, з fallback для решти

За специфікацією

<picture>container element (контейнер). Він містить:

  • Нуль або більше елементів <source>
  • Рівно один елемент <img> (обов'язковий, у кінці)

Браузер перевіряє <source> по порядку і використовує перший, що підходить. <img> — fallback, якщо жодна <source> не підійшла.

Art direction — різна композиція

<picture>
    <!-- Мобільний: квадратний кадр, обличчя крупним планом -->
    <source media="(max-width: 767px)" srcset="/images/speaker-portrait-mobile.jpg" />
    <!-- Планшет: середній план -->
    <source media="(max-width: 1199px)" srcset="/images/speaker-portrait-tablet.jpg" />
    <!-- Десктоп: широкий план з фоном -->
    <img
        src="/images/speaker-portrait-desktop.jpg"
        alt="Олена Мороз, доповідач конференції WebUA 2024"
        width="1200"
        height="630"
    />
</picture>

Format switching — сучасні формати з fallback

<picture>
    <!-- AVIF — найкраще стиснення, нова підтримка -->
    <source srcset="/images/hero.avif" type="image/avif" />
    <!-- WebP — відмінне стиснення, широка підтримка -->
    <source srcset="/images/hero.webp" type="image/webp" />
    <!-- JPEG — універсальний fallback -->
    <img
        src="/images/hero.jpg"
        alt="Панорама Києва зі Схилів"
        width="1920"
        height="1080"
        loading="eager"
        decoding="async"
    />
</picture>

srcset та sizes — ретина та адаптивні розміри

Атрибут srcset у <img> дозволяє вказати набір зображень для різної щільності пікселів або різних ширин вікна:

<!-- 1. Дескриптор щільності (x) — для фіксованих розмірів -->
<img
    src="/images/logo-1x.png"
    srcset="/images/logo-2x.png 2x, /images/logo-3x.png 3x"
    alt="Логотип"
    width="200"
    height="60"
/>

<!-- 2. Дескриптор ширини (w) + sizes — для адаптивних зображень -->
<img
    src="/images/photo-800.jpg"
    srcset="
        /images/photo-400.jpg   400w,
        /images/photo-800.jpg   800w,
        /images/photo-1200.jpg 1200w,
        /images/photo-1600.jpg 1600w
    "
    sizes="
    (max-width: 600px) 100vw,
    (max-width: 1200px) 50vw,
    800px
  "
    alt="Краєвид Карпат у осінніх фарбах"
    width="1600"
    height="900"
    loading="lazy"
/>

Як читати sizes:

sizes="
  (max-width: 600px) 100vw,   ← якщо вікно ≤600px: зображення займає 100% ширини
  (max-width: 1200px) 50vw,   ← якщо вікно ≤1200px: зображення займає 50% ширини
  800px                        ← в іншому разі: фіксована ширина 800px
"

Браузер читає sizes ліворуч направо і застосовує перше відповідне умові значення.


<figure> та <figcaption> — Семантичні підписи

Елемент <figure> (figure) представляє незалежний вміст, на який є посилання в основному тексті, але який може бути відокремлений від нього (як малюнок у книзі).

<figcaption> (figure caption — підпис до рисунка) — опціональний підпис. Може бути першим або останнім дочірнім елементом <figure>.

<!-- Зображення з підписом -->
<figure>
    <img
        src="/images/neural-network-diagram.png"
        alt="Схема нейронної мережі з трьома прихованими шарами"
        width="800"
        height="500"
    />
    <figcaption>
        Рис. 1. Архітектура тришарової нейронної мережі для класифікації зображень.
        <cite>Джерело: Deep Learning Book, Goodfellow et al., 2016</cite>
    </figcaption>
</figure>

<!-- Блок коду як figure -->
<figure>
    <figcaption>Лістинг 1: Функція обчислення факторіалу</figcaption>
    <pre><code>
function factorial(n) {
    if (n === 0) return 1;
    return n * factorial(n - 1);
}
  </code></pre>
</figure>

<!-- Цитата як figure -->
<figure>
    <blockquote>
        <p>Будь-який досить просунутий код невідрізнений від магії.</p>
    </blockquote>
    <figcaption>— Артур Кларк (перефраз)</figcaption>
</figure>
<figure> — для вмісту, на який посилаються в основному тексті («як показано на рисунку 1...»). Якщо вміст є лише декоративним — <figure> не потрібен.

Карти зображень — <map> та <area>

Карта зображення (image map) дозволяє визначити клікабельні зони поверх зображення. Кожна зона — самостійне посилання.

<!-- Атрибут usemap пов'язує <img> з <map> через # + name -->
<img src="/images/ukraine-map.png" alt="Карта регіонів України" width="800" height="600" usemap="#ukraine-regions" />

<map name="ukraine-regions">
    <!-- shape="rect": прямокутна зона: x1,y1,x2,y2 -->
    <area shape="rect" coords="120,80,280,180" href="/regions/kyiv" alt="Київська область" />

    <!-- shape="circle": кругла зона: cx,cy,radius -->
    <area shape="circle" coords="350,300,50" href="/regions/poltava" alt="Полтавська область" />

    <!-- shape="poly": довільний многокутник: x1,y1,x2,y2,...,xN,yN -->
    <area
        shape="poly"
        coords="200,100,300,120,320,200,220,210,180,150"
        href="/regions/cherkasy"
        alt="Черкаська область"
    />

    <!-- shape="default": решта зображення -->
    <area shape="default" href="/regions" alt="Всі регіони України" />
</map>
Карти зображень мають низьку доступність і не є адаптивними (координати фіксовані в пікселях). Для сучасних проєктів краще використовуйте SVG із посиланнями або CSS + HTML замість image maps.

Підсумкова таблиця: атрибути <a> та <img>

Атрибути <a>

href
string required
URL посилання. Без href елемент є заповнювачем.
target
string
Контекст відкриття: _blank, _self, _parent, _top або назва фрейму.
rel
string
Відношення між документами. Важливі значення: noopener, noreferrer, nofollow, external, author, license.
download
string
Якщо присутній — браузер завантажує файл. Значення атрибуту = ім'я файлу.
title
string
Підказка при наведенні. Не замінює доступний текст.
hreflang
string
Мова цільового документа (наприклад, uk, en-US). Підказка для браузера.
type
string
MIME-тип цільового ресурсу (наприклад, application/pdf). Підказка.
ping
string
Список URL, яким браузер надсилає POST-запит при кліку. Використовується для аналітики.

Атрибути <img>

src
string required
URL зображення. Обов'язковий.
alt
string required
Альтернативний текст. Обов'язковий (може бути порожнім для декоративних зображень).
width
number
Ширина в пікселях. Рекомендовано вказувати для уникнення CLS.
height
number
Висота в пікселях. Рекомендовано вказувати разом з width.
loading
string
eager (за замовч.) або lazy — відкладене завантаження.
decoding
string
async, sync, auto — стратегія декодування зображення.
srcset
string
Набір варіантів зображення для різних щільностей (2x) або ширин (800w).
sizes
string
Оголошення відображуваної ширини для кожного media condition. Використовується з srcset.
crossorigin
string
CORS-налаштування: anonymous або use-credentials. Для зображень на Canvas або з fetchpriority.
fetchpriority
string
high, low, auto — пріоритет завантаження. high для LCP-зображень (hero).
usemap
string
Прив'язка до карти зображення: #map-name.
ismap
boolean
Серверна карта зображення (застаріла техніка).

Практичні завдання


Комплексний приклад від А до Я

Тема: Сторінка фотографа-документаліста — портфоліо та контакти.

Цей приклад демонструє всі теги і техніки розділу в реалістичному контексті:

<!DOCTYPE html>
<html lang="uk">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <meta
            name="description"
            content="Портфоліо Андрія Лисенка — документальна фотографія з України. Репортажі, портрети, природа."
        />
        <title>Андрій Лисенко — Документальна фотографія</title>
        <link rel="canonical" href="https://lysenko.photo/" />
        <!-- Іконка сайту -->
        <link rel="icon" href="/favicon.svg" type="image/svg+xml" />
    </head>
    <body>
        <!-- ===== ШАПКА ===== -->
        <header>
            <!-- Логотип — посилання на головну -->
            <a href="/">
                <img
                    src="/images/logo.svg"
                    alt="Повернутися на головну — портфоліо Андрія Лисенка"
                    width="180"
                    height="60"
                />
            </a>

            <!-- Навігація -->
            <nav aria-label="Головне меню">
                <ul>
                    <li><a href="/" aria-current="page">Головна</a></li>
                    <li><a href="/portfolio">Портфоліо</a></li>
                    <li><a href="/about">Про мене</a></li>
                    <li><a href="/workshops">Workshops</a></li>
                    <li>
                        <a
                            href="https://instagram.com/lysenko.photo"
                            target="_blank"
                            rel="noopener noreferrer external"
                            title="Переглянути профіль у Instagram (відкриється в новій вкладці)"
                        >
                            Instagram ↗
                        </a>
                    </li>
                    <li><a href="#contacts">Контакти</a></li>
                </ul>
            </nav>
        </header>

        <!-- ===== ГОЛОВНИЙ БАННЕР ===== -->
        <main>
            <section aria-label="Заголовок портфоліо">
                <!-- Hero-зображення: адаптивне, пріоритетне -->
                <picture>
                    <source srcset="/images/hero-mobile.avif" type="image/avif" media="(max-width: 767px)" />
                    <source srcset="/images/hero-mobile.webp" type="image/webp" media="(max-width: 767px)" />
                    <source srcset="/images/hero-desktop.avif" type="image/avif" />
                    <source srcset="/images/hero-desktop.webp" type="image/webp" />
                    <img
                        src="/images/hero-desktop.jpg"
                        alt="Чоловік фотографує сонце, що сідає над Карпатами. Силует на тлі помаранчевого неба."
                        width="1920"
                        height="900"
                        loading="eager"
                        fetchpriority="high"
                        decoding="async"
                    />
                </picture>

                <h1>Документальна фотографія — правда без прикрас</h1>
                <p>Знімаю людей, місця і події такими, якими вони є.</p>

                <a href="/portfolio" rel="next"> Переглянути портфоліо → </a>
            </section>

            <!-- ===== ГАЛЕРЕЯ ПРОЄКТІВ ===== -->
            <section aria-labelledby="projects-heading">
                <h2 id="projects-heading">Вибрані проєкти</h2>

                <ul>
                    <li>
                        <!-- Посилання з зображенням та текстом -->
                        <a href="/portfolio/carpathians-2024">
                            <figure>
                                <picture>
                                    <source srcset="/images/project-carpathians.webp" type="image/webp" />
                                    <img
                                        src="/images/project-carpathians.jpg"
                                        alt="Вершина Говерли в хмарах. Туристи на гірській стежці."
                                        width="600"
                                        height="400"
                                        loading="lazy"
                                        decoding="async"
                                        srcset="
                                            /images/project-carpathians-400.jpg   400w,
                                            /images/project-carpathians-600.jpg   600w,
                                            /images/project-carpathians-1200.jpg 1200w
                                        "
                                        sizes="(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 400px"
                                    />
                                </picture>
                                <figcaption>
                                    <h3>Карпати 2024</h3>
                                    <p>30 днів. 4 гірські хребти. 1200+ знімків.</p>
                                </figcaption>
                            </figure>
                        </a>
                    </li>

                    <li>
                        <a href="/portfolio/kyiv-streets">
                            <figure>
                                <picture>
                                    <source srcset="/images/project-kyiv.webp" type="image/webp" />
                                    <img
                                        src="/images/project-kyiv.jpg"
                                        alt="Людина з парасолькою на мокрому Хрещатику вночі. Відображення ліхтарів у калюжах."
                                        width="600"
                                        height="400"
                                        loading="lazy"
                                        decoding="async"
                                    />
                                </picture>
                                <figcaption>
                                    <h3>Вулиці Києва</h3>
                                    <p>Street photography. Місто, яке ніколи не спить.</p>
                                </figcaption>
                            </figure>
                        </a>
                    </li>

                    <li>
                        <a href="/portfolio/people-of-donbas">
                            <figure>
                                <!-- Декоративний оверлей — alt порожній -->
                                <img src="/images/project-overlay.svg" alt="" width="600" height="400" />
                                <img
                                    src="/images/project-donbas.jpg"
                                    alt="Літня жінка стоїть на порозі зруйнованого будинку. Вона тримає старе фото."
                                    width="600"
                                    height="400"
                                    loading="lazy"
                                    decoding="async"
                                />
                                <figcaption>
                                    <h3>Люди Донбасу</h3>
                                    <p>Документальний проєкт 2022–2023.</p>
                                </figcaption>
                            </figure>
                        </a>
                    </li>
                </ul>
            </section>

            <!-- ===== ЗАВАНТАЖЕННЯ ===== -->
            <section aria-labelledby="downloads-heading">
                <h2 id="downloads-heading">Матеріали для завантаження</h2>

                <ul>
                    <li>
                        <a
                            href="/files/lysenko-portfolio-2024.pdf"
                            download="Lysenko-Portfolio-2024.pdf"
                            type="application/pdf"
                        >
                            📄 Портфоліо PDF (8.2 МБ)
                        </a>
                    </li>
                    <li>
                        <a href="/files/media-kit.zip" download="lysenko-media-kit.zip" type="application/zip">
                            📦 Media Kit для видань (ZIP, 45 МБ)
                        </a>
                    </li>
                    <li>
                        <!-- Якірне посилання на розділ нижче -->
                        <a href="#pricing">💰 Переглянути прайс-лист</a>
                    </li>
                </ul>
            </section>

            <!-- ===== ПУБЛІКАЦІЇ — посилання з rel="author" ===== -->
            <section aria-labelledby="press-heading">
                <h2 id="press-heading">Публікації</h2>
                <ul>
                    <li>
                        <a
                            href="https://nytimes.com/article/ukraine-documentary"
                            target="_blank"
                            rel="noopener noreferrer external"
                        >
                            The New York Times: «Ukraine Through the Lens»
                            <img src="/images/icon-external.svg" alt="(зовнішнє посилання)" width="12" height="12" />
                        </a>
                    </li>
                    <li>
                        <a
                            href="https://nationalgeographic.com/lysenko-carpathians"
                            target="_blank"
                            rel="noopener noreferrer external"
                        >
                            National Geographic: Carpathian Series
                            <img src="/images/icon-external.svg" alt="(зовнішнє посилання)" width="12" height="12" />
                        </a>
                    </li>
                </ul>
            </section>

            <!-- ===== ПРАЙС — якір ===== -->
            <section id="pricing" aria-labelledby="pricing-heading">
                <h2 id="pricing-heading">Прайс-лист</h2>
                <!-- ... вміст ... -->
            </section>
        </main>

        <!-- ===== КОНТАКТИ ===== -->
        <section id="contacts" aria-labelledby="contacts-heading">
            <h2 id="contacts-heading">Контакти</h2>

            <address>
                <p>
                    Email:
                    <a href="mailto:andrii@lysenko.photo?subject=Запит%20на%20зйомку"> andrii@lysenko.photo </a>
                </p>
                <p>
                    Телефон:
                    <a href="tel:+380671234567">+38 (067) 123-45-67</a>
                </p>
                <p>
                    WhatsApp / Telegram:
                    <a href="https://t.me/lysenko_photo" target="_blank" rel="noopener noreferrer external">
                        @lysenko_photo
                    </a>
                </p>
            </address>

            <!-- Схема студії: image map -->
            <h3>Де знайти студію</h3>
            <img
                src="/images/studio-floor-plan.png"
                alt="Схема першого поверху: студія — кімната 102, ліворуч від входу"
                width="600"
                height="400"
                usemap="#studio-map"
            />
            <map name="studio-map">
                <area
                    shape="rect"
                    coords="80,120,220,200"
                    href="/contacts#studio-info"
                    alt="Студія №102 — Андрій Лисенко"
                />
                <area
                    shape="rect"
                    coords="250,80,380,160"
                    href="/contacts#reception"
                    alt="Ресепшн — запис та адміністрація"
                />
            </map>
        </section>

        <!-- ===== ПІДВАЛ ===== -->
        <footer>
            <p>
                <small>
                    &copy; 2024 Андрій Лисенко.
                    <a href="/license" rel="license"> CC BY-NC 4.0 </a> — некомерційне використання з зазначенням
                    автора.
                </small>
            </p>
            <nav aria-label="Посилання підвалу">
                <a href="/privacy">Політика конфіденційності</a>
                <a href="/sitemap.xml" type="application/xml">Карта сайту</a>
            </nav>
        </footer>
    </body>
</html>

Що демонструє цей приклад:

🔗 Посилання

Всі типи: зовнішні з rel="noopener noreferrer external", якірні (#contacts, #pricing), mailto:, tel:, download, з rel="license" та rel="next", посилання-зображення

🖼️ Зображення

Hero з fetchpriority="high", lazy-завантаження галереї, srcset + sizes, decoding="async", декоративні з alt=""

🎨 `<picture>`

Art direction (mobile vs desktop), format switching (AVIF → WebP → JPEG), комбіновані <source> з media та type

📝 Семантика

<figure> + <figcaption> для зображень та коду, <address> для контактів, <map> + <area> для схеми

Корисні посилання

Copyright © 2026