我从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")
});
});
});
答案 0 :(得分: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。我使用了CSSTRICKS的代码,你必须更改id以匹配你的id。
答案 1 :(得分:1)
我或多或少地猜测CSS和标记,但这更简洁:
$(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()
});
}
});
});
答案 2 :(得分: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
会阻止调用回调但是没有成功。所以用旗帜试了一下。请阅读代码评论,我没有回答所有问题。