Все из-за visibility:hidden
в js
...
} else {
document.querySelectorAll("#modal, #background-dimmer").forEach(x => x.style.cssText="opacity: 0; visibility:hidden;")
}
...
мгновенно вы изменяете opacity
на 0
, но также visibility:hidden
, поэтому нет времени для перехода, сразу же, когда элемент кода запускает скрытие.
Вы используете cssText
, чтобы изменить свойства элемента, чтобы visibility:visible
не было там, когда вы наводите мышь на другой элемент, вместо этого будет visibility:hidden
из css (так что вам также нужно удалить это) .
Я знаю, что это #modal
захватывает событие наведения мыши, тогда ... вот в чем проблема выяснить
Я не знаю, нацелено ли это решение на то, чтобы скрыть модал, когда вы mouseover
только другой элемент, что если я оставлю мышь целиком со стола, модал останется ... просто хотел упомянуть, может быть, его не подходит.
Я сделал скрипку на основе вашего кода: https://jsfiddle.net/svh6dpfk/1/
Одна из идей исправить это событие захвата #modal - добавить правильную видимость в качестве обратного вызова (есть событие transitionend
, которое будет захватывать момент, когда анимация завершена, поэтому что-то вроде этого может помочь:
document.querySelector("#modal, #background-dimmer").addEventListener("transitionend", function(el) {
if(parseFloat(el.target.style.opacity) > 0){
el.target.style.cssText = "visibility:visible;opacity:1";
alert("animation end visible");
}else{
el.target.style.cssText = "visibility:hidden;opacity:0";
alert("animation end unvisible");
}
});
Обновление
у меня сейчас работает ...
это немного сложно, ваш CSS должен иметь visibility:hidden
для модального и фонового затемнения (как в вашем коде)
мне кажется, это работает:
document.querySelector(".container").addEventListener("mouseover", function(el) {
if (el.target.id=="modal_maker" || el.target.id=="modal") {
document.getElementById("modal").style.cssText = "visibility:visible;opacity: 1;"
document.getElementById("background-dimmer").style.cssText = "visibility:visible;opacity: 0.75;"
} else {
if(document.getElementById("modal").style.opacity == "1"){
document.querySelectorAll("#modal, #background-dimmer").forEach(x => x.style.cssText="visibility:visible;opacity: 0; ")
}
/* alert("should be on leave") */;
}
})
эта часть .forEach(x => x.style.cssText="visibility:visible;opacity: 0; ")
изменяется, потому что ваш css всегда имеет visibility:hidden
, поэтому вам нужно всегда выполнять переход на visible
.
полный пример:
https://jsfiddle.net/Loary65w/1/
вы должны помнить, что для поддержки всех этих событий вам нужна поддержка кросс-браузеров
webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend
Надеюсь, это поможет. Возможно, есть лучшее решение, намного более простое, и я слишком усложнил это: F