嗨,快速解决!您需要为网站创建导航,并开始处理移动设备的行为。您选择哪种模式?如果您像大多数人一样,可能是“汉堡包”菜单,单击该菜单后,它会使用一些 JavaScript 展开一个垂直的导航链接列表。
但这并不是唯一的选择。
根据导航的上下文和内容,可能存在一种无 JavaScript 的方法可以完成工作,同时提供更易访问的体验。
最佳实践是使用渐进增强方法,首先为使用最旧和功能最弱的技术的用户构建网页,然后在支持允许的情况下引入其他增强功能。如果您能够为使用基本技术的用户提供优质体验,那么您可能需要考虑您的网页是否真的需要 JavaScript 功能。从导航中移除 JavaScript 可以确保用户即使在禁用 JavaScript 或网络问题阻止脚本加载的情况下也能浏览您的网站——这绝对是优势。
让我们看看汉堡包菜单三种替代模式。
替代方案 1:将菜单放在单独的页面上
谁说导航必须位于每个页面的头部?如果您的前端非常轻量级,或者您在导航中要显示很长的菜单项列表,那么最实用的方法可能是创建一个单独的页面来列出所有这些菜单项。轻量级的 WordPress 主题 Susty 使用此方法进行导航。

此模式对于使用文件系统路由的静态网站特别有用。如果项目是使用静态站点生成器构建的,则页面加载对用户来说可能是难以察觉的,并且具有使模板尽可能模块化的额外好处。
这实际上只需要在用户位于菜单页面时将“菜单”按钮替换为关闭按钮即可。单击时,我们可以通过几种方式将用户带回他们上一个所在的页面。如果我们使用服务器端 CMS(例如 WordPress),则可以使用 $_SERVER['HTTP_REFERER']
获取最后一个 URL 并将其设置为“关闭”按钮的 URL。
但是,如果我们不使用服务器端设置,那么,是的,我们可能需要几行 JavaScript 来获取该最后一个 URL。
<a href="https://MyHomePage.com" onclick="handleClick(event)">×</a>
<script>
function handleClick(event) {
// Don't follow the link
event.preventDefault();
// Go back to last visited page
window.history.back();
// Bail out of the function
return false;
}
</script>
因此,虽然我喜欢这种方法和模式,但它可能需要 JavaScript,具体取决于项目。
替代方案 2:水平滚动条
此方法非常适合较短的链接列表,并允许用户访问所有导航项,而无需打开任何内容或离开当前位置。GitHub 使用此方法来处理子菜单。

使用 flexbox 结合 CSS 中的滚动溢出即可!
替代方案 3:纯 CSS 汉堡包菜单
仅仅因为汉堡包菜单模式通常使用 JavaScript,并不意味着我们必须使用 JavaScript。使用 CSS 伪选择器和 HTML <input>
,我们可以创建一个丰富的移动菜单,并将 JavaScript 保留用于真正需要它的其他功能。
看到了吧?仅仅因为一种约定很流行,并不意味着它是唯一的方法。通常有更简单、更易访问的方法,尤其是在导航方面。在没有 JavaScript 的情况下创建功能性、轻量级、沉浸式的导航并不困难,并且在此过程中我们获得了一些不错的优势。如果您创建了任何有趣的纯 CSS 导航模式,我很乐意看到它们——请在评论中分享!
我经常使用哈希锚链接和 :target 伪状态来实现对 no-script 友好的功能。也许可以更新这篇文章,添加一些额外的策略! :)
你能详细说明一下吗?听起来很聪明 :)
非常好
w3schools 上有一个例子 https://w3schools.org.cn/cssref/sel_target.asp
为什么不使用一个双手适用、拇指区域友好的移动导航菜单?
它使用 HTML5 和 CSS3 的“全屏覆盖滚动菜单”。
位于智能手机屏幕底部。
它既透明又是不透明的,以提醒用户向下滚动以继续查看无法在屏幕上显示的其他内容、菜单类别或网页链接。
所有菜单类别和链接都“居中”,并针对“单手”使用(左手或右手)进行了优化。
访问 https://www.raulgonzalez.com/thumbzone.html
喜欢前两个!我唯一担心的是第三种替代方案的屏幕阅读器可访问性。复选框“技巧”会让这些用户感到困惑,除非其语义使用 aria 属性正确覆盖(即使那样,我不确定它是否完全可行或在屏幕阅读器中得到广泛支持)。人口统计确实会发挥作用,因此,如果您不关心屏幕阅读器,则这不是问题,否则在这种情况下,JavaScript 是更好的选择。
太棒了!也在考虑第三个和可访问性。
我多年来一直使用“滥用复选框”的方法来处理“汉堡包”菜单,并撰写了自己的文章。
https://cutcodedown.com/tutorial/mobileMenu
类似的相关内容是使用 :target 来处理模态窗口——例如登录表单模态窗口——无需脚本
https://cutcodedown.com/tutorial/modalDialogs
这是我十年来一直试图向初学者和所谓的“专家”灌输的东西,那就是停止为 HTML 和 CSS 可以单独完成的事情使用 JavaScript!更重要的是,当使用 CSS 实际上更容易时,可能偶尔会使用脚本增强已有的工作代码。
例如,我有一个自己从不同来源拼凑出来的 x86 ASM 参考,其中整个参考是一个 HTML 文件,但行为类似于多页网站。它具有用于参考的模态对话框,处理器级别操作的过滤以及许多其他功能……并且 98% 以上的功能由 CSS 提供。
https://x86.cutcodedown.com/
整个内容由三个文件组成(不包括广告)……并且认真看看该页面使用了多少 JavaScript
https://x86.cutcodedown.com/intel.js
除了告诉 IE 用户放弃外,所有脚本的作用是检测哈希目标内是否有 H2 并将其分配给标题,并确保任何 INPUT/复选框驱动的模态窗口都已关闭。
尽管每次看到浪费的无意义的 DIV 来制作汉堡包图标时我都会感到难过,因为我们有完美生成的 content。对 label 设置边框,label:before 和 :after 设置固定高度(行间距),使用边框制作顶部和底部的线条,然后从底部线条中移除顶部边框。
那些不支持 css 的浏览器怎么办?那些使用 wget 浏览的人如何查看菜单?
说笑归说笑,自从微软开始强制将 Edge 推送到 Win 7 用户以来,兼容性问题现在应该已经解决了!
恕我直言,那些没有启用 js 的人应该被踢出网站。这些大多是机器人,它们毫无用处;除了增加您的带宽。
我的两分钱。
100% 同意。选项 3 不可访问。
要使用此方法,您仍然需要将 JS 应用于输入,以便可以通过按 <Enter> 来选中它。
并为其提供一些 :focus 样式,以便键盘用户可以查看何时使用 Tab 键切换到它。
无论如何,我喜欢这样的文章,有趣的东西。
最终 CSS 中有一条不正确的评论,关于将汉堡包转换为 X。如果您能实现它,那将是一个很棒的动画!
另一个选择可能是简单地显示一个基本的导航模式,而无需汉堡包菜单——例如,将列表项设为内联块或块(当有多级时)。
如果 JavaScript 文件加载失败或在较旧且功能较弱的浏览器上查看站点,Astra 会执行此操作。Astro 是一种移动优先导航模式,在小屏幕上可以选择扩展和折叠菜单。
http://cferdinandi.github.io/astro/
Astro 是众多轻量级原生 JavaScript 插件之一,由 Chris Fredinandi 创建 https://vanillajstoolkit.com/plugins/
尽管如此,我仍然希望使用 JavaScript,因为它使我们能够以自己的方式实现它,而且我认为使用 JS 没有任何缺点。
另一种选择是使用 HTML 的默认行为
<details≥
和<summary>
标签。这本身在语义上并不正确,但这不是我们第一次这样做吗?;) 通过一些 CSS 过渡,我们可以获得一个非常实用的菜单。我想知道是否可以将
<summary>
和<details>
元素用于扩展导航(无需向下推页面内容)。我使用选项 2 - 水平滚动条 - 并逐步使用 JS 增强它,以添加一个汉堡按钮,用于在移动设备上切换菜单的可见性。
在桌面设备上,使用相同的 HTML,并且 CSS 将菜单转换为超级导航。还添加了一些 JS 增强功能。
但本质上,在没有 JS 的情况下,菜单只是一堆嵌套的
<ul>
。完全可用,尽管可能不太漂亮。我使用复选框和 :checked 选择器创建了一个纯 CSS 导航栏。
https://shaba-seo.netlify.app/index.html
我对备选方案 1 有点好奇,搜索引擎会如何看待它?
我使用复选框和 :checked 伪类选择器创建了一个纯 CSS 导航栏。我使用纯 CSS 来设置侧边栏菜单的样式。您如何看待这个替代方案……请发表您的评论。
https://shaba-seo.netlify.app/index.html
我曾经不得不创建一个没有 JS 的导航菜单,所以我开发了 HyperNav。如有兴趣,请查看。
GitHub:https://github.com/Acmion/HyperNav
非常有用!
我建议添加
这应该可以防止在到达菜单末端时发生不必要的向后/向前导航。
我们一直在使用
<details>
元素作为菜单。它实际上是所有类型的显示/隐藏情况的一个不错的轻量级解决方案。备选方案 1 是一种我之前从未见过的不错的选项。为了避免使用 JavaScript,可以完全删除 X。毕竟还有浏览器后退按钮,打开菜单的目的是访问另一个页面。
哦,天哪!
这就是为什么他们在这里称之为“CSS技巧”。
第三个非常棒。