Обернуть часть элементов в тег и открывать сокрытый блок по клику
Есть список элементов. Сделаю код для примера:
<div class="elem req">Visible</div>
<div class="elem req">Visible</div>
<div class="elem">Hidden</div>
<div class="elem">Hidden</div>
Как правильно обернуть элементы, не имеющие класс req, после чего добавить вверху открывающую кнопку. Порядок может быть хаотичным. Ниже код, что примерно должно получится:
window.addEventListener("DOMContentLoaded", function() {
let button = document.querySelector('.toggle')
let hidden = document.querySelector('.hidden')
button.addEventListener('click', function(e) {
this.classList.toggle('active');
hidden.classList.toggle('visible');
});
});
.hidden {
display: none;
}
.visible {
display: block;
}
.active {
color: red;
}
<div class="elem req">Visible</div>
<div class="elem req">Visible</div>
<button class="toggle">Try it</button>
<div class="hidden">
<div class="elem">Hidden</div>
<div class="elem">Hidden</div>
</div>
Можно использовать и jQuery. С ним то через .before можно и кнопку вставить, и с открыванием сокрытых элементов нет проблем и даже обернул нужные теги, когда их порядок не нарушен. Но, на чистом JS не выходит никак. Хотя бы подкиньте, что почитать или какими образом реализовать.
Спасибо
Ответы (1 шт):
Автор решения: UModeL
→ Ссылка
window.addEventListener("DOMContentLoaded", function() {
let button = document.querySelector('.toggle');
let hidden = document.querySelector('.hidden');
let elems = [...document.querySelectorAll('.elem')];
elems.forEach(el => {
if (!el.classList.contains('req')) { hidden.append(el); }
});
button.addEventListener('click', function(e) {
this.classList.toggle('active');
hidden.classList.toggle('visible');
});
});
.hidden { display: none; }
.visible { display: block; }
.active { color: red; }
<div class="elem req">Visible</div>
<div class="elem req">Visible</div>
<div class="elem">Hidden</div>
<div class="elem">Hidden</div>
<div class="elem req">Visible</div>
<div class="elem">Hidden</div>
<button class="toggle">Try it</button>
<div class="hidden"></div>