Создание системы фильтрации элементов

Тренажер по работе с HTML DOM на JavaScript для пользователей с начальным и средним уровнем подготовки.

Тренажер JavaScript: Покоряем HTML DOM

В этом модуле вы научитесь создавать интерактивные фильтры для контента на веб-странице. Фильтрация — это ключевой элемент интерфейса для интернет-магазинов, галерей и списков задач. Мы пройдем путь от простого скрытия элементов через CSS и JS до создания поиска по тексту и фильтрации по категориям (data-атрибутам). Вы будете работать с методами перебора коллекций, манипуляцией классами и стилями, а также с событиями ввода данных.

Список тем

Получение списка элементов для фильтрации

id: 37090_filter_task_1

Первый шаг в создании фильтра — это выбор всех элементов, которые мы будем сортировать. Ваша задача — получить все элементы списка с классом 'product-item' и сохранить их в переменную для дальнейшей работы.

CSS
.product-item { padding: 10px; background: #f0f0f0; margin-bottom: 5px; border: 1px solid #ccc; }
HTML
Восстановить HTML
<div class="product-list">
  <div class="product-item">Яблоко</div>
  <div class="product-item">Груша</div>
  <div class="product-item">Банан</div>
</div>
JavaScript
// Выберите все элементы с классом .product-item
const items = document.input__1(".product-item");

// Вывод количества найденных элементов для проверки
console.log("Найдено элементов: " + items.length);
Для выбора всех элементов, соответствующих определенному CSS-селектору, используется метод document.querySelectorAll().
Заполнить ответами все поля
Результат
Лог
Выполнить
Показать подсказку

Скрытие элементов через стили

id: 37090_filter_task_2

В системах фильтрации часто требуется скрыть элементы, которые не подходят под условия. В этом задании вам нужно пройтись по всем элементам и скрыть их, изменив их стиль отображения напрямую через JavaScript.

CSS
.item { padding: 10px; border: 1px solid #ddd; margin: 2px; }
HTML
Восстановить HTML
<div id="list">
  <div class="item">Элемент 1</div>
  <div class="item">Элемент 2</div>
  <div class="item">Элемент 3</div>
</div>
JavaScript
const elements = document.querySelectorAll(".item");

// Проходим по каждому элементу и скрываем его
elements.input__1(function(el) {
  el.style.input__2 = "none";
});
Для перебора коллекции используйте forEach. Чтобы скрыть элемент, обратитесь к его свойству style.display и установите значение 'none'.
Заполнить ответами все поля
Результат
Лог
Выполнить
Показать подсказку

Чтение категории из data-атрибута

id: 37090_filter_task_3

Чтобы отфильтровать товары, мы должны знать, к какой категории они относятся. Часто эту информацию хранят в `data-` атрибутах. Вам нужно получить значение категории из атрибута `data-category` для первого элемента.

CSS
.card { padding: 10px; background: #eef; margin-bottom: 5px; }
HTML
Восстановить HTML
<div class="card" data-category="electronics">Ноутбук</div>
<div class="card" data-category="clothing">Футболка</div>
JavaScript
const card = document.querySelector(".card");

// Получаем значение категории из data-category
const category = card.input__1.category;

console.log("Категория товара: " + category);
Доступ к data-атрибутам в JavaScript осуществляется через свойство dataset. Имя атрибута пишется в camelCase (например, data-my-type превращается в dataset.myType).
Заполнить ответами все поля
Результат
Лог
Выполнить
Показать подсказку

Фильтрация по классу

id: 37090_filter_task_4

Реализуем простую логику: если элемент содержит определенный класс, мы его оставляем видимым, иначе — скрываем. Допишите условие проверки наличия класса 'active' у элемента.

CSS
.box { width: 100%; height: 30px; margin: 5px 0; background: #ccc; text-align: center; line-height: 30px; } .active { background: #8f8; }
HTML
Восстановить HTML
<div class="box active">Активный</div>
<div class="box">Неактивный</div>
<div class="box active">Активный</div>
JavaScript
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";
  }
});
Для проверки наличия CSS класса у элемента используется свойство classList и метод contains().
Заполнить ответами все поля
Результат
Лог
Выполнить
Показать подсказку

Фильтрация изображений по кнопке

id: 37090_filter_task_5

У нас есть галерея картинок с разными категориями (природа и город). При клике на кнопку 'Природа' нужно скрыть все картинки, у которых `data-type` не равен 'nature'.

CSS
img { width: 80px; height: 80px; object-fit: cover; margin: 2px; }
HTML
Восстановить HTML
<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>
JavaScript
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";
    }
  });
});
Внутри цикла нужно сравнить значение dataset.type текущей картинки с требуемой строкой. Если не совпадает — скрываем.
Заполнить ответами все поля
Результат
Лог
Выполнить
Показать подсказку

Живой поиск: получение текста

id: 37090_filter_task_6

Создадим поиск по списку. Когда пользователь вводит текст в поле `input`, нам нужно получить этот текст и привести его к нижнему регистру для корректного сравнения. Допишите код обработчика события.

CSS
input { width: 100%; box-sizing: border-box; padding: 5px; margin-bottom: 10px; }
HTML
Восстановить HTML
<input type="text" id="searchInput" placeholder="Поиск...">
<ul id="names">
  <li>Анна</li>
  <li>Борис</li>
  <li>Виктор</li>
</ul>
JavaScript
const input = document.getElementById("searchInput");

// Добавляем слушатель события ввода
input.addEventListener("input__1", function() {
  // Получаем текст из поля и переводим в нижний регистр
  const filterText = this.input__2.toLowerCase();
  console.log("Ищем: " + filterText);
});
Событие ввода текста называется 'input'. Значение поля находится в свойстве value. Для перевода в нижний регистр используется toLowerCase().
Заполнить ответами все поля
Результат
Лог
Выполнить
Показать подсказку

Живой поиск: логика сравнения

id: 37090_filter_task_7

Продолжаем делать поиск. Теперь нужно проверить, содержит ли текст элемента искомую фразу. Если содержит — показываем, если нет — скрываем.

CSS
li { list-style: none; padding: 5px; border-bottom: 1px solid #eee; }
HTML
Восстановить HTML
<input type="text" id="search" value="ба">
<ul id="list">
  <li>Банан</li>
  <li>Яблоко</li>
  <li>Барабан</li>
</ul>
JavaScript
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";
  }
});
Текст внутри тега можно получить через textContent. Для проверки вхождения подстроки в строку используется метод includes().
Заполнить ответами все поля
Результат
Лог
Выполнить
Показать подсказку

Сброс фильтров (Показать все)

id: 37090_filter_task_8

Часто нужна кнопка 'Показать все', которая отменяет действие любых фильтров. Вам нужно реализовать функцию, которая при клике удаляет класс 'hidden' у всех элементов списка.

CSS
.hidden { display: none; } .item { padding: 10px; background: #f9f9f9; border: 1px solid #ddd; margin-bottom: 4px; }
HTML
Восстановить HTML
<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>
JavaScript
document.getElementById("showAllBtn").addEventListener("click", () => {
  const items = document.querySelectorAll(".item");
  
  // Убираем класс hidden у всех элементов
  items.forEach(el => {
    el.input__1.input__2("hidden");
  });
});
Вам нужно выбрать все элементы, пройтись по ним циклом и использовать метод classList.remove('hidden').
Заполнить ответами все поля
Результат
Лог
Выполнить
Показать подсказку

Комплексная задача: Меню фильтрации

id: 37090_filter_task_9

Финальное задание. Есть кнопки фильтров с атрибутом `data-filter`. При клике на кнопку нужно получить значение её фильтра и сравнить его с `data-cat` у картинок. Внимание: если фильтр равен 'all', нужно показать все картинки. Допишите логику условия.

CSS
img { width: 50px; height: 50px; margin: 2px; } button { margin: 2px; }
HTML
Восстановить HTML
<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>
JavaScript
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';
      }
    });
  });
});
Используйте логический оператор ИЛИ (||) в условии. Картинка должна показываться, если выбран фильтр 'all' ИЛИ если категория картинки совпадает с фильтром.
Заполнить ответами все поля
Результат
Лог
Выполнить
Показать подсказку
НайтиКурс.Ру