Я разрабатываю простой калькулятор. Прямо сейчас я использую элемент <input>
с атрибутом readonly
для стилизации результата вычисления. Однако, хотя я считаю, что это обеспечивает желаемую эстетику, меня беспокоит, что это плохой выбор с точки зрения доступности, учитывая, что это не вход, а выход. Является ли здесь более подходящим другой элемент HTML?
Вот небольшое воспроизведение того, что я пытаюсь сделать:
<h1>Triangle Area Calculator</h1>
<form>
<ul>
<li>
<label for = "base">Triangle base:</label>
<input type = "number" step = "any" id = "base" name = "base" required onchange = "checkComplete()">
</li>
<li>
<label for = "height">Triangle height:</label>
<input type = "number" step = "any" id = "height" name = "height" required onchange = "checkComplete()">
</li>
<li>
<label for = "area">Triangle area:</label>
<input type = "number" step = "any" class = "result" id = "area" name = "result" readonly>
</li>
</ul>
</form>
form ul {
list-style: none;
}
input.result{
background-color: whitesmoke;
}
function checkComplete() {
base_input = document.getElementById("base")
height_input = document.getElementById("height")
area_result = document.getElementById("area")
if (base_input.checkValidity() && height_input.checkValidity()){
area_result.value = base_input.value * height_input.value/2
}
else{
area_result.value = ""
}
}
Вот вышеизложенное в проекте JSFiddle.
<output>: элемент вывода, который
элемент-контейнер, в который сайт или приложение может вводить результаты вычислений или действия пользователя.
Вы можете стилизовать выходной элемент с помощью встроенного поля, чтобы он визуально соответствовал элементу input
.
Для доступности программ чтения с экрана, которые еще не распознают семантику <output>
, используйте атрибут aria-live, чтобы указать, что это поле будет обновляться динамически.
"use strict";
function checkComplete() {
let base_input = document.getElementById("base");
let height_input = document.getElementById("height");
let area_result = document.getElementById("area");
if (base_input.checkValidity() && height_input.checkValidity()) {
area_result.value = base_input.value * height_input.value / 2;
} else {
area_result.value = "";
}
}
form ul {
list-style: none;
}
.result {
box-sizing: border-box;
display: inline-block;
vertical-align: bottom;
width: 100px;
height: 1.5rem;
padding-left: 2px;
border-radius: 4px;
border: 1px solid black;
background-color: whitesmoke;
}
<h1>Triangle Area Calculator</h1>
<form>
<ul>
<li>
<label for = "base">Triangle base:</label>
<input type = "number" step = "any" id = "base" name = "base" required onchange = "checkComplete()">
</li>
<li>
<label for = "height">Triangle height:</label>
<input type = "number" step = "any" id = "height" name = "height" required onchange = "checkComplete()">
</li>
<li>
<label for = "area">Triangle area:</label>
<output for = "base height" aria-live = "polite" class = "result" id = "area" name = "result"></output>
</li>
</ul>
</form>
@gallium314: Нет, но вы можете поставить min-height: 1.5em
(соответствует вашему line-height
) и так далее. (В любом случае, вероятно, будет хорошей идеей сделать его визуально отличным от ввода.)
Только что провел быстрый тест с JAWS, похоже, JAWS игнорирует элемент <output>. Хотя придется провести более тщательное тестирование.
@AndréPolykanine: Кажется, известно: Freedomscientific.github.io/standards-support/html.html Помогает ли aria-live
?
Да, я думаю, aria-live
следует добавить, по крайней мере, до тех пор, пока JAWS не будет поддерживать <output>
должным образом. Также необходимо протестировать на мобильном телефоне.
Спасибо Андре и Рай за дополнительные исследования и предложения. Создает ли мой метод обновления ответа, когда все поля заполнены, какие-либо проблемы с доступностью? Меня беспокоит, что required
и checkValidity()
здесь используются не по прямому назначению, и мне интересно, есть ли более подходящий метод.
Спасибо за ответ. Есть ли простой способ воспроизвести стиль поля входного элемента для моего выходного элемента? использование
display: inline-block
по-прежнему приводит к полю без высоты для меня.