【问题标题】:SVG text accessibilitySVG 文本可访问性
【发布时间】:2018-10-26 06:04:40
【问题描述】:

我有以下结构

<h2>
  <svg viewBox='-5 -40 100 50'>
    <!-- some filters that get applied on the elements below -->
    
    <clipPath id='c'>
      <text id='t'>Scooby</text>
    </clipPath>
    
    <g clip-path='url(#c)'>
      <rect x='-5' y='-40' width='100%' height='100%'/>
      <path/>
    </g>
    
    <use xlink:href='#t'/>
    <use xlink:href='#t'/>
  </svg>
</h2>

如何确保屏幕阅读器看到clipPath(“Scooby”)中的text并且只能看到一次

我知道 SVG text 应该由屏幕阅读器阅读,但是 当它位于 clipPath 元素内时,情况是否仍然如此?那么use 的副本呢?

我使用这种结构是为了在标题文本上获得一些奇特的效果(想想stuff like this)(并放弃当前使用的 .jpg 图像)。

【问题讨论】:

    标签: svg text accessibility screen-readers


    【解决方案1】:

    使用 aria-hidden 从屏幕阅读器中删除 SVG,并使用 aria-labelledbyh2 定义标签。

    <h2 aria-labelledby="t">
      <svg viewBox='-5 -40 100 50' aria-hidden="true">
        <!-- some filters that get applied on the elements below -->
    
        <clipPath id='c'>
          <text id='t'>Scooby</text>
        </clipPath>
    
        <g clip-path='url(#c)'>
          <rect x='-5' y='-40' width='100%' height='100%'/>
          <path/>
        </g>
    
        <use xlink:href='#t'/>
        <use xlink:href='#t'/>
      </svg>
    </h2>
    

    【讨论】:

    • @RobertMonfera 它在 Chrome 中对我有用,使用 NVDA
    • 这是屏幕阅读器的最佳/最简单方法。缺点是它不会影响复制和粘贴:一些浏览器会复制和粘贴您的文本的两个副本(对于两个 &lt;use&gt; 元素中的 shadow-DOM 文本元素),一些浏览器将一无所获(因为它们没有t 将卷影副本视为真实文本)。 clipPath 中的文本永远无法访问或选择。
    【解决方案2】:

    在特定元素上添加aria-hiddensuppress 屏幕阅读,它只会读取一次“Scooby”:

    <h2>
      <svg viewBox='-5 -40 100 50'>
        <!-- some filters that get applied on the elements below -->
    
        <clipPath id='c'>
          <text id='t'>Scooby</text>
        </clipPath>
    
        <g clip-path='url(#c)'>
          <rect x='-5' y='-40' width='100%' height='100%'/>
          <path/>
        </g>
    
        <use aria-hidden="true" xlink:href='#t'/>
        <use aria-hidden="true" xlink:href='#t'/>
      </svg>
    </h2>
    

    【讨论】:

      【解决方案3】:

      aria-label 属性适用于文本在屏幕上不可见时使用

      https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_aria-label_attribute

      <h2 aria-label="Scooby">
        <svg> ... </svg>
      <h2>
      

      或者,我相信大多数屏幕阅读器都会使用&lt;title&gt; SVG 元素。

      <h2>
        <svg>
          <title>Scooby logo</title>
          ...
        </svg>
      <h2>
      

      您还可以选择使用其他 ARIA 属性,例如 aria-labelledby

      【讨论】:

      • (或 <desc>)是可靠的一般建议,尽管您的代码 sn-p 仍然需要 <code>aria-hidden</code>,就像我的回答一样</desc>
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多