jorm
jorm

Reputation: 41

Accordions are opening together

accordions are opening together

As you can see in the image, when I open one accordion, the accordion beside it opens as well. I think its the CSS that's causing the issue, but I'm not sure I expected the accordion to open by itself, not with the accordion beside it, it seems as if the JavaScript is controlling the max height of the accordion beside it too.


Here is the code:

const accordionItemHeaders =
  document.querySelectorAll(".accordion-header");

accordionItemHeaders.forEach((accordionItemHeader) => {
  accordionItemHeader.addEventListener("click", (event) => {
    accordionItemHeader.classList.toggle("active");
    //animation
    const accordionItemBody = accordionItemHeader.nextElementSibling;
    if (accordionItemHeader.classList.contains("active")) {
      accordionItemBody.style.maxHeight =
        accordionItemBody.scrollHeight + "px";
    } else {
      accordionItemBody.style.maxHeight = 0;
    }
  });
});
.accordion-wrapper {
  display: flex;
  flex-wrap: wrap;
  gap: 20px;
  position: relative;
  margin-top: 25px;
}

.accordion-card {
  background-color: rgba(182, 210, 253, 0.041);
  border-radius: 10px;
  width: 30vw;
  max-width: 385px;
  min-width: 350px;
  border: 1px solid rgba(153, 196, 239, 0.121);
  position: relative;
}

.accordion-header {
  color: rgba(255, 255, 255, 0.841);
  font-weight: 600;
  font-size: 1.25rem;
  padding: 1rem 1.5rem 0.8rem 1.3rem;
  display: flex;
  align-items: center;
  position: relative;
  cursor: pointer;
}

.accordion-body {
  max-height: 0;
  overflow: hidden;
  transition: max-height 0.2s ease-out;
}

.accordion-body-content {
  color: rgba(255, 255, 255, 0.658);
  font-weight: 400;
  font-size: 1.1rem;
  padding: 0.8rem 1rem 0.8rem 1.3rem;
  line-height: 1.5rem;
  border-top: 1px solid;
  border-image: linear-gradient(to right, rgba(153, 196, 239, 0.053), rgba(153, 196, 239, 0.201), rgba(153, 196, 239, 0.053)) 1;
  letter-spacing: 0.02em;
}

.accordion-header::after {
  content: '\003E';
  font-size: 2rem;
  font-weight: 400;
  position: absolute;
  right: 1rem;
  transition: ease-in 0.3s;
}

.accordion-header.active::after {
  transform: rotate(90deg);
  transition: ease-in 0.3s;
}
<div class="accordion-wrapper">
  <div class="accordion-card">
    <div class="accordion-header">Card 1</div>
    <div class="accordion-body">
      <div class="accordion-body-content">
        Lorem ipsum dolor sit, amet consectetur adipisicing elit. Quos aliquid sint voluptatum deserunt alias iusto excepturi pariatur odio
      </div>
    </div>
  </div>

  <div class="accordion-card">
    <div class="accordion-header">Card 2</div>
    <div class="accordion-body">
      <div class="accordion-body-content">
        Lorem ipsum dolor sit, amet consectetur adipisicing elit. Eaque nesciunt vero sunt. Ad eveniet maiores quidem quis id animi
      </div>
    </div>
  </div>

  <div class="accordion-card">
    <div class="accordion-header">Card 3</div>
    <div class="accordion-body">
      <div class="accordion-body-content">
        Lorem ipsum dolor sit, amet consectetur adipisicing elit. Eaque nesciunt vero sunt. Ad eveniet maiores quidem quis id animi
      </div>
    </div>
  </div>

  <div class="accordion-card">
    <div class="accordion-header">Card 4</div>
    <div class="accordion-body">
      <div class="accordion-body-content">
        Lorem ipsum dolor sit, amet consectetur adipisicing elit. Eaque nesciunt vero sunt. Ad eveniet maiores quidem quis id animi
      </div>
    </div>
  </div>

  <div class="accordion-card">
    <div class="accordion-header">Card 5</div>
    <div class="accordion-body">
      <div class="accordion-body-content">
        Lorem ipsum dolor sit, amet consectetur adipisicing elit. Eaque nesciunt vero sunt. Ad eveniet maiores quidem quis id animi
      </div>
    </div>
  </div>

  <div class="accordion-card">
    <div class="accordion-header">Card 6</div>
    <div class="accordion-body">
      <div class="accordion-body-content">
        Lorem ipsum dolor sit, amet consectetur adipisicing elit. Eaque nesciunt vero sunt. Ad eveniet maiores quidem quis id animi
      </div>
    </div>
  </div>
</div>

Upvotes: 0

Views: 60

Answers (1)

SnoopFrog
SnoopFrog

Reputation: 724

This is caused because display: flex uses align-items: stretch as default value which causes other elements in the row to fill whenever any enlarges the parent they all are contained in. Please set it to flex-start which will prevent this from happening, like this:

.accordion-wrapper {
  display: flex;
  flex-wrap: wrap;
  gap: 20px;
  position: relative;
  margin-top: 25px;
  align-items: flex-start;
}

Upvotes: 2

Related Questions