我喜欢对文章标题充满信心,但现实情况是,对于超长下拉菜单,这只是一个**可能的**解决方案。超长下拉菜单的问题在于,下拉菜单本身可能会超出网站的“折叠”区域。也就是说,超出浏览器窗口的可见区域。因此,为了访问这些位于底部的菜单项,您需要滚动浏览器窗口。对于我们这些鼠标上带有某种滚轮的人来说,这不是什么大问题。但对于没有滚轮的人来说,这些较低的菜单项完全无法访问,因为使用浏览器滚动条意味着鼠标要离开菜单(并且可能导致菜单关闭)。
我第一次在 Media Temple 账户中心页面上看到这个想法的实际应用。他们有一个用于“域名”的下拉菜单,其中列出了您在他们那里托管的每个域名。这可能是一个非常长的列表。Media Temple 实现了一种技术,当您向下滚动时,菜单实际上会以加速的方式移动。
当然,当我准备截取屏幕截图时,我发现他们之前采用的那个很酷的解决方案已经不见了。这让我有点好奇他们遇到了什么麻烦,但不管怎样,让我们继续吧。以下是尝试可视化这个想法:
jQuery 实现
我将把所有代码都放在这里,以便快速参考。我已经添加了注释,因此应该很容易理解。代码超过 60 行,但不要担心,它相当简单。
- 为下拉菜单设置最大高度
- 悬停时显示子菜单
- 根据子菜单的高度计算速度倍数
- 监视菜单中的鼠标移动
- 根据倍数滚动菜单
- 鼠标移出时关闭菜单
var maxHeight = 400;
$(function(){
$(".dropdown > li").hover(function() {
var $container = $(this),
$list = $container.find("ul"),
$anchor = $container.find("a"),
height = $list.height() * 1.1, // make sure there is enough room at the bottom
multiplier = height / maxHeight; // needs to move faster if list is taller
// need to save height here so it can revert on mouseout
$container.data("origHeight", $container.height());
// so it can retain it's rollover color all the while the dropdown is open
$anchor.addClass("hover");
// make sure dropdown appears directly below parent list item
$list
.show()
.css({
paddingTop: $container.data("origHeight")
});
// don't do any animation if list shorter than max
if (multiplier > 1) {
$container
.css({
height: maxHeight,
overflow: "hidden"
})
.mousemove(function(e) {
var offset = $container.offset();
var relativeY = ((e.pageY - offset.top) * multiplier) - ($container.data("origHeight") * multiplier);
if (relativeY > $container.data("origHeight")) {
$list.css("top", -relativeY + $container.data("origHeight"));
};
});
}
}, function() {
var $el = $(this);
// put things back to normal
$el
.height($(this).data("origHeight"))
.find("ul")
.css({ top: 0 })
.hide()
.end()
.find("a")
.removeClass("hover");
});
// Add down arrow only to menu items with submenus
$(".dropdown > li:has('ul')").each(function() {
$(this).find("a:first").append("<img src='images/down-arrow.png' />");
});
});
HTML 和 CSS
我犹豫是否要在这里放置大量的 HTML 和 CSS 代码,因为它们真的没什么意思。无论如何,您可以下载代码,所以可以去那里看看。它只是一个普通的语义嵌套无序列表和一些非常基本的样式。
测试
我从 IE 6 开始,在所有浏览器中都进行了测试,看起来效果不错。
一如既往,真是个绝妙的想法……谢谢……我 80% 的 HTML/CSS 知识都来自这个网站……太棒了!
下载链接已断……
不错的想法。我看到的唯一限制是“非常高的菜单”。很难可视化整个列表并知道您要查找的项目是否在该列表中。此外,速度太快,人们可能很难真正点击正确的链接(因为稍微移动一下鼠标就会使菜单移动很多)。
无论如何,这只是一些在网站上下文中需要调整的小东西。
干得好。
我同意。它的滚动速度确实有点快。如果滚动速度慢一些,我认为“非常高的菜单”的长度就不会成为问题。
但这绝对是值得存档的东西,以备不时之需。不错的代码 :)
我更喜欢多列子菜单。这样一来,就可以一次看到所有链接。例如,看看德国的 otto 目录。
我必须同意。但这个想法很好,并且可以用于网站的其他部分,例如作品集……
我发现,在“非常高的菜单”中,我无法看到最后几个链接(我检查了源代码以查看应该有多少个链接)。
对于那些需要在主菜单导航中显示所有内容的客户来说,这是一个好主意。
非常棒的技巧!我唯一想更改/添加的是一个视觉指示器,表明还有更多项目未显示。
并非所有用户都会将鼠标悬停在下拉菜单上,当您将鼠标停留在主项目上时,您看不到下拉菜单中还有更多项目未列出。
感谢提供此解决方案。
真的很棒!
但我认为我会将速度设置为比示例慢一点,并且不依赖于菜单高度……如果不同的菜单以不同的速度运行,可能会让用户感到混乱!
我知道你的意思,但速度与子菜单的高度直接相关。子菜单越高,它必须移动的速度就越快,才能在鼠标到达底部之前*绝对*到达菜单的末尾。
是否可以使菜单仅在指针位于菜单底部一半时向下滚动,并在指针位于菜单顶部一半时向上滚动?这样,滚动就不会依赖于鼠标的移动,而是依赖于指针的位置。
@Snookerman:可能的事情是可能的,但我认为这需要一个相当“肮脏”的补丁。
也许,我们可以考虑添加两个项目(底部和头部,分别),并且仅当指针位于其中一个项目上时才开始滚动(就像标准滚动条中的箭头,但具有悬停操作)。
谢天谢地,超长下拉菜单很少见,至少我在设计网站时从未遇到过,如果有这种可能性,我总是会想办法避免它。我真的不喜欢下拉菜单,尤其是在导航方面……显示域名背后的想法本来是一个很好的用途。
无论如何,这是一个不错的教程,如果将来有客户想要一个令人讨厌的折叠区域之外的下拉菜单,我一定会查阅这段代码!谢谢
真是太棒了!!!!
鼓掌鼓掌鼓掌
感谢你的分享,Chris!终于找到了解决超长下拉菜单的方案。只是一个想法,但在下拉菜单底部添加一个向下指示的箭头来告诉用户还有更多项目,可能会为它增添另一层精致的触感。仅供参考 :-)
赞同
我在 GReader 中阅读了这篇文章,直接转到了演示页面,想要返回文章,但没有返回链接。
此外,正如其他人提到的那样——我无法看到所有类别或是否有更多类别,因此如果我第一次访问该网站并寻找特定内容,并且我希望它在那里,但它不在那里,我可能会离开或使用搜索功能。
看起来不错。
但是,如果我将屏幕调整为“maxHeight, 400”低于折叠区域的高度,那么我将永远无法看到底部的项目。
也许可以根据窗口的高度和下拉菜单在窗口中开始的位置动态设置 maxHeight。
其余部分看起来和工作都很好。但我个人认为最好生成一个多列菜单,其宽度最大为水平菜单的宽度。
如果仍然没有足够的空间,可能会出现滚动条(我的意思是 .dropdown {overflow-y: scroll})。
但是回到本文中的解决方案,在里面添加一个滚动条怎么样?我认为仅仅把它放在那里(尽管它会自动滚动)对于用户来说是非常重要的信息,这样他们就能“知道”还有更多内容。
它不必是“真正的”滚动条。只是一个随着你移动而移动的矩形框,对于那些不太经常移动鼠标的用户(就像上面提到的OkkE一样)来说,可能就能起到视觉上的效果。
——
我的两分钱,
TeMc
我创建了一个修复程序来防止菜单超出屏幕底部。
长下拉菜单 - 插件
如果你想在某个地方发布该插件的下载链接,Baylor,我很乐意链接到它。
哈哈,这是一个很巧妙的小技巧。我尽量避免使用过长的下拉菜单,但如果需要,这会派上用场。谢谢!
我想看到这个效果应用在侧边栏上。忘记下拉菜单吧。保留第一个下拉列表,保持展开状态,并将你的活动流或博客链接放在里面。第一次有人将鼠标悬停在其上时可能会有点困惑,但他们会很快“理解”它的工作原理。
另一个想法……如果你要按照演示中的方式使用此技术,感觉需要某种视觉提示来表示链接的长列表是如何排序的:按字母顺序或按时间顺序(这需要附加日期)。然后它变得更有用……有点像在 iPhone 上滚动通讯录。实际上,在下拉菜单中按字母顺序排列的公司目录将是此技术的完美应用场景。
Leif,我喜欢你将它整合到侧边栏的想法。实际上,我已经尝试过在此页面上实现了。如果将鼠标悬停在“项目”上,缩略图列表就会显示出来。
我只是无法做到“保留第一个下拉列表,保持展开状态”,就像你说的那样。你找到方法做到这一点了吗?提前感谢。
嘿,Josh,
到目前为止,你在那个演示页面上做得不错。它开始看起来很好了。
我还没有开始尝试使用此技术,但我有一个项目计划在12月1日发布,所以我会告诉你结果如何。
顺便问一下,你是如何制作那个动画favicon的?
http://www.htmlkit.com/services/favicon/ 这个网站可以让你制作动画favicon。但我认为它只能在 Firefox 中查看,至少在 Safari 中不行;然后它会切换回静态favicon。
我对这个长下拉菜单有点着急。我能不能简单粗暴地做,用其他东西替换 .js 中的 .hover 语句,让它立即下拉?
谢谢。
这很有趣,但我喜欢有些人只是将很长的导航分成多列的方式。类似于白宫网站或 REI 网站那样。这很酷,但我不知道人们是否已经准备好接受这种方式。如果有人在寻找某个东西,却无法通过简单地将鼠标悬停在主导航项上快速找到它,可用性可能会受到一些影响。
Chris,你做得非常好!
但至少子菜单项应该无需 JavaScript 即可访问。
为什么
这样没有安装 JS 的用户仍然可以浏览网站。
至少我认为 **jitendra vyas** 的意思是这个。
我认为 Doug(可能)的意思是在没有 JavaScript 的情况下,菜单只会显示顶级项目,这些项目大概会将你带到一个页面,在那里你可以看到下一级导航。
我知道 IE 6 不支持 hover,所以没有 JS 的情况下子菜单不会显示,但在 IE 7、Firefox 和 Safari 中,子菜单应该可以访问。
但是……基本的下拉菜单也可以在没有 JavaScript 的情况下工作。
li.list-item div.dropDown { display:hidden; }
li.list-item:hover div.dropDown { display:block; (…..) }
也许可以将其作为备用方案?
参考
» 如何在没有 JavaScript 的情况下创建漂亮的下拉博客链接 | Pro Blog Design
非常棒,Chris。这样的菜单很少见,但拥有这种技术总是一件好事。
哇,绝妙的解决方案。
我会添加一个沿下拉菜单右侧边缘的 y 轴移动的指示器,以便用户知道他们在菜单中的位置。这也可以稍微缓解一些人感受到的“移动太快”的感觉,因为任何不确定性都会加剧这种感觉。
很棒的教程!非常有用!
不错,我可以看到这在很多领域都很有用。
我真的很喜欢这个概念,但为什么不使用目前标准的方法(如巨型下拉菜单)而不是创建新的东西呢?
http://www.useit.com/alertbox/mega-dropdown-menus.html
你在这里创建了一个非常有趣的概念证明,但我只是担心在这种情况下要求用户做太多事情。
我喜欢巨型菜单,并且我赞成使用现有标准。我也赞成探索新技术。
你将 maxHeight 声明在 ondomready 函数之外有什么特别的原因吗?此外,为什么你在顶部的一些变量前使用了 $?
var $container
var $list
var $anchor
var height
var multiplier
这是你区分 DOM 元素的方式吗?只是个人编码风格?
maxHeight 在外部只是为了使其脱颖而出并显而易见。它实际上不需要更改。
$ 变量正如你所怀疑的那样,它们代表页面元素,因此这只是使视觉区分变得简单的一种方法。
太棒了!
嗯……我认为这个想法也可以应用于非常长的侧边栏菜单——我正在考虑鼠标悬停时滚动的侧边栏菜单,哈哈。
不错的全新技术,值得探索……
绝妙的想法。这是为数不多的几个真正提出好的原创想法的网站之一。
啊!我爱它!Chris,干得好。我喜欢用户无需点击任何东西即可滚动的方式。
简直太棒了。
如果缺少什么东西,那就是一个指针,表明底部/顶部还有更多内容,这样用户就不会认为“我看到的项目就是全部”。
但仍然,太棒了。
很棒的菜单,伙计。我知道你不太喜欢“干得好”,但我必须表达我的欣赏!
我以前从未见过这样的菜单栏,我一直想在网站中实现一个下拉菜单,因为客户似乎很喜欢它们。当我更有信心的时候,我可能会尝试将其添加到一个 WordPress 网站中。
说真的,就像其他人说的那样,“我 80% 的 HTML/CSS 知识都来自这个网站……太棒了!”
Chris;好主意!我在浏览 HTML 时注意到你把箭头作为
标签放在锚点内部。为什么不将箭头设置为锚点的背景呢?我认为箭头是一个表现性的图像!只是一点想法!
谢谢!
哇!我将在下一个网站上使用它
酷!
当您到达非常长的菜单底部时,用户会直接从下拉菜单下方掉落,并且下拉菜单会关闭。因此,如果用户不知道下拉菜单中的最后一个元素,他将始终从下拉菜单中掉落。最好保持最后几个项目显示,只有当用户将鼠标移出菜单时才隐藏下拉菜单。
我知道我可能没有很好地解释这一点,但我希望这些信息能有所帮助。
伙计,Chris!你提出的解决方案总是让我惊叹不已!
很棒的修复,Chris!
我想知道 MediaTemple 在看到它之后是否会将其用于他们的下拉菜单?
下拉菜单的一个视觉提示会很好(例如,在底部显示一个箭头,并在完成时隐藏它(同时显示顶部箭头),以便用户知道还有更多内容。我只是通过查看演示来查看它,直到我在下拉菜单项中悬停才知道它是如何工作的。
我喜欢你关于更好 CSS 编码的文章,请多写一些。菜单很棒 :-)
很棒的工作……没有比有效的导航规划更好的替代方案,但绝对值得收藏!
只有我一个人觉得这个菜单不可用吗?如果您从顶部开始并想点击第三个链接,菜单将自动向下滚动,您想要点击的链接将不再可见。
恐怕这里的受众有点偏见,因为我们都是网页设计师。“普通”人可能会讨厌这样的菜单。
它不是不可用,只是需要几秒钟才能意识到它是如何工作的。
但是的,我们是有偏见的 :)
它“很酷”,但我同意它不可用……而且完全无法访问。如果您需要这种菜单,那么您的网站架构肯定存在错误。无论如何,下拉菜单在 99.99% 的情况下都是糟糕的设计。
这个特别糟糕
– 不要显示所有选项
– 需要理解一个新的 UI 小部件
– 需要大量的精细操作(并非所有人员都可访问)
适合
– 我真的不知道,但它很有趣,所以请将其用于作品集,因为 -> http://twitter.com/gagarine/status/5097314179
嘿,这只是一个想法。
同意你的观点,这可能会让人困惑,但只需稍微修改一下,它就会非常有效(例如,不是自动滚动,而是在顶部和底部都添加两个箭头,只有当鼠标悬停在箭头上时才滚动)。
对于可访问性,xhtml 标记只是一个无序列表,没有更易于访问的内容。
非常棒的想法。是否可以获得支持键盘导航的更新版本,以实现可访问性目的?
太棒了!:D
有趣的解决方案。就我个人而言,我认为更合适的解决方案是完全消除长下拉菜单,并可能重新检查您网站的信息架构。
当然,这并非总是可行的,尤其是在您的客户能够使用 CMS 添加页面时。在这些情况下,这可能可以正常工作。
我有一个建议,就是在包含子菜单的<a>标签中添加一个类,而不是插入<img>标签。
类似这样的内容
$(".dropdown > li:has('ul')").addClass('submenu');
这允许您使用 CSS 添加箭头图标,而不是使用 JavaScript 插入表现性标记。
很棒的想法,我喜欢滚动效果。但我认为一个非常微小的缺点是,如果用户没有将鼠标悬停在任何列表项上会怎样?除了显示的项目之外,他将无法知道是否存在任何其他内容。也许可以以某种方式通知用户还有更多项目需要滚动?
我同意——我认为这将是一个很棒的视觉提示,可以改善可用性/用户体验。
你好,
我目前正在尝试使菜单垂直显示。我已经将其设置为垂直显示,并且使其在右侧显示子菜单,但只有在没有滚动效果时才有效。如果它有滚动效果,它就会像在背景后面一样消失。我尝试过 overflow: visible,但这不是解决方案 :P
我该如何解决这个小问题?
顺便说一句,菜单非常棒 :D
YUI 有一个菜单,当菜单太长时会自动添加向上和向下滚动按钮。这似乎效果很好。
这真是太棒了。如此优雅的解决方案。
这趋向于 iPhone 中的漂亮滚动选择器。
一些建议
– 更改边缘项目字体大小以进行视觉提示
– 自动添加一个不可选择的包含三个点的最后一个项目,作为列表结束的提示
某些信息最好以不同的方式呈现,但长列表选择器确实存在合法案例
干得好
欢呼
不错的菜单
这是一个计算 maxHeight 的小补充(因此无论如何它都不会低于窗口高度)
var maxHeight = $(window).height() – ($(‘.dropdown’).offset().top + $(‘.dropdown’).outerHeight());
注意:我还没有测试过,但应该可以正常工作……
如何避免长下拉菜单下方的内容向下移动。因为每次悬停时,下面的内容也会移动,因此会破坏内容。
任何帮助?
非常酷的想法。正如其他人已经提到的,它需要某种指示器来显示您在列表中的位置。这对于比典型下拉菜单多得多的内容来说可能是一个很酷的功能。感谢分享这个想法。
感谢您提供很棒的菜单!
有没有办法使子菜单显示在导航的顶部,而不是底部?
非常感谢您提供这种独特的导航类型。对于所有负面的人;请去别处。
现在我有一个问题:我在 此页面 上使用了您的脚本。但我希望这些项目已经存在,而不仅仅是在您将鼠标悬停在“项目”上时出现。有人可以帮我完成这个任务吗?
再次非常感谢。
我尝试在您的论坛上注册,但反垃圾邮件确认代码真的不可读。我无法阅读它,在刷新几次后,我的 IP 被阻止,我“应该稍后再试”。
我真的希望有人能帮我解决我上面提到的问题。
谢谢,好的下拉菜单
我非常喜欢这个长下拉菜单的解决方案。我不确定是否还有其他人尝试在主菜单项上使用透明 PNG 或没有背景的纯文本。子导航隐藏在文本后面,并且在消失之前不会消失。查看此示例……
http://www.sonnykotler.com/nav.html
有什么想法吗?
感谢您的解决方案。但是我的调试器显示“需要对象”失败 :(
非常棒!
感谢分享。
:-)
一直在尝试这个想法……
http://funcityfinder.com/events/indianapolis/
……但是“overflow:hidden”属性似乎不起作用。
:-(
有什么想法吗?
再次感谢!
非常感谢这个很棒的想法!干杯!!
是的,很好,但是多级子菜单的解决方案是什么?