Какую семантику HTML следует использовать, чтобы сделать вывод пользовательского калькулятора доступным?

Я разрабатываю простой калькулятор. Прямо сейчас я использую элемент <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.

Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
0
0
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

<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>

Спасибо за ответ. Есть ли простой способ воспроизвести стиль поля входного элемента для моего выходного элемента? использование display: inline-block по-прежнему приводит к полю без высоты для меня.

gallium314 26.06.2024 22:53

@gallium314: Нет, но вы можете поставить min-height: 1.5em (соответствует вашему line-height) и так далее. (В любом случае, вероятно, будет хорошей идеей сделать его визуально отличным от ввода.)

Ry- 26.06.2024 23:04

Только что провел быстрый тест с JAWS, похоже, JAWS игнорирует элемент <output>. Хотя придется провести более тщательное тестирование.

André Polykanine 27.06.2024 00:26

@AndréPolykanine: Кажется, известно: Freedomscientific.github.io/standards-support/html.html Помогает ли aria-live?

Ry- 27.06.2024 01:27

Да, я думаю, aria-live следует добавить, по крайней мере, до тех пор, пока JAWS не будет поддерживать <output> должным образом. Также необходимо протестировать на мобильном телефоне.

André Polykanine 27.06.2024 15:08

Спасибо Андре и Рай за дополнительные исследования и предложения. Создает ли мой метод обновления ответа, когда все поля заполнены, какие-либо проблемы с доступностью? Меня беспокоит, что required и checkValidity() здесь используются не по прямому назначению, и мне интересно, есть ли более подходящий метод.

gallium314 27.06.2024 23:50

Другие вопросы по теме