В этом модуле вы научитесь создавать интерактивные фильтры для контента на веб-странице. Фильтрация — это ключевой элемент интерфейса для интернет-магазинов, галерей и списков задач. Мы пройдем путь от простого скрытия элементов через CSS и JS до создания поиска по тексту и фильтрации по категориям (data-атрибутам). Вы будете работать с методами перебора коллекций, манипуляцией классами и стилями, а также с событиями ввода данных.
- Модуль 1: Основы выбора элементов
- Выбор элемента по ID.
- Выбор элементов по классу.
- Выбор элементов по тегу.
- Выбор по селектору CSS.
- Выбор по атрибуту.
- Поиск элементов внутри другого элемента.
- Поиск родительского элемента.
- Поиск соседних элементов (предыдущий, следующий).
- Поиск первого и последнего дочернего элемента.
- Поиск всех дочерних элементов.
- Модуль 2: Манипуляция содержимым
- Модуль 3: Работа с атрибутами
- Модуль 4: Управление классами
- Модуль 5: Управление стилями
- Модуль 6: Создание и удаление элементов
- Создание нового элемента.
- Вставка элемента перед другим элементом.
- Вставка элемента после другого элемента.
- Добавление элемента в определенную позицию внутри списка дочерних элементов.
- Удаление элемента из DOM.
- Замена одного элемента другим.
- Перемещение существующего элемента в другое место DOM..
- Очистка содержимого элемента без его удаления.
- Модуль 7: Обработка событий
- Модуль 8: Работа с формами
- Модуль 9: Продвинутые манипуляции
- Модуль 10: Работа с размерами и прокруткой
- Получение размеров элемента.
- Получение позиции элемента относительно окна браузера.
- Получение позиции элемента относительно родительского элемента.
- Управление прокруткой страницы.
- Определение, виден ли элемент в текущей области просмотра.
- Плавная прокрутка к элементу.
- Создание элемента, который фиксируется при прокрутке.
- Модуль 11: Работа с медиа-элементами
- Модуль 12: Практические задания
- Создание интерактивного списка задач (todo list).
- Создание простого калькулятора.
- Создание игры "Крестики-нолики".
- Создание интерактивного календаря.
- Создание системы фильтрации элементов.
Получение списка элементов для фильтрации
Первый шаг в создании фильтра — это выбор всех элементов, которые мы будем сортировать. Ваша задача — получить все элементы списка с классом 'product-item' и сохранить их в переменную для дальнейшей работы.
.product-item { padding: 10px; background: #f0f0f0; margin-bottom: 5px; border: 1px solid #ccc; }
<div class="product-list">
<div class="product-item">Яблоко</div>
<div class="product-item">Груша</div>
<div class="product-item">Банан</div>
</div>
// Выберите все элементы с классом .product-item
const items = document.input__1(".product-item");
// Вывод количества найденных элементов для проверки
console.log("Найдено элементов: " + items.length);
Скрытие элементов через стили
В системах фильтрации часто требуется скрыть элементы, которые не подходят под условия. В этом задании вам нужно пройтись по всем элементам и скрыть их, изменив их стиль отображения напрямую через JavaScript.
.item { padding: 10px; border: 1px solid #ddd; margin: 2px; }
<div id="list">
<div class="item">Элемент 1</div>
<div class="item">Элемент 2</div>
<div class="item">Элемент 3</div>
</div>
const elements = document.querySelectorAll(".item");
// Проходим по каждому элементу и скрываем его
elements.input__1(function(el) {
el.style.input__2 = "none";
});
Чтение категории из data-атрибута
Чтобы отфильтровать товары, мы должны знать, к какой категории они относятся. Часто эту информацию хранят в `data-` атрибутах. Вам нужно получить значение категории из атрибута `data-category` для первого элемента.
.card { padding: 10px; background: #eef; margin-bottom: 5px; }
<div class="card" data-category="electronics">Ноутбук</div>
<div class="card" data-category="clothing">Футболка</div>
const card = document.querySelector(".card");
// Получаем значение категории из data-category
const category = card.input__1.category;
console.log("Категория товара: " + category);
Фильтрация по классу
Реализуем простую логику: если элемент содержит определенный класс, мы его оставляем видимым, иначе — скрываем. Допишите условие проверки наличия класса 'active' у элемента.
.box { width: 100%; height: 30px; margin: 5px 0; background: #ccc; text-align: center; line-height: 30px; } .active { background: #8f8; }
<div class="box active">Активный</div>
<div class="box">Неактивный</div>
<div class="box active">Активный</div>
const boxes = document.querySelectorAll(".box");
boxes.forEach(box => {
// Проверяем, есть ли у элемента класс 'active'
if (box.input__1.input__2("active")) {
box.style.display = "block";
} else {
box.style.display = "none";
}
});
Фильтрация изображений по кнопке
У нас есть галерея картинок с разными категориями (природа и город). При клике на кнопку 'Природа' нужно скрыть все картинки, у которых `data-type` не равен 'nature'.
img { width: 80px; height: 80px; object-fit: cover; margin: 2px; }
<button id="filterBtn">Показать только Природу</button><br>
<div id="gallery">
<img src="https://naytikurs.ru/img/1.png" data-type="nature">
<img src="https://naytikurs.ru/img/2.png" data-type="city">
<img src="https://naytikurs.ru/img/4.png" data-type="nature">
</div>
const btn = document.getElementById("filterBtn");
const images = document.querySelectorAll("img");
btn.addEventListener("click", () => {
images.forEach(img => {
// Если тип картинки НЕ 'nature', скрываем её
if (img.input__1.type !== "nature") {
img.style.display = "input__2";
}
});
});
Живой поиск: получение текста
Создадим поиск по списку. Когда пользователь вводит текст в поле `input`, нам нужно получить этот текст и привести его к нижнему регистру для корректного сравнения. Допишите код обработчика события.
input { width: 100%; box-sizing: border-box; padding: 5px; margin-bottom: 10px; }
<input type="text" id="searchInput" placeholder="Поиск...">
<ul id="names">
<li>Анна</li>
<li>Борис</li>
<li>Виктор</li>
</ul>
const input = document.getElementById("searchInput");
// Добавляем слушатель события ввода
input.addEventListener("input__1", function() {
// Получаем текст из поля и переводим в нижний регистр
const filterText = this.input__2.toLowerCase();
console.log("Ищем: " + filterText);
});
Живой поиск: логика сравнения
Продолжаем делать поиск. Теперь нужно проверить, содержит ли текст элемента искомую фразу. Если содержит — показываем, если нет — скрываем.
li { list-style: none; padding: 5px; border-bottom: 1px solid #eee; }
<input type="text" id="search" value="ба">
<ul id="list">
<li>Банан</li>
<li>Яблоко</li>
<li>Барабан</li>
</ul>
const filterValue = document.getElementById("search").value.toLowerCase();
const items = document.querySelectorAll("li");
items.forEach(item => {
const text = item.input__1.toLowerCase();
// Если текст элемента содержит искомую фразу
if (text.input__2(filterValue)) {
item.style.display = "block";
} else {
item.style.display = "none";
}
});
Сброс фильтров (Показать все)
Часто нужна кнопка 'Показать все', которая отменяет действие любых фильтров. Вам нужно реализовать функцию, которая при клике удаляет класс 'hidden' у всех элементов списка.
.hidden { display: none; } .item { padding: 10px; background: #f9f9f9; border: 1px solid #ddd; margin-bottom: 4px; }
<button id="showAllBtn">Показать все</button>
<div class="list">
<div class="item">Элемент 1</div>
<div class="item hidden">Элемент 2 (скрыт)</div>
<div class="item hidden">Элемент 3 (скрыт)</div>
</div>
document.getElementById("showAllBtn").addEventListener("click", () => {
const items = document.querySelectorAll(".item");
// Убираем класс hidden у всех элементов
items.forEach(el => {
el.input__1.input__2("hidden");
});
});
Комплексная задача: Меню фильтрации
Финальное задание. Есть кнопки фильтров с атрибутом `data-filter`. При клике на кнопку нужно получить значение её фильтра и сравнить его с `data-cat` у картинок. Внимание: если фильтр равен 'all', нужно показать все картинки. Допишите логику условия.
img { width: 50px; height: 50px; margin: 2px; } button { margin: 2px; }
<div>
<button class="btn" data-filter="all">Все</button>
<button class="btn" data-filter="cat1">Кот 1</button>
<button class="btn" data-filter="cat2">Кот 2</button>
</div>
<div id="gallery">
<img src="https://naytikurs.ru/img/5.png" data-cat="cat1">
<img src="https://naytikurs.ru/img/6.png" data-cat="cat2">
<img src="https://naytikurs.ru/img/7.png" data-cat="cat1">
</div>
const buttons = document.querySelectorAll('.btn');
const images = document.querySelectorAll('img');
buttons.forEach(button => {
button.addEventListener('click', () => {
const filter = button.getAttribute('data-filter');
images.forEach(img => {
// Условие: показываем, если фильтр 'all' или категория совпадает
if (filter === 'all' input__1 img.getAttribute('data-cat') === input__2) {
img.style.display = 'inline-block';
} else {
img.style.display = 'none';
}
});
});
});