Установите родительский элемент как скрытое переполнение, чтобы отключить анимацию, но продолжать показывать дочерний элемент

У меня есть два меню, между которыми вы можете переключаться с помощью переключателя. Каждый пункт меню имеет раскрывающийся список, который отображается при нажатии на пункт меню.

Проблема заключается в том, что при нажатии на переключатель отображается анимация перехода между двумя меню (выдвижение и выдвижение). Я хочу сохранить скользящую анимацию только внутри элемента меню, поэтому я использовал overflow-y: hidden;, чтобы это произошло. Однако это также отключает мои выпадающие меню, поскольку они являются дочерними элементами родителя, у которого есть overflow: hidden.

Я сделал codepen, показывающий проблему здесь:

https://codepen.io/twan2020/pen/jOMMoom

Когда вы переключаете меню, вы можете видеть, что анимация переполняет контейнер меню.

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

.categoriemenu .categorielijst {
  width: 100%;
  margin-bottom: 0px;
  display: flex;
  justify-content: space-evenly;
  position: relative;
  overflow-y: hidden;
}

Как я могу это исправить?

Я попытался установить product-menu (который является классом раскрывающихся меню) на position:fixed, но это нарушает стиль, мое меню также имеет переменную высоту, поэтому я хотел бы знать, есть ли более простое решение для этого?

Существуют решения/обходные пути для «Выход из скрытого переполнения», но они довольно сложны и зависят от конкретных обстоятельств. Я предполагаю, что вам лучше всего применить overflow-y: hidden только на время анимации переключения меню, а затем сбросить его до значения по умолчанию.

CBroe 10.12.2020 11:54

@CBroe Я не думал об этом. Звучит как отличное решение. Я попробую это.

twan 10.12.2020 12:10

@CBroe Заработало, установив overflow-y:hidden только на время анимации. Спасибо

twan 10.12.2020 15:47

возможно, вы хотите рассмотреть возможность написания самостоятельного ответа со своим решением, чтобы избежать ответа только в комментариях. см. stackoverflow.com/help/self-answer

Vickel 10.12.2020 22:53
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
365
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я исправил это, установив таймер на overflow-hidden на продолжительность анимации следующим образом:

$('.toggle-switch input').on('change', function() {
    if ($('input[name=switch]:checked', '.toggle-switch').val() == 1) {
        $(".categorielijst").css('overflow-y', 'hidden');
        $("#menu1").addClass('animate__slideInUp');
        $("#menu2").addClass('animate__slideOutUp');
        $("#menu1").css('display', 'flex');
        $("#menu1").removeClass('animate__slideOutDown');
        $("#menu2").removeClass('animate__slideInDown');
        setTimeout(function() {
            $(".categorielijst").css('overflow-y', 'visible');
        }, 600)
    } else if ($('input[name=switch]:checked', '.toggle-switch').val() == 2) {
        $(".categorielijst").css('overflow-y', 'hidden');
        $("#menu1").css('position', 'absolute')
        $("#menu1").addClass('animate__slideOutDown');
        $("#menu2").addClass('animate__slideInDown');
        $("#menu2").css('display', 'flex');
        $("#menu1").removeClass('animate__slideInDown');
        $("#menu2").removeClass('animate__slideOutUp');
        setTimeout(function() {
            $(".categorielijst").css('overflow-y', 'visible');
        }, 600);
    }
});

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

Другие вопросы по теме