CSS 同时转换 运行,而不是一个接一个(手风琴)

CSS transition running at the same time, instead of one after the other (accordion)

我正在制作手风琴,但在 CSS 转换、动画 max-height

方面遇到了问题

我想要同时关闭一个项目和打开另一个项目的动画 运行,而不是像当前正在发生的那样一个接着一个。

此外,结束过渡比开始过渡慢得多...

我在 JSFiddle 上安装了这个 运行ning 但这是我的代码:

HTML:

<div class="accordion">
  <div class="accordion-item">
    <div class="accordion-title">
      Title 1
    </div>
    <div class="accordion-content">
      <p>kjshsdjkfhsdkfh</p>
      <p>kjshsdjkfhsdkfh</p>
      <p>kjshsdjkfhsdkfh</p>
      <p>kjshsdjkfhsdkfh</p>
    </div>
  </div>
  <div class="accordion-item">
    <div class="accordion-title">
      Title 2
    </div>
    <div class="accordion-content">
      <p>kjshsdjkfhsdkfh</p>
      <p>kjshsdjkfhsdkfh</p>
      <p>kjshsdjkfhsdkfh</p>
      <p>kjshsdjkfhsdkfh</p>
    </div>
  </div>
  <div class="accordion-item">
    <div class="accordion-title">
      Title 3
    </div>
    <div class="accordion-content">
      <p>kjshsdjkfhsdkfh</p>
      <p>kjshsdjkfhsdkfh</p>
      <p>kjshsdjkfhsdkfh</p>
      <p>kjshsdjkfhsdkfh</p>
    </div>
  </div>
</div>

CSS

.accordion-item {
  border: 1px solid #000000;
  margin-bottom: 1px;
}
.accordion-title {
  padding: 0 20px;
  display: flex;
  align-items: center;
  height: 40px;
  background-color: #cdcdcd;
  cursor: pointer;
}

.accordion-content {
  max-height: 0;
  transition: max-height 2s;
  overflow: hidden;
}

.accordion-item.open .accordion-content {
  max-height: 500px; 
}

JAVASCRIPT:

document.body.addEventListener('click', ({ target }) => {
    if(target.classList.contains('accordion-title')){
    const opened = document.querySelector('.accordion-item.open')
    opened && opened.classList.remove('open')
    const parent = target.parentNode
    parent !== opened && parent.classList.add('open')
  }
})

转换实际上是 运行 同时进行的,只是看起来它们没有。

问题是您将 max-height 设置为 0 到 500 像素的动画,但完全展开的手风琴项目的实际高度约为 150 像素。因此打开动画只在开始时有可见效果,然后从150到500px时“什么都不做”,而关闭动画开始和500px直到150px才可见效果。

您必须选择不同的方法来实现您想要的效果 - 您可能必须测量元素的展开高度,然后将动画中的最大高度(或仅高度)设置为该精确值。