- objective-c - iOS 5 : Can you override UIAppearance customisations in specific classes?
- iphone - 如何将 CGFontRef 转换为 UIFont?
- ios - 以编程方式关闭标记的信息窗口 google maps iOS
- ios - Xcode 5 - 尝试验证存档时出现 "No application records were found"
自从我开始使用 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>
还有 <li>
在<a>
里面
CSS:
ul {
list-style-type: none;
}
li {
display: inline-block;
}
和现在的HTML5基本一样,只是塞了个<nav>
标签或任何对浏览器/屏幕阅读器说“这是一些导航内容”的内容。
我的问题是它们是否需要与现代 HTML5 语义和 ARIA 可访问性角色一起使用,还有什么好处?当然是链接列表,但还有其他实际原因吗?
我发现的原因:
语义、屏幕阅读器和可访问性:对于它如何使屏幕阅读器变得更好(或更糟……),观点各不相同。但是不应该使用 HTML5 的 <nav>
和/或链接周围的相关 ARIA 角色执行此操作?它是否也需要专门显示为链接列表(无序或其他方式)?
美学:在带有默认项目符号点或没有 CSS 的垂直列表中,是的。但其他替代标记(例如 <a>
中的 <nav>
)而不是 <li>
在 <ul>
将根据需要轻松设置样式。
现有用途:它在现有网站中大量使用(例如 StackExchange 站点、MDN,等等……)。
W3C <nav>
spec:表示链接不必在列表中,但可以。但它也指定了<nav>
的内容作为“链接的一部分”,它是否也需要是“链接列表”?
向后兼容性:它经常被使用,因此应该得到广泛支持,并且 HTML5 和 ARIA 可能不适用于旧的浏览器/屏幕阅读器。
各种引用帖子:
<nav>
进行类似的测试)<div>
的 & <span>
应该使用 s(从 HTML5 之前开始)。更糟糕的是,否则它会尝试读出所有导航列表而不是页面实际内容。我可能会继续使用列表,因为这似乎是当前的现状,并且希望能够向后(和向前?)兼容,并且我会尝试使用现代屏幕阅读器*自己对自己的代码进行更多研究。但是是否有理由在导航中使用列表以更符合 HTML5 语义?
此外,除了 JAWS,我还应该尝试使用哪些屏幕阅读器?
最佳答案
许多导航菜单包含多个级别(通常用于下拉菜单),即层次结构:
- Home
- Products
- Physical products
- Digital products
- Contact
如果不使用 ul
(带有嵌套的 ul
),您无法在标记中表示此层次结构(除非导航很复杂/很长,在这种情况下您可以使用带有标题元素的子部分)。
您的导航(目前)不超过一级?这并没有突然改变它的语义,它仍然是相同的信息结构,只是只有一个级别而不是两个或更多级别。
通过使用 ul
,用户代理(如屏幕阅读器)有机会提供利用该结构的功能。例如,屏幕阅读器可以宣布列表有多少项目,并提供额外的方式来导航该列表(例如,跳转到第一个/最后一个项目)。
如果只使用 div
,很容易发生用户“跳出”导航而没有注意到导航已经结束的情况。通过使用 ul
,可以非常清楚开始和结束的位置,这对于导航菜单尤其重要,因为导航条目通常只有在与所有其他条目进行比较时才有意义(找到正确的通常只有通过检查所有可用的导航链接并将其排除在外,才能找到您目标的链接。
nav
无关。nav
元素仅表示此部分包含导航链接。如果没有 nav
(即 HTML5 之前的版本),用户代理只知道有一个列表。使用 nav
,用户代理知道有一个列表 + 它用于导航。
此外,nav
当然不应该总是 包含ul
,因为并非所有导航都是链接列表。看这个nav
example in the HTML5 spec :
A
nav
element doesn't have to contain a list, it can contain other kinds of content as well. In this navigation block, links are provided in prose:<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>
关于html - 为什么 HTML5 中的导航栏做成列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36811224/
我想做的是让 JTextPane 在 JPanel 中占用尽可能多的空间。对于我使用的 UpdateInfoPanel: public class UpdateInfoPanel extends JP
我在 JPanel 中有一个 JTextArea,我想将其与 JScrollPane 一起使用。我正在使用 GridBagLayout。当我运行它时,框架似乎为 JScrollPane 腾出了空间,但
我想在 xcode 中实现以下功能。 我有一个 View Controller 。在这个 UIViewController 中,我有一个 UITabBar。它们下面是一个 UIView。将 UITab
有谁知道Firebird 2.5有没有类似于SQL中“STUFF”函数的功能? 我有一个包含父用户记录的表,另一个表包含与父相关的子用户记录。我希望能够提取用户拥有的“ROLES”的逗号分隔字符串,而
我想使用 JSON 作为 mirth channel 的输入和输出,例如详细信息保存在数据库中或创建 HL7 消息。 简而言之,输入为 JSON 解析它并输出为任何格式。 最佳答案 var objec
通常我会使用 R 并执行 merge.by,但这个文件似乎太大了,部门中的任何一台计算机都无法处理它! (任何从事遗传学工作的人的附加信息)本质上,插补似乎删除了 snp ID 的 rs 数字,我只剩
我有一个以前可能被问过的问题,但我很难找到正确的描述。我希望有人能帮助我。 在下面的代码中,我设置了varprice,我想添加javascript变量accu_id以通过rails在我的数据库中查找记
我有一个简单的 SVG 文件,在 Firefox 中可以正常查看 - 它的一些包装文本使用 foreignObject 包含一些 HTML - 文本包装在 div 中:
所以我正在为学校编写一个 Ruby 程序,如果某个值是 1 或 3,则将 bool 值更改为 true,如果是 0 或 2,则更改为 false。由于我有 Java 背景,所以我认为这段代码应该有效:
我做了什么: 我在这些账户之间创建了 VPC 对等连接 互联网网关也连接到每个 VPC 还配置了路由表(以允许来自双方的流量) 情况1: 当这两个 VPC 在同一个账户中时,我成功测试了从另一个 La
我有一个名为 contacts 的表: user_id contact_id 10294 10295 10294 10293 10293 10294 102
我正在使用 Magento 中的新模板。为避免重复代码,我想为每个产品预览使用相同的子模板。 特别是我做了这样一个展示: $products = Mage::getModel('catalog/pro
“for”是否总是检查协议(protocol)中定义的每个函数中第一个参数的类型? 编辑(改写): 当协议(protocol)方法只有一个参数时,根据该单个参数的类型(直接或任意)找到实现。当协议(p
我想从我的 PHP 代码中调用 JavaScript 函数。我通过使用以下方法实现了这一点: echo ' drawChart($id); '; 这工作正常,但我想从我的 PHP 代码中获取数据,我使
这个问题已经有答案了: Event binding on dynamically created elements? (23 个回答) 已关闭 5 年前。 我有一个动态表单,我想在其中附加一些其他 h
我正在尝试找到一种解决方案,以在 componentDidMount 中的映射项上使用 setState。 我正在使用 GraphQL连同 Gatsby返回许多 data 项目,但要求在特定的 pat
我在 ScrollView 中有一个 View 。只要用户按住该 View ,我想每 80 毫秒调用一次方法。这是我已经实现的: final Runnable vibrate = new Runnab
我用 jni 开发了一个 android 应用程序。我在 GetStringUTFChars 的 dvmDecodeIndirectRef 中得到了一个 dvmabort。我只中止了一次。 为什么会这
当我到达我的 Activity 时,我调用 FragmentPagerAdapter 来处理我的不同选项卡。在我的一个选项卡中,我想显示一个 RecyclerView,但他从未出现过,有了断点,我看到
当我按下 Activity 中的按钮时,会弹出一个 DialogFragment。在对话框 fragment 中,有一个看起来像普通 ListView 的 RecyclerView。 我想要的行为是当
我是一名优秀的程序员,十分优秀!