AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 79268796
Accepted
Shtole
Shtole
Asked: 2024-12-10 23:23:41 +0800 CST2024-12-10 23:23:41 +0800 CST 2024-12-10 23:23:41 +0800 CST

内联 <svg> 文本的可访问性

  • 772

我有以下代码:

<h2>
    Deadpool
    <svg width="53" height="64" class="inline" aria-label="and">
        <use href="#oleo-ampersand"></use>
    </svg>
    Wolverine:<br>
    A StackOverflow Example
</h2>

“&”符号的样式如下:

在此处输入图片描述

现在,我想让屏幕阅读器将其叙述为常规短语(即“死侍和金刚狼”)。添加aria-label="and"到<svg>似乎被忽略了。有办法实现这一点吗?也许,我应该制作整个块aria-hidden并添加一个视觉上隐藏的元素?

此外,如果能以相同的方式复制块就太酷了Ctrl+C,但我猜如果没有 JS 拦截这是不可能的。

html
  • 3 3 个回答
  • 40 Views

3 个回答

  • Voted
  1. mplungjan
    2024-12-10T23:42:02+08:002024-12-10T23:42:02+08:00

    不使用 JS 来复制文本确实不是一件容易的事。

    这个标记在屏幕阅读器上对你有用吗?

    document.addEventListener('copy', (event) => {
      const selection = window.getSelection().toString();
      if (selection.includes("Deadpool") && selection.includes("Wolverine")) {
        event.clipboardData.setData('text/plain', "Deadpool and Wolverine");
        event.preventDefault();
      }
    });
    .sr-only {
      position: absolute;
      width: 1px;
      height: 1px;
      padding: 0;
      margin: -1px;
      overflow: hidden;
      clip: rect(0, 0, 0, 0);
      white-space: nowrap;
      border: 0;
    }
    <h2>
      <span class="sr-only">Deadpool and Wolverine</span> Deadpool
      <svg width="53" height="64" class="inline" aria-hidden="true">
            <use href="#oleo-ampersand"></use>
        </svg> Wolverine:
      <br> A StackOverflow Example
    </h2>

    • 1
  2. Best Answer
    herrstrietzel
    2024-12-11T03:21:38+08:002024-12-11T03:21:38+08:00

    您还可以将该类仅应用于带有文本内容“and”的.sr-only隐藏。<span>

    如果您的 SVG 不包含任何文本元素,您甚至可以省略该aria-hidden属性。

    为了避免复制文本时出现浏览器不一致的情况,我们可以:

    • 应用于aria-hidden="true"SVG 元素(包含 & 符号)
    • 添加隐藏但可选择/可读的<span>

    您也可以使用应用了所需字体子集版本的 span(示例 1)。在这种情况下,您需要通过aria-hidden="true"以下方式应用并使其不可选择:user-select:none

    body {
      font-family: sans-serif;
    }
    
    /** subset version of Oleo - only including ampersans **/
    @font-face {
      font-family: "Oleo Script Swash Caps";
      font-style: normal;
      font-weight: 700;
      font-display: swap;
      src: url("data:font/woff2;base64,d09GMgABAAAAAAMMAA8AAAAABfAAAAK5AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhYbDBwYBmAAPBEICoFggV0LCAABNgIkAwwEIAWEfAcgDAcb4wTIBB74POv9JAM4Y67Agdzuul3iavAk5uevyUfH3wZyAYCR78cyKJoaK2w+kQLK4JlOZAPjqcYWu4QOsXcpavUIwBoHhE2kg/aBWBrGDVylURSkVhRhTm6WJQ/pECYgGaSRSvucZGI8CcIiLJE4OpkN5elMSW1ZOSoqIfKn/1OtivxJ1KtVFBEHpY+GqKS242RwViIUKYRxplojyyohmkaqJqM91x5lNzqR0TTsmqgfmOkF+oJNJDxK/f6z3M7MPHuxzt3ScEt33Xg38JzhgOfSjW6rjXfv3jXe1t0y9L91y9LQ+87wLfoud0ecuSP0d4230V0zXNG32XVMdzw5Vb/B0POy8cFKves6dIs3bonwTzPtPKrf9N9ZfUZtbOi6R+eaP88zrFto15gRoYM7JUzs3KkoVGQsXVHU5WIvP59OSml8p1F1yriu/Vr0aRy+uqRH2/Da/kVD2tzo3//b3sjZ1ilxW1P6fA++E/zps6/VIwBo6TXB5NerCidPsGv7zdxKfofcpTPnI04HtdT/U5UA+RMC897Hore1Pm9TOmqpmqkS0GNW4pLFV5xzkpYu0OlHXGbsKJvjYcwNT0c2bk7W6PgUC03dER1vgiBKOAsS5sJakBnJLkEhhSbBBE8yBFPiSAJbvAM5VFBBCa2JJZZy0ikjlxIqBMVQ/ssCYiimjGxiGUB3+jKAAjIpZgipyOZqUiknhy6kUoJN0XSmmAIyGG5IWTGviilCJZ4Y4ogjAdOqTKrqUZVXv4shFFNLBZVUUEsJmbRGDbRMrQnEEU/C68gKgS5IlFBLkOyBXKwSRjrhRZKobD2bazDaYHy6glTSqaAj5QGJASokZl4ZDYh1JBssdZIMkoRXF6smF1pDY2VkQpuAYhWZZIBlVQpFSgob4gntMgtd12uh7SaBpHqf0KZuU2YD")
        format("woff2");
    }
    
    .ampersand {
      font-family: "Oleo Script Swash Caps";
      font-weight: 700;
    }
    
    
    /* SVG ampersand */
    .svgText {
      height: 1em;
      transform: scale(1.5) translateY(0.1em);
    }
    
    
    .non-select{
        user-select:none
    }
    
    /* hide for not impaired readers */
    .sr-only {
      clip-path: inset(50%);
      height: 1px;
      overflow: hidden;
      position: absolute;
      white-space: nowrap;
      width: 1px;
      outline:1px solid #ccc
    }
    
    textarea {
      display: block;
      width: 100%;
      min-height: 10em;
    }
    
    h2{
      white-space: nowrap;
    }
    <h2>
        Deadpool <span aria-hidden="true" class="non-select  ampersand">&</span><span class="sr-only">and</span>
        Wolverine
    </h2>
    
    <h2>
    Deadpool <svg class="svgText" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 75 138.3"  aria-hidden="true"><path class="glyph" d="M36.2 57.3 L36.3 57.3 Q36.6 58.4 36.6 60.1 Q36.6 61.7 35.9 63.6 L35.9 63.6 L35.3 63.6 Q28.7 63.6 24.2 67.5 Q19.7 71.4 19.7 78.2 Q19.7 84.9 22.9 87.9 Q26.1 90.8 31.2 90.8 Q36.3 90.8 40.1 86.3 Q43.9 81.8 45 75.8 L45 75.8 Q39.4 78.7 36 78.7 Q32.6 78.7 30.4 77.6 Q28.2 76.4 27.3 74.7 L27.3 74.7 Q27.5 74 28.6 72.6 Q29.8 71.2 30.8 71.1 L30.8 71.1 Q32.6 72.2 34.6 72.2 Q36.6 72.2 40.1 70.2 Q43.6 68.2 47.1 65.8 Q50.5 63.5 54.9 61.5 Q59.3 59.5 63.4 59.5 Q67.5 59.5 70.8 62.1 Q74.1 64.6 74.1 69.4 Q74.1 74.2 70.8 77.5 Q67.4 80.8 61.9 80.8 Q56.4 80.8 51.3 76.8 L51.3 76.8 Q51.1 86.9 43.5 94.7 Q35.9 102.4 24.9 102.4 L24.9 102.4 Q18.2 102.4 12.1 99.6 L12.1 99.6 Q4.7 96.4 1.7 89.8 L1.7 89.8 Q0 86.1 0 80.5 Q0 74.8 3.6 69.8 L3.6 69.8 Q10.2 60.8 22.5 60.3 L22.5 60.3 Q17.1 58.9 13.7 55 Q10.2 51.1 10.2 45.6 L10.2 45.6 Q10.2 38.1 16.5 33.8 Q22.8 29.4 31.1 29.4 Q39.3 29.4 45 33 Q50.6 36.6 50.6 42.6 L50.6 42.6 Q50.6 46.7 47.8 49.6 Q45 52.5 41.1 52.5 Q37.2 52.5 34.5 50.2 Q31.7 47.8 31.7 43.7 Q31.7 39.5 35.3 36.7 L35.3 36.7 Q30.7 37 28.9 40.2 Q27 43.3 27 47.2 Q27 51.1 29.4 53.8 Q31.8 56.5 36.2 57.3 L36.2 57.3 ZM66.2 71.5 L66.2 71.5 Q66.2 70.3 65.2 69.2 Q64.2 68 61.8 68 Q59.4 68 53.5 71.2 L53.5 71.2 Q58.7 75.1 62.5 75.1 Q66.2 75.1 66.2 71.5 ZM40.6 45.7 Q41.5 45.7 42.2 44.6 Q42.9 43.4 42.9 41.6 Q42.9 39.7 41.4 38.4 L41.4 38.4 Q38.2 40.3 38.2 43.3 L38.2 43.3 Q38.2 44.4 38.9 45.1 Q39.6 45.7 40.6 45.7 Z " /></svg><span class="sr-only">and</span> Wolverine
    </h2>
    
    <h3>Paste text</h3>
    <textarea></textarea>

    常用的sr-only规则确保文本仍然可被屏幕阅读器读取和选择 - 尽管对于视力正常的用户而言是不可见的。此技术的主要技巧是通过多个属性使元素不可见,而无需应用disply:none或,visibility:hidden因为两个属性都会将内容从可访问性树中删除。

    另请参阅“A11Y 项目:隐藏内容”

    SVG 到字体的转换

    如果您的内联 SVG 图形不可用作字体 - 您也可以使用SVG 到字体生成器(如icomoon或fontello)将您的资产转换为图标字体。

    子集

    如果您的字体服务不支持子集,您也可以使用transfonter之类的服务进行转换。它还有一个选项可以生成字体资源的 base64 编码 dataURL。

    • 1
  3. Roland McLeod
    2024-12-11T03:51:00+08:002024-12-11T03:51:00+08:00

    也许,我应该使整个块变为 aria-hidden 并添加一个视觉上隐藏的元素?

    是的,从可访问性树中删除 svg,并添加单词“and”作为视觉隐藏文本。

    <h2>
      <span class="first-line">
        Deadpool
        <svg width="53" height="64" class="inline" aria-hidden="true">
          <use href="#oleo-ampersand"></use>
        </svg>
        <span class="sr-only">and&nbsp;</span> 
        Wolverine:
      </span> 
      A StackOverflow Example
    </h2>
    
    .first-line {
      display: block;
    }
    

    另外,请注意,我删除了br“Wolverine”之后的元素,而是将第一行内容包裹在一个 span 中,并将其显示为 block,以获得所需的换行符。在浏览模式下,如果您使用该元素br强制换行,某些屏幕阅读器会将标题读作两个单独的标题,因此这是一种礼貌的做法,可以防止这种情况发生。

    • 1

相关问题

  • 使用代码点渲染轮廓图标,而不是从 Material Design Google Fonts 中填充

  • 如何使用CSS将选项卡制作为箭头形状

  • 在 html 和 css 中绘制表格内的倾斜线

  • HTML 表格,一行中有 2 行单元格

  • 如何创建 mat-grid-list 角度材质

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    Vue 3:创建时出错“预期标识符但发现‘导入’”[重复]

    • 1 个回答
  • Marko Smith

    为什么这个简单而小的 Java 代码在所有 Graal JVM 上的运行速度都快 30 倍,但在任何 Oracle JVM 上却不行?

    • 1 个回答
  • Marko Smith

    具有指定基础类型但没有枚举器的“枚举类”的用途是什么?

    • 1 个回答
  • Marko Smith

    如何修复未手动导入的模块的 MODULE_NOT_FOUND 错误?

    • 6 个回答
  • Marko Smith

    `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它?

    • 3 个回答
  • Marko Smith

    何时应使用 std::inplace_vector 而不是 std::vector?

    • 3 个回答
  • Marko Smith

    在 C++ 中,一个不执行任何操作的空程序需要 204KB 的堆,但在 C 中则不需要

    • 1 个回答
  • Marko Smith

    PowerBI 目前与 BigQuery 不兼容:Simba 驱动程序与 Windows 更新有关

    • 2 个回答
  • Marko Smith

    AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String”

    • 1 个回答
  • Marko Smith

    我正在尝试仅使用海龟随机和数学模块来制作吃豆人游戏

    • 1 个回答
  • Martin Hope
    Aleksandr Dubinsky 为什么 InetAddress 上的 switch 模式匹配会失败,并出现“未涵盖所有可能的输入值”? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge 为什么这个简单而小的 Java 代码在所有 Graal JVM 上的运行速度都快 30 倍,但在任何 Oracle JVM 上却不行? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini 具有指定基础类型但没有枚举器的“枚举类”的用途是什么? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer 何时应使用 std::inplace_vector 而不是 std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller 在 5.2 版中,bash 条件语句中的 [[ .. ]] 中的分号现在是可选的吗? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench 为什么双破折号 (--) 会导致此 MariaDB 子句评估为 true? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng 为什么 `dict(id=1, **{'id': 2})` 有时会引发 `KeyError: 'id'` 而不是 TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String” 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB 为什么 GCC 生成有条件执行 SIMD 实现的代码? 2024-02-17 06:17:14 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve