1

我从 CSSTRICKS 获得了一段代码,即魔术线导航,它将在我的菜单项下放置一条线,并在我悬停的项目上移动。我希望它是这样的,当我单击菜单时,该行将停留在该菜单项上,而不是像往常一样回到第一个。

该脚本使用类选择器来告诉默认情况下该行应该去哪里。有了这个,我用jQuery做了一个toggleClass,它将类传递给单击的菜单项,但它没有更新。我必须重新加载页面才能更新。而且,它再次卡在同一位置。我希望有人知道如何做到这一点。这是我的代码:

$(window).bind("load", function () {
    var $el, leftPos, newWidth;
    $mainNav2 = $("#example-two");

    /*
    EXAMPLE ONE
*/

    /* Add Magic Line markup via JavaScript, because it ain't gonna work without */
    $("#line-menu").append("<li id='magic-line'></li>");

    /* Cache it */
    var $magicLine = $("#magic-line");

    $magicLine.width($(".current_page_item").width())
        .css("left", $(".active a").position().left)
        .data("origLeft", $magicLine.position().left)
        .data("origWidth", $magicLine.width());

    $("#line-menu li").find("a").hover(function () {
        $el = $(this);
        leftPos = $el.position().left;
        newWidth = $el.parent().width();

        $magicLine.stop().animate({
            left: leftPos,
            width: newWidth
        });
    }, function () {
        $magicLine.stop().animate({
            left: $magicLine.data("origLeft"),
            width: $magicLine.data("origWidth")
        });
    });
});
4

3 回答 3

1

将魔术线移动到它自己的功能。编辑评论如下。

  $(document).ready(function(){
        magicline();
    });

function magicline() {

    var $el, leftPos, newWidth,
        $mainNav = $("#example-one");
    //remove the old magic line before creating a new one.
    $("#magic-line").remove();
    $mainNav.append("<li id='magic-line'></li>");
    var $magicLine = $("#magic-line");

    $magicLine
        .width($(".current_page_item").width())
        .css("left", $(".current_page_item a").position().left)
        .data("origLeft", $magicLine.position().left)
        .data("origWidth", $magicLine.width());

    $("#example-one li a").hover(function() {
        $el = $(this);
        leftPos = $el.position().left;
        newWidth = $el.parent().width();
        $magicLine.stop().animate({
            left: leftPos,
            width: newWidth
        });
    }, function() {
        $magicLine.stop().animate({
            left: $magicLine.data("origLeft"),
            width: $magicLine.data("origWidth")
        });    
    });
}
//on click on a new menu item iterate through and remove the class
//then add the class back to the parent of the a clicked and recall the 
//magicline function
$('li a').on('click',function(){
    $('li').each(function(){ 
       $(this).removeClass('current_page_item');               
    });
    $(this).parent().addClass('current_page_item');
    magicline();
});

演示:http: //jsfiddle.net/calder12/vtuKH/1/

PS. I used the code from CSSTRICKS, you'll have to change the id's to match your id's.

于 2013-03-30T18:42:58.637 回答
1

I more or less guess at the CSS and markup, but this is much more concise:

$(window).bind("load", function () {
    var $lineMenu = $("#line-menu"),
        $active = $lineMenu.children('.current_page_item'),
        $magicLine = $("<li id='magic-line'></li>");

    $magicLine
        .width($active.width())
        .css("left", $active.position().left)
        .appendTo($lineMenu);

    $lineMenu.on('mouseenter mouseleave click', 'li:not(#line-menu)', function (e) {
        var $el = e.type == 'mouseleave' ? $active : $(this);

        if (e.type == 'click') {
            $el.addClass('active').siblings().removeClass('active');
            $active = $el;
        } else {
            $magicLine.stop().animate({
                left: $el.position().left,
                width: $el.width()
            });
        }
    });
});

http://jsfiddle.net/userdude/tTsk6/

于 2013-03-30T19:11:17.187 回答
0

那条线回到原来的位置,因为有回调附加到hover. 在这种情况下您需要做的是,当单击菜单项时,您需要避免该行转到原始位置。

这就是我要做的 -

附加单击处理程序,当用户单击菜单项时设置一个标志以显示该菜单已被选中。在hover的回调函数中检查这个标志,如果设置则返回。否则,如果不是平置,则将线移至先前的位置。

var $magicLine = $("#magic-line");
var isClicked = false;  // to show whether menu is clicked or not

$magicLine.width($(".current_page_item").width())
    .css("left", $(".active a").position().left)
    .data("origLeft", $magicLine.position().left)
    .data("origWidth", $magicLine.width());

$("#line-menu li").find("a").hover(function () {
    $el = $(this);
    leftPos = $el.position().left;
    newWidth = $el.parent().width();

    $magicLine.stop().animate({
        left: leftPos,
        width: newWidth
    });
}, function () {
   if(!isClicked){         // if no item is clicked, take line to old position
      $magicLine.stop().animate({
          left: $magicLine.data("origLeft"),
          width: $magicLine.data("origWidth")
      });
    }else{                 // else, just keep it there  
       isClicked = false;
       return false;
    }
}).click(function(e){   // added click listener 
    isClicked = true;       // flag is set to indicate menu item is clicked.
    $magicLine.css({
        left: leftPos,
        width: newWidth
    });                             
});

首先,我想过unbinding hover会阻止回调被调用,但没有成功。所以用标志试了一下。请阅读代码注释,我没有回答所有问题。

于 2013-03-30T18:18:13.647 回答