为什么 HTML5 中的导航栏采用列表形式?

2024-04-13

自从我开始使用 HTML、CSS 等以来,我一直注意到的一件事是,导航栏几乎总是以列表的形式呈现,有以下几种变体:

HTML:

<ul>
 <li><a href="link1.html">link 1</a></li>
 <li><a href="link2.html">link 2</a></li>
 <li><a href="link3.html">link 3</a></li>
 <li><a href="link4.html">link 4</a></li>
</ul>

Also with <li> inside the <a>

CSS:

ul {
    list-style-type: none;
}

li {
    display: inline-block;
}

和现在的HTML5基本是一样的,只是塞进了一个<nav>标签或任何向浏览器/屏幕阅读器显示“这是一些导航内容”的内容。

我的问题是它们是否需要包含在现代 HTML5 语义和 ARIA 可访问性角色的列表中,还有哪些好处?当然它是一个链接列表,但是还有其他实际原因吗?

我发现的原因:

  • 语义、屏幕阅读器和辅助功能:对于如何让屏幕阅读器变得更好(或更糟……)的观点各不相同。但不应该使用 HTML5<nav>和/或链接周围的相关 ARIA 角色会执行此操作吗?它是否还需要专门显示为链接列表(无序或其他)?

  • 美学:在带有默认项目符号点的垂直列表中,或者没有 CSS, 是的。但其他替代标记(例如<a> in <nav>) 代替<li> in <ul>将根据需要轻松或更容易地设计风格。

  • 现有用途:它在现有网站中被大量使用(例如 StackExchange 网站、MDN 等等……)。

  • W3C <nav> spec:表示链接不必位于列表中,但可以是。但它也指定了内容<nav>作为“链接的一部分”,它是否也需要是“链接列表”?

  • 向后兼容性:它经常使用,因此应该得到广泛支持,并且 HTML5 和 ARIA 可能不适用于旧浏览器/屏幕阅读器。

各种参考帖子:

  • CSS 技巧 https://css-tricks.com/navigation-in-lists-to-be-or-not-to-be/- 2013年01月 -说他们不会使用列表。然后在导航中使用列表:-S
  • 达斯汀·布鲁尔文章(已存档) https://web.archive.org/web/20110610170958/http://dustinbrewer.com/the-importance-of-using-lists-for-navigation/- 2011年06月 -广泛提及
  • 堆栈溢出:为什么要在 HTML 中使用 UL/LI? https://stackoverflow.com/questions/13416866/why-should-i-use-ul-li-in-my-html and 导航栏是否应该始终以列表的形式实现? https://stackoverflow.com/questions/12476672/should-navigation-bars-always-be-implemented-as-lists- 2012 -“是的,它是一个列表中的链接列表”.
  • HTML5 规范 https://www.w3.org/TR/html5/sections.html#the-nav-element
  • 布鲁斯·劳森文章 http://www.brucelawson.co.uk/2005/navigation-lists/- 2005年 -实际上显示列表工作得更好(尽管经常说“子弹”),但是很旧......(我将尝试进行类似的测试<nav>)
  • B 免费更多文章 http://bfreemore.blogspot.co.uk/2011/01/web-accessibility-with-reinhard-stebner.html, VJAKYSQQ文章 http://vjakysqq.blogspot.co.uk/2011/01/january-refresh-baltimore-reinhard.html and 吉姆·多兰文章 http://jimdoran.net/joy/webdesign/refresh-web-accessibility- 2011 -基于 JAW 的盲人用户的讲话,并表示使用列表会使情况变得更糟,并且<div>的&<span>应该使用 s (从 HTML5 之前开始)。更糟糕的是,否则它会尝试读出所有导航列表而不是页面的实际内容。

我可能会继续使用列表,因为这似乎是当前的现状,并且希望能够向后(和向前?)兼容,并且我将尝试使用现代屏幕阅读器*用我自己的代码进行更多研究。但是,是否有理由在导航中使用更符合 HTML5 语义的列表呢?

另外,除了 JAWS 之外,我还应该尝试哪些屏幕阅读器?


等级制度!

许多导航菜单包含多个级别(通常用于下拉菜单),即层次结构:

  • Home
  • Products
    • 实物产品
    • 数码产品
  • Contact

不使用ul(带有嵌套的ul),您无法在标记中表示此层次结构(除非导航很复杂/很长,在这种情况下您可以使用带有标题元素的子部分)。

您的导航(当前)没有超过一级吗?这并没有突然改变它的语义,它仍然是相同的信息结构,只是只有一层而不是两层或更多层。

列表的更多好处。

通过使用ul,用户代理(如屏幕阅读器)有机会提供利用该结构的功能。例如,屏幕阅读器可以宣布列表有多少项目,并提供其他方法navigate该列表(例如,跳转到第一个/最后一个项目)。

If only div使用时,很容易发生用户“跳出”导航而没有注意到导航已经结束的情况。通过使用ul,非常清楚起点和终点在哪里,这对于导航菜单尤其重要,因为导航条目通常只有与所有其他条目相比才有意义(通常只有通过检查所有内容才能找到适合您目标的正确链接)可用的导航链接并排除它们)。

这一切都与nav.

The nav元素只是传达该部分包含导航链接。没有nav(即 HTML5 之前),用户代理只知道有一个列表。和nav,用户代理知道有一个列表 + 它用于导航。

此外,nav当然不应该always包含一个ul,因为并非所有导航都是链接列表。看到这个navHTML5 规范中的示例 https://www.w3.org/TR/2014/REC-html5-20141028/sections.html#the-nav-element:

A nav元素不必包含列表,它也可以包含其他类型的内容。在此导航块中,以散文形式提供链接:

<nav>
 <h1>Navigation</h1>
 <p>You are on my home page. To the north lies <a href="/blog">my
 blog</a>, from whence the sounds of battle can be heard. To the east
 you can see a large mountain, upon which many <a
 href="/school">school papers</a> are littered. Far up thus mountain
 you can spy a little figure who appears to be me, desperately
 scribbling a <a href="/school/thesis">thesis</a>.</p>
 <p>To the west are several exits. One fun-looking exit is labeled <a
 href="http://games.example.com/">"games"</a>. Another more
 boring-looking exit is labeled <a
 href="http://isp.example.net/">ISP™</a>.</p>
 <p>To the south lies a dark and dank <a href="/about">contacts
 page</a>. Cobwebs cover its disused entrance, and at one point you
 see a rat run quickly out of the page.</p>
</nav>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 HTML5 中的导航栏采用列表形式? 的相关文章

  • 如何阻止 HTML 输入字段中的特殊字符? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我只是想问一下如何在html输入字段中阻止 等特殊字符 为什么不使用html5呢
  • 如何在mvc 4中使用多重选择?

    我想使用多重选择Chosen http harvesthq github com chosen 我有类似的技能模型 public class Skill public int Id get set public string Name ge
  • 如何在alert()之后给予focus()?

    我有类似的东西
  • 有没有办法在 Blazor 中隐藏 div?

    我正在使用 Blazor 并且想在按下导航栏切换器图标时隐藏侧边栏 列表项崩溃了 但问题是 div 仍然存在 div class page div class sidebar div class nav top row pl 4 navba
  • 如何设计一个在 Firefox、Chrome 和 IE11 中看起来相同的单选按钮

    我想设计一组单选按钮 它们在 Chrome Firefox 和 IE 11 中看起来应该相同 我的解决方案在 Firefox 中看起来相当不错 在 Chrome 中 按钮周围有一个蓝色框 而在 IE 11 中 颜色和边框似乎无法识别 它应该
  • 浮动的垂直对齐方式:左div的

    我有大约 10 个宽度相等但高度不同的 div 我希望它们尽可能紧密地组合在一起 当设置为向左浮动时 它们不会垂直彼此对齐 而是与上面 行 的底部对齐 我在下面模拟了一个小例子 想要去掉空白 你有什么建议吗 我仅限于使用这种格式 因为内容是
  • html5 canvas贝塞尔曲线获取所有点

    我喜欢从贝塞尔曲线中得到一些点 我发现 在javascript中查找三次贝塞尔曲线的所有点 https stackoverflow com questions 15397596 find all the points of a cubic
  • 脚本和链接标签的简写 http:// 为 // ?有人以前看过/用过这个吗?

    问题如下 如果您使用 addthis 共享按钮 查看任何网站 一旦您浮动在 addthis 按钮上 并且加载了所有必需的资源 请使用 firebug 或 chrome 检查器查看文档的正文 不是源代码 而是屏幕上的实际文档 对象检查器 你会
  • 在客户端将大文件(> 2GB)压缩为 ZIP

    我使用构建上传工具node js and socket io 因为他们通常会上传令人难以置信的巨大文件 而普通的上传表单将无法工作 问题是他们想在发送之前将文件压缩成zip 以提高传输效率 我一直在研究压缩方法 例如JSZip http s
  • WebRTC 暂停和恢复流

    我正在尝试使用 WebRTC 构建一个 Web 应用程序 当某些事件触发时需要暂停 恢复视频 音频流 我已经尝试过getTracks 0 stop 但我不知道如何恢复流 对此有什么建议吗 谢谢 getTracks 0 stop 是永久的 U
  • 用于解析网页链接的正则表达式?

    我正在寻找一个 NET 正则表达式来从网页中提取所有 URL 但还没有找到一个足够全面的表达式来涵盖指定链接的所有不同方式 还有一个附带问题 有没有一个正则表达式来统治它们 或者我最好使用一系列不太复杂的正则表达式 并且只对原始 HTML
  • CSS - 显示:无;不工作

    我正在尝试开发一个移动样式表 在这个样式表中我想删除一个特定的 div 在div的HTML代码中 我放置了一个名为 tfl 的id 如下所示 div style display block width 187px height 260px
  • setTimeout 调用期间超出最大调用堆栈大小

    我试图每 4 秒调用一次我的函数 这样它就会实时增加一个数字 由于某种原因 我不断收到错误 这是我的代码
  • 引导导航栏后面的空间

    使用引导程序navbar 我试图弄清楚如何使其不隐藏主体部分的顶部 实际上 使用这里推荐的方法可以很好地解决这个问题 Twitter Bootstrap 顶部导航栏阻挡页面顶部内容 https stackoverflow com quest
  • Openlayers3:中止绘制交互

    我在 html 中使用绘制交互来手动绘制路线 manual route creation event createRoute click function remove previous interactions map removeInt
  • CSS位置绝对和全宽问题

    我想改变 dl 下面占据全屏宽度而不更改换行和包含它的标题元素 当我尝试定位 dl 元素 参见 problematic code 部分 下面 导航获取最大宽度为 1003px 的包装器的 100 我希望它在不改变换行和标题 div 的情况下
  • 是否可以强制 html canvas 标签显示子项?

    基本上和我问的一模一样 我希望以下工作能够发挥作用
  • 在 TypeScript 中使用三个 Js + OrbitControl

    我无法得到this http www example com 在 TypeScript 中使用上述组合的示例 I have and 在我的html中和打字稿文件
  • CSS/Javascript 将单词与特定字符对齐

    我如何使用 CSS Javascript 将 html 中的单词与该单词中的任意字符对齐 更改对齐字符的样式 例如使其粗体 以与其他字符形成对比 如本例中所示 对齐和粗体 k e t 和 f stack overflow stack ove
  • 0x800a138f - JavaScript 运行时错误:无法获取未定义或 null 引用的属性“值”

    我编写了一段 JavaScript 代码来比较 2 个文本框中的 2 个日期 function CompareDates var fdate document getElementById txtFromDate var edate doc

随机推荐

  • 元素不可点击错误 Ruby / Watir

    在我的测试中 我尝试访问 etsy com 进行搜索 单击结果 然后将商品添加到我的购物车 我可以做所有事情 直到我尝试单击 添加到购物车 按钮 下面的代码实际上在 IRB 中工作 所以我知道我的定位器是可靠的 但是当我运行测试时 我得到一
  • 在 Elasticsearch 中过滤折叠结果

    我有一个弹性搜索索引 其中包含表示给定时间点实体的文档 当实体更改状态时 会创建带有时间戳的新文档 当我需要获取所有实体的当前状态时 我可以执行以下操作 GET https 127 0 0 1 9200 myindex search col
  • .NET RIA 服务与 MVC 风格存储库?

    我有一个包含多个项目的解决方案 包括两个共享位于外部程序集中 也在同一解决方案中 的存储库和模型的 asp net mvc 项目 本质上 Core 存储库 楷模 国内 Web 基本MVC站点 引用核心项目 国际网 基本MVC站点 引用核心项
  • 使用 NativeMessaging 进行边缘扩展

    我有一个具有本机消息传递支持的边缘扩展 它与系统中运行的 uwp 应用程序进行通信 是否必须将扩展打包到 uwp 应用程序的 appx 文件夹中 如果没有 那么我们如何将扩展上传到边缘扩展存储中 我遵循 secureInput 示例 htt
  • 快速向 SQL Server 插入 200 万行

    我必须从文本文件中插入大约 200 万行 通过插入 我必须创建一些主表 将如此大的数据集插入 SQL Server 的最佳且快速的方法是什么 我认为最好读取 DataSet 中文本文件的数据 试用SQL批量复制 从 C 应用程序批量插入 S
  • GSON反序列化:如何知道对象?

    我尝试使用 gson 库来反序列化发送给我的对象流 在我见过的所有示例中 当调用 fromJson 方法时 我们已经知道我们期望拥有什么类型的对象 就我而言 我收到不同对象的流 我想知道在反序列化对象之前了解对象类的最佳方法 A B B1
  • Android 自定义通知布局与 RemoteViews

    我正在尝试使用此为我的 Android 应用程序创建自定义通知post https stackoverflow com questions 18367631 change notification layout 我偶然发现了一个我在过去 2
  • 使用 LIMIT 时获取总行数? [复制]

    这个问题在这里已经有答案了 可能的重复 使用 offset limit 查找 mySQL 查询中的结果总数 https stackoverflow com questions 5928611 find total number of res
  • JAX-RS自定义ExceptionMapper不拦截RuntimeException

    我想包裹底层RuntimeExceptions自定义 json 格式 使得 servlet 容器不会将堆栈跟踪转储到客户端 我关注这个问题 使用 XML 或 JSON 的 JAX RS Jersey 自定义异常 https stackove
  • 强制 MySQL 在连接上使用两个索引

    我试图强制 MySQL 使用两个索引 我正在加入一个表 我想利用两个索引之间的交叉 具体术语是 Using intersect 这里是 MySQL 文档的链接 http dev mysql com doc refman 5 0 en ind
  • Xamarin 表单:从 Xamarin Forms 应用程序启动 IOS 应用程序时出现问题(输入 URL 无效)

    我正在尝试从我的 xamarin forms ios 应用程序打开一个 ios 应用程序 我已经提到过this https stackoverflow com questions 43944283 launch another ios ap
  • 使用 NuGet 安装 NHibernate 3.2

    我是 NHibernate 的新手 一直在尝试使用 NuGet 来启动和运行它 Fluent NHibernate 和 NProf 读完这篇文章后 http gurustop net blog 2011 03 13 nhibernate 3
  • SVGforeignObject 无法在任何浏览器上显示,为什么?

    我在 SVG 元素中有一个foreignObject 所有其他元素都会显示 但foreignObject 及其内容是不可见的 在 Chrome Firefox 和 Edge 中进行了测试 结果均相同 这是代码
  • 尝试使用 PHP 通过 HMAC-SHA1 进行数字签名

    我正在尝试设置一些 Google Maps Premier API 操作 为此 我需要对我的网址进行签名以进行身份 验证 如果您查看签名示例 可以看到一些 Python C 和 Java 代码向您展示如何通过 HMAC SHA1 进行签名
  • IEnumerable vs IReadonlyCollection vs ReadonlyCollection 用于公开列表成员

    我花了好几个小时思考曝光名单成员的问题 在与我类似的问题中 乔恩 斯基特 Jon Skeet 给出了很好的答案 请随意看看 ReadOnlyCollection 或 IEnumerable 用于公开成员集合 https stackoverf
  • 这个值应该被释放吗?

    我在 IOS 模拟器中遇到了 segfault 11 内存访问错误 但当我在下面的代码中注释掉该版本时 该错误消失了 get get the question number NSString text attributeDict value
  • 减少knitr块中命令和输出之间的空间

    我在用着knitr with LaTeX并且代码块回显的命令与输出的开头之间似乎有很多空间 LaTeX 代码如下所示 begin knitrout scriptsize definecolor shadecolor rgb 1 1 1 co
  • .net5.0 PRISM WPF应用程序,如何使用 Microsoft.Exensions.Logging 以 Serilog 作为提供程序?

    我有一个 PRISM 8 1 97 WPF 应用程序在带有 Unity 容器的 net5 0 上运行 我想做的是将 Serilog 指定为我的日志记录提供程序 但注入通常的Microsoft Extensions Logging通过我的 D
  • django更新视图不​​显示日期输入(以前的)值

    当我进入更新页面时 除日期输入 截止日期和提醒 外 所有先前的值都会显示 我该如何修复它 起初 我没有将 TaskCreationForm 用于 TaskUpdateView 因为考虑到 django 会自动处理它 但后来日期输入变成了普通
  • 为什么 HTML5 中的导航栏采用列表形式?

    自从我开始使用 HTML CSS 等以来 我一直注意到的一件事是 导航栏几乎总是以列表的形式呈现 有以下几种变体 HTML ul li a href link1 html link 1 a li li a href link2 html l