辅助功能:仅使用带有 href="#" 的 javascript 链接

2024-03-11

我有一个 React SPA,其中有一些链接可以导航到其他页面或同一页面上的其他位置,这些导航要么以编程方式决定,要么依赖 javascript 转到同一页面上的另一个位置。

  • 我可能不知道链接href当显示链接时,所以我将其渲染为href="#" and event.preventDefault()在单击处理程序中,然后运行逻辑来决定链接应导航到的位置。
  • 在锚链接的情况下,我需要 javascript 滚动到元素,因为对于 SPA 路由器,基于哈希的锚链接可能无法工作,因为锚定元素可能尚不可用,而且我还需要平滑滚动。 (在这种情况下,我可能仍然可以指定 href,这使链接可访问,但使用 javascript 来处理滚动)

对我来说,从语义上讲,它仍然应该是一个链接,而不是一个按钮,因为它将用户导航到另一个页面或同一页面上的另一个位置。但是,考虑到可访问性,屏幕阅读器没有足够的信息来理解链接目的地,并且无法将其告知用户。我想这不太好吧?

如何确保使用符合语义且易于访问? 我应该使用按钮吗? 或者我应该在 aria-label 链接中添加一些其他信息? 或者对于可访问性来说,使用 href="#" 的链接实际上可以吗?


简答

如果 URL 发生变化(导航),则应使用链接,而其他所有内容均应使用按钮。<a href="#"这不是一个好的做法,但对于 SPA 来说,如果您的链接文本准确且详细,应该没问题。避免平滑滚动或给人们一种关闭它的方法,因为它可能会让人迷失方向。

更长的答案

我给了相当广泛的答案<a> vs <button>在这里的 SPA 中 https://stackoverflow.com/questions/61395925/anchor-or-button-in-react-spa/61441207#61441207,所以我希望这足以回答一般用例在什么场景中使用哪一个。

关于#由于您事先不知道 URL,因此在 URL 中。如果你开始它会更好#如果 URL 未知,但更新href一旦你知道要将人们引导到哪里。

这是由于在我链接的答案 https://stackoverflow.com/questions/61395925/anchor-or-button-in-react-spa/61441207#61441207关于保证,即知道链接会将我带到哪里。

显然,如果您无法做到这一点,请确保链接文本具有很强的描述性,以便我可以确信我会去正确的地方。

在 SPA 内滚动

关于滚动到页面的不同部分,正如您所说,它仍然是一个链接,假设您使用以下内容更新了网址#section-name. 你应该做这个,但如果您的应用程序路由器无法处理 URL 片段,那么我根本不会更新 URL 并将其更改为按钮。

在此阶段,我将在按钮内使用一些视觉上隐藏的文本来解释它滚动到当前页面上的某个部分。

下面的例子说明了这一点。请使用下面的 CSS 类在视觉上隐藏文本因为它有比 Bootstrap sr-only 类更好的兼容性,如我给出的这个答案中所述 https://stackoverflow.com/questions/62107074/how-to-hide-a-text-and-make-it-accessible-by-screen-reader/62109988#62109988.

.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 */
}
<button><span class="visually-hidden">Go To </span>Section name<span class="visually-hidden"> on this page</span></button>

关于平滑滚动的快速说明

最后我要提醒您注意平滑滚动的使用。如果您使用此功能,请确保有办法将其关闭,因为它可能会分散患有运动障碍或焦虑症的人的注意力或迷失方向。

实现此目的的一种方法是使用 CSS 媒体查询prefers-reduced-motion https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-reduced-motion.

最后的想法

在没有看到每个场景的情况下,很难给出 100% 明确的答案,如果您可以尝试并遵循用于同一页面操作的按钮的标准导航模式、用于导航到同一页面的部分的带有 url 片段的链接以及到其他页面的链接,甚至如果这些是通过 AJAX 处理并且仅部分重新加载。

显然这就是目标,我知道对于某些路由解决方案来说,这并不总是可能的,在这种情况下,请使用您的最佳判断和使用屏幕阅读器进行测试因为屏幕阅读器用户最有可能遭受 SPA 中导航系统结构不良的困扰。

最后一点提示- 如果您确实更改了 SPA 中的页面,请制作<h1>在下一页上可以通过编程方式聚焦tabindex="-1"并在页面加载后聚焦。这是一种很好的方法,可以让弱视或无视的用户知道 SPA 中的导航是使用 AJAX 完成的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

辅助功能:仅使用带有 href="#" 的 javascript 链接 的相关文章

  • jQuery 在附加元素后立即返回 div 元素的高度 0

    我有一个浮动 div 最初没有内容 我使用 jQuery 将一组元素附加到 div 然后立即调用原始 div 的 height 方法 我添加的元素在样式表中具有定义的最小高度 而浮动 div 则没有 问题是 当我在原始 div 上调用 he
  • 当key未知时如何获取js对象中的属性值

    我有一个对象数组 a 81 25 p 81 25 81 26 p 81 26 我想循环遍历数组并获取值p在每个元素中 for var key in a console log a key outputs 81 25 Object How d
  • 如何使用javascript将视频文件转换为字符串?

    我在 signalR 工作 我想通过将视频文件拆分为不同部分来将视频文件从一个客户端发送到另一个客户端 我已经通过分割图像源数据发送图像并在另一个客户端上接收该图像 document getElementById fileUpload ad
  • 半流体布局 CSS/Html

    我有一个两列布局 其中右列的静态宽度为 350px 左列的宽度应填充页面的其余部分 或者至少这是我想要发生的事情 但不幸的是事实并非如此 看一下我的 css html http jsfiddle net CmJ7P http jsfiddl
  • 如何使用 javascript 将我的域名字母大写?

    假设我的域名是www hello com 如何使用 jQuery JavaScript 使浏览器的 URL 栏看起来像 www HELLO com 您无法更改浏览器地址栏中显示的内容 这是一项基本的安全功能 您可以使您的域名全部大写 并将页
  • 单击 btn 而不触发 div 单击未按预期工作

    代码沙盒 https codesandbox io s currying breeze depdc9 file package json https codesandbox io s currying breeze depdc9 file
  • 如何使用css网格制作一个垄断板?

    I want to create a monopoly board like There are following features in the board 角是方形的 比其他盒子大 每行的文本都面向特定的角度 我的基本 html 结构
  • 如何创建显示/隐藏 Docusaurus 项目中所有详细标签状态的按钮?

    根据讨论here https stackoverflow com questions 58579048 how to add or remove the open attribute from all details tags in a r
  • Python 中的 Firebase 身份验证时出现 KeyError:“databaseURL”

    相信你做得很好 我是 firebase 的新手 正在尝试进行用户身份验证 我已经安装了pyrebase4并在firebase控制台上创建了一个项目 我还启用了使用 电子邮件和密码 登录并尝试连接我的应用程序 下面是我正在尝试的代码 impo
  • 使用外部按钮选择下一个/上一个单选按钮

    我正在制作一种幻灯片形式 当用户单击下一张图像时 还必须选择单选按钮 我的滑动功能可以正常工作 下一个按钮 也可以工作 但我有点坚持使用 上一个 按钮 不明白为什么它不起作用 fiddle http jsfiddle net V4tdx 这
  • 如何从代码隐藏中向我的 div 添加点击事件?

    如何从代码隐藏中向我的 div 添加点击事件 当我点击 div 时 会出现一个消息框 其中显示 您想删除它吗 并在框中显示 是 或 否 全部来自后面的代码 while reader Read System Web UI HtmlContro
  • 指定 body CSS 宽度安全吗?

    现在通常满足于以一定的尺寸居中 div Blah div 不使用包装器进行对齐和大小并直接将其应用到body tag 像这样 Blah 尺寸是
  • 单击 html 中的按钮后如何从 javascript 函数写入文件

    我正在尝试编写真正基本的代码 在 html 文件上按下按钮后 通过 JavaScript 函数在本地写入 txt 文件 这不可能吗 我可以仅使用 javascript 文件写入文件 但在尝试同时使用两者时则不能
  • 如何将 Django 数据库中的模板标签解释/渲染为 HTML

    我正在尝试添加带有来自 Django 管理站点的图像的帖子 但安全 自动转义关闭过滤器无法解释 Django 的模板标签 My input and page look like 复制图像地址 给出http 127 0 0 1 8000 7B
  • javascript 加壳器与压缩器

    我想知道加壳器与压缩器的区别 优点是什么 即您应该在网络应用程序中部署压缩版本还是压缩版本 示例代码 var layout NAVVISIBLE 1 Init function this Resize Dimensions function
  • 数组长度未定义[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我试图按如
  • 如何使用 React 制作垂直选项卡

    有人可以为我提供一种使用 React 创建垂直选项卡的方法吗 我尝试了各种npm包 如react web tabs reactstrap和react bootstrap 最后两个只有水平选项卡的示例 React web tabs在其文档中有
  • 如何使用node.js获取屏幕分辨率

    我需要使用 node js 获取屏幕分辨率 但以下代码不起作用 var w screen width var h screen height 这也行不通 var w window screen width var h window scre
  • 如何将函数导入到Vue组件中?

    我正在尝试将单个函数导入到我的 Vue 组件中 我为我的函数创建了一个单独的 js 文件 randomId js exports randomId gt My function 在我的 Vue 组件中 我导入了 Random js let
  • 如何向 SvelteKit/Vite 应用添加版本号?

    我正在尝试在我的 SvelteKit 应用程序中创建一个系统 它会在某个页面上向您显示有关当前应用程序版本的信息 最好是 Git 提交哈希和描述 我尝试使用Vite的定义功能 https vitejs dev config define在构

随机推荐

  • FFMPEG Android 库增加大小

    我在我的项目中使用 ffmpeg 库 问题是应用程序 apk 大小太大 有人知道如何减小 apk 大小吗 任何帮助 建议或链接将不胜感激 谢谢 你好 tech android 和 gulab patel 我已经找到了解决方案 Android
  • 从开发工具中的检查元素查找原始源文件路径

    我正在尝试为使用 React 和 Webpack 构建的大型 Web 应用程序添加可访问性 这需要从应用程序返回源文件 有没有办法查看代码最初来自哪个文件 检查元素和查看源代码很好 但我找不到生成代码的源文件的路径 有没有办法在开发工具 c
  • 即使使用限制,Rails Mongoid 模型查询结果也会返回错误的大小/长度/计数信息

    当在我的 Rails 应用程序中查询某个模型时 它返回正确的结果 摘录size length or count信息 甚至使用limit标准 recipes Recipe where bitly url gt some url order b
  • 访问控制允许来源-本地主机

    我在通过ajax接收json时遇到问题 错误如下 根据我迄今为止发现的有关该错误的信息 这似乎是某种跨域问题 但我不知道这意味着什么以及如何解决它 响应头可能有问题 我自己创建了 API 之前没有经验 但是如果直接在浏览器中访问 url 则
  • 如何使用 PowerShell 命令从 terraform Variables.tf 文件中提取变量值

    我有一个变量 tf 文件 其中包含所有项目变量 我尝试使用 PowerShell 获取变量值 变量 tf variable products default Product 1 Product 2 Product 3 Product 4 v
  • 忽略和有什么缺点

    不使用有什么缺点吗 and 在用 HTML 和 PHP 编写的网页上 我的意思是 无论有没有它 一切都可以正常工作 那么为什么要使用它呢 它们在规范中是明确可选的 因此文档仍然有效 自从原始规格 https www w3 org MarkU
  • 拒绝在框架中显示“url”,因为它将“X-Frame-Options”设置为“sameorigin”。 JavaScript 代码有问题

    我正在开发一个网站 当您搜索该网站时 该网站会隐藏您的历史记录 function code url var win window open win document body style margin 0 win document body
  • Java Dom 解析器报告子节点数量错误

    我有以下 xml 文件
  • 如何在 capnproto C++ 生成的代码中设置列表的字符串项?

    我有这样的 capnproto 定义 struct School name 0 Text address 1 Address foundation 2 Date emailAddresses 3 List Text 我想在构建器中使用与此类
  • JSLint:在定义错误之前使用函数

    我使用 JSLint 来验证我的大部分外部 Javascript 文件 但我得到的最大数量的错误来自于定义之前使用的函数 这真的是我应该担心的问题吗 看来 Firefox IE7 和 Chrome 并不关心 功能与流行的一样init 我经常
  • 时间延迟 Tkinter

    我想在 PyDev Eclipse python 2 75 中制作一个图形窗口 我做了一些事情 但我想做一个 入口 眨眼 它测试用户输入 如果它是一个整数 它应该闪烁绿色一秒钟 然后变成白色 但如果它是一串其他东西 它应该闪烁红色 然后变成
  • 如何制作分割文本输入占位符?

    我想要做的事情也许最好用图像来解释 我将在下面添加 但本质上它是文本inputHTML 字段一半是预先存在的值 另一半是可替换的 我尝试添加两个value and a placeholder场 然后通过将它们分开padding left在
  • python SyntaxError 与 dict(1=...), 但 {1:...} 有效

    Python 似乎在接受字典类型的键方面不一致 或者 换句话说 它允许以一种定义字典的方式使用某些类型的键 但不允许以其他方式使用 gt gt gt d 1 one 2 2 gt gt gt d 1 one gt gt gt e dict
  • UIHostingController 是否必须位于视图控制器层次结构中?

    我想在我的基于 UIKit 的 UI 中嵌入一些 SwiftUI 不幸的是 Apple 不提供UIHostingView only UIHostingController 我可以或多或少地忽略该控制器并只使用它的视图 还是我真的需要将它添加
  • Clojure 中 definterface 和 defprotocol 的区别

    除了缺少文档之外 还有什么区别definterface and defprotocol在 Clojure 中 根据Clojure 的乐趣 使用的优点definterface over defprotocol受到限制 完全是因为前者允许原始类
  • 在 Libgdx 中使用屏幕时重用代码

    根据我在阅读其他人关于如何制作不同屏幕的代码时的理解 您执行一个主处理程序类 然后为每个屏幕创建一个新类 让我困惑的是 每当你创建一个新屏幕时 你都必须重新定义将要渲染的所有内容 例如 SpriteBatch 精灵 字体等 有没有办法在所有
  • Scala:包导入冲突

    我正在导入一个隐式 scala concurrent ExecutionContext Implicits global 在此之前 我import global Analytics xyzMethod 其中 global 是我的包中的一个目
  • 如何将大型 xml 文件的一部分反序列化为 C# 类?

    我已经阅读了一些关于如何反序列化 xml 的帖子和文章 但仍然没有弄清楚应该如何编写代码来满足我的需求 所以 我为另一个关于反序列化 xml 的问题道歉 我有一个大 50 MB 的 xml 文件 需要反序列化 我使用 xsd exe 获取文
  • 如何将 Blender 3D 动画导入 iPhone OpenGL ES?

    我正在尝试使用 OpenGL ES 在 iPhone 上制作动画 我能够在 Blender 3D 软件中制作动画 我可以将 Blender 导出为 obj 文件到 OpenGL 并且它可以在 iPhone 上运行 但我无法将我的动画作品从
  • 辅助功能:仅使用带有 href="#" 的 javascript 链接

    我有一个 React SPA 其中有一些链接可以导航到其他页面或同一页面上的其他位置 这些导航要么以编程方式决定 要么依赖 javascript 转到同一页面上的另一个位置 我可能不知道链接href当显示链接时 所以我将其渲染为href a