Плавное появление подменю

461
07 сентября 2017, 20:19

В мобильной версии меню при заходе в подменю предыдущий уровень мигает, то есть сперва исчезает, потом появляется следующий уровень. Как сделать появление и исчезновение плавным?

<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script> 
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"/>
</head>
<body>
    <div>
        <div class="rmm style">
            <ul>
                <li>
                    <a href="#">Books</a>
                    <ul>
                        <li>
                            <a href="#">Audiobooks</a>
                        </li>
                        <li>
                            <a href="#">Cookbooks</a>
                        </li>
                        <li>
                            <a href="#">Catalogs</a>
                        </li>
                        <li>
                            <a href="#">Other</a>
                            <ul>
                                <li><a href="#">Other 1</a></li>
                                <li><a href="#">Other 2</a></li>
                            </ul>
                        </li>
                    </ul>
                </li>
                <li>
                    <a href="#">Dvds</a>
                </li>
                <li>
                    <a href="#">Music</a>
                    <ul>
                        <li><a href="#">Cassettes</a></li>
                        <li><a href="#">CD</a></li>
                        <li><a href="#">Records</a></li>
                    </ul>
                </li>
                <li>
                    <a href="#">Video games</a>
                </li>
            </ul>
        </div>
    </div>
</body>
</html>
<script type="text/javascript">
    function adaptMenu() {
    /*  toggle menu on resize */
    $('.rmm').each(function() {
        // initialize vars
        var maxWidth = 0;
        var width = 0;
        // width of menu list (non-toggled)
        $('.rmm-menu').children("li").each(function() {
            if($(this).parent().hasClass('rmm-menu')){
                width = $(this).outerWidth();//outerWidth();
                if(width>0){
                    maxWidth += width;
                }
            }
        });
        // compare width
        var width = $('.rmm').css('max-width');
        width = width.replace('px', ''); 
        if ( $(this).parent().width() > width ) {
            $('.rmm-menu').removeClass("rmm-mobile");
            //remove all classes from mobile verion
            $(".rmm-menu ul").removeClass("rmm-subview");
            $(".rmm-menu li").removeClass("rmm-subover-hidden");
            $(".rmm-menu li").removeClass("rmm-subover-visible");
            $(".rmm-menu a").removeClass("rmm-subover-header");
            $(".rmm-toggled").removeClass("rmm-closed");
            $('.rmm-toggled').hide();
            //$('.rmm-toggled').removeClass("rmm-view");
            //$('.rmm-toggled').addClass("rmm-closed");
        }else {
            if($('.rmm-menu').is(".rmm-mobile")) return;
            $('.rmm-menu').addClass("rmm-mobile");
            $('.rmm-toggled').show();
            $('.rmm-toggled').addClass("rmm-closed");
            //$('.rmm-toggled').removeClass("rmm-closed");
        }
    });
}
function responsiveMultiMenu() {
    $('.rmm').each(function() {
        // create mobile menu classes here to light up HTML
        $(this).find("ul").addClass("rmm-submenu");
        $(this).find("ul:first").addClass("rmm-menu");
        $(this).find("ul:first").removeClass("rmm-submenu");
        $(this).find('.rmm-submenu').prepend( '<li class="rmm-back"><a href="#">back</a></li>' );
        $(this).find("ul").prev().addClass("rmm-dropdown");
        // initialize vars
        var maxWidth = 0;
        var width = 0;
        // width of menu list (non-toggled)
        $('.rmm-menu').children("li").each(function() {
            if($(this).parent().hasClass('rmm-menu')){
                width = $(this).outerWidth();//outerWidth();
                if(width>0){
                    maxWidth += width;
                }
                console.log(width)
            }
        });
        if ($.support.leadingWhitespace) {
            $(this).css('max-width' , (maxWidth+5)+'px');
        }else{
            $(this).css('width' , (maxWidth+5)+'px');
        }
        // create dropdown button
        var str=''
        str+='<div class="rmm-toggled rmm-view rmm-closed">'
            str+='<div class="rmm-toggled-controls">'
                str+='<div class="rmm-toggled-title">Menu</div>';
                str+='<div class="rmm-toggled-button"><span>&nbsp;</span><span>&nbsp;</span><span>&nbsp;</span></div>';
            str+='</div>';
        str+='</div>';
        $(this).prepend(str);
    });
    // click interacts in mobile wersion
    $('.rmm-dropdown').click(function (e) {
        if($(this).parents(".rmm-menu").hasClass('rmm-mobile')){
            e.preventDefault();
            e.stopPropagation();
            $(this).next().addClass("rmm-subview");
            var index=$(this).parent().index();
            var i=0;
            $(this).parent().parent().children("li").each(function() {
                if(index==$(this).index()){
                    $(this).removeClass("rmm-subover-hidden");
                    $(this).addClass("rmm-subover-visible");
                }else{
                    $(this).removeClass("rmm-subover-visible");
                    $(this).addClass("rmm-subover-hidden");
                }
            });
            $(this).addClass("rmm-subover-header");
        }
    });
    // click back interacts in mobile version
    $('.rmm-back a').click(function () {
        $(this).parent().parent().prev().removeClass("rmm-subover-header");
        $(this).parent().parent().removeClass("rmm-subview");
        $(this).parent().parent().parent().parent().find("li").removeClass("rmm-subover-hidden");
    });
    // click toggler interacts in mobile version
    $('.rmm-toggled, .rmm-toggled .rmm-button').click(function(){
        if ($(this).is(".rmm-closed")) {
            $(this).removeClass("rmm-closed");
        }else {
            $(this).addClass("rmm-closed");
        }
    }); 
}
jQuery(window).load(function() {
    responsiveMultiMenu();
    adaptMenu();
});

$(window).resize(function() {
    adaptMenu();
});
</script>
<style type="text/css"> 
.rmm {margin: 0 auto;}
.rmm ul {margin: 0; padding:0; list-style: none; position: relative; background: #000;}
.rmm ul:after {content: ""; clear: both; display: block;}
.rmm ul li {float: left;}
.rmm ul li:hover {background: #202020;}
.rmm ul li:hover > ul {display: block;}
.rmm ul li:hover a{color: #fff;}
.rmm ul li a {color: #fff; display: block; text-decoration: none;}
.rmm ul ul {display: none; margin:0; padding: 0; position: absolute; top: 100%;}
.rmm ul ul li {float: none; position: relative;}
.rmm ul ul li a{color: #fff;}
.rmm ul ul li a:hover {background: #202020;}
.rmm ul ul ul {position: absolute; left: 100%; top:0; width: 100%;}
.rmm-toggled {width: 100%; background-color: #555555; min-height: 50px; margin: 0 auto; display: none;}
.rmm-closed ~ .rmm-mobile {display: none!important;}
.rmm-toggled-controls{width: 100%;}
.rmm-toggled-title{width: 60%; float: left; font-size: 27px; color: #fff; font-weight:600; display: block; padding: 8px 0; text-decoration: none; text-transform: uppercase; text-align: left; padding-left: 35px;}
.rmm-toggled-button{width: 20%; float: left; margin-top: 3px;
    display:block;
    width: 32px;
    padding:0 !important;
    margin:10px 10px 0 0;
    border:1px solid #fff;
    border-radius:3px;
    float: right;
}
.rmm-toggled-button span{float: left; display:block; margin: 3px 6px; height: 3px; background:white; width:20px;}
.rmm .rmm-back{display: none; font-size: 12px;}
.rmm .rmm-back:after {display: none;}
.rmm .rmm-back a:after {
    font-family: 'icomoon';
    speak: none;
    -webkit-font-smoothing: antialiased;
    content: "\e000";
    position: relative;
    display: inline-block;
    -webkit-transform: rotate(-60deg);
    transform: rotate(-60deg);
    top: 1px;
    right: -2px ;
    float: left;
    font-size: 10px;
}
.rmm-mobile .rmm-back{display: block;}
.rmm-mobile{width: 100%;}
.rmm-mobile .rmm-dropdown:hover ~ ul, .rmm-mobile .rmm-dropdown:hover > ul ,.rmm-mobile .rmm-dropdown:hover + ul {display: none!important;}
.rmm-mobile ul{width: 100%; position: inherit!important;}
.rmm-mobile li{width: 100%; }
.rmm-dropdown{display: block!important;}
.rmm-mobile .rmm-subview{display: block!important; width: 100%;}
.rmm-mobile .rmm-subover-hidden{display: none!important;}
.rmm-mobile .rmm-subover-visible{display: block;}
.rmm-mobile .rmm-subover-header{display: none!important; padding: 0; margin: 0;}
.rmm-mobile .rmm-submenu{position: relative; left: 0px;}
.rmm .rmm-mobile li:hover > ul {display: none;}
.rmm.style {text-align: left; font-family: Tahoma;}
.rmm.style ul {box-shadow: 0px 0px 9px rgba(0, 0, 0, 0.15); background:#990; text-transform: uppercase; display: inline-table; text-align:left;}
.rmm.style ul li {text-align:left;}
.rmm.style ul li:hover {background: #4b545f;}
.rmm.style ul ul {display: none; margin:0; background: #5f6975; border-radius: 0px; padding: 0; position: absolute;}
.rmm.style ul li a {color: #fff; font-weight:600; display: block; padding: 15px 35px; text-decoration: none; font-weight:600; }
.rmm.style ul ul li {border-bottom: 1px solid #575F6A; border-top: 1px solid #6B727C;}
.rmm.style ul ul li a {padding: 12px 35px; color: #fff; }
.rmm.style ul ul li a:hover {background: #4b545f;}
.rmm.style ul li > a:not(:only-child):after {
    font-family: 'icomoon';
    speak: none;
    -webkit-font-smoothing: antialiased;
    content: "\e000";
    position: relative;
    display: inline-block;
    -webkit-transform: rotate(210deg);
    transform: rotate(210deg);
    top: -4px;
    left: 1px;
    font-size: 10px;
}
.rmm.style ul ul li > a:not(:only-child):after {-webkit-transform: rotate(120deg)!important; transform: rotate(120deg)!important; top: 2px; font-size: 14px; float: right; margin-right: -20px;}
.rmm.style .rmm-mobile li > a:not(:only-child):after {-webkit-transform: rotate(120deg)!important; transform: rotate(120deg)!important; top: 4px!important; font-size: 14px!important; float: right; margin-right: -20px;}
.rmm.style .rmm-mobile li{background: #3ab4a6; border-bottom: 1px solid #575f6a!important; border-top: 0!important; }
    </style>
Answer 1

Проблема заключается в том, что после добавления классов и их удаления JS только лишь потом происходит проверка и присвоение свойств CSS, поправил пару ваших функций с явным присвоением style. Это позволяет избежать ожидания события присвоения CSS свойств назначенных через

 // click interacts in mobile wersion 
    $('.rmm-dropdown').click(function (e) { 
        if($(this).parents(".rmm-menu").hasClass('rmm-mobile')){ 
            e.preventDefault(); 
            e.stopPropagation(); 
			$(this).next().attr('style', 'display:block !important;') 
            $(this).next().addClass("rmm-subview"); 
 
            var index=$(this).parent().index(); 
 
            var i=0; 
            $(this).parent().parent().children("li").each(function() { 
                if(index==$(this).index()){ 
                    $(this).removeClass("rmm-subover-hidden"); 
                    $(this).addClass("rmm-subover-visible"); 
                }else{ 
                    $(this).removeClass("rmm-subover-visible"); 
                    $(this).addClass("rmm-subover-hidden"); 
                } 
            }); 
            $(this).addClass("rmm-subover-header"); 
        } 
    }); 
 
    // click back interacts in mobile version 
    $('.rmm-back a').click(function () { 
        $(this).parent().parent().prev().removeClass("rmm-subover-header"); 
        $(this).parent().parent().removeClass("rmm-subview"); 
		$(this).parent().parent().attr('style', '') 
        $(this).parent().parent().parent().parent().find("li").removeClass("rmm-subover-hidden"); 
    });

READ ALSO
Как получить меню в wordpress через rest api?

Как получить меню в wordpress через rest api?

Здравствуйте, нужно вывести меню в приложении под вордпресс, связано по REST API, просмотрел документацию developerwordpress

319
Как найти 3 самых длинных слова на js

Как найти 3 самых длинных слова на js

Задача такая: спросить у пользователя текст произвольной длины; найти во введённом тексте три самых длинных словаТак вот текст запросил,...

657
Таймер показывает Nan в браузере Safari

Таймер показывает Nan в браузере Safari

Есть такой скриптВ браузере сафари показывает Nan

316
Как вернуть промисс?

Как вернуть промисс?

ЗдравствуйтеМожно такой небольшой вопрос

305