我想添加一些关于屏幕阅读器行为的细节,因为这里有一些惊喜。
先讲一些背景知识。一些屏幕阅读器(如NVDA)处理display: block和display: inline-block的方式是不同的(它们应该是这样的,稍后您将看到)。
不同显示属性的比较
显示:块
一个display: block元素总是在一个单独的“行”中宣布,这意味着NVDA将在其内容结束后停止说话,用户将手动告诉NVDA宣布下一个元素(通常使用下箭头键)。
<div>This is the first line</div>
<div>This is another line</div>
这将使NVDA宣布这是第一行,然后这是另一行。
下面是相同的结果:
<span style="display: block">This is the first line</span>
<span style="display: block">This is another line</span>
显示:inline-block
一个display: inline-block元素将与所有前面和后面的其他内联元素(display: inline和display: inline-block)一起显示。
<span style="display: inline-block">This is the first line</span>
<span style="display: inline-block">This is another line</span>
这将使屏幕阅读器一口气宣布两个元素:这是第一行,这是另一行。
如前所述,它是内联还是内联块元素并不重要;下面会得到完全相同的结果:
<span style="display: inline">This is the first line</span> <!-- Inline! -->
<span style="display: inline-block">This is another line</span> <!-- Inline block! -->
显示:flex
这与display: block的工作原理完全相同。
显示:inline-flex
令人惊讶的是,这也像display: block一样工作,而不像display: inline-block!
Display: grid /显示:内联网格
我没有测试这个,但我希望在这里与flex / inline-flex一样。
为什么这是个问题呢?
使用display: inline-block,可以创建视觉上看起来非常不同,但语义上被视为“一体”的元素。
例如,考虑以下在线新闻平台的标题:
<h2>
<span class="category">Rain forests</span>
They need our love
</h2>
你现在想要在视觉上设计一个与“真正的”标题(“他们需要我们的爱”)截然不同的类别(Rain forests),即通过将每个类别放在自己的行中,如下所示:
如果你将类别设置为display: block元素,那么屏幕阅读器将以两行不同的方式显示标题:雨林,标题级别2,那么他们需要我们的爱,标题级别2。这让用户感到困惑:页面上是否有两个不同的标题?为什么第一个标题没有内容(相反,紧接着出现了第二个标题)?
然而,如果你将类别设置为显示:内联块元素,那么屏幕阅读器将一次性宣布标题:雨林他们需要我们的爱,标题2级。
遗憾的是,display: inline-flex(可能还有inline-grid)并没有模仿这种行为。因此,如果你想提供完美的可访问性,你可能想在这种情况下使用内联块。