#html #css #css-animations
#HTML #css #css-анимации
Вопрос:
Я получил анимацию, с которой я сохраняю состояние animation-fill-mode: forwards;
. Я бы хотел, чтобы он анимировал тот же путь обратно к своему источнику, как только класс для него будет удален. Как бы я это сделал?
Это то, что я получил
document.querySelector(".js-toggle-animation").addEventListener("click", () => {
document.querySelector(".container").classList.toggle("container--is-active");
});
body {
background-color: #ededed;
}
.container {
margin: 0 auto;
width: 20rem;
padding: 2rem;
background-color: crimson;
overflow: hidden;
}
.container__toggle-action {
margin-bottom: 2rem;
padding: 1rem 2rem;
background-color: black;
color: white;
border: none;
}
.container__content {
position: relative;
height: 20rem;
background-color: lighten(crimson, 20%);
}
.information-block {
position: absolute;
right: 0;
bottom: 0;
left: 0;
display: flex;
align-items: flex-start;
height: 60%;
padding: 1.875rem;
background-color: #ffffff;
transform: translateY(0);
opacity: 0;
visibility: hidden;
z-index: 3;
animation-direction: reverse;
animation-duration: 3s;
animation-fill-mode: backwards;
}
.container--is-active .information-block {
animation: smooth-in 320ms ease forwards;
}
@keyframes smooth-in {
10% {
bottom: 0;
height: 60%;
margin-right: 0;
margin-left: 0;
padding-right: calc(1.875rem);
padding-left: calc(1.875rem);
opacity: 1;
visibility: visible;
}
70% {
bottom: -2rem;
height: calc(60% 4rem);
margin-right: 0;
margin-left: 0;
padding-right: calc(1.875rem);
padding-left: calc(1.875rem);
transform: translateY(0);
}
100% {
bottom: -2rem;
height: calc(60% 4rem);
margin-right: -2rem;
margin-left: -2rem;
padding-right: calc(1.875rem 2rem);
padding-left: calc(1.875rem 2rem);
opacity: 1;
visibility: visible;
transform: translateY(0);
}
}
<div class="container">
<button class="container__toggle-action js-toggle-animation">toggle animation</button>
<div class="container__content">
<div class="information-block">
<h2>headline</h2>
<p>Lorem ipsum dolor sit amet consectetur, adipisicing elit. Eaque obcaecati debitis nihil ratione dicta quaerat, dolores quis laboriosam quae recusandae!</p>
</div>
</div>
</div>
Ответ №1:
Как вы можете видеть, я добавляю обратную анимацию, поэтому при повторном нажатии div исчезнет
document.querySelector(".js-toggle-animation").addEventListener("click", () => {
if( document.querySelector(".container").classList.contains('container--is-active')){
document.querySelector(".container").classList.toggle("container--is-not-active");
document.querySelector(".container").classList.remove("container--is-active");
}else if( document.querySelector(".container").classList.contains('container--is-not-active')){
document.querySelector(".container").classList.toggle("container--is-active");
document.querySelector(".container").classList.remove("container--is-not-active");
}else{
document.querySelector(".container").classList.toggle("container--is-active");
}
});
body {
background-color: #ededed;
}
.container {
margin: 0 auto;
width: 40rem;
padding: 2rem;
background-color: crimson;
overflow: hidden;
}
.container__toggle-action {
margin-bottom: 2rem;
padding: 1rem 2rem;
background-color: black;
color: white;
border: none;
}
.container__content {
position: relative;
height: 20rem;
background-color: lighten(crimson, 20%);
}
.information-block {
position: absolute;
right: 0;
bottom: 0;
left: 0;
display: flex;
align-items: flex-start;
height: 60%;
padding: 1.875rem;
background-color: #ffffff;
transform: translateY(0);
opacity: 0;
visibility: hidden;
z-index: 3;
animation-direction: reverse;
animation-duration: 3s;
animation-fill-mode: backwards;
}
.container--is-active .information-block {
animation: smooth-in 320ms ease forwards;
}
.container--is-not-active .information-block {
animation: smooth-in-reverse 320ms ease forwards;
}
@keyframes smooth-in {
10% {
bottom: 0;
height: 60%;
margin-right: 0;
margin-left: 0;
padding-right: calc(1.875rem);
padding-left: calc(1.875rem);
opacity: 1;
visibility: visible;
}
70% {
bottom: -2rem;
height: calc(60% 4rem);
margin-right: 0;
margin-left: 0;
padding-right: calc(1.875rem);
padding-left: calc(1.875rem);
transform: translateY(0);
}
100% {
bottom: -2rem;
height: calc(60% 4rem);
margin-right: -2rem;
margin-left: -2rem;
padding-right: calc(1.875rem 2rem);
padding-left: calc(1.875rem 2rem);
opacity: 1;
visibility: visible;
transform: translateY(0);
}
}
@keyframes smooth-in-reverse {
10% {
bottom: -2rem;
height: calc(60% 4rem);
margin-right: -2rem;
margin-left: -2rem;
padding-right: calc(1.875rem 2rem);
padding-left: calc(1.875rem 2rem);
opacity: 1;
visibility: visible;
transform: translateY(0);
}
70% {
bottom: -2rem;
height: calc(60% 4rem);
margin-right: 0;
margin-left: 0;
padding-right: calc(1.875rem);
padding-left: calc(1.875rem);
transform: translateY(0);
}
100% {
bottom: 0;
height: 60%;
margin-right: 0;
margin-left: 0;
padding-right: calc(1.875rem);
padding-left: calc(1.875rem);
opacity: 1;
visibility: none;
}
}
<div class="container">
<button class="container__toggle-action js-toggle-animation">toggle animation</button>
<div class="container__content">
<div class="information-block">
<h2>headline</h2>
<p>Lorem ipsum dolor sit amet consectetur, adipisicing elit. Eaque obcaecati debitis nihil ratione dicta quaerat, dolores quis laboriosam quae recusandae!</p>
</div>
</div>
</div>
Комментарии:
1. Это немного запутанно из-за необходимости добавлять a для добавления класса при удалении элемента. Есть ли другой способ?
2. я думаю, это единственный способ. другим очень похожим решением было бы изменить кнопку для отображения одного класса, а не другого
3. вы нашли другой способ?