CSS `aria-current` 属性在导航中的样式应用

各位观众老爷,大家好!今天咱们来聊聊一个在前端开发中经常被忽略,但其实贼有用的 CSS 属性——aria-current。这玩意儿,说白了,就是专门用来告诉屏幕阅读器,以及其他辅助技术设备,当前页面对应于导航栏里的哪个链接。

为啥需要 aria-current

想象一下,你是一个视力障碍人士,正在浏览一个网站。当你点击导航栏里的链接时,你希望知道你现在在哪儿,对吧?如果你使用屏幕阅读器,它会读出当前页面的标题,但如果你想快速确认这个页面对应于导航栏里的哪个链接,就需要 aria-current 来帮忙了。

aria-current 属性就像一个路标,清晰地告诉用户:“嘿,你现在的位置就是这儿!” 没了它,用户就得靠猜,或者反复听屏幕阅读器朗读页面内容,效率简直低到姥姥家。

aria-current 的取值

aria-current 属性可以取以下几个值:

  • page: 表示当前页面。这是最常用的值,通常用于导航栏的链接,表明当前页面就是该链接指向的页面。
  • step: 表示步骤,通常用于向导或分步流程中,表明当前步骤。
  • location: 表示当前位置,例如地图应用中的当前位置。
  • date: 表示当前日期,例如日历应用中。
  • time: 表示当前时间。
  • true: 表示当前元素是当前上下文中的活动元素,但没有更具体的语义。
  • false: 表示当前元素不是当前上下文中的活动元素。
  • "" (空字符串): 表示该元素不表示当前上下文中的活动元素。
  • none: 表示该元素不表示当前上下文中的活动元素。

今天咱们重点关注 page,因为它在导航栏中使用最广泛。

aria-current="page" 的用法

直接上代码,咱们用一个简单的导航栏示例来说明:

<nav>
  <ul>
    <li><a href="/">首页</a></li>
    <li><a href="/about">关于我们</a></li>
    <li><a href="/products">产品</a></li>
    <li><a href="/contact" aria-current="page">联系我们</a></li>
  </ul>
</nav>

在这个例子中,假设我们当前正在“联系我们”页面。那么,我们就给“联系我们”这个链接加上 aria-current="page" 属性。

CSS 样式配合 aria-current

光有 aria-current 还不够,我们还需要用 CSS 来给当前链接加上一些醒目的样式,让视觉用户也能一眼看出当前页面。

nav ul li a {
  display: block;
  padding: 10px 15px;
  text-decoration: none;
  color: #333;
}

nav ul li a[aria-current="page"] {
  font-weight: bold;
  color: #007bff;
  border-bottom: 2px solid #007bff;
}

这段 CSS 代码做了两件事:

  1. 给所有链接设置了基本的样式,比如内边距、颜色等。
  2. aria-current="page" 的链接设置了更醒目的样式,比如加粗字体、改变颜色、添加下划线。

这样一来,当用户访问“联系我们”页面时,导航栏里的“联系我们”链接就会显示为粗体蓝色,并且带有下划线,非常醒目。

JavaScript 动态设置 aria-current

在实际项目中,我们通常会使用 JavaScript 来动态设置 aria-current 属性。这是因为,页面加载时,我们需要根据当前 URL 来判断哪个链接应该被设置为 aria-current="page"

下面是一个简单的 JavaScript 示例:

document.addEventListener('DOMContentLoaded', function() {
  const currentPath = window.location.pathname;
  const navLinks = document.querySelectorAll('nav ul li a');

  navLinks.forEach(link => {
    if (link.getAttribute('href') === currentPath) {
      link.setAttribute('aria-current', 'page');
    } else {
      link.removeAttribute('aria-current'); // 移除其他链接的 aria-current 属性
    }
  });
});

这段代码做了以下几件事:

  1. 监听 DOMContentLoaded 事件,确保页面加载完成后再执行。
  2. 获取当前页面的 URL 的路径部分(例如 /contact)。
  3. 获取导航栏里所有的链接。
  4. 遍历所有链接,如果链接的 href 属性与当前路径匹配,就给它设置 aria-current="page" 属性;否则,移除它的 aria-current 属性。

复杂场景:子页面高亮父级菜单

有时候,我们的网站结构比较复杂,例如有子页面。例如,“产品”下面有“产品A”、“产品B”、“产品C”等子页面。当用户访问“产品A”页面时,我们希望不仅“产品A”链接高亮,还要让“产品”这个父级菜单也高亮。

这时,我们可以修改 JavaScript 代码,来判断当前页面是否是某个父级菜单的子页面。

document.addEventListener('DOMContentLoaded', function() {
  const currentPath = window.location.pathname;
  const navLinks = document.querySelectorAll('nav ul li a');

  navLinks.forEach(link => {
    const href = link.getAttribute('href');

    // 检查当前页面是否是某个父级菜单的子页面
    if (currentPath.startsWith(href) && href !== '/') {
      // 找到父级菜单的链接
      const parentLink = link.closest('ul').closest('li').querySelector('a');
      if(parentLink){
          parentLink.setAttribute('aria-current', 'page');
      }

      link.setAttribute('aria-current', 'page');
    } else if (href === currentPath) {
      link.setAttribute('aria-current', 'page');
    } else {
      link.removeAttribute('aria-current');
      // 移除父级菜单的 aria-current 属性,避免错误高亮
      const parentLink = link.closest('ul').closest('li').querySelector('a');
      if(parentLink && parentLink.getAttribute('aria-current')){
          parentLink.removeAttribute('aria-current');
      }
    }
  });
});

这段代码的关键在于 currentPath.startsWith(href),它可以判断当前路径是否以某个链接的 href 属性开头。如果是,就说明当前页面是该链接指向的页面的子页面。 找到父级链接然后设置aria-current

aria-current 的最佳实践

  • 只在一个链接上使用 aria-current="page": 在一个页面上,应该只有一个链接拥有 aria-current="page" 属性。如果多个链接都拥有这个属性,屏幕阅读器可能会感到困惑。
  • 保持一致性: 在整个网站上,aria-current 的使用方式应该保持一致。例如,如果在一个页面上使用粗体来表示当前链接,那么在其他页面上也应该使用粗体。
  • 测试你的网站: 使用屏幕阅读器或其他辅助技术设备来测试你的网站,确保 aria-current 属性能够正确地工作。
  • 使用语义化的 HTML: aria-current 只是辅助手段,更重要的是使用语义化的 HTML 结构。例如,使用 <nav> 元素来表示导航栏,使用 <ul><li> 元素来表示列表。
  • 考虑无 JavaScript 的情况: 虽然我们通常使用 JavaScript 来动态设置 aria-current 属性,但我们也要考虑在 JavaScript 被禁用或加载失败的情况下,网站的可用性。可以考虑在服务器端渲染时设置 aria-current 属性。

aria-current 与其他 ARIA 属性的比较

aria-current 只是 ARIA (Accessible Rich Internet Applications) 属性中的一个。ARIA 属性是一组 HTML 属性,用于增强网页的可访问性,特别是对于使用辅助技术设备(如屏幕阅读器)的用户。

一些与 aria-current 相关的 ARIA 属性包括:

  • aria-selected: 用于表示选项卡或列表框中当前被选中的元素。
  • aria-expanded: 用于表示可折叠/展开的区域是否展开。
  • aria-disabled: 用于表示元素是否被禁用。

这些 ARIA 属性可以与 CSS 结合使用,来创建更具可访问性的用户界面。

aria-current 的兼容性

aria-current 属性的兼容性非常好,主流浏览器都支持它。但是,为了确保最佳的兼容性,建议使用最新的浏览器版本,并进行充分的测试。

示例:使用 aria-current 的面包屑导航

面包屑导航是一种常见的导航模式,用于帮助用户了解他们在网站中的位置。我们可以使用 aria-current 属性来增强面包屑导航的可访问性。

<nav aria-label="breadcrumb">
  <ol>
    <li><a href="/">首页</a></li>
    <li><a href="/products">产品</a></li>
    <li aria-current="page">产品详情</li>
  </ol>
</nav>

在这个例子中,aria-current="page" 被添加到了“产品详情”这个面包屑上,表明当前页面是“产品详情”页面。

示例:使用 aria-current 的选项卡

选项卡是一种用于组织内容的常见用户界面模式。我们可以使用 aria-selectedaria-current 属性来增强选项卡的可访问性。

<div role="tablist" aria-label="Sample Tabs">
  <button role="tab" aria-selected="true" aria-controls="panel1" id="tab1" aria-current="page">选项卡 1</button>
  <button role="tab" aria-selected="false" aria-controls="panel2" id="tab2">选项卡 2</button>
  <button role="tab" aria-selected="false" aria-controls="panel3" id="tab3">选项卡 3</button>
</div>

<div role="tabpanel" id="panel1" aria-labelledby="tab1">
  <p>选项卡 1 的内容。</p>
</div>
<div role="tabpanel" id="panel2" aria-labelledby="tab2" hidden>
  <p>选项卡 2 的内容。</p>
</div>
<div role="tabpanel" id="panel3" aria-labelledby="tab3" hidden>
  <p>选项卡 3 的内容。</p>
</div>

在这个例子中,aria-selected="true" 表示选项卡 1 是当前被选中的选项卡,aria-current="page" 也被设置到了选项卡1上。 注意 JavaScript 需要用来切换选项卡和更新 aria-selected 属性。

总结

aria-current 属性是一个简单但强大的工具,可以用来提高网站的可访问性。通过合理地使用 aria-current 属性,我们可以让网站对所有用户都更加友好,无论他们是否使用辅助技术设备。记住,可访问性不仅仅是为了符合法律法规,更是为了让每个人都能平等地访问信息和服务。

希望今天的讲解对大家有所帮助!下次再见!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注