🕐 7 хв читання

Теги для верстки структури контенту

Конспект лекції: семантичні теги, блочна модель, рядкові та блочні елементи

Тег <div> — універсальний контейнер

  • <div> — блочний елемент для групування вмісту. Не несе жодного семантичного значення.
  • Використовується, коли жоден семантичний тег не підходить, але потрібно згрупувати елементи або застосувати спільні стилі.
  • Якщо є більш відповідний семантичний тег (<main>, <section>, <article>, <aside>) — використовуйте його замість <div>.
Принцип: спочатку семантика, потім <div>. Не обгортайте все підряд у <div> — шукайте тег із відповідним значенням.

Іменування класів

  • Англійською мовою — це стандарт індустрії. Класи українською чи іншими мовами не прийнятні.
  • Семантичні назви — клас описує призначення елемента, а не його зовнішній вигляд.
  • kebab-case — слова розділяються дефісом: course-card, main-nav, article-preview.
✅ Правильно
  • course-card
  • article-preview
  • sidebar-widget
  • main-content
❌ Неправильно
  • red-block (колір може змінитися)
  • big-text (візуальний опис)
  • left-column (позиція може змінитися)
  • kartka-kursu (не англійською)
Ніколи не називайте класи за зовнішнім виглядом. Дизайн змінюється — назви залишаються. Клас red-button стане безглуздим, якщо кнопку перефарбують у синій.

Тег <main> — основний вміст

  • <main> позначає основний унікальний контент сторінки — те, заради чого користувач відкрив сторінку.
  • Має бути один на сторінку.
  • Не включає шапку, підвал, навігацію, бічну панель — лише основний контент.
  • На сторінці статті — це текст статті. На головній сторінці блогу — стрічка публікацій.
На сайті Smashing Magazine основний контент — це текст статті. Бічна панель з рекомендаціями, шапка з навігацією — все це за межами <main>.
<body>
    <header>...</header>
    <main>
        <!-- Основний контент сторінки -->
        <h1>Заголовок статті</h1>
        <p>Текст статті...</p>
    </main>
    <footer>...</footer>
</body>

Тег <aside> — супутній контент

  • <aside> позначає контент, пов'язаний з основним, але не є його частиною.
  • Може бути всередині <main> (врізка в статті, пов'язана рекламна пропозиція) або ззовні (бічна панель, sidebar).
  • На сторінці може бути кілька <aside>.
  • Ключовий критерій — зв'язок з основним контентом. Якщо блок ніяк не пов'язаний із <main>, це не <aside>.
Стаття про штучний інтелект, а поруч — рекламний блок курсу з Data Science. Він опосередковано пов'язаний зі змістом статті → <aside>.
<!-- aside всередині main -->
<main>
    <article>...</article>
    <aside>Пов'язаний курс</aside>
</main>

<!-- aside ззовні main -->
<main>...</main>
<aside>Бічна панель</aside>

Тег <section> — тематична група

  • <section> — тематично згрупований контент, що має заголовок.
  • На відміну від <article>, <section> не є самостійним — він частина більшого контексту.
  • Якщо вирвати <section> зі сторінки, він може втратити сенс.
  • <section> може містити інші <section> або <article>.
Простий орієнтир: <section> — це, по суті, <div> із заголовком і тематичним змістом. Є заголовок і група пов'язаних елементів — використовуйте <section>.
<section>
    <h2>Інші курси</h2>
    <article>Картка курсу 1</article>
    <article>Картка курсу 2</article>
    <article>Картка курсу 3</article>
</section>

Тег <article> — незалежний контент

  • <article> — самостійна, незалежна одиниця контенту, яку можна вирвати зі сторінки й використати окремо.
  • У <article> обов'язково має бути заголовок.
  • Типові приклади: картка товару, новина в стрічці, пост у блозі, коментар.
  • <article> не може містити інший <article>.
<article>
  • Незалежний від контексту
  • Можна перенести в інше місце
  • Обов'язковий заголовок
  • Не вкладається сам у себе
<section>
  • Частина більшого контексту
  • При винесенні може втратити сенс
  • Заголовок бажаний
  • Може вкладатися сам у себе

Пріоритет семантичних тегів

Під час розмітки сторінки визначайте теги у такому порядку:

  1. <main> — виділіть основний контент сторінки.
  2. <aside> — знайдіть блоки, пов'язані з основним контентом.
  3. <article> — визначте незалежні самодостатні елементи.
  4. <section> — згрупуйте тематичні блоки із заголовками.
  5. <div> — все, що не підійшло під семантичні теги.
Не потрібно «страждати семантикою» і засовувати семантичні теги всюди. Основне призначення — дати загальне уявлення про структуру сторінки пошуковим системам та скрінрідерам.

Приклад розмітки сторінки

Уявімо сторінку новинного сайту зі статтею та рекомендаціями:

<body>
    <header>Шапка сайту</header>

    <main>
        <!-- Стаття — основний контент -->
        <section>
            <h1>Заголовок статті</h1>
            <p>Перша частина тексту...</p>
        </section>
        <section>
            <h2>Другий розділ</h2>
            <p>Друга частина тексту...</p>
        </section>

        <!-- Пов'язана пропозиція -->
        <aside>Спецкурс із теми статті</aside>
    </main>

    <!-- Блок рекомендованих курсів -->
    <section>
        <h2>Інші курси</h2>
        <article>Картка курсу 1</article>
        <article>Картка курсу 2</article>
    </section>

    <footer>Підвал сайту</footer>
</body>
Вивчайте розмітку якісних сайтів (наприклад, Smashing Magazine) через інспектор браузера — це допоможе розвинути «професійний погляд» на структуру сторінки.

Блочна модель (Box Model)

Кожен елемент на сторінці — це прямокутник (бокс). Браузер будує розкладку, спираючись на розміри цих боксів.

Складові елемента

  1. Контентна область (content) — область, де розміщується текст або дочірні елементи.
  2. Внутрішні відступи (padding) — простір між контентом і межею.
  3. Межа (border) — видима рамка елемента.

Елемент = content + padding + border

Що таке бокс?

Бокс = елемент + зовнішні відступи (margin). Саме боксами елементи «бачать» одне одного і взаємодіють на сторінці.

margin
border
padding
content

Формули розрахунку

  • Ширина елемента = width + padding-left + padding-right + border-left + border-right
  • Висота елемента = height + padding-top + padding-bottom + border-top + border-bottom
  • Ширина боксу = ширина елемента + margin-left + margin-right
Якщо сума ширин дочірніх елементів перевищує ширину батьківського — елементи переносяться на новий рядок. Навіть 1 зайвий піксель спричинить перенос.

Властивість box-sizing

box-sizing змінює, на що саме впливають властивості width і height.

Значення width задає Розрахунок
content-box (за замовчуванням) ширину контентної області Загальна ширина = width + padding + border
border-box ширину всього елемента Браузер автоматично зменшить контентну область
Задано width: 300px і padding: 50px.
При content-box: загальна ширина = 300 + 50 + 50 = 400px.
При border-box: загальна ширина = 300px (контент автоматично = 200px).
box-sizing не впливає на margin — це властивість боксу, а не елемента. box-sizing змінює лише поведінку width та height.
box-sizing не успадковується. Його потрібно задавати кожному елементу окремо (або через універсальний селектор *).

Рядкові та блочні елементи

Властивість display визначає, як елемент поводиться на сторінці.

display: inline (рядкові)

  • Поводяться як слова в реченні — вишиковуються одне за одним у рядок.
  • Не застосовується блочна модель: width, height, вертикальні margin — не працюють.
  • padding відображається, але не взаємодіє з сусідніми елементами (налізає на текст).
  • Розмір визначається лише внутрішнім вмістом.

Приклади: <a>, <span>, <strong>, <em>, <time>.

display: block (блочні)

  • Займають всю ширину контентної області батька за замовчуванням.
  • Застосовується повна блочна модель: width, height, margin, padding, border.
  • Кожен блочний елемент починається з нового рядка.

Приклади: <div>, <h1><h6>, <ul>, <ol>, <li>, <section>, <article>.

Особливий випадок: <p>

Тег <p> має рядковий контекст форматування (всередині — тільки рядкові елементи), але до нього застосовується блочна модель (width, margin, padding працюють).

Як перевірити тип елемента: якщо елемент за замовчуванням займає всю ширину — він блочний. Якщо його ширина дорівнює вмісту — рядковий. Або відкрийте довідник на MDN.

Зміна типу елемента

Рядковий елемент можна зробити блочним (і навпаки) через display:

/* Зробити посилання блочною */
a {
    display: block;
    width: 375px;
    margin-top: 20px;
}

Після display: block посилання:

  • Займає всю ширину батька (або задану width).
  • Реагує на margin-top, padding.
  • Починається з нового рядка.

Вирівнювання тексту: text-align

  • text-align вирівнює рядковий вміст всередині блочного елемента.
  • Застосовується до батьківського блочного елемента, а не до самого тексту.
  • Не працює для рядкових елементів (інлайнових) — вони вже частина рядка.
Щоб відцентрувати текст рядкового посилання, оберніть його в блочний елемент і задайте text-align: center обгортці.
<div class="action">
    <a href="#">Читати далі</a>
</div>

<!-- CSS -->
.action { text-align: center; }

Центрування блочного елемента

Щоб відцентрувати блочний елемент горизонтально, потрібні дві умови:

  1. Елементу задано явну ширину (width).
  2. Задано автоматичні бокові margin.
.news {
    width: 485px;
    margin-left: auto;
    margin-right: auto;
}

Браузер автоматично розподілить вільний простір порівну між лівим і правим margin.

Якщо ширина не задана — блочний елемент і так займає всю ширину батька, і центрування не має сенсу.
Не використовуйте скорочення margin: auto — воно перезапише вертикальні відступи. Задавайте margin-left: auto і margin-right: auto окремо.

Один auto-margin

  • margin-left: auto — притискає елемент вправо.
  • margin-right: auto — нічого не змінює (елемент і так ліворуч).
  • Обидва auto — елемент по центру.
Вертикальні auto-margin (margin-top: auto, margin-bottom: auto) не працюють для центрування в нормальному потоці.

Успадкування властивостей

  • Текстові властивості успадковуються: font-family, font-size, color, line-height, text-align тощо.
  • Задайте їх на body — і всі дочірні елементи отримають ці значення.
  • Властивості блочної моделі НЕ успадковуються: margin, padding, border, width, height, box-sizing.
body {
    font-family: "Segoe UI", sans-serif;
    color: #333;
    line-height: 1.6;
    /* Усі дочірні елементи успадкують ці значення */
}

Підсумок

Тема Ключове
<div> Універсальний контейнер без семантики
<main> Основний контент, один на сторінку
<aside> Супутній контент, пов'язаний з основним
<article> Незалежний контент із заголовком
<section> Тематична група із заголовком
Box Model content + padding + border = елемент; + margin = бокс
box-sizing content-box: width → контент; border-box: width → весь елемент
Рядкові vs Блочні Inline: без блочної моделі; Block: повна блочна модель
Центрування блока width + margin-left/right: auto
Успадкування Текстові — так; блочна модель — ні
🔍
Почніть вводити назву лекції або тему