
В этом тренажере вы попрактикуетесь в создании интерактивных выпадающих меню с использованием JavaScript и HTML DOM. Задания охватывают различные аспекты работы с выпадающими списками: открытие и закрытие меню по клику, добавление и удаление элементов, изменение стилей и обработка событий. Каждое задание представляет собой фрагмент кода с пропусками, которые вам нужно заполнить, чтобы достичь желаемого результата. Внимательно читайте описание и используйте подсказки, если возникнут трудности.
- Модуль 1: Основы выбора элементов
- Выбор элемента по ID.
- Выбор элементов по классу.
- Выбор элементов по тегу.
- Выбор по селектору CSS.
- Выбор по атрибуту.
- Поиск элементов внутри другого элемента.
- Поиск родительского элемента.
- Поиск соседних элементов (предыдущий, следующий).
- Поиск первого и последнего дочернего элемента.
- Поиск всех дочерних элементов.
- Модуль 2: Манипуляция содержимым
- Модуль 3: Работа с атрибутами
- Модуль 4: Управление классами
- Модуль 5: Управление стилями
- Модуль 6: Создание и удаление элементов
- Создание нового элемента.
- Вставка элемента перед другим элементом.
- Вставка элемента после другого элемента.
- Добавление элемента в определенную позицию внутри списка дочерних элементов.
- Удаление элемента из DOM.
- Замена одного элемента другим.
- Перемещение существующего элемента в другое место DOM..
- Очистка содержимого элемента без его удаления.
- Модуль 7: Обработка событий
- Модуль 8: Работа с формами
- Модуль 9: Продвинутые манипуляции
- Модуль 10: Работа с размерами и прокруткой
- Получение размеров элемента.
- Получение позиции элемента относительно окна браузера.
- Получение позиции элемента относительно родительского элемента.
- Управление прокруткой страницы.
- Определение, виден ли элемент в текущей области просмотра.
- Плавная прокрутка к элементу.
- Создание элемента, который фиксируется при прокрутке.
- Модуль 11: Работа с медиа-элементами
- Модуль 12: Практические задания
Простое открытие/закрытие меню
Создайте выпадающее меню, которое открывается при клике на кнопку "Меню" и закрывается при повторном клике. Используйте свойство `display` для управления видимостью списка. Вам нужно добавить обработчик события `click` к кнопке и изменить стиль элемента списка.
.dropdown-menu { display: none; }
<button id="menu-btn">Меню</button>
<ul id="menu-list" class="dropdown-menu">
<li>Пункт 1</li>
<li>Пункт 2</li>
<li>Пункт 3</li>
</ul>
const menuBtn = document.getElementById("menu-btn");
const menuList = document.input__1("menu-list");
menuBtn.input__2("click", () => {
if (menuList.style.display === "block") {
menuList.style.input__3 = "none";
} else {
menuList.style.display = input__4;
}
});
Добавление класса при открытии
Доработайте предыдущий пример: при открытии меню добавляйте к элементу списка класс `active`, а при закрытии - удаляйте этот класс. Это позволит вам стилизовать открытое меню с помощью CSS.
.dropdown-menu { display: none; }
.active { background-color: #f0f0f0; }
<button id="menu-btn">Меню</button>
<ul id="menu-list" class="dropdown-menu">
<li>Пункт 1</li>
<li>Пункт 2</li>
<li>Пункт 3</li>
</ul>
const menuBtn = document.getElementById("menu-btn");
const menuList = document.getElementById("menu-list");
menuBtn.addEventListener("click", () => {
if (menuList.style.display === "block") {
menuList.style.display = "none";
menuList.classList.input__1("active");
} else {
menuList.style.display = "block";
menuList.classList.input__2("active");
}
});
Закрытие меню при клике вне его
Сделайте так, чтобы меню закрывалось при клике в любом месте документа, кроме самого меню и кнопки, которая его открывает.
.dropdown-menu { display: none; }
<button id="menu-btn">Меню</button>
<ul id="menu-list" class="dropdown-menu">
<li>Пункт 1</li>
<li>Пункт 2</li>
<li>Пункт 3</li>
</ul>
const menuBtn = document.getElementById("menu-btn");
const menuList = document.getElementById("menu-list");
menuBtn.addEventListener("click", () => {
if (menuList.style.display === "block") {
menuList.style.display = "none";
} else {
menuList.style.display = "block";
}
});
document.addEventListener("click", (event) => {
if (input__1.target !== menuBtn && !menuList.contains(event.target)) {
menuList.style.display = input__2;
}
});
Выпадающее меню с подменю
Создайте выпадающее меню с вложенными подменю. При наведении на пункт меню, у которого есть подменю, оно должно отображаться. При уходе курсора с пункта меню, подменю должно скрываться.
.dropdown-menu { list-style: none; padding: 0; margin: 0; }
.dropdown-menu li { position: relative; }
.dropdown-menu ul { display: none; position: absolute; top: 100%; left: 0; background-color: #eee; padding: 0; margin: 0; list-style: none; }
.dropdown-menu li:hover > ul { display: block; }
<ul class="dropdown-menu">
<li>Пункт 1</li>
<li>
Пункт 2
<ul id="submenu-1">
<li>Подпункт 2.1</li>
<li>Подпункт 2.2</li>
</ul>
</li>
<li>Пункт 3</li>
</ul>
const submenu = document.getElementById("submenu-1");
const parentLi = submenu.input__1;
parentLi.addEventListener(input__2, () => {
submenu.style.display = "block";
});
parentLi.addEventListener("mouseout", () => {
submenu.input__3.display = "none";
});
Динамическое создание пунктов меню
Создайте выпадающее меню, пункты которого генерируются динамически из массива JavaScript. Каждый элемент массива должен стать пунктом меню.
.dropdown-menu { display: none; }
<button id="menu-btn">Меню</button>
<ul id="menu-list" class="dropdown-menu"></ul>
const menuBtn = document.getElementById("menu-btn");
const menuList = document.getElementById("menu-list");
const menuItems = ["Пункт 1", "Пункт 2", "Пункт 3"];
menuBtn.addEventListener("click", () => {
if (menuList.style.display === "block") {
menuList.style.display = "none";
} else {
menuList.style.display = "block";
}
});
for (const item of input__1) {
const li = document.createElement(input__2);
li.textContent = item;
menuList.appendChild(input__3);
}
Удаление пунктов меню
Добавьте кнопку "Удалить пункт" к каждому пункту меню. При нажатии на эту кнопку соответствующий пункт меню должен удаляться.
.dropdown-menu { display: none; }
<button id="menu-btn">Меню</button>
<ul id="menu-list" class="dropdown-menu"></ul>
const menuBtn = document.getElementById("menu-btn");
const menuList = document.getElementById("menu-list");
const menuItems = ["Пункт 1", "Пункт 2", "Пункт 3"];
menuBtn.addEventListener("click", () => {
if (menuList.style.display === "block") {
menuList.style.display = "none";
} else {
menuList.style.display = "block";
}
});
for (const item of menuItems) {
const li = document.createElement("li");
li.textContent = item;
const deleteBtn = document.createElement("button");
deleteBtn.textContent = "Удалить";
deleteBtn.addEventListener("click", () => {
li.input__1();
});
li.appendChild(deleteBtn);
input__2.appendChild(li);
}
Изменение текста пункта меню
Добавьте текстовое поле и кнопку "Изменить" рядом с каждым пунктом меню. При нажатии на кнопку текст пункта меню должен заменяться на текст из текстового поля.
.dropdown-menu { display: none; }
<button id="menu-btn">Меню</button>
<ul id="menu-list" class="dropdown-menu"></ul>
const menuBtn = document.getElementById("menu-btn");
const menuList = document.getElementById("menu-list");
const menuItems = ["Пункт 1", "Пункт 2", "Пункт 3"];
menuBtn.addEventListener("click", () => {
if (menuList.style.display === "block") {
menuList.style.display = "none";
} else {
menuList.style.display = "block";
}
});
for (const item of menuItems) {
const li = document.createElement("li");
li.textContent = item;
const input = document.createElement("input");
input.type = "text";
const changeBtn = document.createElement("button");
changeBtn.textContent = "Изменить";
changeBtn.addEventListener("click", () => {
li.textContent = input__1.value;
});
li.appendChild(input);
li.appendChild(changeBtn);
menuList.appendChild(li);
}