#javascript #css
#javascript #css
Вопрос:
Я всегда могу добавить fadeIn с переходом. Но по какой-то причине fadeOut никогда не работает. Даже после установки непрозрачности в 0 и перехода к родительскому элементу body / class.
Мне интересно, возможно ли отключить то же самое, что и fade in, при нажатии?
Кто-нибудь может объяснить, что я делаю не так, и возможно ли это сделать?
body {
height: 100%;
padding: 0;
margin: 0;
color: $text-body;
overflow-x: hidden;
overflow-y: auto;
amp;:after {
content: '';
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: -10;
visibility: hidden;
opacity: 0;
transition: opacity 1.2s ease-out;
}
amp;.bg-dark {
amp;:after {
background: rgba($color-black, 0.7);
visibility: visible;
opacity: 1;
z-index: 100;
transition: opacity 1.2s ease-out;
}
}
@if $use-custom-fonts == true {
font-family: $font-body-custom;
} @else {
font-family: $font-body;
}
}
Мой JS:
(() => {
const menuToggle = document.querySelector('[rel="js-menu"]');
const body = document.body;
if (!menuToggle) {
return;
}
const sideNav = document.querySelector('[rel="js-side__nav"]');
const sideNavClose = document.querySelector('[rel="js-side__close"]');
const openMenu = (e) => {
sideNav.classList.add('side__nav--open');
body.classList.add('bg-dark');
e.preventDefault();
};
const closeMenu = (e) => {
if (sideNav.classList.contains('side__nav--open')) {
sideNav.classList.remove('side__nav--open');
body.classList.remove('bg-dark');
}
e.preventDefault();
};
document.addEventListener('keyup', (e) => {
if (e.keyCode === 27) {
if (sideNav.classList.contains('side__nav--open')) {
sideNav.classList.remove('side__nav--open');
body.classList.remove('bg-dark');
}
}
});
menuToggle.addEventListener('click', openMenu);
sideNavClose.addEventListener('click', closeMenu);
})();
Комментарии:
1. Где ваш HTML? Пожалуйста, опубликуйте рабочий фрагмент.
2. Фрагмент не является ссылкой на ваш веб-сайт.
Ответ №1:
Проблема в visibility: hidden;
. Он мгновенно скрывает ваш элемент без перехода, который действует только для opacity
.
Другая проблема заключается в том, что background-color
устанавливается только на .bg-dark
и transition
только для opacity
. Таким образом, непрозрачность работает, но изменение цвета фона происходит мгновенно.
Я привел пример с удаленным visibility
и примененным background
для начального состояния (без .bg-dark
)
(() => {
const menuToggle = document.querySelector('[rel="js-menu"]');
const body = document.body;
if (!menuToggle) {
return;
}
const sideNav = document.querySelector('[rel="js-side__nav"]');
const sideNavClose = document.querySelector('[rel="js-side__close"]');
const openMenu = (e) => {
sideNav.classList.add('side__nav--open');
body.classList.add('bg-dark');
e.preventDefault();
};
const closeMenu = (e) => {
if (sideNav.classList.contains('side__nav--open')) {
sideNav.classList.remove('side__nav--open');
body.classList.remove('bg-dark');
}
e.preventDefault();
};
menuToggle.addEventListener('click', openMenu);
sideNavClose.addEventListener('click', closeMenu);
})();
body {
height: 100%;
padding: 0;
margin: 0;
overflow-x: hidden;
overflow-y: auto;
}
body:after {
content: '';
position: fixed;
/* moved background style here */
background: rgba(0, 0, 0, 0.7);
/* removed visibility */
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: -1;
opacity: 0;
transition: opacity 1.2s ease-out;
}
body.bg-dark:after {
opacity: 1;
z-index: -1;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div rel="js-side__nav"></div>
<button rel="js-side__close">close</button>
<button rel="js-menu">open</button>
Комментарии:
1. Удалена видимость, но все еще при закрытии не исчезает.
2. Также проблема с вашим
background-color
. Приведенный пример.