Плавная анимация для подложки бокового меню

Всех приветствую.

Реализовываю боковое меню вот из этого примера: https://blog-kopilka.ru/demo_html/bootstrap4-sidebar/index.php

Не получается решить вопрос со скоростью появления/исчезновения полупрозрачной подложки, когда открывается/закрывается боковое меню.

В примере код, отвечающий за подложку, выглядит так:

.overlay {
    display: none;
    position: fixed;
    width: 100vw;
    height: 100vh;
    background: rgba(0, 0, 0, 0.7);
    z-index: 998;
    opacity: 0;
    transition: all 0.5s ease-in-out;
}
.overlay.active {
    display: block;
    opacity: 1;
}

Я понимаю, что свойство, отвечающее за скорость анимации является transition. Однако, как бы я не менял время данного свойства, появление/исчезновение подложки анимируется мгновенно. Выглядит это очень резко.

Буду признателен за пояснение причин, из-за которых свойство transition не работает у данного элемента. А также за рекомендации, как можно реализовать поставленную задачу и сделать появление/исчезновение подложки плавным.

Заранее благодарю за помощь.


Ответы (2 шт):

Автор решения: Мне без сахара

display block; и display none; не берут свойство transition что бы случилось, так что можешь дерзать так или с помощю библиотеки jQuery

.overlay {
    display: none;
    position: fixed;
    width: 100vw;
    height: 100vh;
    background: rgba(0, 0, 0, 0.7);
    z-index: 998;
    opacity: 0;
    transition: all 0.5s ease-in-out;
    animation: anim 1s ease;
}

@keyframes anim{
  0%{display:block;}
  10%{opacity:0;}
  100%{opacity:1;}
}

→ Ссылка
Автор решения: Александр

Вам стоит отказаться от использование display так как они прерывает вашу анимацию. Только opacity вам тоже не поможет, так как элемент все еще находиться в области видимости и не будет пропускать некоторые события например клик на элементы стоящие ниже по z-index. Для того что бы пропустить клик на элементы который находятся ниже по z-index вас стоит использовать другие свойства. Например: visibility в паре с opacity.

Пример кода:

  .overlay {
    position: fixed;
    width: 100vw;
    height: 100vh;
    z-index: 1000;
    background: rgba(0, 0, 0, 0.7);
    opacity: 0;
    visibility: hidden;
    transition: visibility 0.5s, opacity 0.5s ease-in-out;
  }
  .overlay.active {
    visibility: visible;
    opacity: 1;
    transition: visible 0.5, opacity 0.5s ease-in;
  }

Пример песочницы: https://codesandbox.io/s/eloquent-water-rcmro?file=/index.html:111-515

→ Ссылка