Как сделать плавную замену блоков? css js
Всем привет! Не могу разобраться как сделать замену блоков с анимацией
Есть блок родитель - .form_block Его дочерние эл-ты - .form и .form_after
.form_after изначально скрыт, нужно сделать плавное пропадание .form с уменьшением высоты у родителя .form_block до высоты .form_after и плавным появлением .form_after
Код:
<div class="form_block">
<div class="form"></div>
<div class="form_after"></div>
</div>
Ответы (1 шт):
Автор решения: UModeL
→ Ссылка
В обработчике нажатия кнопки отправки добавляем родительскому блоку вспомогательный класс. Основываясь на наличии этого класса, изменяются необходимые свойства в стилях.
document.querySelector(".form button").addEventListener("click", function(ev) {
ev.preventDefault();
document.querySelector(".form_block").classList.toggle("sending", true);
});
.form_block {
font: bold 14px/1em sans-serif;
position: relative;
height: 167px; width: 438px;
border: 1px solid #d6323b;
border-radius: 30px;
overflow: hidden;
box-sizing: border-box;
box-shadow: 0 0 5px #0008;
background-color: #efefef;
}
.form_block.sending {
height: 99px;
transition: height 1s ease-in-out;
}
.form_block > * {
position: absolute;
top: 50%; left: 50%;
width: 100%;
padding: 0 40px;
box-sizing: border-box;
transform: translate(-50%, -50%);
}
.form {
display: flex;
flex-flow: column nowrap;
justify-content: center;
text-align: center;
gap: 0.8em;
height: 165px;
}
.sending .form {
opacity: 0;
pointer-events: none;
transition: opacity .6s ease-out;
}
.form p {
font: bold 1.4em/1em sans-serif;
margin: 0;
color: #000;
}
.form input {
height: 40px;
padding: 1em;
border: 1px solid #d6323b;
border-radius: 1em;
box-sizing: border-box;
background-color: #fff;
}
.form button {
font: bold 1.2em/1em sans-serif;
height: 44px;
border: none;
border-radius: 1000px;
color: #fff;
background-color: #d6323b;
cursor: pointer;
}
.form:invalid button {
opacity: 0.5;
filter: saturate(10%);
pointer-events: none;
}
.form_after {
position: absolute;
display: flex;
flex-flow: row nowrap;
justify-content: center;
align-items: center;
text-align: center;
gap: 17px;
height: 99px;
opacity: 0;
pointer-events: none;
}
.sending .form_after {
opacity: 1;
pointer-events: all;
transition: opacity .6s ease-out .2s;
}
.form_after .icon {
position: relative;
margin-left: -30px;
height: 40px; width: 40px;
border-radius: 1000px;
background-color: #e8979b;
box-shadow: inset 0 0 2px 1px #6a6a6a;
}
.form_after .icon::before {
content: "";
position: absolute;
top: 17px; left: 21px;
height: 10px; width: 17px;
box-shadow: inset 4px -4px 0 #fff;
transform: translate(-50%, -50%) rotate(-45deg);
filter: drop-shadow(0 0 1px #6a6a6a) drop-shadow(0 0 1px #6a6a6a) drop-shadow(0 0 .5px #6a6a6a) drop-shadow(0 0 .5px #6a6a6a);
}
.form_after p {
font: bold 1.1em/1em sans-serif;
letter-spacing: -0.6px;
margin: 0;
color: #000;
}
body {
margin: 0;
min-height: 100vh;
background-color: #efefef;
display: flex;
justify-content: space-around;
align-items: center;
}
<div class="form_block">
<form class="form">
<p>Submit your application</p>
<input type="email" placeholder="Your mail" required>
<button>Send</button>
</form>
<div class="form_after">
<div class="icon"></div>
<p>Thank you, I will contact you soon</p>
</div>
</div>

