Решение заключается в использовании AnimationEvent слушателей. Вот моя сырая реализация:
CSS
• 2 анимации (открытие, закрытие)
• 2 класса (открытый, закрытый)
• 2 состояния (переполнение скрытого/видимое)
открытые и закрытые всегда переключаются при анимации, а скрытые/видимые состояния по-разному выработаны при анимации.
Примечание: вы увидите элемент главного меню #: это UL с переводимыми переводами по оси Y, потому что все это эффект слайд-вниз/вверх.
@include keyframes(open) {
0% {
height:0;
}
100% {
height:$main_menu_height;
}
}
@include keyframes(close) {
0% {
height:$main_menu_height;
}
100% {
height:0;
}
}
#main-menu-box{
overflow-y:hidden;
height:0; // js
&.closed{
@include animation('close 200ms ease-out 0s');
}
&.opened{
@include animation('open 200ms ease-out 0s 1');
//#main-menu{
// @include translate(0, 0);
//}
}
&.overflow-hidden{
overflow-y:hidden;
}
&.overflow-visible{
overflow-y:visible;
}
}
JS
• гамбургер простая кнопка включения/выключения
• теперь я должен был использовать как JQuery и ваниль селекторы ..
function poly_event_listener(element, type, callback) {
var pfx = ['webkit', 'moz', 'MS', 'o', ''];
for(var i=0; i<pfx.length; i++) {
if (pfx[i] === '') type = type.toLowerCase();
element.addEventListener(pfx[i]+type, callback, false);
}
}
var hamburger = $('header .hamburger');
var main_menu_box = $('#main-menu-box');
var main_menu_box_std = document.querySelector('#main-menu-box');
var init_menu = true;
hamburger.click(function(){
if(init_menu){
main_menu_box.addClass('opened');
init_menu = false;
return;
}
main_menu_box.toggleClass('opened closed');
});
poly_event_listener(main_menu_box_std,'AnimationStart',function(e){
main_menu_box.addClass('overflow-hidden');
main_menu_box.removeClass('overflow-visible');
});
poly_event_listener(main_menu_box_std,'AnimationEnd',function(e){
// in all the other cases I want hidden:true, visible:false
// if class == closed, since animationend comes after animationstart, the state will already be hidden:true, visible:false
// so non need to check for 'closed' here
if(main_menu_box.hasClass('opened')){
main_menu_box.addClass('overflow-visible');
main_menu_box.removeClass('overflow-hidden');
}
});
это работает для меня.
Не могли бы вы включить фрагмент или скрипку? –
Не достаточно ли всего этого кода? :) – Stratboy
Кроме того, это старый пост, не уверен, что это по-прежнему действительно лучшее/первоклассное решение. Может быть, но я должен исследовать. – Stratboy