Посилання та зображення в HTML
Посилання та зображення в HTML
Навіщо гіперпосилання змінили світ
1989 рік. Тім Бернерс-Лі пише пропозицію для CERN і формулює концепцію, яка перевернула спосіб поширення знань. Ключова ідея проста і геніальна: документи повинні посилатися один на одного. Не копіювати інформацію — а посилатися на неї.
Цей принцип, який ми сьогодні сприймаємо як даність — клікабельне посилання в тексті — лежить в основі Всесвітньої павутини. Без тегу <a> інтернет був би набором ізольованих сторінок-островів.
Тег <img> з'явився пізніше — у 1993 році в браузері Mosaic. Марк Андрессен запропонував елемент, що дозволяв вбудовувати зображення безпосередньо в текст. До цього в «мережі» були лише слова.
Сьогодні ми розберемо обидва елементи так, як їх визначає HTML Living Standard (WHATWG) — актуальна жива специфікація, яку підтримують всі сучасні браузери.
Тег <a> — Гіперпосилання
Що каже специфікація
За визначенням HTML Living Standard, елемент <a> (anchor — якір) представляє гіперпосилання або заповнювач для нього. Якщо присутній атрибут href — це гіперпосилання. Якщо href відсутній — це заповнювач (placeholder), де посилання могло бути.
<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 (змішаний вміст).
Відносна адреса — відносно поточного документа або кореня сайту:
<!-- Відносно поточної директорії -->
<a href="about.html">Про нас</a>
<a href="contacts/index.html">Контакти</a>
<!-- Відносно кореня сайту (починається з /) -->
<a href="/products">Каталог</a>
<a href="/blog/2024/my-article">Стаття</a>
<!-- На рівень вище (../) -->
<a href="../index.html">Повернутися до головної</a>
Посилання на конкретний елемент на поточній або іншій сторінці:
<!-- Посилання на елемент з id="contacts" на ПОТОЧНІЙ сторінці -->
<a href="#contacts">Перейти до контактів</a>
<!-- Посилання на елемент на ІНШІЙ сторінці -->
<a href="/about#team">Наша команда</a>
<!-- Прокрутка до початку сторінки -->
<a href="#">Вгору ↑</a>
<!-- Краще: -->
<a href="#top">Вгору ↑</a>
<!-- Мета-визначення якоря: -->
<section id="contacts">
<h2>Контакти</h2>
<!-- ... -->
</section>
Спеціальні схеми URL:
<!-- Відкриває поштовий клієнт -->
<a href="mailto:info@example.com">Написати нам</a>
<!-- З темою та тілом листа (URL-кодування) -->
<a href="mailto:support@company.com?subject=Запит%20підтримки&body=Доброго%20дня%2C"> Звернутися до підтримки </a>
<!-- Телефонний дзвінок (важливо для мобільних!) -->
<a href="tel:+380441234567">+38 (044) 123-45-67</a>
<!-- SMS -->
<a href="sms:+380441234567">Надіслати SMS</a>
Атрибут download змушує браузер завантажити файл замість відображення:
<!-- Завантаження файлу з його оригінальною назвою -->
<a href="/files/report-2024.pdf" download>Завантажити звіт</a>
<!-- Завантаження з перейменуванням -->
<a href="/api/export/users.csv" download="список-користувачів.csv"> Експортувати CSV </a>
<!-- Завантаження зображення -->
<a href="/images/logo.svg" download="logo-brand.svg"> Завантажити логотип </a>
Атрибут download працює лише для посилань на той самий origin (той самий домен + протокол + порт). Для зовнішніх URL браузер ігнорує download з міркувань безпеки.
Атрибут 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 | Посилання на ліцензію контенту |
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" />
Зображення не несе інформації — alt залишаємо порожнім (alt=""). Скринрідери пропускають такі зображення:
<!-- Декоративна хвиля-роздільник -->
<img src="wave-divider.svg" alt="" />
<!-- Іконка-прикраса поруч з текстом -->
<p>
<img src="star-icon.svg" alt="" />
Рейтинг: 4.8 з 5
</p>
<!-- Фотографія-ілюстрація, яку повністю описує підпис figure -->
<figure>
<img src="hero-photo.jpg" alt="" />
<figcaption>Офіс компанії TechUA у Києві</figcaption>
</figure>
Коли зображення є єдиним вмістом посилання або кнопки — alt описує дію:
<!-- alt = те, що робить посилання/кнопка -->
<a href="/"><img src="logo.png" alt="Повернутися на головну" /></a>
<button type="submit">
<img src="search-icon.svg" alt="Пошук" />
</button>
<!-- Кнопка закрити -->
<button type="button">
<img src="close.svg" alt="Закрити діалог" />
</button>
Атрибути розміру: 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" />
Формати зображень: коли що використовувати
| Формат | Прозорість | Анімація | Стиснення | Підтримка | Рекомендація |
|---|---|---|---|---|---|
| JPEG | ❌ | ❌ | Добре | ✅ Всі | Фото без прозорості |
| PNG | ✅ | ❌ | Помірне | ✅ Всі | Скріншоти, точні кольори |
| WebP | ✅ | ✅ | Відмінне | ✅ Сучасні | Замінює JPEG та PNG |
| AVIF | ✅ | ✅ | Найкраще | ⚠️ Частково | Майбутнє, поки з fallback |
| SVG | ✅ | ✅ | Вектор | ✅ Всі | Іконки, логотипи, схеми |
| GIF | ✅ (1 біт) | ✅ | Погане | ✅ Всі | Уникайте — використовуйте WebP |
<picture> — адаптивні зображення
Елемент <picture> (picture) дозволяє браузеру обрати найбільш відповідне зображення з набору варіантів. Це відповідь на дві проблеми:
- Art direction — різні зображення для різних розмірів екрана (обрізка, інша композиція)
- 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>
Підсумкова таблиця: атрибути <a> та <img>
Атрибути <a>
href елемент є заповнювачем._blank, _self, _parent, _top або назва фрейму.noopener, noreferrer, nofollow, external, author, license.uk, en-US). Підказка для браузера.application/pdf). Підказка.Атрибути <img>
width.eager (за замовч.) або lazy — відкладене завантаження.async, sync, auto — стратегія декодування зображення.2x) або ширин (800w).srcset.anonymous або use-credentials. Для зображень на Canvas або з fetchpriority.high, low, auto — пріоритет завантаження. high для LCP-зображень (hero).#map-name.Практичні завдання
Створіть навігаційне меню для сайту університету. Вимоги:
- Елемент
<nav>з<ul>та п'ятьма<li> - Посилання: «Головна» (
/), «Факультети» (/faculties), «Вступнику» (/admissions), «Наука» (/research), «Контакти» (/contacts) - Посилання на контакти має відкриватися на тій же сторінці
- Посилання на зовнішній партнерський університет у рядку стану сторінки з
target="_blank"та правильнимrel
Створіть галерею із 4 фотографій. Кожна фотографія:
- Загорнута в
<figure>з<figcaption> - Посилання на збільшену версію (
/gallery/photo-N-large.jpg) зdownload - Адаптивна версія через
<picture>: WebP + JPEG fallback - Атрибути
width,height,loading="lazy",decoding="async" - Семантичний
alt(не «Фото 1», а конкретний опис)
Створіть HTML картки товару (наприклад, ноутбука) з такими елементами:
- Зображення товару —
<picture>з AVIF + WebP + JPEG,srcsetз 3 розмірами (400w,800w,1200w),sizesдля адаптивного відображення,fetchpriority="high"(товар вгорі сторінки) - Посилання на товар — з
<a>навколо зображення та назви, правильнийtitle - Завантаження брошури — посилання з
downloadта зазначеним іменем файлу - Зовнішні посилання — на офіційний сайт виробника з повним набором
rel - Карта магазинів —
<map>з<area>для 3 різних зон схеми торгового центру
Комплексний приклад від А до Я
Тема: Сторінка фотографа-документаліста — портфоліо та контакти.
Цей приклад демонструє всі теги і техніки розділу в реалістичному контексті:
<!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>
© 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", посилання-зображення🖼️ Зображення
fetchpriority="high", lazy-завантаження галереї, srcset + sizes, decoding="async", декоративні з alt=""🎨 `<picture>`
<source> з media та type📝 Семантика
<figure> + <figcaption> для зображень та коду, <address> для контактів, <map> + <area> для схемиКорисні посилання
- 📖 HTML Living Standard:
<a>— офіційна специфікація - 📖 HTML Living Standard:
<img>— офіційна специфікація - 📖 HTML Living Standard:
<picture>— офіційна специфікація - 🌐 Can I Use: WebP — підтримка браузерами
- 🌐 Can I Use: AVIF — підтримка браузерами
- 🔧 Squoosh — стиснення та конвертація зображень онлайн
- 🔧 WebAIM: Accessible Link Text — доступні посилання
- ✅ W3C Nu HTML Checker — валідація HTML
Форматування тексту в HTML
Детальний розбір усіх тегів форматування тексту в HTML5: блокові та рядкові елементи, семантика vs. фізичне форматування, спецсимволи та CSS-властивості для тексту.
Списки та таблиці в HTML
Детальний розбір елементів <ul>, <ol>, <dl>, <table>, <caption>, <colgroup> за специфікацією HTML Living Standard: семантика, доступність, colspan/rowspan та коли використовувати таблиці.