【问题标题】:How to create a smooth animation for my menu?如何为我的菜单创建流畅的动画?
【发布时间】:2013-12-24 04:00:32
【问题描述】:

我有一个扩展“悬停时”的菜单,但问题是如果我将鼠标悬停在一个项目上,并且该项目正在运行动画下一个项目动画将不流畅(基本上是子-menu 将显示在动画中间)。

我已经创建了a JS Fiddle 的问题。

我认为我的这部分代码导致了问题:

j('.active').next('ul')
.removeClass('sub-menu')
.addClass('jsub-menu').css({
'visibility':'',
'opacity':'',
'height':get_height_of_first_child +'px',
'width':'0'
 });
j('.active').next('.jsub-menu').animate({width:get_width},2000);

j('.active').next('.jsub-menu').animate({height:get_submenu_height},2000);

编辑:这是更新后的Fiddle Code。如果您仔细查看59 行,我已添加此代码

if(j('.active').next('.jsub-menu').is(':animated')){ j('.active').next('.jsub-menu').hide(); }

现在,如果您将鼠标悬停在 “在我展开时​​悬停我!” 并且该菜单已动画化,它将隐藏菜单(不希望这样,但请耐心等待)。

所以现在尝试将鼠标悬停在 “仅悬停在我身上”WAIT 4-5 秒THEN 悬停在 "在我展开时​​将鼠标悬停在我身上!” 你会看到下一个菜单的动画很流畅。

这是我想要的效果,但显然我不想在这个过程中隐藏菜单。

【问题讨论】:

  • 你想看到什么结果?如果运行动画的项目仍在运行,您是希望该动画在下一个动画之前完成,还是希望下一个动画即使在前一个动画尚未完成动画的情况下也开始显示?
  • 是的,我想在第一个动画完成后开始第二个动画...
  • 我建议(如果可能的话)重新设计导航,太多的关卡很烦人,你会遇到意外 mouseOut 的问题,然后他们就不会再经历整个事情了。我建议跳到 UX 堆栈交换 (ux.stackexchange.com) 寻找一些方法来简化菜单以获得更好的用户体验

标签: javascript jquery css animation


【解决方案1】:

我会这样做。它检查它是否是父.jnav 的直接子菜单,如果是则使用slideDown。否则它会获取宽度(而元素有visibility:hidden)并在之后将其动画到该宽度

var j = jQuery.noConflict();    
j(document).ready(function () {    
    j('ul.nav').removeClass('nav').addClass('jnav');    
    j('ul.jnav li').hover(function () {
        if (j(this).children('ul:first').hasClass('jsub-menu')) { 
            return false; 
        } else {    
            if(j('ul.jnav > li').is(this)) {
                j(this).find('ul.sub-menu:first').not(':animated').slideDown(500);
            } else {
                var elem = j(this).find('ul.sub-menu:first').not(':animated');
                elem.css({
                    visibility: 'hidden',
                    display: 'block'                    
                });
                var elemWidth = elem.width();
                console.log(elemWidth);
                elem.css({
                    width: '0px',
                    visibility: 'visible'
                }).animate({
                    width: elemWidth
                });
            }
        }
    }, function () {
        j(this).find('ul:first').slideUp(500, function () {
            j(this).removeClass('jsub-menu').addClass('sub-menu');            
        });
    });    
});

Updated jsFiddle

【讨论】:

  • 是的,这行得通,但是正如您在我的示例中可能注意到的那样,我不希望每个项目都向下滑动,只有第一个。所以只有第一个子菜单向下滑动,所有其他的必须动画宽度,然后检查是否有孩子,然后动画高度。
  • @DejoDekic 已更新以解决该问题
  • 别担心 :) 我会接受你的回答,但我需要等待 20 小时才能奖励你;)
  • @DejoDekic 没有必要!我对我所拥有的非常满意!
  • 你去吧;)我没有马上奖励你,因为我想看到更多的答案或建议......无论如何,感谢@Zack 的帮助和良好的编码。
猜你喜欢
  • 1970-01-01
  • 2019-07-23
  • 1970-01-01
  • 2011-08-10
  • 1970-01-01
  • 2012-02-17
  • 1970-01-01
  • 2013-01-08
  • 1970-01-01
相关资源
最近更新 更多