Answer the question
In order to leave comments, you need to log in
How to make a category filter with a "Show more" button in pure JS?
Hello, who is strong in JS? For three days I have been suffering with one block. A gallery block with a filter: at the top there are 5 buttons for sorting pictures into categories, and at the bottom there is a "show more" button, which should open pictures hidden before. In general, I looked at how the filter is made and how the button is made, individually everything is fine. But when I'm in a separate category, the "show more" button opens all the pictures, and not those that should be in this category. Help good people
<div class="wrapper">
<div class="container">
<h1 class="title">Фильтр контента по категориям</h1>
<ul class="filter">
<li class="button button_type_all" data-filter="all">Все</li>
<li class="button button_type_winter" data-filter="winter">Зима</li>
<li class="button button_type_spring" data-filter="spring">Весна</li>
<li class="button button_type_summer" data-filter="summer">Лето</li>
<li class="button button_type_autumn" data-filter="autumn">Осень</li>
</ul>
<div class="blocks">
<ul class="blocks__row">
<li class="blocks__item summer big">
<a class="blocks__link" href="#">
<img class="blocks__img" src="img/summer1.jpg" alt="summer">
</a>
<span>Лето</span>
</li>
<li class="blocks__item autumn">
<a class="blocks__link" href="#">
<img class="blocks__img" src="img/autumn1.jpg" alt="autumn">
</a>
<span>Осень</span>
</li>
<li class="blocks__item winter medium">
<a class="blocks__link" href="#">
<img class="blocks__img" src="img/winter1.jpg" alt="winter">
</a>
<span>Зима</span>
</li>
<li class="blocks__item spring">
<a class="blocks__link" href="#">
<img class="blocks__img" src="img/spring1.jpg" alt="spring">
</a>
<span>Весна</span>
</li>
<!-- hidden images -->
<li class="blocks__item summer more big">
<a class="blocks__link" href="#">
<img class="blocks__img" src="img/summer1.jpg" alt="summer">
</a>
<span>Лето</span>
</li>
<li class="blocks__item autumn more">
<a class="blocks__link" href="#">
<img class="blocks__img" src="img/autumn1.jpg" alt="autumn">
</a>
<span>Осень</span>
</li>
<li class="blocks__item winter more medium">
<a class="blocks__link" href="#">
<img class="blocks__img" src="img/winter1.jpg" alt="winter">
</a>
<span>Зима</span>
</li>
<li class="blocks__item spring more">
<a class="blocks__link" href="#">
<img class="blocks__img" src="img/spring1.jpg" alt="spring">
</a>
<span>Весна</span>
</li>
</ul>
<button class="blocks__btn" type="button" id="btn">Показать ещё</button>
</div>
</div>
</div>
function app() {
const buttons = document.querySelectorAll('.button'),
cards = document.querySelectorAll('.blocks__item')
function filter(category, items) {
items.forEach((item) => {
const isItemFiltered = !item.classList.contains(category),
isShowAll = category.toLowerCase() === 'all'
if (isItemFiltered && !isShowAll) {
item.classList.add('hide')
} else {
item.classList.remove('hide')
}
})
}
buttons.forEach((button) => {
button.addEventListener('click', () => {
const currentCategory = button.dataset.filter
filter(currentCategory, cards)
})
// ! Скрыть/показать блок по клику
const btnMore = document.querySelector('#btn');
let showMore = document.querySelectorAll('.more');
btnMore.addEventListener("click", function (event) {
event.preventDefault();
for (let y = 0; y < showMore.length; y++) {
showMore[y].classList.toggle('show');
}
showMore.forEach(item => {
if (item.classList.contains('show')) {
item.style.display = 'block'
} else {
item.style.display = 'none'
}
})
console.log(btnMore);
})
})
}
app()
Answer the question
In order to leave comments, you need to log in
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question