Знаю, точно такой же вопрос уже был, но там в ответе не то что нужно.
<ul class="box-list wrapper__box">
<li class="box-list__item">1</li>
<li class="box-list__item">2</li>
<li class="box-list__item">3</li>
<li class="box-list__item">4</li>
<li class="box-list__item">5</li>
<li class="box-list__item">6</li>
<li class="box-list__item">7</li>
<li class="box-list__item">8</li>
<li class="box-list__item">9</li>
<li class="box-list__item">10</li>
<li class="box-list__item">11</li>
<li class="box-list__item">12</li>
<li class="box-list__item">13</li>
<li class="box-list__item">14</li>
<li class="box-list__item">15</li>
<li class="box-list__item">16</li>
<li class="box-list__item">17</li>
<li class="box-list__item">18</li>
<li class="box-list__item">19</li>
<li class="box-list__item">20</li>
</ul>
<button class="show-more" type="button">Show more</button>
.box-list__item {
display: none;
}
.ui-box-active {
display: grid;
}
.ui-button-hidden {
display: none;
}
В общем есть вот такой код JS.
На данным момент при загрузке страницы отображаемых блоков - 0.
Оно и понятно ведь они скрыты с помощью display: none;
Нужно чтобы при загрузке страницы отображалось 8 блоков, а при каждом клике на кнопку показывалось ещё 4.
Можно было бы, конечно, прописать сразу 8 блокам в разметке активный класс, но мне кажется лучше это сделать через JS чтобы не засорять лишний раз разметку.
const boxItems = document.querySelectorAll('.box-list__item');
const showMoreButton = document.querySelector('.show-more');
let per = 4;
let counter = 1;
let total = 0;
showMoreButton.addEventListener('click', (e) => {
total = per * (counter++);
[...boxItems].slice(0, total).forEach((el) => {
el.classList.add('ui-box-active');
});
if (total >= [...boxItems].length) {
e.currentTarget.classList.add('ui-button-hidden');
}
});
В идеале конечно если есть такая возможно, чтобы можно было указать, например, в переменную кол-во отображаемых сразу блоков и кол-во, которое нужно показывать при каждом клике.