不能在 <button> 内使用 <div>,但可点击的 div 被认为是错误的。什么是 "correct" 方法?

Cannot use <div> inside of <button>, but clickable divs are considered bad. What is "correct" approach?

我正在构建一个采用日历形式的 React 应用程序,用户应该可以在其中单击日历上的日期。这些日子由大方块表示,因此它们可以包含当天的信息。出于可访问性原因,使用 <button>s 似乎是最明智的选择,但我的研究 (Why can't a <button> element contain a <div>?) + (https://www.w3.org/TR/2012/WD-html5-20120329/the-button-element.html#the-button-element) 表明将 div 放在按钮内是不正确的。我能想到的唯一其他选择是将日子变成它们自己的 <div>,但让它们可点击并手动为它们提供 tabIndexrole 功能以实现可访问性目的.

可点击区域的正确 html 标签或方法是什么,其中可能还包含多个 <div>

您可以将 div 包裹在锚点中:

<a href="javascript:void(0)"><div>Hello World!</div></a>

您可以在 <button> 中使用 <span> 个元素并且它是 有效 HTML.

<button>
  <span>Three Different Spans</span>
  <span>But Perfectly Valid</span>
  <span>HTML!</span>
</button>

因为您可以按照自己的方式设置跨度的样式,所以这不会给您带来任何问题。

但是:如果您发现需要一个可点击区域(您认为应该是一个按钮,这对于日历来说确实是正确的!)需要多个容器,则很可能是您设计的不正确,可能需要重新考虑设计。

您可以求助于 CSS :before:after 伪选择器来增加您需要的复杂性(没有看到设计很难给出任何可靠的建议)。

如果您真的不确定,可以将 aria-label 添加到 <button> 元素,然后(同样取决于内容)将 aria-hidden="true" 添加到所有内部项目。

<button aria-label="function of the button, this will be read to screen readers and other assistive tech">
  <!-- this should be unnecessary, but depending on the content this is a technique to fix any issues caused by the button content -->
  <span aria-hidden="true">Three Different Spans</span>
  <span aria-hidden="true">But Perfectly Valid</span>
  <span aria-hidden="true">HTML!</span>
</button>