Как заставить JAWS читать тексты в графе SVG в значимом порядке

Я пытался добавить доступность к своей диаграмме на основе SVG. Я добавил атрибуты id и aria-labelledby для сопоставления меток и значений:

<svg width="400" height="200" tabindex="0">
    <g class="subjects">
        <text id="subject1">Maths</text>
        <text id="subject2">Physics</text>
        <text id="subject3">English</text>
        <text id="subject4">Chemistry</text>
    </g>
    <g class="marks">
        <text aria-labelledby="subject1">90%</text>
        <text aria-labelledby="subject2">85%</text>
        <text aria-labelledby="subject3">80%</text>
        <text aria-labelledby="subject4">95%</text>
    </g>
</svg>

Но программа чтения с экрана (JAWS) последовательно читает:

Математика Физика Английский Химия 90% 85% 80% 95%

Я хочу, чтобы программа чтения с экрана читала:

Математика 90% Физика 85% Английский язык 80% Химия 95%


person gerin    schedule 24.02.2015    source источник


Ответы (2)


Итак, во-первых, позвольте мне сказать, что доступность SVG является новой областью специальных возможностей, и поэтому эти методы могут работать только в подмножестве браузеров), что, как уже было сказано, вы можете улучшить доступность сейчас в поддерживающих браузерах, сделав это (осторожно - проверено только в OS X с Safari):

<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" x="0" y="0" width="400px" height="200px" viewBox="0 0 400 200" tabindex="0">
    <g class="subjects">
        <text y="25" aria-label="Maths 90%">Maths</text>
        <text y="75" aria-label="Physics 85%">Physics</text>
        <text y="125" aria-label="English 80%">English</text>
        <text y="175" aria-label="Chemistry 95%">Chemistry</text>
    </g>
    <g class="marks" aria-hidden="true">
        <text x="100" y="25">90%</text>
        <text x="100" y="75">85%</text>
        <text x="100" y="125">80%</text>
        <text x="100" y="175">95%</text>
    </g>
</svg>

Следующее будет работать в большем количестве браузеров, например. IE в Windows и Safari в OS X

<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" x="0" y="0" width="400px" height="200px" viewBox="0 0 400 200" tabindex="0" aria-labelledby="svgDesc">
    <title id="svgDesc">
        Maths 90%, Physics 85%, English 80%, Chemistry 95%
    </title>
    <g class="subjects" aria-hidden="true">
        <text y="25">Maths</text>
        <text y="75">Physics</text>
        <text y="125">English</text>
        <text y="175">Chemistry</text>
    </g>
    <g class="marks" aria-hidden="true">
        <text x="100" y="25">90%</text>
        <text x="100" y="75">85%</text>
        <text x="100" y="125">80%</text>
        <text x="100" y="175">95%</text>
    </g>
</svg>

Чтобы заставить что-то работать везде на момент написания этого ответа, вы должны полагаться на то, чтобы рассматривать SVG как изображение и предоставлять альтернативу в виде текстового описания, как показано выше во втором примере, или скрыть все это с помощью aria-hidden="true" и предоставление "закадровой" альтернативы, такой как таблица или альтернативное представление HTML. Приведенный ниже пример будет работать везде и обеспечит реальную семантическую разметку, равную визуальному отображению.

<!doctype html>
<html>
<head>
    <style>
    .screen-reader-text {
        position: absolute !important;
        height: 1px; width: 1px; 
        overflow: hidden;
        clip: rect(1px 1px 1px 1px); /* IE6, IE7 */
        clip: rect(1px, 1px, 1px, 1px);
        clip-path: polygon(0px 0px, 0px 0px,0px 0px, 0px 0px);
    }
    </style>
</head>
<body>
    <table class="screen-reader-text">
        <tr>
            <th scope="col">Subject</th>
            <th scope="col">Percentage</th>
        </tr>
        <tr>
            <th scope="row">Maths</th>
            <td scope="col">90%</td>
        </tr>
        <tr>
            <th scope="row">Physics</th>
            <td scope="col">85%</td>
        </tr>
        <tr>
            <th scope="row">English</th>
            <td scope="col">80%</td>
        </tr>
        <tr>
            <th scope="row">Chemistry</th>
            <td scope="col">95%</td>
        </tr>
    </table>
    <svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" x="0" y="0" width="400px" height="200px" viewBox="0 0 400 200" aria-hidden="true">
        <g class="subjects">
            <text y="25">Maths</text>
            <text y="75">Physics</text>
            <text y="125">English</text>
            <text y="175">Chemistry</text>
        </g>
        <g class="marks">
            <text x="100" y="25">90%</text>
            <text x="100" y="75">85%</text>
            <text x="100" y="125">80%</text>
            <text x="100" y="175">95%</text>
        </g>
    </svg>
</body>
</html>
person unobf    schedule 24.02.2015
comment
Да, это прекрасно отвечает на вопрос. Я бы добавил, что для идеальных требований доступности он мог бы также добавить заголовок в SVG и мог бы использовать тег описания для описания содержимого. - person Adam; 25.02.2015
comment
Я пробовал aria-label, но мне это не помогло. Я пробовал Windows Chrome + JAWS. aria-label работает в других местах, но не внутри <text>. Возможно, моя комбинация браузер+ОС не распознает aria-label внутри <text>. Однако aria-hidden работает просто отлично. - person gerin; 25.02.2015

Возможно, используйте тот факт, что «labeledby» будет принимать несколько идентификаторов. добавлены роли и титровальный элемент. Это, кажется, читается как хотелось бы:

<svg width="400" height="200" tabindex="0" role="img"
    aria-labelledby="chart-title subject1 val1 subject2 val2 subject3 val3 subject4 val4">
    <title id="chart-title">Student's grades for quarter:</title>
    <g class="subjects" role="presentation">
        <text id="subject1">Maths</text>
        <text id="subject2">Physics</text>
        <text id="subject3">English</text>
        <text id="subject4">Chemistry</text>
    </g>
    <g id="marks" role="presentation">
        <text id="val1">90%</text>
        <text id="val2">85%</text>
        <text id="val3">80%</text>
        <text id="val4">95%</text>
    </g>  
</svg>
person Todd    schedule 06.07.2016