Ось твій урок у стилі CS50 та David Malan. Високий темп, жива мова, фокус на розумінні суті, а не зубрінні.
🎓 CS50: CSS Positioning. Магія розташування
Привіт, друзі! Це CS50, і сьогодні ми зламаємо фізику веб-сторінки.
1. 🔥 Вступ: Коли стандартних правил замало
Уявіть, що ви пишете статтю у Word. Ви пишете речення, воно закінчується, починається нове. Абзац за абзацом, зверху вниз. Це логічно, правда? Це називається "Нормальний потік документа" (Normal Flow).
Але подивіться на сучасний веб-сайт. * Чому кнопка "Чат з підтримкою" завжди висить у правому нижньому кутку, навіть коли ви скролите сторінку? * Як зробити бейдж "ЗНИЖКА" поверх фотографії товару? * Чому навігаційне меню прилипає до верху екрана, коли ви читаєте статтю?
Риторичне питання: Якби ми користувалися лише стандартними правилами "зверху-вниз", чи змогли б ми це зробити? Ні.
Уявіть собі кімнату, повну коробок (це ваші <div>).
* У звичайному житті ви ставите коробки одна на одну.
* Але CSS Positioning дозволяє вам взяти одну коробку і прибити її цвяхом до стелі, або змусити її левітувати над іншими, або приклеїти до скла вашого монітора.
Сьогодні ми розберемося, як керувати гравітацією на вашому сайті. Поїхали!
2. 🧠 Теоретична база (Що там "під капотом"?)
У CSS є властивість position. Вона має 5 основних значень. Давайте розберемо їх не як терміни з підручника, а як поведінкові моделі.
1. static (Статичний — "За замовчуванням")
Це те, що ви маєте, якщо нічого не чіпаєте.
* Логіка: Елемент пливе за течією. Один за одним.
* Важливо: Властивості top, bottom, left, right та z-index на нього НЕ діють.
* Аналогія: Цегла у стіні. Вона стоїть там, де її поклали.
2. relative (Відносний — "Привид")
Ось тут починається магія. * Логіка: Елемент залишається у потоці (інші елементи "думають", що він досі на своєму місці), АЛЕ ви можете зсунути його візуально. * Як це працює: Якщо ви зсунете його на 20px вправо, на його старому місці залишиться порожнеча. * Аналогія: Ви встали зі стільця і зробили крок вбік. Ваше місце все ще зайняте (ніхто не може туди сісти), але фізично ви знаходитесь трохи збоку.
3. absolute (Абсолютний — "Самотній вовк")
Це найпотужніший і найнебезпечніший інструмент новачка.
* Логіка: Елемент виривається з нормального потоку. Інші елементи ігнорують його і займають його місце, наче його ніколи й не було.
* Головне правило (Запам'ятайте це!): Він позиціонується відносно найближчого батьківського елемента, у якого position НЕ static. Якщо такого немає — він летить аж до самого вікна браузера (<body>).
* Аналогія: Наклейка на коробці. Куди рухається коробка (батько), туди й наклейка.
4. fixed (Фіксований — "Наліпка на моніторі")
- Логіка: Елемент виривається з потоку, як і
absolute, але він позиціонується відносно вікна браузера (viewport). - Ефект: Ви скролите сторінку, а елемент стоїть на місці.
- Аналогія: Бруд на вашому окулярі. Ви крутите головою, дивитесь на різні речі, але ця пляма завжди перед очима в одному й тому ж місці.
5. sticky (Липкий — "Гібрид")
Найсучасніший варіант.
* Логіка: Він поводиться як relative, поки ви скролите, але як тільки він доходить до певної точки екрана — стає fixed.
* Аналогія: Ви котите візок у супермаркеті. Поки ви йдете, він їде. Але як тільки він впирається в касу, він зупиняється.
3. 🧪 Приклади (Lab time!)
Приклад 1: Relative vs Static
Уявіть код:
.box { position: relative; top: 20px; left: 20px; }
Питання до вас: Що станеться з текстом, який йде ОДРАЗУ після цього блоку? Він посунеться вниз? Відповідь: Ні! Текст підлізе під (або над) наш блок. Тому що старе місце блоку "заброньоване". Це часто плутає новачків.
Приклад 2: Класика жанру — Absolute всередині Relative
Це "Святий Грааль" верстки карток товарів. Нам треба розмістити іконку "Хіт продажів" у кутку картки.
<!-- Батько -->
<div class="card" style="position: relative;">
<img src="sneakers.jpg">
<!-- Дитина -->
<span class="badge" style="position: absolute; top: 10px; right: 10px;">
SALE
</span>
</div>
Чому це працює?
1. Ми сказали .card: "Ти — точка відліку" (position: relative).
2. Ми сказали .badge: "Стань у правий верхній кут відносно своєї картки" (absolute).
3. Якби ми забули position: relative у картки, де опинився б бейдж? Правильно, у правому верхньому кутку всієї сторінки!
4. 🛠 Практична частина
Час кодити! Відкрийте редактор (CodePen, VS Code) і виконайте ці завдання.
Завдання 1: "Привид"
Створіть три квадрати (div) різного кольору, що йдуть один за одним.
* Середньому квадрату дайте position: relative, top: 50px, left: 50px.
* Переконайтеся, що третій квадрат не зрушив з місця, а простір між 1-м і 3-м залишився порожнім.
Завдання 2: "Аватарка з індикатором"
Зробіть коло (аватарку).
* Додайте маленьке зелене коло (індикатор "Онлайн") поверх аватарки в правому нижньому кутку.
* Підказка: Батько — relative, індикатор — absolute. Використовуйте bottom і right.
Завдання 3: "Набридлива реклама"
Створіть кнопку "Купи мене!", яка завжди знаходиться внизу екрана по центру, скільки б тексту на сторінці ви не написали.
* Підказка: position: fixed.
Завдання 4: "Липкий заголовок"
Створіть довгий список тексту. Зробіть заголовок <h2>, який при скролі "прилипає" до верху на відступі 10px.
* Увага: Для роботи sticky обов'язково треба задати top (наприклад, top: 0 або top: 10px). Без цього магія не спрацює!
Завдання 5: Міні-кейс "Випадаюче меню"
Подумайте, як зробити просте випадаюче меню. У вас є кнопка, а під нею — прихований список посилань. Коли список з'являється, він має бути ПОВЕРХ контенту, а не розсувати його.
* Яке позиціонування потрібне списку? (Відповідь — absolute).
5. 💡 Мислення як у розробника
Ось вам кілька інсайдів, щоб ви не наступали на граблі, на яких танцювали ми всі.
-
Синдром "Абсолютного хаосу": Новачки часто намагаються зверстати ВЕСЬ сайт на
position: absolute.- Чому це погано: Ваш сайт перестане бути гнучким. На мобільному телефоні все поїде, елементи налізуть один на одного.
- Як думає профі: Абсолютне позиціонування — це як спеції. Використовуйте його для дрібних деталей (іконки, бейджі, модальні вікна, тултіпи). Для основного макету використовуйте Flexbox або Grid (про них — на наступних уроках).
-
Проблема
z-index: Коли ви починаєте накладати елементи (absolute,fixed), вони можуть перекрити те, що не треба.- Властивість
z-indexкерує віссю Z (ближче/далі від очей користувача). - Порада: Не пишіть
z-index: 999999. Це поганий тон. Створіть систему (наприклад, меню = 100, модалка = 1000).
- Властивість
-
Не забувайте про
relativeу батька! Якщо вашabsoluteелемент полетів невідомо куди — 99% гарантії, що ви забулиposition: relativeу контейнера.
6. 🧩 Підсумок
Отже, що ми маємо у своєму арсеналі?
- Static: Просто потік. Нудно, надійно.
- Relative: Зсув без впливу на сусідів. База для абсолютів.
- Absolute: Повна свобода всередині батька. Для накладання шарів.
- Fixed: Прив'язка до екрана. Для меню та чатів.
- Sticky: Розумне прилипання при скролі.
Тепер ви можете не просто складати блоки в стовпчик, а створювати складні, інтерактивні інтерфейси, нашаровувати елементи та фіксувати навігацію.
Що далі?
Ви, напевно, помітили, що розставляти великі блоки (як колонки сайту) за допомогою position — це пекло. Має ж бути спосіб простіше?
Він є. На наступному уроці ми познайомимося з Flexbox — системою, яка змінила веб назавжди.
А поки що — це був CS50. Практикуйтесь!