Отказ от ответственности: я понимаю, что это недействительно HTML. Я пытаюсь понять, почему это запрещено?
W3 C предполагает, что интерактивный элемент, такой как button
или a
, не должен содержать другой интерактивный элемент.
Я мог найти множество ресурсов, упоминающих это правило и некоторые обходные пути, а также некоторые ресурсы, связанные с тем, как это влияет на доступность и программы чтения с экрана, но почти все эти ресурсы говорят о том, что это требование, но не объясните почему.
https://adrianroselli.com/2016/12/be-wary-of-nesting-roles.html
https://codepen.io/vloux/pen/wXGyOv
Вложение внутри
https://github.com/dequelabs/axe-core/issues/601
Я не смог найти объяснения, почему это запрещено? приводит ли это к каким-либо проблемам с удобством использования?
Это связанный вопрос: Почему интерактивный элемент не должен использоваться в якоре?
Принятый ответ является удовлетворительным, но он недостаточно, чтобы сделать это правило обязательным. Описанной ситуации можно избежать, если правильно обработать событие.
Кроме того, если вложенный интерактивный контент недействителен, как мы должны иметь что-то вроде этого:
Карточка, на которую можно щелкнуть в целом, а также внутри нее есть интерактивный вторичный призыв к действию. Я знаю, что обходным путем было бы иметь в карточке первичный и вторичный призыв к действию, но разве не должно быть разрешено и вышеупомянутое?
Вот скрипка: https://jsfiddle.net/t9qbwas5/2/
<button type="button" class="card">
The card itself is the primary CTA.
<br/>
<br/>
some important content to read through.
some important content to read through.
some important content to read through.
<div class="cta">
Secondary CTA
</div>
</button>
.cta {
padding: 4px;
background: #00a9a9;
color: white;
width: 80px;
margin: auto;
margin-top: 8px;
margin-bottom: 8px;
}
.card {
width: 200px;
display: flex;
flex-direction: column;
justify-content: center;
text-align: center;
}
В приведенном выше примере я добиваюсь этого, используя интерактивный div внутри кнопки, но это не semanti c (?), а также функционально, это интерактивный элемент внутри другого. Я пытаюсь понять, что даже если я использую этот обходной путь, принципиально неправильно иметь вложенные интерактивные элементы? это плохая практика дизайна / юзабилити?