Не срабатывает анимация при закрытии

[data-foo=sett_m] {
  display: none;
  position: absolute;
  opacity: 0;
  top: 0;
  right: 10px;
  overflow: hidden;
  border-radius: 2px;
  background: rgb(28 28 28 / 90%);
  box-shadow: 0 0 4px rgb(0 0 0 / 40%); 
  width: min(30%, 600px);
  min-width: min-content;
  color: rgb(255 255 255 / 70%);
  white-space: nowrap;
  transition: 100ms all ease-in-out;
  transform: translateY(calc(-100% - 13px));
  font-size: calc(13px + 3 * ((100vw - 320px) / 1000));
  animation: mn_up .5s ease-in-out normal forwards;
  z-index: 3000
}
@keyframes mn_up {from {opacity: 1} 99% {opacity: 0} 100% {display:none}}

.menu_pl [data-foo=sett_m] {display:block; animation: mn_down .5s ease-in-out normal forwards}
@keyframes mn_down {1% {opacity: 0} to {opacity: 1}}

При добавлении класса menu_pl, анимация срабатывает. А вот когда убираем, блок резко исчезает.

Как сделать так, чтобы при открытии и закрытии, работала анимация. При этом только один класс, добавляем класс menu_pl - открываем блок, удаляем menu_pl - закрываем блок


Ответы (1 шт):

Автор решения: zain

Резкое пропадание блока происходит из-за свойства dislpay: none, к которому невозможно применить анимацию. Можно попробовать так:

[data-foo=sett_m] {
  display: block;
  position: absolute;
  opacity: 0;
  top: 0;
  right: 10px;
  overflow: hidden;
  border-radius: 2px;
  background: rgb(28 28 28 / 90%);
  box-shadow: 0 0 4px rgb(0 0 0 / 40%); 
  width: min(30%, 600px);
  min-width: min-content;
  color: rgb(255 255 255 / 70%);
  white-space: nowrap;
  transition: opacity 100ms ease-in-out;
  transform: translateY(calc(-100% - 13px));
  font-size: calc(13px + 3 * ((100vw - 320px) / 1000));
  z-index: -1;
}
.menu_pl [data-foo=sett_m] {
  z-index: 3000;
  transition: opacity 100ms ease-in-out;
  opacity: 1;
}

Возможно это не самое лучшее решение, но от него можно отталкиваться дальше.

→ Ссылка