【问题标题】:Menu icon toggle issue JQuery菜单图标切换问题 JQuery
【发布时间】:2015-08-28 18:46:19
【问题描述】:

我获得了一个切换控件,该控件在单击时在菜单图标和X 之间进行动画处理。它还提供了一个覆盖导航。

问题是:当您单击覆盖导航上的任何链接时,它不会将X 更改/切换回默认菜单图标。


在下面的代码 sn-p 中,我添加了 $('.cd-menu-icon').toggleClass('is-clicked'); $('.cd-header').toggleClass('menu-is-open');(在第 33、34 行)来初始设置控件的切换状态。

jQuery(document).ready(function($){
    //if you change this breakpoint in the style.css file (or _layout.scss if you use SASS), don't forget to update this value as well
    var MQL = 1170;

    //primary navigation slide-in effect
    if($(window).width() > MQL) {
        var headerHeight = $('.cd-header').height();
        $(window).on('scroll',
        {
            previousTop: 0
        }, function () {
            var currentTop = $(window).scrollTop();
            //check if user is scrolling up
            if (currentTop < this.previousTop ) {
                //if scrolling up...
                if (currentTop > 0 && $('.cd-header').hasClass('is-fixed')) {
                    $('.cd-header').addClass('is-visible');
                } else {
                    $('.cd-header').removeClass('is-visible is-fixed');
                }
            } else {
                //if scrolling down...
                $('.cd-header').removeClass('is-visible');
                if( currentTop > headerHeight && !$('.cd-header').hasClass('is-fixed')) $('.cd-header').addClass('is-fixed');
            }
            this.previousTop = currentTop;
        });
    }

    //open/close primary navigation
    $('.cd-primary-nav-trigger').on('click', function(){
        $('.cd-menu-icon').toggleClass('is-clicked');
        $('.cd-header').toggleClass('menu-is-open');

        //in firefox transitions break when parent overflow is changed, so we need to wait for the end of the trasition to give the body an overflow hidden
        if( $('.cd-primary-nav').hasClass('is-visible') ) {
            $('.cd-primary-nav').removeClass('is-visible').one('webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend',function(){
                $('body').removeClass('overflow-hidden');
            });
        } else {
            $('.cd-primary-nav').addClass('is-visible').one('webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend',function(){
                $('body').addClass('overflow-hidden');
            });
        }
    });
});

希望有人能提供帮助。


重现:(使用 JsFiddle Example

  1. 打开菜单(点击“汉堡”图标框区域)
  2. 点击覆盖上的任何链接,当它出现时。 (即“1”、“2”、“3”、“4”)
  3. 结果:覆盖关闭,但菜单图标没有切换回来。

【问题讨论】:

  • 我认为在指定的fiddel中,它工作正常。
  • 这不是@Lal.. 问题是次要的:链接上没有 eventListener,也没有覆盖,可以切换 '.cd- 上的 'menu-is-open' 类头”。原因可能是该 html 的标记格式错误。请更正您的 html(尤其是 nav 标记内没有结束标记的 div)。
  • 很抱歉,html 被部分从文档中删除,就像其他代码进入 jsfiddle 一样,仅用于菜单部分问题。不过,我会检查我的 html。

标签: javascript jquery html css icons


【解决方案1】:

我认为您已经在 HTML 部分的 &lt;script&gt; 标签 (第 253 行) 中实现了 1, 2, 3, 4 链接上的自定义点击事件。

只需将 &lt;script&gt; 标记替换为以下内容:

<script>
  $('.cd-primary-nav a').on('click', function(){
  $('.cd-menu-icon').removeClass('is-clicked');
  $('.cd-header').removeClass('menu-is-open');
  $('.cd-primary-nav').removeClass('is-visible').one('webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend',function(){
    $('body').removeClass('overflow-hidden');
  });
  });
</script>

JSFiddle:https://jsfiddle.net/c9dj010v/

【讨论】:

  • 绝对精彩!这已经解决了!我不久前在不同的部分实现了它,并且一定忘记了这部分。非常感谢您解决了这个问题!
【解决方案2】:

一个快速的解决方案是添加一个新的点击监听器来监听链接上的点击

$('.nav-overlay').click(function() {
    $('.cd-menu-icon').toggleClass('is-clicked');
});

在您原来的小提琴中,汉堡图标仅在直接单击时才会更改,因为单击侦听器仅附加到该元素

Modified Fiddle

【讨论】:

  • 嗯...您在概念上是正确的,但您似乎对代码示例进行了太多修改,以至于您得到了一些误报,导致您提供了不正确的解决方案。 $('cd-header').toggleClass('menu-is-open') 实际上是切换控件的动画/状态..
  • 您对$(document) 上的点击事件的修改实际上是导致您的样本最初运行的原因,但它在大约 2-3 次测试中中断。
  • 感谢大家的帮助,我已经从上面的帖子中修复了它。
猜你喜欢
  • 2011-05-24
  • 1970-01-01
  • 2015-12-05
  • 1970-01-01
  • 2011-06-24
  • 2023-03-15
  • 2012-12-17
  • 1970-01-01
  • 2018-08-10
相关资源
最近更新 更多