【问题标题】:CSS Transitions Not working after toggleClass()在 toggleClass() 之后 CSS 转换不起作用
【发布时间】:2013-07-05 06:58:44
【问题描述】:

我创建了一个切换菜单,如this demo所示。

我为div.nav-menu添加了一个css过渡效果,我使用max-height:0;max-height:480px;

当我单击菜单切换以显示菜单时,过渡效果很好。但是当我再次单击菜单切换以隐藏菜单时,过渡不起作用。

我做错了什么?

【问题讨论】:

    标签: jquery css css-transitions


    【解决方案1】:

    不要使用最大高度,而是使用高度

    .nav-menu {
        margin: 0;
        background-color: #1e1e1e;
        height:0;
        display: block;
        clear: both;
        overflow: hidden;
        -moz-transition:all 350ms cubic-bezier(.42,0,.58,1);
        -ms-transition:all 350ms cubic-bezier(.42,0,.58,1);
        -o-transition:all 350ms cubic-bezier(.42,0,.58,1);
        -webkit-transition:all 350ms cubic-bezier(.42,0,.58,1);
        transition:all 350ms cubic-bezier(.42,0,.58,1);
    }
    .toggled-on .nav-menu {
        display: block;
        height:480px;
    }
    

    【讨论】:

      【解决方案2】:

      你对 CSS 过渡是错误的。它们在您添加或删除类时不会动画,它只会在您更改 CSS 属性时产生动画。 而你是直接添加和删除类。

      这是您的解决方案:

      $( '.menu-toggle' ).on( 'click', function() {
          if(nav.hasClass('toggled-on')) {
             menu.css('maxHeight', 0);
             //^ Here is changed the 'max-height` first so that the 
             //  Transition animation will trigger first
          }
          else menu.css('maxHeight', '480px'); 
               // ^ If not I changed it back to 480px;
      } );
      
      // Next I bind on the transaction end event of the element to toggle class
      // After it finishes the transistion
      
      menu.on("transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd", function() {
          nav.toggleClass( 'toggled-on' );
      });
      

      Updated Fiddle

      【讨论】:

      • 谢谢!但是还是有问题!因为您将 max-height=0; 添加到 .nav-menu ,当单击切换隐藏菜单时,样式仍然存在。所以它只能运行一个循环,而不是一直循环。
      • 感谢您帮我修改问题中的错误,我的英语很差! :)
      • @85Ryan,请查看我的更新答案。我已经更新了您的 nav-menu ul 样式以在没有切换类的情况下显示,现在一切正常。 :)
      • 我明白了!谢谢,你错过了{
      • @Starx 我猜你对They **do not animate when you add or remove class** 的看法不是100% 正确。因为如果您更改类,并且新类更改 CSS 属性,transition 也将起作用。看这个>link。我只是稍微改变了他的 CSS。
      【解决方案3】:

      有一种更简单的方法可以达到您想要的效果。

      Working Example

      js

      $(function() {
          $('.menu-toggle').click(function(){
              if($('.nav-menu').is(':hidden')){ // check to see if menu is hidden
                  $('.nav-menu').slideDown();}  // if so slide down
              else{$('.nav-menu').slideUp();}   // else slide up
          });
      });
      

      css

      html {
          font-size: 100%;
          overflow-y: scroll;
      }
      body {
          max-width: 860px;
          margin: 0 auto;
          font-family: Helvetica, sans-serif;
      }
      .main-navigation {
          clear: both;
          min-height: 45px;
          margin-top: 30px;
          position: relative;
      }
      .menu-toggle {
          cursor: pointer;
          display: inline-block;
          font: bold 16px/1.3;
          margin: 0;
          padding: 10px;
          color: #fff;
          background-color: #1e1e1e;
      }
      
      .nav-menu {
      
          margin: 0;
          background-color: #1e1e1e;
          display: none;
          overflow: hidden;
      }
      
      .nav-menu ul {
          display: block;
          margin: 0;
          padding: 0;
          width: 100%;
      }
      .nav-menu li {
          display: block;
          padding: 10px;
      }
      .nav-menu li a {
          display: block;
          padding:10px;color:#fff;line-height:1;
          text-decoration: none;
      }
      .nav-menu li a:hover,.nav-menu li a:focus{background:#272727;}
      .toggled-on li a:active{background:#2A8A15;}
      

      API for .slideUp()API for .slideDown()

      【讨论】:

      • 你明白这个问题是关于 CSS 过渡的吗?
      • @Starx 是的,我理解这个问题,只是认为操作人员可能对实现同一目标的捷径感兴趣。此外,您的解决方案似乎只工作一次...尝试隐藏后再次单击菜单。
      • 你好像看错了我。我没有评论您的问题以使我的回答正确。 :)
      • @Starx 一切都好,看看这个元帖子,对这个主题开怀大笑meta.stackexchange.com/a/179567/217863
      • 另外,如果我认为你的答案是错误的,我会否决你。你是对的伙计!! :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 2015-05-17
      • 2014-12-01
      • 2021-03-11
      • 2021-05-21
      • 1970-01-01
      • 2013-09-28
      相关资源
      最近更新 更多