Сглаживание аккордеонной коллапс анимации ключевых кадров CSS3 - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть элемент аккордеона на моем сайте, созданный с использованием ES6 JS и CSS3.Я создал анимацию ключевых кадров CSS3 для открытия и закрытия этих аккордеонов, но коллапс является резким и не плавным, как при открытой анимации.Что я делаю не так в следующем коде?Что я могу сделать, чтобы сгладить это?

const initial = (accordions) => {
  accordions.forEach(accordion => {
    accordion.classList.add('close')
  })
}

const reset = (accordions) => {
  accordions.forEach(accordion => {
    accordion.classList.add('close')
    accordion.classList.remove('open')
  })
}

const toggle = (accordions) => {
  accordions.forEach(accordion => {
    accordion.onclick = function() {
      if (accordion.classList.contains('open')) {
        accordion.classList.remove('open')
        accordion.classList.add('close')
      } else {
        reset(accordions)
        accordion.classList.remove('close')
        accordion.classList.add('open')
      }
    }
  })
}

let accordions = Array(...document.querySelectorAll('.js-accordion'))
if (accordions.length) {
  initial(accordions)
  reset(accordions)
  toggle(accordions)
}
@keyframes open {
  0% {
    display: none;
    transform: translate3d(0, -1rem, 0);
    opacity: 0;
  }
  1% {
    display: block;
    transform: translate3d(0, -1rem, 0);
    opacity: 0;
  }
  100% {
    transform: translate3d(0, 0, 0);
    opacity: 1;
  }
}
@keyframes close {
  0% {
    display: block;
    opacity: 1;
  }
  99% {
    display: none;
    opacity: 0;
  }
  100% {
    opacity: 0;
  }
}
.faq {
  padding: 4em 0;
}
.faq-item {
  background-repeat: no-repeat;
  background-size: 1.5em;
  background-position: 100% 50%;
  padding: 1em 0;
  cursor: pointer;
  border-bottom: 1px solid black;
}
.faq-item a {
  text-decoration: none;
}
.faq-item.open {
  background-image: url("accordion-minus.svg");
}
.faq-item.open .content {
  animation: open 0.5s ease-in-out;
  display: block;
}
.faq-item.close {
  background-image: url("accordion-plus.svg");
}
.faq-item.close .content {
  animation: close 0.5s ease-in-out;
  display: none;
}
.faq-border {
  border-bottom: 1px solid black;
}
.content {
  width: 95%;
}
<div class="faq">
<h3>Acupuncture</h3>

<div class="faq-item js-accordion">
Question
  <div class="content js-accordion-content">Answer</div>
</div>

</div>

1 Ответ

0 голосов
/ 18 сентября 2018

Я думаю, что в этой анимации переключения не нужна анимация или ключевые кадры. что вам нужно это transition и transform.

  1. display не рекомендуется для перехода. потому что дом не получает размер, если отображается: нет
  2. очень рекомендуется отображать и скрывать переходный элемент с visibility и opacity
  3. сначала поставьте стиль .faq-item .content. когда этот элемент находится в скрытом состоянии
  4. затем поместите стиль, когда он будет видим на .faq-item.open .content

извините, если я не понял это ясно.

это то, что вам нужно? ПОПРОБУЙТЕ ЭТУ СКИДКУ

const initial = (accordions) => {
  accordions.forEach(accordion => {
    accordion.classList.remove('open')
  })
}

const reset = (accordions) => {
  accordions.forEach(accordion => {
    accordion.classList.remove('open')
  })
}

const toggle = (accordions) => {
  accordions.forEach(accordion => {
    accordion.onclick = function() {
      if (accordion.classList.contains('open')) {
        accordion.classList.remove('open')
      } else {
        reset(accordions)
        accordion.classList.add('open')
      }
    }
  })
}

let accordions = Array(...document.querySelectorAll('.js-accordion'))
if (accordions.length) {
  initial(accordions)
  reset(accordions)
  toggle(accordions)
}
.faq {
  padding: 4em 0;
}
.faq-item {
  background-repeat: no-repeat;
  background-size: 1.5em;
  background-position: 100% 50%;
  padding: 1em 0;
  cursor: pointer;
  border-bottom: 1px solid black;
}
.faq-item a {
  text-decoration: none;
}
.faq-item.open {
  background-image: url("accordion-minus.svg");
}
.faq-item .content{
  display: block !important;
  transform: translateY(0);
  opacity:0;
  visibility: hidden;
  transition: all 0.5s ease-in-out;
}
.faq-item.open .content {
  display: block !important;
  transform: translateY(1em);
  opacity:1;
  visibility: visible;
}

.faq-border {
  border-bottom: 1px solid black;
}
.content {
  width: 95%;
}
<div class="faq">
<h3>Acupuncture</h3>

<div class="faq-item js-accordion">
Question
  <div class="content js-accordion-content">Answer</div>
</div>

</div>
...