#javascript #css
#javascript #css
Вопрос:
У меня возникла проблема с системой уведомлений, которую я создаю.
Все работает нормально до конца, когда запускается мой javascript для удаления класса show из div уведомлений. Когда класс удаляется, происходит короткое мигание в начальную позицию div.
JS для отображения уведомлений:
function showNotification() {
notificationRef.current.classList.add("nShow");
setTimeout(() => {
notificationRef.current.classList.remove("nShow");
}, 4000);
}
CSS уведомлений имеет общее позиционирование и стиль с visibility: hidden
помощью и top: 85px
set .
nShow (класс для отображения уведомлений):
.notification.nShow {
visibility: visible;
animation: fadeNotiIn 1s, fadeNotiOut 1s 3s;
}
@keyframes fadeNotiIn {
from {
top: 0;
opacity: 0;
}
to {
top: 85px;
opacity: 1;
}
}
@keyframes fadeNotiOut {
from {
top: 85px;
opacity: 1;
}
to {
top: 0;
opacity: 0;
}
}
Кажется, что visibility: hidden устанавливается после непрозрачности: 1, поэтому при удалении класса show возникает вспышка.
Спасибо
Комментарии:
1. привет, @Tom, можешь добавить рабочий пример со своим кодом, чтобы мы могли его протестировать?
Ответ №1:
Вот пример. Я бы не советовал вам использовать animation
здесь. Между двумя анимациями, которые вы планируете, ваш элемент возвращается к своему состоянию по умолчанию, и это делает вещи уродливыми.
Вместо этого я бы использовал короткое transition
замыкание, чтобы немного сгладить разницу между двумя состояниями, и продолжал обрабатывать его через JS.
const notification = document.querySelector('.notification');
function startNotification() {
notification.classList.add("nShow");
setTimeout(() => {
notification.classList.remove("nShow");
}, 3000);
}
.notification {
opacity: 0;
position: absolute;
top: 0px;
transition: all 1s;
}
.notification.nShow {
top: 85px;
opacity: 1;
}
.root {
position: relative;
}
<button onclick="startNotification()">Start notification</button>
<div class="root">
<div class="notification">Hello</div>
</div>
Как было сказано в первой версии, я не думаю, что вам следует visibility
использовать и opacity
одновременно, и поскольку вы уже используете непрозрачность, давайте использовать ее полностью.
Комментарии:
1. Спасибо за ваш ответ — я пробовал это ранее, однако из-за .notification, имеющего непрозрачность 0 и небольшую паузу между обеими анимациями, он устанавливает непрозрачность 0 в середине анимации, как показано здесь
2. Работаем над образцом 🙂 BRB
3. Вот это, я думаю, вам следует использовать
transition
вместо этого, потому что, как вы заметили, если вы планируете несколько анимаций, графическая конфигурация вашего элемента сбрасывается между обеими частями вашей анимации.4. Хорошая идея, кажется немного «хакерской», поскольку технически элемент присутствует на странице. Вы можете исправить это, добавив
pointer-events: none
в класс .notification иpointer-events: all
в . Класс nShow означает, что любые кнопки / текст могут быть выделены только тогда, когда отображается уведомление. Немного подождет, чтобы увидеть другие ответы, но примет, если других решений нет. Спасибо!