【问题标题】:Add accessibility to React-leaflet map添加对 React 传单地图的可访问性
【发布时间】:2021-10-25 07:34:12
【问题描述】:

大家早上好, 我创建了一个带有 React-leaflet 的 SPA,除了可访问性之外,它都可以正常工作。

我的地图自动添加了多个标记,但是当我尝试使用 Tab 进入地图时,我得到的只是放大/缩小按钮和地图名称,标记被完全忽略,因此我无法将 ARIA 添加到它们。

有谁知道是否可以为每个标记添加制表符? 理想情况下,我希望拥有它,这样当用户点击标记时,它会读取特定数据,但是如果这不可能,我愿意接受建议。

如果有帮助,我将如何生成/填充地图:

标记:--

const showDataOnMap = (countryList, y) => (
        countryList.map(country => (
            <Circle
                key = {country.country}
                center={[country.countryInfo.lat, country.countryInfo.long]}
                fillOpacity={0.4}
                pathOptions={{color:casesTypeColors[y].hex,
                fillColor:casesTypeColors[y].hex}}
                radius={
                    Math.sqrt(country[y] * 12000)
                }
                eventHandlers={{
                    click: () => {
                      console.log(mapRef.current)
                    },
                  }}
                tabIndex="0"
                aria-label="circle"
            >
                <Popup tabIndex="0" aria-live="polite" ref={mapRef}>
                    <div>
                        <img className="mapFlag" src={country.countryInfo.flag} alt={country.country} role="image"/>
                        {country.country}
                    </div>
                    <p>
                        {`${y}: ${numeral(country[y]).format("0,0")}`}
                    </p>
                </Popup>

            </Circle>
        )
    )
    )

地图:--

return (
    <div className="map" aria-label={`World-map-${active}`} tabIndex="0" role="application">
        <MapContainer center={coords} zoom={2}>
            <TileLayer
            attribution='&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
            url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
            aria-label="Copyright-information"
            aria-hidden="true"
            />
            {showDataOnMap(table,checkActive())}
        </MapContainer>
    </div>
)

【问题讨论】:

    标签: reactjs leaflet accessibility wai-aria react-leaflet


    【解决方案1】:

    对问题进行了排序。 将 ARIA 添加到 React 传单组件是问题所在,它只是一直忽略它们,所以我在 Popup 中添加了一个包装器并解决了问题。

                     <Popup>
                        <div className="popWrapper" tabIndex="0" ref={mapRef}>
                        <div>
                            <img className="mapFlag" src={country.countryInfo.flag} alt={country.country} role="image" aria-hidden="true"/>
                            {country.country}
                        </div>
                        <p>
                            {`${y}: ${numeral(country[y]).format("0,0")}`}
                        </p>
                        </div>
                    </Popup>
    

    所以现在当点击 Circles 时,我强制将焦点放在 popWrapper div 上并读取内容。

    【讨论】:

      【解决方案2】:

      我看到您在&lt;Circle&gt; 元素上使用了tabindex,所以我假设您已经知道tabindex 的工作原理。将 tabindex 添加到您的标记将允许它们被 TABBED 到。

      但是,您可以 TAB 的元素应该是交互式元素。单击或悬停时,您的标记有什么作用吗?如果标记是键盘可聚焦元素,则标记将需要一个“角色”(WCAG 4.1.2)。如果您希望标记器做的只是宣布数据值,那么role="tooltip" 可能就足够了。可能role="note" 也可以,但这有点牵强,因为数据值可能不被视为“辅助”。

      我还注意到您在&lt;TileLayer&gt; 上使用了aria-hidden="true"。您的标记是否作为子节点添加到&lt;TileLayer&gt;?在父容器上设置的aria-hidden 将向下传播到子容器,并且它们也将从辅助技术中隐藏。在子元素上设置aria-hidden="false" 可能不会解决问题,因为不完全支持“false”值。请参阅aria-hidden 规范中的第二个“注意”:

      注意
      在撰写本文时,已知aria-hidden="false" 在浏览器中的工作方式不一致。随着未来实施的改进,请谨慎使用并在依赖此方法之前进行彻底测试。

      【讨论】:

      • 第一件事,辉煌的名字,@slugolicious。感谢您的评论,我已删除 aria-hidden="true" 并添加了工具提示的角色,但不幸的是问题仍然存在,目前当您单击圆圈时,会出现一个带有特定信息的弹出窗口,因此从技术上讲它们是交互式的。问题可能是圈子是动态添加的吗?
      • 哈,我都没注意到你的身份证。我想那里有很多蛞蝓。动态添加元素不是可访问性的问题,也不应该是键盘导航(tabindex)的问题。您是说您正在使用tabindex=0 添加元素,但对它们进行制表符不起作用?你有一个可行的例子吗?
      • 感谢您一直以来的支持,但我现在已经解决了这个问题。不知道为什么,但无论出于何种原因,我都无法选择 React-leaflet 组件。刚刚在 Popup 组件中添加了一个内容包装器 div 已经解决了这个问题。
      猜你喜欢
      • 1970-01-01
      • 2018-09-13
      • 2019-07-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-28
      • 2022-11-13
      • 2018-08-10
      • 1970-01-01
      相关资源
      最近更新 更多