🕐 9 хв читання

Спливаючі елементи

Конспект лекції: контентні та декоративні зображення, float, clearfix, обтікання та позиціювання елементів

1. Контентне vs декоративне зображення

Є два способи додати зображення на сторінку — через HTML і через CSS. Вони не взаємозамінні.

Спосіб Технологія Коли використовувати
<img> HTML Зображення є частиною контенту — товар, аватар, фото квартири
background-image CSS Зображення декоративне — фон шапки, абстрактна текстура
Як визначити тип: подумки приберіть зображення зі сторінки. Якщо втрачається важлива інформація (фото товару, квартири) — це контент → <img>. Якщо нічого суттєвого не змінилось — це декорація → background-image.

2. Фонове зображення — базовий набір властивостей

Для декоративних фонів (hero-банер, шапка з фото) майже завжди використовується один і той самий набір:

.hero {
    background-image: url("img/hero.jpg");
    background-repeat: no-repeat;
    background-position: center;
    background-size: cover;
    background-color: #000;
}
Властивість Значення Що робить
background-image url("...") Підключає зображення
background-repeat no-repeat Забороняє дублювання картинки
background-position center Центрує по горизонталі та вертикалі
background-size cover Заповнює блок повністю, зберігаючи пропорції
background-color #000 Запасний фон, якщо зображення не завантажиться
Завжди додавайте background-color! Якщо зображення не завантажиться або завантажується повільно — текст залишиться читабельним (білий текст на чорному фоні, а не білий на білому).

cover vs contain

Значення Поведінка Коли використовувати
cover Заповнює весь блок, зайве обрізає Фонові зображення банерів, шапок
contain Вписує повністю, нічого не обрізає Іконки в псевдоелементах, логотипи

3. position: absolute — поведінка та властивості

Коли елементу задають position: absolute, він радикально змінює поведінку:

  • Ширина та висота вираховуються за кількістю контенту (а не на 100% батька)
  • Елемент стає невидимим для сусідів і батьківського елемента — ніби його немає в розмітці
  • Батько не враховує абсолютний елемент при розрахунку своїх розмірів
  • Сусідні елементи займають його місце
  • Елемент розміщується поверх звичайних блоків

Керування позицією: top, right, bottom, left

Абсолютний елемент переміщується за допомогою чотирьох властивостей:

.element {
    position: absolute;
    top: 0;     /* 0 від верхнього краю */
    left: 20px;  /* 20px від лівого краю */
}
Комбінація Результат
top: 0; left: 0; Лівий верхній кут
top: 0; right: 0; Правий верхній кут
bottom: 0; left: 0; Лівий нижній кут
bottom: 0; right: 0; Правий нижній кут

Розтягування абсолютного елемента

Якщо ширина не задана явно, а вказано left: 0 і right: 0 — елемент розтягнеться на всю доступну ширину. Те саме працює для вертикалі з top: 0 і bottom: 0:

.overlay {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
}
Якщо задана ширина (наприклад, width: 300px) і одночасно left: 0; right: 0 — елемент не розтягнеться, а притиснеться до лівого краю. Значення right буде проігноровано.

4. position: relative — збереження поведінки

На відміну від absolute, значення position: relative не змінює стандартну поведінку блока:

  • Блочний елемент залишається блочним, рядковий — рядковим
  • Елемент займає місце в потоці документа, як і раніше
  • Сусіди та батько його враховують у розрахунках

Два головних призначення position: relative

  1. Активація z-index — без position властивість z-index не працює
  2. Контекст позиціювання — батьківський елемент з position: relative стає точкою відліку для дочірніх position: absolute

5. Контекст позиціювання (relative + absolute)

Елемент з position: absolute вираховує свої top/left/right/bottom від найближчого батьківського елемента з position: relative (або absolute, fixed).

/* Батько — точка відліку */
.parent {
    position: relative;
}

/* Дитина — позиціюється відносно .parent */
.child {
    position: absolute;
    top: 0;
    right: 0;
}
Без position: relative у батька абсолютний елемент позиціюється відносно першого екрана (viewport). При прокрутці він «від'їде» разом з видимою областю — це типова помилка.

Алгоритм пошуку контексту:

  1. Перевірити свого безпосереднього батька — чи є в нього position: relative?
  2. Якщо ні — перевірити наступного батька вгору по DOM
  3. Якщо жоден батько не має position — позиціювання відбувається відносно viewport

6. z-index — порядок накладання

Властивість z-index керує тим, який елемент відображається поверх іншого при накладанні.

  • Більше значення — елемент ближче до користувача (поверх інших)
  • Працює лише з елементами, у яких задано position (relative, absolute, fixed)
  • Без z-index — порядок визначається позицією в HTML (елемент нижче в коді — вище в накладанні)
  • При однаковому z-index — діє правило порядку в HTML
/* Без z-index: третій елемент поверх усіх */
.box-1 { position: absolute; }
.box-2 { position: absolute; }
.box-3 { position: absolute; }

/* З z-index: перший елемент поверх усіх */
.box-1 { position: absolute; z-index: 2; }

7. Техніка затемнення фону (overlay)

Класична задача: фоновий банер із затемненням і білим текстом поверх. Затемнення обов'язково робимо через CSS, а не в графічному редакторі — бо зображення може бути динамічним (змінюватись через CMS).

Ідея

  1. Створити псевдоелемент ::after
  2. Розтягнути його на весь блок через position: absolute
  3. Задати напівпрозорий чорний фон через rgba()
  4. Текст винести на передній план через z-index

Повний приклад

/* HTML: <section class="hero"><div class="hero__content">...</div></section> */

/* 1. Батьківський блок */
.hero {
    position: relative;         /* контекст для ::after */
    background-image: url("img/hero.jpg");
    background-repeat: no-repeat;
    background-position: center;
    background-size: cover;
    background-color: #000;
}

/* 2. Затемнюючий шар */
.hero::after {
    content: "";
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background-color: rgba(0, 0, 0, 0.5);
}

/* 3. Контент поверх затемнення */
.hero__content {
    position: relative;         /* активує z-index */
    z-index: 1;                 /* вище за ::after */
    color: #fff;
}
Чому ::after, а не окремий <div>? Порожній блок без змісту не потрібен у HTML. Псевдоелемент — ідеальний інструмент для декоративних шарів.

8. text-transform — зміна регістру через CSS

Заголовок великими літерами потрібно писати звичайним текстом у HTML, а трансформувати через CSS:

.hero__title {
    text-transform: uppercase;
}
Значення Результат Приклад
none Без змін (за замовчуванням) Привіт Світ
uppercase Усі великі ПРИВІТ СВІТ
lowercase Усі малі привіт світ
capitalize Кожне слово з великої Привіт Світ
Не пишіть «ВЕЛИКИМИ» в HTML! HTML описує контент, а не оформлення. Використовуйте text-transform у CSS.

9. Блок соціальних мереж — правильна розмітка

Блок із посиланнями на соцмережі — це список посилань. Іконки — це декоративні зображення, а не контент.

Розмітка

<address class="social">
    <ul class="social__list">
        <li class="social__item">
            <a href="https://facebook.com/…" class="social__link social__link--facebook">
                <span class="social__text">Facebook</span>
            </a>
        </li>
        <li class="social__item">
            <a href="https://instagram.com/…" class="social__link social__link--instagram">
                <span class="social__text">Instagram</span>
            </a>
        </li>
        <li class="social__item">
            <a href="https://youtube.com/…" class="social__link social__link--youtube">
                <span class="social__text">YouTube</span>
            </a>
        </li>
    </ul>
</address>

Чому саме так?

  • <address> — семантичний тег для контактної інформації (адреса, телефон, соцмережі). Не для кнопок «Поділитися»
  • Два класи на кожному посиланні: спільний (social__link) — для загальних стилів; унікальний (social__link--facebook) — для індивідуальної іконки та кольору
  • Текст у <span> — приховується візуально, але доступний для скрінрідерів та пошукових систем

CSS — два класи

/* Загальні стилі — однаковий розмір, форма, background */
.social__link {
    display: inline-block;
    width: 40px;
    height: 40px;
    background-repeat: no-repeat;
    background-position: center;
    background-size: contain;
    background-color: #3b5998;  /* базовий колір */
}

/* Унікальні стилі — іконка та колір */
.social__link--facebook  { background-image: url("img/fb.svg"); }
.social__link--instagram {
    background-image: url("img/ig.svg");
    background-color: #e1306c;
}
.social__link--youtube {
    background-image: url("img/yt.svg");
    background-color: #ff0000;
}
Перевага патерну «два класи»: загальний код зібрано в одному місці. Якщо змінився розмір іконок — правимо тільки .social__link, а не кожну мережу окремо.

10. Тег <address> — стиль за замовчуванням

Тег <address> має стиль за замовчуванням: font-style: italic. Якщо курсив не потрібен — скиньте його:

address {
    font-style: normal;
}
Часта помилка: розробники забувають про курсив <address> і витрачають час на пошук причини, чому текст став похилим.

11. margin vs padding — коли що використовувати

Ситуація Властивість Приклад
Відступ між сусідніми (паралельними) елементами margin Відстань між пунктами меню, між карточками
Відступ від батька до дитини (внутрішній) padding Поля всередині шапки, відступ контенту від краю секції
Шапка сайту: логотип зліва, меню справа. Відступ від верху/низу шапки до контенту — це padding-top / padding-bottom для <header>. Відступи між пунктами меню — це margin-left або margin-right для кожного <li>.
Важливий нюанс: якщо у блока є фоновий колір або зображення — тільки padding буде «всередині» фону. margin залишиться за межами фону. У таких випадках вибір очевидний.

12. Типові випадки position: absolute

position: absoluteне для розміщення основного контенту на сторінці. Основні елементи повинні бути звичайними блоками з margin, padding, Flexbox або Grid.

Типові випадки для absolute:

  • Затемнюючий overlay — маска поверх фону (розділ 7)
  • Елемент, що виступає за межі свого блока (наприклад, фото, що «виглядає» з секції)
  • Декоративні іконки — додаються через ::before/::after, позиціюються абсолютно
  • Бейджі та мітки — «Новинка», «-20%» на кутку карточки товару
  • Випадаючі меню — не повинні зсувати основний контент

13. Робота з макетами — інструменти та вимірювання

Для верстки за макетом потрібно вміти вимірювати відстані, кольори та розміри. Сучасні інструменти:

Інструмент Тип Примітки
Figma Онлайн-редактор Найзручніший для верстальника: працює у браузері, автоматично показує відстані, кольори, шрифти
Photoshop Десктоп Відкриває PSD-файли. Потребує ручного вимірювання лінійкою та напрямними
Zeplin Онлайн-сервіс Приймає макети з Figma, Sketch, Adobe XD. Зручний для колаборації дизайнерів і розробників

Основи роботи з PSD у Photoshop

  • Одиниці вимірювання: в налаштуваннях поставте пікселі (Edit → Preferences → Units & Rulers)
  • Відкривайте саме .psd файл, а не .jpg/.png — лише в PSD є шари
  • Шари (Layers): кожен елемент макету — окремий шар. Панель шарів — справа
  • Автовибір: інструмент у верхньому лівому куті — клацаєте на елемент у макеті, підсвічується його шар
  • Напрямні (Guides): тягніть з лінійки на макет для точних вимірювань
  • Лінійка (Ruler tool): вимірює відстань між двома напрямними з точністю до пікселя
Дробні значення при вимірюванні (наприклад, 900.33 px) — завжди округлюйте. Пікселі неподільні: 900.33 = 900 px.
Відстані між текстовими елементами неможливо виміряти ідеально точно. У кожного шрифту є внутрішні відступи (залежать від font-size та line-height). Для піксельної точності використовуйте техніку pixel perfect — накладання макету на верстку.

14. Типи шарів у Photoshop

Тип Позначення Призначення
Текстовий Літера T Будь-який текст у макеті
Зображення Мініатюра Фото, ілюстрації, іконки
Фон Кольоровий квадрат Заливка кольором
Маска Чорно-білий прямокутник Обрізає або модифікує інший шар
Smart Object Іконка з квадратиком Група шарів, згорнута в один. Подвійний клік відкриє вміст

15. Підсумкова таблиця

Тема Ключове
Контент vs декор <img> — контент; background-image — декорація
Фоновий набір background-image + no-repeat + center + cover + background-color
cover vs contain cover заповнює блок (обрізає); contain вписує повністю
position: absolute Виймає з потоку, позиціюється через top/left/right/bottom
position: relative Не змінює поведінку; активує z-index; створює контекст для absolute
z-index Керує порядком накладання; потребує position
Overlay (затемнення) ::after + absolute + rgba(); текст виносимо через relative + z-index: 1
text-transform uppercase / lowercase / capitalize / none
Блок соцмереж Список посилань; текст прихований; іконки через CSS; <address> для контактів
<address> Семантика контактної інформації; за замовчуванням font-style: italic
margin vs padding margin — між сусідами; padding — від батька до дитини
Figma / Photoshop Figma — найзручніший; PSD — відкривати в Photoshop, одиниці — пікселі
🔍
Почніть вводити назву лекції або тему