使用纯 JS 完成转换后设置显示 none
Set display none after transition has finished with pure JS
如何仅在 CSS 转换完成后将显示设置为 none(反之亦然)?
这是我当前的代码,但效果不佳 – 转换不可见,因为我 adding/removing display:none;
很直接。
<script type="text/javascript">
var mobile_menu = document.querySelector('#mobile-menu');
var mobile_menu_open = document.querySelector('#open-mobile-menu');
var mobile_menu_close = document.querySelector('#close-mobile-menu');
mobile_menu_open.addEventListener('click', function (event) {
mobile_menu.classList.remove('duration-100', 'ease-in', 'opacity-0', 'scale-95');
mobile_menu.classList.add('duration-200', 'ease-out', 'opacity-100', 'scale-100');
mobile_menu.removeAttribute('style');
});
mobile_menu_close.addEventListener('click', function (event) {
mobile_menu.classList.remove('duration-200', 'ease-out', 'opacity-100', 'scale-100');
mobile_menu.classList.add('duration-100', 'ease-in', 'opacity-0', 'scale-95');
mobile_menu.style.display = "none";
});
</script>
我只能想到 setTimeout();
但在大多数情况下,它不被认为是一个合适的解决方案,而是一个肮脏的黑客。我还有其他选择吗?
您可以使用 transitionend
事件侦听器。
mobileMenu.addEventListener('transitionend', setDisplayNone);
动画结束后,会执行setDisplayNone()
。如果你只想运行这一次,你可以在setDisplayNone
函数的末尾添加:
mobileMenu.removeEventListener('transitionend', setDisplayNone);
示例:
var div = document.querySelector('div')
function setDisplayNone() {
div.style.display = 'none'
}
document.querySelector('button').onclick = function() {
div.addEventListener('transitionend', setDisplayNone);
div.classList.add('transition')
}
.transition {
transition-duration: 3s;
opacity: 0;
}
<button>Click me!</button>
<br>
<div id='someDiv'>
Click the button!
</div>
This text will shift upwards once the div has display:none
如何仅在 CSS 转换完成后将显示设置为 none(反之亦然)?
这是我当前的代码,但效果不佳 – 转换不可见,因为我 adding/removing display:none;
很直接。
<script type="text/javascript">
var mobile_menu = document.querySelector('#mobile-menu');
var mobile_menu_open = document.querySelector('#open-mobile-menu');
var mobile_menu_close = document.querySelector('#close-mobile-menu');
mobile_menu_open.addEventListener('click', function (event) {
mobile_menu.classList.remove('duration-100', 'ease-in', 'opacity-0', 'scale-95');
mobile_menu.classList.add('duration-200', 'ease-out', 'opacity-100', 'scale-100');
mobile_menu.removeAttribute('style');
});
mobile_menu_close.addEventListener('click', function (event) {
mobile_menu.classList.remove('duration-200', 'ease-out', 'opacity-100', 'scale-100');
mobile_menu.classList.add('duration-100', 'ease-in', 'opacity-0', 'scale-95');
mobile_menu.style.display = "none";
});
</script>
我只能想到 setTimeout();
但在大多数情况下,它不被认为是一个合适的解决方案,而是一个肮脏的黑客。我还有其他选择吗?
您可以使用 transitionend
事件侦听器。
mobileMenu.addEventListener('transitionend', setDisplayNone);
动画结束后,会执行setDisplayNone()
。如果你只想运行这一次,你可以在setDisplayNone
函数的末尾添加:
mobileMenu.removeEventListener('transitionend', setDisplayNone);
示例:
var div = document.querySelector('div')
function setDisplayNone() {
div.style.display = 'none'
}
document.querySelector('button').onclick = function() {
div.addEventListener('transitionend', setDisplayNone);
div.classList.add('transition')
}
.transition {
transition-duration: 3s;
opacity: 0;
}
<button>Click me!</button>
<br>
<div id='someDiv'>
Click the button!
</div>
This text will shift upwards once the div has display:none