Навчитися працювати з об’єктною моделлю документа (DOM) для створення динамічних інтерфейсів. Реалізувати повноцінне “Модальне вікно” кошика покупок, яке відкриватиметься поверх контенту сайту при натисканні на кнопку кошика в навігації.
position: fixed, z-index).classList.add).cart всередину списку в модальному вікні.Увага: Продовжуємо роботу над інтернет-магазином “TechShop”. В нас вже є кнопка кошика в Header (з ПР №7) і масив cart (з ПР №10), але досі ми виводили суму лише в консоль. Час показати її користувачеві візуально.
У файл index.html, одразу ПЕРЕД закриваючим тегом </body>, додайте структуру модалки:
<!-- Темний напівпрозорий фон, який перекриває весь сайт -->
<div class="modal-overlay hidden" id="cartOverlay">
<!-- Саме біле вікно кошика по центру -->
<div class="modal-window">
<div class="modal-header">
<h2>Ваш Кошик</h2>
<button class="close-btn" id="closeCartBtn">×</button>
</div>
<!-- Тут JS малюватиме додані товари -->
<div class="cart-items" id="cartItemsContainer">
<p>Кошик порожній.</p>
</div>
<div class="modal-footer">
<h3>Разом: <span id="cartTotalSum">0</span> грн</h3>
<!-- Посилання на нашу форму оформлення з ПР №6 -->
<a href="checkout.html" class="btn btn-primary" id="checkoutBtn"
>Оформити замовлення</a
>
</div>
</div>
</div>
style.css):
Задайте стилі для Overlay (position: fixed, щоб він не прокручувався разом зі сторінкою) та віконця по центру (через display: flex; align-items: center або transform):
.modal-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(0, 0, 0, 0.5); /* Напівпрозорий чорний */
display: flex;
justify-content: center;
align-items: center;
z-index: 1000; /* Вікно поверх усього іншого на сторінці */
transition: opacity 0.3s ease;
}
.modal-window {
background: #fff;
padding: 2rem;
border-radius: 8px;
width: 90%;
max-width: 500px;
max-height: 80vh;
overflow-y: auto; /* Дозволяємо скролити список всередині вікна, якщо багато товарів */
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.2);
}
.close-btn {
background: transparent;
border: none;
font-size: 1.5rem;
cursor: pointer;
}
/* Утиліта приховування, якщо ви ще не створили її в ПР №11 */
.hidden {
display: none !important;
opacity: 0;
}
main.js):
Знайдіть ваші кнопки та оверлей:
const cartButton = document.querySelector(".btn-cart"); // Ваша кнопка в Header з SVG (ПР №7)
const cartOverlay = document.getElementById("cartOverlay");
const closeBtn = document.getElementById("closeCartBtn");
// Функція відкриття
function openCartModal() {
cartOverlay.classList.remove("hidden");
renderCartItems(); // Оновлюємо список перед тим як показати
}
// Функція закриття
function closeCartModal() {
cartOverlay.classList.add("hidden");
}
// Вішаємо слухачі
cartButton.addEventListener("click", openCartModal);
closeBtn.addEventListener("click", closeCartModal);
// Закриття кліком по темному фону (оверлею) повз вікно
cartOverlay.addEventListener("click", (event) => {
if (event.target === cartOverlay) {
closeCartModal();
}
});
renderCartItems):
updateUI() з ПР №10, або в окремій функції renderCartItems(), переберіть масив cart і створіть HTML для КОЖНОГО товару в кошику (картинка, назва, ціна, та кнопки “плюс”/”мінус”). Вставте цей рядок у <div id="cartItemsContainer">.<span id="cartTotalSum"> за допомогою виклику вашої старої функції обчислення calculateTotal().git add . та git commit -m "Implement interactive Cart Modal".main.У проектах з’явилася складна взаємодія з DOM. Інтернет-магазин став відчуватися як повноцінний додаток: кошик працює поверх сторінки, плавно з’являється і зникає, та візуалізує всі бізнес-операції.
position: fixed;, а не position: absolute;? Що сталося б, якби модалка була відкритою, а користувач прокрутив (просролив) сторінку вниз?header, z-index тощо)?classList (в JavaScript) дозволяє швидко додавати або забирати клас .hidden у відповідь на подію кліку без написання if...else? (Підказка: є метод add, remove, та ?)if (event.target === cartOverlay) у функції закриття фону? Що сталося б без цієї перевірки, якби користувач клікнув просто на саме біле вікно з товаром?setTimeout. Якщо ми хочемо зробити модалку не тільки display: none, але й плавно прозорою (opacity), як JS і таймери можуть допомогти в організації анімації CSS?