目前我认为只存在一些解决方法,比如使用HTML元素和aria-hidden
的组合,或者浏览器实现的有限支持,例如实现了CSS3语音模块。
注意,该模块仍处于候选推荐级别,但应该提供更准确的控制,以便在朗读时决定哪些内容需要被读出来,哪些不需要。
如果浏览器的支持是完美的,那么一个好的回答就是:
使用CSS3语音模块。
但是,这是Web,浏览器支持并不完美,因此即使在这个问题被问了4年后,我推荐使用span
和aria-hidden="true"
的组合。
但需要知道的是,尽管aria-hidden
属性确实可以防止元素内容被朗读,但它也会将其存在隐藏起来。差别微妙,但speak
属性不会通过在说出属于元素的子元素数量时提到它来隐藏元素的存在。
例如,考虑以下代码:
<html lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>What a beautiful day!</title>
<style type="text/css">
body {
counter-reset: headers;
}
h2::before {
counter-increment: headers;
content: counter(headers, upper-roman);
speak: none;
}
</style>
</head>
<body>
<h2>Early morning</h2>
<h2>Lunch</h2>
<h2>Before dinner</h2>
</body>
</html>
以下是支持Web浏览器(此处为Firefox 59)上Voice Over读取Lunch元素的内容:
![Voice Over on Firefox 59 result for CSS speak: none property](https://istack.dev59.com/O6RfO.webp)
它会计算(伪元素算作一个)speak:none;
元素,但不会朗读它。
使用aria-hidden
可以使元素完全不被计算。
我尚未尝试其他屏幕阅读器,因此结果可能会有所不同。