Хотя это совершенно верно HTML, наличие двух меток вызовет проблемы с NVDA и, возможно, с другими программами чтения с экрана, где он будет читать только одну метку.
Именно поэтому WAVE предлагает использовать aria-labelledby
в качестве он предназначен для приема нескольких элементов и может объединять их (в том порядке, в котором вы их перечислили).
Вполне допустимо использовать это на input
, также обратите внимание, что aria-labelledby
переопределит все связанные <label>
элементов, использующих for="id"
Одна вещь, которую вы могли бы сделать, это использовать менее часто используемый aria-describedby
, чтобы связать вторую метку и убедиться, что порядок чтения правильный.
В приведенном ниже примере будет указано «См. Главное меню, см. Подменю», поскольку сначала будет прочитано <label for="toggle-drawer">
, а затем добавлено aria-describedby="toggle-drawer-label"
для добавления дополнительной информации.
Единственным недостатком является то, что он может считывать входную информацию между <label>
и меткой describedby
.
<ul class=main-menu>
<li>
<input id="toggle-drawer" aria-describedby="toggle-drawer-label" type=checkbox title="hidden checkbox">
<label id="toggle-drawer-label">See Sub Menu</label>
<ul class=sub-menu>
<li>
<label for="toggle-drawer">See Main Menu</label>
</li>
<li>Sub-menu item 1</li>
<li>Sub-menu item 2</li>
<li>Sub-menu item 3</li>
</ul>
</li>
<li>Main Menu item 1</li>
<li>Main Menu item 2</li>
<li>Main Menu item 3</li>
</ul>
Рекомендуемый способ
Я бы порекомендовал просто использовать aria-labelledby="label1 label2"
так как это приемлемый метод, который приведет к наиболее согласованным результатам, очевидно, это означает, что вам нужно добавить атрибуты id
к обоим меткам, чтобы получить компромисс.
Обратите внимание , что использование aria-labelledby="label1 label2"
и связывание полей с for="toggle-drawer"
на обеих метках дает дополнительное преимущество правильного связывания меток, так что вы можете нажать на любую метку, и она будет фокусироваться <input>
.