html - 具有多个链接的卡片中的制表符
问题描述
我是一名网络开发的学生,正在从事一个投资组合项目。目前在这个项目上,我正在解决通过提供项目信息链接的卡片标签的挑战:一个是现场演示,一个是项目 Github Repo。我想知道在没有 a) 太多制表位的情况下浏览卡片列表的最佳做法是什么,以及 b) 视觉障碍用户不必考虑如何在这些站点之间导航信息。如果可能,我不想涉及 JavaScript。
此外,我确实使用屏幕阅读器 (NVDA) 来测试功能。
这是我目前拥有的基本代码,其中包含两个列表元素,为了代码的视觉外观,故意没有类名:
<ul>
<li tabindex="0">
<h3>Project Name</h3>
<img src="https://via.placeholder.com/744.png" alt="Preview Image of X project">
<div>
<p>
Project Description
</p>
<div>
<a href="{Link to live page}" target="_blank" tabindex="-1">View Demo</a>
<a href="{Link to Github Repo}" target="_blank" tabindex="-1">View Code</a>
</div>
</div>
</li>
<li tabindex="0">
<h3>Project Name</h3>
<img src="https://via.placeholder.com/744.png" alt="Preview Image of X project">
<div>
<p>
Project Description
</p>
<div>
<a href="{Link to live page}" target="_blank" tabindex="-1">View Demo</a>
<a href="{Link to Github Repo}" target="_blank" tabindex="-1">View Code</a>
</div>
</div>
</li>
</ul>
这就是其中一张卡片的样子: 项目卡片截图
感谢您的帮助和建议!
解决方案
有两种处理卡片的方法。一种是使整个事物可点击,一种是使卡片中的单个项目可点击。目前看来,您正试图同时实现这两者,这是不可能的。(好吧,这是可能的,这只是一个糟糕的主意,并且会给你尝试嵌套超链接的人带来各种头痛)。
鉴于卡片中有两个链接指向不同的地方,我们应该使用选项 2。
我将重点介绍您可以根据卡片中的两个链接提供的 HTML 进行的一些改进。
您的 HTML 已经很不错了,只是一些小问题。
1. 不要让整张卡片成为制表位。
您已添加tabindex="0"
以使整张卡片能够获得焦点。这没有任何好处(因为您在卡中有多个链接,如前所述)并且是不必要的。
制表位的黄金法则是,只有当它可以执行某个操作时,才能使某些东西具有焦点。没有视力障碍的键盘用户会感谢您没有添加额外的制表位,并且屏幕阅读器用户通过标题、链接部分等进行导航,因此他们不需要您让没有操作的事情变得可聚焦。
2. 链接文字本身应该是有意义的。
对于有视力的用户来说,“查看演示”和“查看代码”没有问题,因为他们可以在页面上直观地看到关系。
但是屏幕阅读器用户可以通过链接导航以了解页面/找到他们正在寻找的内容。
对于屏幕阅读器用户,“查看演示”作为描述毫无用处。
你有两个选择。
- 使链接文本对每个人都具有描述性。您可以将按钮堆叠而不是并排,并制作链接文本“X project Demo”和“View X Project”。
- 添加一些视觉上隐藏的文本,使链接对屏幕阅读器用户有意义。
如果您可以更改设计以容纳额外的文本,我会选择第一个选项。
进一步链接相关点
另外,因为我们现在希望每个链接都具有焦点,所以您需要删除tabindex="-1"
.
最后一点,如果您要在新窗口中打开链接,最好表明这一事实。
我认为可以接受的一件事(因为在每个链接之后写“(在新窗口中打开)”是不切实际的)是有一个小图标表示它在新窗口中打开。
通过使用一点 CSS 技巧,我们可以使该过程自动化。
a[target="_blank"]::after {
content: '\29C9';
content: '\29C9' / " (opens in new window)";
margin: 0 3px 0 5px;
}
请注意我如何定义content
两次?第一个被所有浏览器识别,第二个使用content: alternative text
它为屏幕阅读器添加“(在新窗口中打开)”。
此外,我选择的角色并未作为标准达成一致,但它适用于大多数目的。
图像是否增加了价值?
这只是需要引起注意的事情。如果图像没有为页面上的信息增加任何价值,它应该是装饰性的。我所说的值是指图像中的信息不会添加任何额外的信息。
不可能根据给出的示例给出建议,但如果图像纯粹是产品的屏幕截图,那么要么改进描述以解释图像在上下文中显示的内容(所以它描绘的是什么过程),或者只是使其具有装饰性。
您只需将alt
属性保留为空字符串即可使图像具有装饰性。但是您仍然必须具有该属性。所以<img alt=""/>
没关系,但<img alt />
不会。使用alt=""
将确保屏幕阅读器忽略图像。
基于建议的最终 HTML(和用于视觉隐藏文本的 CSS)
我在我更改的部分上方添加了评论。
关键部分是用于在视觉上隐藏项目的 CSS(但让屏幕阅读器可以访问它)。
.visually-hidden {
border: 0;
padding: 0;
margin: 0;
position: absolute !important;
height: 1px;
width: 1px;
overflow: hidden;
clip: rect(1px 1px 1px 1px); /* IE6, IE7 - a 0 height clip, off to the bottom right of the visible 1px box */
clip: rect(1px, 1px, 1px, 1px); /*maybe deprecated but we need to support legacy browsers */
clip-path: inset(50%); /*modern browsers, clip-path works inwards from each corner*/
white-space: nowrap; /* added line to stop words getting smushed together (as they go onto seperate lines and some screen readers do not understand line feeds as a space */
}
/****adds a nice little icon to show a new window ****/
a[target="_blank"]::after {
content: '\29C9';
content: '\29C9' / " (opens in new window)";
margin: 0 3px 0 5px;
}
<ul>
<!-- removed the tabindex -->
<li>
<h3>Project Name</h3>
<img src="https://via.placeholder.com/744.png" alt="Preview Image of X project">
<div>
<p>
Project Description
</p>
<div>
<!-- added a visually-hidden span to make the link text make sense on its own, also removed the `tabindex="-1"` to make the links focusable-->
<a href="{Link to live page}" target="_blank">View Demo <span class="visually-hidden">for project X</span></a>
<a href="{Link to Github Repo}" target="_blank">View Code <span class="visually-hidden">for project X</span></a>
</div>
</div>
</li>
<li>
<h3>Project Name</h3>
<img src="https://via.placeholder.com/744.png" alt="Preview Image of Y project">
<div>
<p>
Project Description
</p>
<div>
<a href="{Link to live page}" target="_blank">View Demo <span class="visually-hidden">for project Y</span></a>
<a href="{Link to Github Repo}" target="_blank">View Code <span class="visually-hidden">for project Y</span></a>
</div>
</div>
</li>
</ul>
推荐阅读
- c++ - 为什么 std::pair 不能与 std::initiliazer_list 进行比较
- powershell - PowerShell:try 语句缺少其 catch 或 finally 块
- c# - 为什么 .NET 5 GC 不收集(或至少调用 Finalize)明确取消引用的对象?
- ios - 如何从我的 iOS 应用程序安全地打开 URL 上的文档?
- google-sheets - 如何强制刷新 =importdata()?
- c - C中的递归类型定义
- r - 需要一个 data.table 方法来按组使用滞后计算值
- javascript - 如何在 Plotly 中单击图像时更改图像?
- c# - 哪个博士是打开的?(System.InvalidOperationException:'已经有一个打开的 DataReader 与此命令关联,必须先关闭。')
- arrays - 多维char数组和指针赋值