在具有多个链接的卡片中停止制表

Tab-Stopping in a Card with Multiple Links

我是一名网络开发专业的学生,​​正在从事一个作品集项目。目前在这个项目上,我正在解决通过提供项目信息和链接的卡片进行制表的挑战:一个是现场演示,一个是项目 Github Repo。我想知道在没有 a) 太多制表位的情况下浏览卡片列表的最佳做法是什么,以及 b) 视觉障碍用户不必考虑如何在这些停靠点之间导航信息。如果可能的话,我不想涉及JavaScript。

此外,我确实使用屏幕 reader (NVDA) 来测试功能。

为了代码的视觉效果,这是我目前拥有的包含两个列表元素的基本代码,有意没有 class 名称:

<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>

其中一张卡片是这样的: Project Card Screenshot

感谢您的帮助和建议!

有两种处理卡片的方法。一种是让整个事物都可以点击,一种是让卡片中的个别项目可以点击。目前看来您正在尝试同时实现这两个目标,这是不可能的。 (好吧,这是可能的,这只是一个糟糕的想法,会给你尝试嵌套 hyperlinks 的人带来各种头痛)。

鉴于卡片中有两个 link 去不同的地方,我们应该选择选项 2。

我将重点介绍您可以根据卡片中有两个 link 提供的 HTML 进行的一些改进。

您的 HTML 已经很不错了,只是一些小问题。

1。不要让整张卡片成为一个制表位。

你添加了tabindex="0",让整张卡片都能获得焦点。这没有任何好处(因为如前所述,您的卡中有多个 link)并且没有必要。

制表位的黄金法则是只有在可以执行某项操作时才能使它成为焦点。没有视力障碍的键盘用户会感谢您不添加额外的制表位和屏幕 reader 用户通过标题、link 部分等进行导航,因此他们不需要您让那些不重要的东西变得可聚焦有动作。

2。 Link 文本本身应该有意义。

对于有视力的用户,“查看演示”和“查看代码”没有问题,因为他们可以在页面上直观地看到关系。

但屏幕 reader 用户可以通过 link 导航来感受页面/找到他们正在寻找的内容。

对于屏幕 reader 用户“查看演示”作为描述没有用。

你有两个选择。

  1. 使 link 文本对每个人都具有描述性。您可以使按钮堆叠而不是并排放置,并使 link 文本为“X 项目演示”和“查看 X 项目”。
  2. 添加一些视觉上隐藏的文本,使 link 对屏幕 reader 用户有意义。

如果您可以更改设计以容纳额外的文本,我会选择第一个选项

进一步link个相关点

另外,因为 我们现在希望每个 link 都可以聚焦,所以您需要删除 tabindex="-1"

最后一点,如果您要在新的 window 中打开 link,最好指明这一点。

我认为可以接受的一件事(因为在每个 link 之后写“(opens in new window)”是不实际的)是有一个小图标表明它打开一个新的 window.

通过使用一些 CSS 技巧,我们可以使该过程自动化。

a[target="_blank"]::after {
  content: 'C9';
  content: 'C9' / " (opens in new window)";
  margin: 0 3px 0 5px;
}

注意我是如何定义 content 两次的吗?第一个被所有浏览器识别,第二个使用 content: alternative text 以便它为屏幕 readers 添加“(在新 window 中打开)”。

此外,我选择的角色并未作为标准达成一致,但它适用于大多数用途。

图片是否增值?

这只是提请注意的事情。如果图像没有为页面上的信息增加任何价值,则它应该是装饰性的。我所说的价值是指图像中的信息不会添加任何额外信息。

无法根据给出的示例提供建议,但如果图像纯粹是产品的屏幕截图,则要么改进描述以解释图像在上下文中显示的内容(因此它描述的是什么过程),要么只是制作装饰性的。

您只需将 alt 属性保留为空字符串即可使图像具有装饰性。 但您必须仍然拥有属性。所以 <img alt=""/> 可以,但 <img alt /> 就不行。使用 alt="" 将确保屏幕 reader 忽略图像。

基于建议的最终 HTML(CSS 用于 visually-hidden 文本)

我在修改的部分上面添加了评论。

关键部分是 CSS to visually hide an item(但让屏幕可以访问 readers)。

.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: 'C9';
      content: 'C9' / " (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>