Как сделать, чтобы при клике на MORE/BACK переключалась только одна конкретная карточка, а не все сразу на чистом JS?
Есть такая, упрощенная для примера, разметка карточек товара:
<section class="cards_wrapper">
<div class="card">
<div class="face">
<img class="picture" src="img/meter.png" alt="">
<p class="more link">MORE</p>
</div>
<div class="description">
<h3>Lorem ipsum dolor sit amet consectetur adipisicing elit.</h3>
<p class="back link">BACK</p>
</div>
</div>
<div class="card">
<div class="face">
<img class="picture" src="img/size.png" alt="">
<p class="more link">MORE</p>
</div>
<div class="description">
<h3>Lorem ipsum dolor sit amet consectetur adipisicing elit.</h3>
<p class="back link">BACK</p>
</div>
</div>
<div class="card">
<div class="face">
<img class="picture" src="img/weighing-scale.png" alt="">
<p class="more link">MORE</p>
</div>
<div class="description">
<h3>Lorem ipsum dolor sit amet consectetur adipisicing elit.</h3>
<p class="back link">BACK</p>
</div>
</div>
</section>
Пробный JS:
const cardsLink = document.querySelectorAll(".link");
const cardsFace = document.querySelectorAll(".face");
cardsLink.forEach(cLink => {
cLink.addEventListener("click", function() {
cardsFace.forEach(cFace => {
cFace.classList.toggle("on");
});
});
});
css:
.on {
transform: translateX(-100%);
}
Как сделать, чтобы при клике на MORE/BACK переключалась только одна конкретная карточка, а не все сразу? Должно быть много карточек. Нужно реализовать на чистом JS без jQuery. В JS знания пока очень поверхностные.
Ответы (1 шт):
Автор решения: Cahandar97
→ Ссылка
Данная цикл производит изменения для всех элементов, её нужно убрать.
cardsFace.forEach(cFace => {
cFace.classList.toggle("on");
});
Вместо неё можно использовать this обращаясь к активному элементу, тем самым мы получим или <p class="more link">MORE</p>, или же <p class="back link">BACK</p>. А дальше уже используя parentElement и querySelector находим нужен элемент и задаём свойства.
Тем самым получим:
this.parentElement.parentElement.querySelector('.face').classList.toggle("on");
А вот конечный, полный код:
const cardsLink = document.querySelectorAll(".link");
cardsLink.forEach(cLink => {
cLink.addEventListener("click", function() {
this.parentElement.parentElement.querySelector('.face').classList.toggle("on");
});
});