使用 javascript 显示和隐藏元素和切换图标

Show and hide element and toggle icon with javascript

当我点击图标时,我想切换 class 段落不可见和 h4 粗体。 我怎样才能遍历这个?当我尝试时,我只得到第一段。 也无法在点击时更改图标。

我的代码:

const btns = document.querySelectorAll('i');

btns.forEach((btn) => {
    btn.addEventListener('click', (e) => {

        const paragraph = document.querySelector('p');
        const h4 = document.querySelector('h4')

        h4.classList.toggle('bold');
        paragraph.classList.toggle('invisible');

        if (btn.classList.contains('hidden')) {
       btn.classList.remove('hidden');
        btn.classList.add('visible');
    }
    else if (btn.classList.contains('visible')) {
        btn.classList.remove('hidden');
        btn.classList.add('visible');
    }
    })
})
    .bold {
      font-weight: 700;
    }

    .invisible {
      display: none;
    }
    i.hidden {
    visibility: hidden;

}
    i.visible {
    visibility: visible;
}
    <div class="question">
      <h4>question<i class="fas fa-chevron-down"></i></h4>
      <p>answear</p>
    </div class="question">
    <div class="question">
      <h4>question<i class="fas fa-chevron-down"></i></h4>
      <p>answear</p>
    </div class="question">
    <div class="question">
      <h4>question<i class="fas fa-chevron-down"></i></h4>
      <p>answear</p>
    </div>

您可以使用 Event.target class question 定位最近的元素,您可以从中找到相应的元素:

const btns = document.querySelectorAll('i');

btns.forEach((btn) => {
  btn.addEventListener('click', (e) => {

    const paragraph = e.target.closest('.question').querySelector('p');
    const h4 = e.target.closest('.question').querySelector('h4')

    h4.classList.toggle('bold');
    paragraph.classList.toggle('invisible');
    
    //if you want the icon to be toggled
    e.target.classList.toggle('fa-chevron-up');
    e.target.classList.toggle('fa-chevron-down');
  })
})
.bold {
  font-weight: 700;
}

.invisible {
  display: none;
}
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@5.15.3/css/fontawesome.min.css" integrity="sha384-wESLQ85D6gbsF459vf1CiZ2+rr+CsxRY0RpiF1tLlQpDnAgg6rwdsUF1+Ics2bni" crossorigin="anonymous">
<div class="question">
  <h4>question<i class="fas fa-chevron-down"></i></h4>
  <p>answear</p>
</div class="question">
<div class="question">
  <h4>question<i class="fas fa-chevron-down"></i></h4>
  <p>answear</p>
</div class="question">
<div class="question">
  <h4>question<i class="fas fa-chevron-down"></i></h4>
  <p>answear</p>
</div>

我建议您只在父问题上切换 class 并使用基于该父问题的 class 特定规则 class

const btns = document.querySelectorAll('.question i');

btns.forEach((btn) => {
  btn.addEventListener('click', (e) => {
    const answer = e.target.closest('.question')
    answer.classList.toggle('collapsed');
  });
});
.question.collapsed h4 {
  font-weight: 700;
  color:red
}

.question.collapsed p {
  display: none;
}
<div class="question">
  <h4>question<i class="fas fa-chevron-down">Icon</i></h4>
  <p>answear</p>
</div>
<div class="question">
  <h4>question<i class="fas fa-chevron-down">Icon</i></h4>
  <p>answear</p>
</div>
<div class="question">
  <h4>question<i class="fas fa-chevron-down">Icon</i></h4>
  <p>answear</p>
</div>