Мне кажется, что вы столкнулись с двумя проблемами.
Первая проблема заключается в том, что вы забыли включить атрибут content
в свои псевдоэлементы (часто это будет пусто, например * 1004).*).Без этого атрибута ваши псевдоэлементы не будут существовать в DOM.Выполнение фрагмента кода и его проверка подтверждают это, поскольку псевдоэлементы нигде не найдены.
Во-вторых, вы создаете несколько псевдоэлементов.body::before
- это собственный псевдоэлемент, а body.is-changing::before
- отдельный псевдоэлемент.Если вы надеетесь создать постоянный набор элементов, которые действуют как «двери» для отображения загрузки, вы можете рассмотреть возможность создания двух реальных элементов, которые расположены в position: fixed
выше и ниже области просмотра, а затем скользить внутрь или наружу, когдакласс добавлен.Возможно, это могут быть div.upper-door
и div.lower-door
.
Кроме того, мне кажется, что вам нужен переход для вашего преобразования, иначе псевдоэлементы просто "защелкнутся" взад-вперед,Вы можете контролировать положение своих элементов в разных точках во время этого перехода с помощью анимации CSS.Ваш JavaScript в основном остался бы прежним, если бы не таргетинг на дивизии .upper-door
и .lower-door
с использованием document.querySelector()
, или просто использование идентификаторов, а не классов и нацеленность с getElementById()
, если это имеет больше смысла для вас.Ваш CSS может выглядеть следующим образом:
div.upper-door {
top: 0;
transform: translateY(-100%);
}
div.upper-door.is-changing {
animation-duration: 5s;
animation-name: upper-door-closeopen;
}
div.lower-door {
bottom: 0;
transform: translateY(100%);
}
div.lower-door.is-changing {
animation-duration: 5s;
animation-name: lower-door-closeopen;
}
@keyframes upper-door-closeopen {
0% {
transform: translateY(-100%);
}
25% {
transform: translateY(0);
}
75% {
transform: translateY(0);
}
100% {
transform: translateY(-100%);
}
}
@keyframes lower-door-closeopen {
0% {
transform: translateY(100%);
}
25% {
transform: translateY(0);
}
75% {
transform: translateY(0);
}
100% {
transform: translateY(100%);
}
}
Анимация CSS будет срабатывать при добавлении .is-changing
к элементу.В ходе эксперимента вы можете обнаружить, что различные варианты этого решения (например, использование прослушивателей событий, если нажатие кнопки вызывает экран загрузки) являются идеальными.
На MDN * 1025 имеется большой ресурс* для анимации CSS, если вам нужна дополнительная информация.