这些“滑动”样式的导航栏已经存在一段时间了,我只是认为最近有机会时可以自己尝试一下。事实证明,这真的非常容易。我为此制作了两个示例。
想法
这个想法是在您将鼠标悬停在导航中的不同链接上时,让某种高亮显示(背景或下划线)跟随您。这将通过 jQuery 及其动画功能来实现。因此,“魔法线”只会通过 JavaScript 追加。添加到列表并设置样式后,当您将鼠标悬停在不同的链接上时,它会计算出左侧位置和宽度并进行动画以匹配。
HTML
这里是一个典型的列表……它具有“group”类,因为它将成为一个水平行,并且需要 clearfix 以使其具有高度。ID 用于 JavaScript 来定位它。
<nav class="nav-wrap">
<ul class="group" id="example-one">
<li class="current_page_item"><a href="#">Home</a></li>
<li><a href="#">Buy Tickets</a></li>
<li><a href="#">Group Sales</a></li>
<li><a href="#">Reviews</a></li>
<li><a href="#">The Show</a></li>
<li><a href="#">Videos</a></li>
<li><a href="#">Photos</a></li>
<li><a href="#">Magic Shop</a></li>
</ul>
</nav>
请注意围绕它的 .nav-wrap div。这是因为样式的原因,条形会占据屏幕的整个宽度,但导航在其中居中。当我们启动 JavaScript 时,此居中会带来一个问题。
CSS
使用旧的内联列表元素和左浮动锚点使列表水平排列,并避免 阶梯式。魔法线绝对定位在条形下方,这样就不会导致抖动(将鼠标悬停在链接上,动画移到链接上,鼠标现在位于魔法线上而不是链接上,动画返回等)其他所有内容纯粹是样式。
.nav-wrap { margin: 50px auto; background-color: rgba(0, 0, 0, 0.6); border-top: 2px solid white; border-bottom: 2px solid white; }
#example-one { margin: 0 auto; list-style: none; position: relative; width: 960px; }
#example-one li { display: inline; }
#example-one li a { color: #bbb; font-size: 14px; display: block; float: left; padding: 6px 10px 4px 10px; text-decoration: none; text-transform: uppercase; }
#example-one li a:hover { color: white; }
#magic-line { position: absolute; bottom: -2px; left: 0; width: 100px; height: 2px; background: #fe4902; }
jQuery JavaScript
- 当 DOM 准备就绪时……
- 设置变量,包括导航的当前左侧偏移量
- 在窗口上设置调整大小函数,以在偏移量发生更改时(因为居中)重置该偏移量
- 将魔法线追加到导航
- 设置当前页面项目的魔法线的位置和宽度
- 还将原始宽度和位置设置为数据,以便可以将其用于动画返回
- 在悬停时,计算新的宽度和新的左侧位置并对其进行动画
- 在悬停回调(鼠标移出)时,动画返回到原始位置
更新,感谢 Daniel 和 Nora Brown 在下面的智能评论。
$(function() {
var $el, leftPos, newWidth,
$mainNav = $("#example-one");
$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")
});
});
});
演示
查看 CodePen 上的示例
jQuery 魔法线,由 Chris Coyier (@chriscoyier) 创建。
在 CodePen 上。
问题
Opera 对此很奇怪。它使魔法线的原始宽度成为导航栏的整个宽度,并在悬停时从右侧缩短它。我无法解决这个问题。如果您解决了,太棒了,请告诉我,我将更新本文和演示。
备选版本
查看下面的演示链接,了解使用背景而不是线条并同时对颜色、位置和宽度进行动画的备选版本。基本上是一样的,除了 CSS 略有不同,并且 JavaScript 从 HTML 中的 rel 属性中提取新列表项的颜色。
jQuery 中的颜色动画需要 颜色插件。我刚刚抱怨它不适用于 RGBa 颜色,有人向我发送了一个可以使用的补丁,该补丁包含在下载中。我真的很抱歉,但我记不起他们的名字了!如果那是您,请说出来,我将更新此内容并将补丁归功于您。
归您所有
与往常一样,请随意使用它。最好是在公司项目中使用它并赚取大量的现金。
没什么新鲜事……
嗨,Chris,
您使这些东西变得如此简单——感谢您提供的所有很棒的技巧和辛勤工作!我的问题是这是否也可以用于多级导航?它不需要对子链接应用效果,但希望能够使其下拉。任何关于此的提示都很有帮助。
谢谢,Larry
Larry 刚刚问了我也有的问题。这是一个很好的开始,但是需要做些什么才能支持多级导航?
虽然我还没有尝试过,但可能有效的一件事是复制 find(“a”) hover 的代码并为 $(“li:not(:has(ul))”) 创建一个。执行默认操作(它没有 UL 子级,因此不是可下拉的项目)
以及另一个用于 $(“li:has(ul)”) 的,它确实有一个 ul 子级。在这种情况下,将魔法线水平移动到它应该在的位置,但也要将其向下移动 UL 元素的高度。
如果您不希望魔法线对角线移动(即最短路径),则需要将动画排队以首先水平移动到 LI 项目,然后垂直向下移动(position: absolute; bottom: -(2 + UL-height)px;)。在鼠标移出时(hover() 的回调 - 垂直向上移动,然后水平移动)。
我可能会在下周末尝试一下,但我不确定我是否会记得。随意看看它是否有效!
——
TeMc
尝试查看下拉菜单(也基于 jQuery)
感谢分享,Chris,只是一个细节。下载已损坏。
再一次,一个狡猾的实现!
与往常一样,请随意使用它。最好是在公司项目中使用它并赚取大量的现金。
是的!
实际上,我需要它用于商业项目,而这个项目满足了我的需求。您是一位 5 星级的乐于助人的人 :)
哇,简单有效,看起来不错。
只有一件事,我更喜欢在 html 标记中拥有 magic-line li,而不是通过 javascript 追加它。
这只是一个品味问题,也许您的方法对 SEO 更好,但作为开发人员,我喜欢看到我必须使用的确切标记;)
Daniele,
我遇到了完全相同的问题……你解决了吗?
如何将此与WordPress的wp_page_menu一起使用?
这正是我今天要找的东西。我喜欢你将所有链接设置为先前示例的方式。我还没有查看过你的clearfix或stairstepping页面。这是一个在特定上下文中查看它们的好方法。再次感谢,Chris!
还有其他人看到IE8中的问题吗?类“current_page_item”的颜色在onLoad时不起作用。我尝试过内联设置颜色,但它仍然不起作用。我非常确定这是一个我不太了解如何修复的JQuery问题。
嗨,我看到了同样的问题,如果提供了解决方案,请发邮件给我
哇,这个效果看起来真的很棒,同时又非常微妙。很棒的工作!非常感谢分享!
一如既往,你的作品很棒,而且易于理解和实施。谢谢。
非常棒的效果,不能说我经常看到它被使用,或者我只是没有注意到使用它的网站!
我查看了所有浏览器,IE8有点奇怪,我今晚会玩一下看看是怎么回事。至于Opera……关于它我只能说这么多。
做得非常好,Chris!这对于不需要下拉菜单的网站非常有用。
谢谢Chris,我非常喜欢!
很棒的文章和效果,Chris!
不过,整个pageOffset的东西并不是真正必要的。如果你使用jquery的position()方法,你可以简单地替换例如
为
我自己尝试过,效果一样好
谢谢Daniel,好主意,我更新了上面的代码、演示和下载。
这绝对是性感的导航!谢谢Chris!!
嗨,Chris,这真的很酷。jQuery 正在取代 Flash 菜单或动画吗?我认为是的。
有一件很小的事情我想知道,并且我认为它会很有趣,是否可以使魔法线停留在菜单上我点击的最后一项?
在列表项中有一个类(class=”current_page_item”),它使线条停留在该位置。因此,对于您点击的每个页面,只需将该类更改为该链接,线条就会停留在该链接上。
$(“#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”)
});
});
这里魔法线通过上面代码中的以下函数返回到原始位置,因此您可以从代码中移动该函数,它就可以工作。
function() {
$magicLine.stop().animate({
left: $magicLine.data(“origLeft”),
width: $magicLine.data(“origWidth”)
});
我第一次在Opera中查看它,并认为“太棒了”!!我甚至没有意识到它在Opera中坏了。这仅仅证明(至少对我来说)它在不同的浏览器中看起来可能会有天壤之别,这没问题。
我还没有尝试任何调试,但有一件奇怪的事情……从你的演示文件中删除第一个示例,第二个示例将停止工作。(除非我做错了什么——我认为我没有。)
在JS中/* Example One */上方设置了一些变量,确保这些变量仍然存在。
仍在尝试使用它,遇到了同样的问题,并且正在尝试学习所有这些内容,如何删除上部并使其继续工作,哈哈
我是一个网页开发新手,想在我的新网站构建中添加这种样式。
干杯 Jason
只是好奇是否
比
?
更好(更快)?很棒的演示——我喜欢这些微妙的效果,您可以使用jquery快速轻松地实现它们。
不,可能不是,那是我犯的一个错误。它最初在那里是因为我需要对一些列表项使用.not()过滤器,但仍然需要定位锚链接,因此使用了.find()。随意按照你的方式编写它。
刚刚添加到客户的网站上,谢谢Chris。
哥们,你太棒了!!
一个非常棒的技巧,不错,伙计。谢谢
很棒的教程。感谢分享!!
我非常喜欢最后一个
刚刚在我的一个最近的项目中实现了类似的东西
这里
尽管我使用了lava lamp jquery脚本
现有技术
http://devthought.com/blog/projects-news/2007/01/cssjavascript-true-power-fancy-menu/
启发了jQuery
http://www.gmarwaha.com/blog/?p=7
不过文章不错。
嗯……这不错。另一件可以玩的东西。
在Opera中玩了一下。从锚而不是父列表项获取宽度几乎修复了它……(现在的问题是它有点太窄了。)尝试调整css以修复它,但也没有完全奏效。
问题似乎在于内联列表项的.width()无法正常工作。
恢复了我的更改,而是将css更改为使用内联块,如下所示
#example-one li { display: inline-block; }
这完美地工作了。(至少在Opera中是这样。:)
Chris,这个插件做得很好……你采用了Lava Lamp的处理方式并使其成为你自己的。并在过程中设计了一个不错的演示页面。
感谢你的想法。它很酷
我非常喜欢这个菜单,但在尝试添加子菜单时发现它非常令人沮丧。有没有人掌握了这第二部分并添加了子菜单,或者可以指引我正确的方向?我不是JS专家,所以仅仅是指向我代码并没有太大帮助,尽管我在编码方面并不是完全的菜鸟。任何和所有帮助将不胜感激。
很棒!
可以使用click()函数对其进行一些改进,以使Magicline停留在点击的链接上
确实,感谢pintus。“current_page_item”是使用wp_list_pages时应用的默认WordPress类名,因此当新页面加载时,它将具有该类名并正确设置。但如果使用某种AJAX或其他方式,请使用此方法。
哦,对不起,我不知道我从未尝试过WordPress……
我使用Ajax,我尝试使用你的代码使Magicline停留在点击的链接上,但它不起作用。
我需要在html页面上更改什么吗?
我需要把你的代码放在哪里?
非常感谢!!
好的,我找到了我的错误 ^^
抱歉重复发帖
出于某种原因,我无法让线条停留在它应该所在的链接上。它在点击后立即停留在那里,但在新页面加载时会返回主页。我该如何让它保持原位?
谢谢
抱歉,我把代码分开了……
只需粘贴这两部分!
所以我在尝试使它与 WordPress 一起工作时遇到了麻烦。在主页上有效,但如果我转到任何其他页面,它就会无法工作,也永远不会记住新页面。
求助 :)
克里斯,这修复了 Opera 并在我测试的所有浏览器中都能正常工作(FF3.6、Chrome、IE8、Opera 10.10 和 Safari,所有这些都在 WinXP 下运行)。我只列出了我更改的行
基本上,我将 <li> 浮动而不是 <a>,然后我必须调整几个元素的填充以使所有内容看起来都正确。
这修复了 IE7 中当前链接文本丢失的错误。谢谢。
这太简单又甜蜜了。感谢分享! :)
还有其他人无法让它停留在您上次点击的项目上吗?上述方法似乎对我不起作用
嗨,我将这个很棒的脚本与一个垂直子菜单结合起来……
http://www.castellolarocchetta.it/test/
有没有办法让魔法线(我将其更改为一个小徽标)保持在原始位置(current_page_item),而不是在转到子菜单链接时移动到导航栏的左侧?感谢您的辛勤工作
看起来第二个示例对任何版本的 IE 都无效。我还没有检查代码 - 但其他人是否也注意到这一点?
jquery.color-RGBa-patch.js 代码中存在问题。它试图为魔法线元素的背景分配一个 rgba() 值,而 IE 不识别该值。
是的,我确定这就是问题所在。只需使所有颜色值都不为 RGBa,您就应该没问题了。
刚刚来看了一下,已经解决了。很高兴我在这里查看了。感谢您的帮助!
嗨,克里斯,你的所有教程都非常棒。我通过观看和阅读你的所有文章学到了很多关于 CSS 和 jQuery 的知识。它们真的帮助了我很多。
虽然我有一个疑问。实际上我想知道你是如何制作这个评论系统的?
我的意思是每个人都可以互相回复。而评论框有一个非常好的功能,比如它显示在框中输入什么,当我们鼠标悬停在其上时,它只是变灰了,但并没有完全消失,但是当我们输入我们的名字时,它就会消失。
你能写一篇关于这个主题的文章吗?这对我和像我这样的初学者来说将非常有帮助。
这个教程很棒。谢谢。
将此评论的文本区域的“resize”属性设置为“vertical”,这样在调整大小时比现在好得多
嘿,克里斯!我上周也一直在考虑做类似的事情!我将用这种方法再试一次,并尝试将其用于我正在开发的 WordPress 主题,我将尝试添加下拉菜单并告知您我的进展。你的博客正在快速成为我对此类事情的首选参考点……干杯 :)
嗨!非常棒的演示。很高兴在我的客户项目中使用。我在 上进行了一些测试,在 Win XP 和 Explorer 下遇到了一些问题..有人可以帮我吗?
干杯:)
我的 HTML 使用得很糟糕。抱歉。您也可以查看演示 :)
嘿,克里斯,我没有通读所有评论以查看此内容是否在此处,但我下载了它,它在 Opera 中不起作用,至少效果不佳。
好吧,那毫无意义,我向上滚动,然后砰!那里有解决方案^^抱歉
嗨,克里斯,我仍然需要 IE 的帮助。
http://ekolor.sitiweblecce.it
我进行了上面写的更改,但仍然不起作用。
谢谢:)
我也在 IE8 中看到了同样的问题。克里斯或任何人有什么想法如何解决这个问题?拜托…
嗨,很棒的脚本,谢谢 - 但有没有办法在魔法线的移动上设置一点延迟?
克里斯
嗨,克里斯,我是你的忠实粉丝。感谢分享所有这些代码片段。
嘿,克里斯,
再次感谢您的灵感=),示例 1 中的下划线效果很棒……
我使用了 这个 插件几个月并在不同的项目中使用它,我确定这种效果也可以用它来实现……我认为 jQuery 代码更重,但它确实适用于所有浏览器并且具有非常有用的附加功能……
不错的效果,我喜欢 JQuery。感谢分享
很棒的代码!!
你知道如何使其垂直而不是水平吗?
我通过在您的 example.js 中添加浏览器检测使 example2 在 IE 中工作。在“$(function(){”之后,您可以添加类似的内容
在 html 中,您必须添加 id=”nav1″ ..
我也对 John Pisello 的 css 做了更改。
嗨,海晨,尝试了你的建议。我也使用 example two,也应用了 John P. 的更改,但我仍然在 I.E. 中遇到问题。
网站网址是 ekolor.sitiweblecce.it
我也粘贴了代码
HTML
EXAMLE.JS
没有变化……
非常感谢您的帮助
如果先加载网站,你会得到一个“错误”的颜色。在 example.js 中添加背景线以更改它。
谢谢克里斯。非常有用的 javascript 菜单。但在 Ie 6 中并不完美。我已经修复了错误。我在我的菜单中使用了 jpg 图像,就像菜单底部的指向箭头一样。
Ie6 加载页面时,“magic-line”div 定位在菜单文本的中间。
谁在乎 IE6?它是一个 9 年前的浏览器。
我已经完全停止支持该浏览器,每个人都应该这样做。 :)
嗨!
非常棒的文章。
当页面没有当前页面时,有没有办法完全隐藏红色条?
我的意思是,我的应用中有一些页面无法通过点击菜单访问。
当用户位于该页面时,如果她没有将鼠标悬停在菜单上,红色线条应该消失。
有什么想法吗?
谢谢!
我再试一次
嗨,Alfredo,
id 属于你的链接。它们必须像这样
如你所见,链接使用 rgb 作为标准。如果浏览器不是 IE,jquery 会生成 rgba。因此,透明度仅适用于非 IE 浏览器。
请删除我之前的帖子
谢谢
谢谢 Haichen:)
做了修改,但仍然无法工作..
耐心点;)
我粘贴 js 代码给你看
非常感谢
此致,
阿尔弗雷多
在你的 css 中,你需要为 rgba 设置一个后备。
在 css 中同时设置这两个定义。
还有这个
IE 使用 rgb,大多数其他浏览器使用 rgba。
还有两个 #nav1,但这似乎不是问题。
我用你的代码试过了,它在 IE 中工作正常。
希望这能有所帮助。
谢谢大师!:))现在一切运行正常。你给了我巨大的帮助。非常感谢:)
此致,
阿尔弗雷多
我上面不小心多加了一个点(“错误”颜色),以及一些注释,但也许你已经看到了。
海晨
:-)
嗨!
我在 Opera 中遇到了这个问题,但我将“display:inline”改为“float:left”,它就起作用了。
我的 HTML 代码略有不同,所以我粘贴在这里
HTML
以及 CSS
js 代码相同。
谢谢!
嗨!有没有人在 IE 中成功运行示例 1?谢谢
感谢分享这篇文章。我将使用你的代码应用到我的项目中。
有没有可能在使用其他链接时切换菜单?例如,我的网站上有一个“新闻”页面(news.html);我希望菜单不仅在我从菜单中点击新闻链接时发生变化,而且在从网站主体点击普通新闻链接时也发生变化。另一个问题是我使用 IFRAME 作为网站主体。我认为我需要这样的东西
这是 IFRAME 主体内的代码;我还有这个
在主 index 页面的代码中。
但它不起作用。请注意,如果我使用 alert(‘parent.document.getElementById(‘a1′).className’); 我会得到正常打印的消息,其中包含文本“testclass”。
可能我需要触发 example.js 脚本的一些额外功能?我该如何做到这一点?
这太棒了。天哪,我现在想拆散我自己的网站,只为了实现这种导航风格。感谢分享!!!
很棒的代码片段,能够使用基于 CSS 和 jQuery 的导航而不是讨厌的 Flash 导航真是太有帮助了!
干得好,Chris!
我在 IE8 中遇到了问题..
它在我的所有其他测试过的浏览器中都能正常工作..
在 IE 中.. 当你将鼠标悬停在链接上然后移开时,线条会跑掉 :P
它跑到页面右侧,创建了一个水平滚动条.. 有什么想法吗?
这不能用 CSS:hover 类来实现吗?
很棒的菜单!我有一个联系部分,希望按钮分开显示在右侧。这可能吗?我已经添加了
.right_page_item a { float: right; color: white !important; }
到 css 和网页中,但仍然不行
嗨,
很棒的教程。
我在 IE8 的标准模式下遇到了一个问题(但在兼容性视图中工作正常)- 获取 current_page_item 的初始宽度,这实际上会使该项目变为空白,直到我将鼠标悬停在其上。不太好。似乎在 IE8 中获取内联元素的宽度存在问题(尽管在将鼠标悬停在新项目上时获取 newWidth 时不会发生错误 - 很奇怪吧?)。
更改以下 CSS
#example-one li { display: inline; }
为
#example-one li { display: inline-block; }
可以解决问题。看起来它也解决了你在教程中提到的 Opera 问题!
继续努力。
感谢你的想法和教程!我在我的博客上实现它,并进行了一些修改。我的主题有一个上划线和下划线。
我遇到一个问题
我想使用 MagicLine 的第二个示例,但如果我实现 jQuery 1.8.3(我需要 fancybox),颜色就不再改变了 :(
当它在页面上激活时,它将如何工作。
它的工作原理是这样的:http://www.ministranten.stvitus.de/new/
我想在点击或突出显示菜单时添加一个 active 状态,但如何操作?
这就是我的问题 :/
有人找到解决子菜单问题的方案了吗?也许是一个小演示或其他东西?拜托!!!:)
抱歉,JavaScript 代码中存在错误
leftPos = $el.position().left;
应该是
leftPos = $el.parent().position().left;
再次感谢分享。
并且忘记提及此错误
.css("left", $("li.current_page_item a").position().left)
应该是
.css("left", $("li.current_page_item").position().left)
所有这些都是因为如果你引用 'a' 标签的 position(),它将始终返回 0(零)
再次感谢
如何修改才能仅在点击时激活动画?我将 .hover 事件更改为 .click 事件
$("#example-one li").find("a").click(function() {
,但当然,在动画开始之前,你会看到选择下方出现红色的闪烁。如何避免这种闪烁?你知道吗,我完全搞砸了。.click 工作完美,我在脚本中冗余地添加了第二个 animate 函数。我现在更喜欢这个插件了!
这几乎正是我想要的!
不得不为一个客户使用它,并做了以下修改
上面的行仅
行必须与链接一样宽
在锚点之间移动鼠标时,线条不能跳回
current_page_item 在 :hover 时必须保持相同的颜色,但其他项在 :hover 时必须更改
查看 fiddle
http://jsfiddle.net/alexwcoleman/Dwv7X/
(我的 jquery/javascript 不太强,所以如果有任何建议…)
你好,
我想将此 MagicLine 用于垂直导航。因此,我有一个问题:magic line 可以垂直而不是水平工作吗?或者是否有任何关于这方面的教程?
我正在尝试更新插件以用于使用 JQuery 1.9 或 2.0 的网站。是否有人知道 js 中哪些函数已弃用/替换?
嗨
感谢所有美好的事物。
当我将 position:relative 应用于 li 标签时,我遇到一个问题。它不起作用。
我必须在
#example-one li a
中添加position:relative
才能实际看到链接后面的 magic-line,没有它,它就在链接上面,因为它忽略了 z-index 设置嗨,
我不是程序员,但我通常足够胜任,可以根据我的需要调整代码,并且通常可以通过研究找出我自己的实现。在这种情况下,我碰壁了。
我不知道是否有人可以帮我。我正在尝试在我的Squarespace网站上使用它。我之前做过很多次jQuery插件了,但这个就是无法运行。我已经修改了脚本以反映我的模板类和ID,并在页面中间使用代码块进行了测试。但无论如何我都没法让它在屏幕顶部的实际菜单上生效。
我感觉代码中查找链接悬停区域的部分,由于模板CSS中的某些内容,无法检测到光标。任何帮助都将不胜感激。您可以在以下地址查看页面:
http://boxjelly.squarespace.com
&
$(“.cf li a”).hover(function() {
代码中查找部分是否应该进一步细化?例如:
$(“.desktopnav nav.main-Nav div.nav-wrapper ul.cf li a…
我不知道这是否有意义
-Matt
哦,这是我正在使用的完整代码+CSS
$(function() {
});
// 魔法线
//.cf { margin: 0 auto; list-style: none; position: relative; }
//.cf li { display: inline; }
//.cf li a { color: #bbb; font-size: 14px; display: block; float: left; text-decoration: none; text-transform: uppercase; }
//.cf li a:hover { color: white; }
#magic-line { position: absolute; bottom: -2px; left: 0; width: 100px; height: 2px; background: #fe4902; }
我已经注释掉了大多数样式元素,因为导航菜单已经应用了样式元素。