Лабораторна робота

Позиціонування в CSS

Дисципліна: Веб-технології
⏱ Час виконання: 90 хв
Максимум балів: 30 (+ 5 бонусних)
Тема
Позиціонування в CSS: position, z-index, overflow, visibility
Форма здачі
HTML/CSS файли або посилання на GitHub Pages

Мета роботи

1

Картка товару зі значком акції

position: relative + absolute · z-index

Рівень:

Створи картку товару, на якій у верхньому лівому куті розміщений значок "АКЦІЯ". При наведенні миші на картку — повинна з'являтися напівпрозора підказка з описом товару.

  • 1
    Картка має фіксований розмір (наприклад, 220×280px), зображення-заглушка (можна кольоровий блок), назва та ціна товару
  • 2
    Значок "АКЦІЯ" розміщений у верхньому лівому куті картки через position: absolute
  • 3
    Підказка (overlay) при наведенні покриває картку напівпрозорим фоном з описом — також через position: absolute
  • 4
    Значок "АКЦІЯ" повинен бути поверх overlay (використай z-index)
  • 5
    Перехід overlay — плавний (transition: opacity .3s)
📐 Очікувана структура
[ зображення ]
Назва товару
₴ 599
АКЦІЯ
Опис товару при наведенні
HTML — стартова структура
<div class="card">
  <div class="card__image"></div>
  <div class="card__badge">АКЦІЯ</div>
  <div class="card__overlay">
    <p>Опис товару...</p>
  </div>
  <div class="card__info">
    <h3>Назва товару</h3>
    <p class="card__price">₴ 599</p>
  </div>
</div>
💡 Підказка (натисни якщо застряг)
Батьківській .card дай position: relative; overflow: hidden.
Значку .card__badge: position: absolute; top: 8px; left: 8px; z-index: 2.
Overlay .card__overlay: position: absolute; inset: 0; opacity: 0; z-index: 1, а на .card:hover .card__overlayopacity: 1.

Критерії оцінювання

Правильна структура HTML2 бали
position: relative на картці, absolute на значку і overlay3 бали
z-index: значок поверх overlay2 бали
Плавна анімація overlay при hover2 бали
Загальний вигляд та охайність коду1 бал
2

Сторінка з фіксованою навігацією та скролом

position: fixed · sticky · overflow · visibility

Рівень:

Створи односторінковий лендінг з фіксованою навігацією, яка залишається на екрані при прокручуванні. Кнопка "↑ Вгору" з'являється після прокрутки 200px і зникає коли вгорі. Секції мають "липкі" підзаголовки.

  • 1
    Навігаційна панель зверху: position: fixed, займає всю ширину, завжди видима при скролі
  • 2
    Мінімум 3 секції контенту (достатньо для появи скролу), кожна з підзаголовком position: sticky; top: 60px (60px — висота навбару)
  • 3
    Кнопка "↑" у нижньому правому куті: position: fixed. Використовує visibility: hidden коли прихована (не display: none) — для плавної анімації opacity
  • 4
    Бічна панель чи блок із overflow-y: auto; max-height: 200px — scrollable список пунктів
  • 5
    JavaScript: слухач scroll на window, що перемикає видимість кнопки "↑"
JS — підказка для кнопки "вгору"
const btn = document.querySelector('.scroll-top');

window.addEventListener('scroll', () => {
  if (window.scrollY > 200) {
    btn.style.visibility = 'visible';
    btn.style.opacity = '1';
  } else {
    btn.style.visibility = 'hidden';
    btn.style.opacity = '0';
  }
});

btn.addEventListener('click', () => {
  window.scrollTo({ top: 0, behavior: 'smooth' });
});
💡 Підказка щодо sticky підзаголовків
Липкий підзаголовок повинен мати position: sticky; top: 60px, де 60px — це висота фіксованого навбару. Якщо написати top: 0, підзаголовок прилипне під навбаром і той його перекриє. Також переконайся, що жоден батьківський елемент не має overflow: hidden.

Критерії оцінювання

position: fixed навбар, завжди видимий2 бали
position: sticky підзаголовки секцій2 бали
Кнопка "вгору" з visibility (не display:none)2 бали
JavaScript: кнопка з'являється при скролі 200px2 бали
overflow-y: auto блок зі скролом2 бали
3

Модальне вікно + бонус

position: fixed · z-index · overflow: hidden на body

Рівень:

Реалізуй модальне вікно (popup / dialog). Кнопка "Відкрити" відображає напівпрозорий backdrop та вікно по центру екрану. При відкриті модалки — сторінка позаду не прокручується. Клік на backdrop або кнопку ✕ закриває вікно.

  • 1
    Backdrop: position: fixed; inset: 0; background: rgba(0,0,0,.6); z-index: 100
  • 2
    Модальне вікно: position: fixed; top: 50%; left: 50%; transform: translate(-50%,-50%); z-index: 101
  • 3
    При відкритті модалки: document.body.style.overflow = 'hidden' (сторінка не скролиться)
  • 4
    При закритті: overflow повертається до 'auto'
  • 5
    Кнопка ✕ у правому верхньому куті модалки — теж через position: absolute
HTML — структура модалки
<!-- Тригер -->
<button id="openModal">Відкрити</button>

<!-- Backdrop -->
<div class="modal-backdrop" id="backdrop">
  <!-- Вікно -->
  <div class="modal">
    <button class="modal__close" id="closeModal"></button>
    <h2>Заголовок модалки</h2>
    <p>Вміст...</p>
  </div>
</div>
💡 Підказка щодо центрування та backdrop
Трюк top: 50%; left: 50%; transform: translate(-50%, -50%) — класичний спосіб центрування абсолютного/фіксованого елемента. Спочатку лівий верхній кут вікна в центрі екрану, потім transform зміщує його на половину власної ширини/висоти назад.

Щоб клік на backdrop (але не на вікно) закривав модалку, порівняй event.target === backdrop.

⭐ Бонусне завдання (+5 балів)

Додай анімацію появи модалки: вікно "вїжджає" знизу (translateY) і стає видимим (opacity 0→1) за 0.3с. Для цього використай CSS-клас .modal--visible, який додається/прибирається через JS.

Критерії оцінювання

Backdrop: position: fixed; inset: 0; z-index правильний2 бали
Модалка центрована через transform: translate2 бали
overflow: hidden на body при відкритті2 бали
Кнопка ✕ через position: absolute1 бал
Закриття по кліку на backdrop1 бал
⭐ Бонус: анімація появи/зникнення+5 балів

Порядок здачі роботи

  1. Кожне завдання — в окремому HTML-файлі: task1.html, task2.html, task3.html
  2. CSS може бути в тому самому файлі (в тегу <style>) або в окремому .css файлі
  3. Завантажити на курс у Moodle або надіслати посилання на GitHub / CodePen
  4. Код має бути охайним: відступи, зрозумілі назви класів (BEM або власна логіка)
Загальна сума: 30 балів основних + 5 бонусних
Завдання 1: 10 б Завдання 2: 10 б Завдання 3: 10 б