如何让树视图中的父树项成为 link
How to have a parent treeitem in a treeview be a link
treeview example of the WAI-ARIA Authoring Practices 展示了如何拥有一棵树,其中一些项目是可扩展的父节点,一些项目是 hyperlinks:
<ul role="tree" aria-label="Foods">
<li role="treeitem" aria-expanded="true">
<span> Fruits </span>
<ul role="group">
<li role="none"> <a role="treeitem" href="/orange"> Oranges </a> </li>
<li role="none"> <a role="treeitem" href="/pineapple"> Pineapple </a> </li>
</ul>
</li>
</ul>
但是,如果我也想有一个“Fruits”页面,并且有一个既是父节点又是 hyperlink 的树项怎么办?
(对于键盘导航,将使用 Right Arrow
/Left Arrow
opening/closing 父节点的模式,以及 hyperlink 之后的 Enter
的模式。这类似于交互的 combobox with a tree popup。
对于鼠标交互,将保留当前模式:有一个可点击的图标 (aria-hidden
) 指示展开状态,opens/closes 节点,以及 link 本身的文本,它跟在link.)
例如:
<ul role="tree" aria-label="Foods">
<li role="none">
<a role="treeitem" aria-expanded="true" href="/fruits">
<span> Fruits </span>
<ul role="group">
<li role="none"> <a role="treeitem" href="/orange"> Oranges </a> </li>
<li role="none"> <a role="treeitem" href="/pineapple"> Pineapple </a> </li>
</ul>
</a>
</li>
</ul>
这虽然在技术上是正确的,但违反了 HTML 规范,该规范不允许 <a>
标签嵌套在其他 <a>
标签中。
经过大量搜索,我找到了 ,这是一个不同的主题,只是提示了我的解决方案。
要使 <a>
元素成为 treeitem
,同时“包含”嵌套在组中的其他 <a>
元素,可以使用 aria-owns
属性。
这样,要求
Each parent node contains or owns an element with role group.
满意,同时遵循 HTML 规格。
<ul role="tree" aria-label="Foods">
<li role="none">
<a role="treeitem" aria-expanded="true" aria-owns="fruit-group" href="/fruits">
<span> Fruits </span>
</a>
<ul role="group" id="fruit-group">
<li role="none"> <a role="treeitem" href="/orange"> Oranges </a> </li>
<li role="none"> <a role="treeitem" href="/pineapple"> Pineapple </a> </li>
</ul>
</li>
</ul>
这不完全是您要找的东西,但我想我会把它分享给任何正在寻找类似的东西,至少从最终用户的角度来看完成同样的事情的人。
以下代码已从 w3school 的树视图示例中修改为具有可点击的箭头和父 link 项目。
原代码:https://www.w3schools.com/howto/howto_js_treeview.asp
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
ul, #myUL {
list-style-type: none;
}
#myUL {
margin: 0;
padding: 0;
}
.caret {
cursor: pointer;
-webkit-user-select: none; /* Safari 3.1+ */
-moz-user-select: none; /* Firefox 2+ */
-ms-user-select: none; /* IE 10+ */
user-select: none;
}
.caret::before {
content: "B6";
color: black;
display: inline-block;
margin-right: 6px;
}
.caret-down::before {
-ms-transform: rotate(90deg); /* IE 9 */
-webkit-transform: rotate(90deg); /* Safari */'
transform: rotate(90deg);
}
.nested {
display: none;
}
.active {
display: block;
}
</style>
</head>
<body>
<h2>Tree View</h2>
<p>A tree view represents a hierarchical view of information, where each item can have a number of subitems.</p>
<p>Click on the arrow(s) to open or close the tree branches.</p>
<ul id="myUL">
<li><span class="caret"><a href="https://en.wikipedia.org/wiki/Drink">Beverages</a></span>
<ul class="nested">
<li><a href="https://en.wikipedia.org/wiki/Water">Water</a></li>
<li><span class="caret">Juice</span>
<ul class="nested">
<li>Orange Juice</li>
<li>Apple Juice</li>
</ul>
</li> <!-- End of caret Tea -->
<li><span class="caret">Tea</span>
<ul class="nested">
<li>Black Tea</li>
<li>White Tea</li>
<li><span class="caret"></span><a href="https://en.wikipedia.org/wiki/Green_tea">Green Tea</a>
<ul class="nested">
<li>Sencha</li>
<li>Gyokuro</li>
<li>Matcha</li>
<li>Pi Lo Chun</li>
</ul>
</li>
</ul>
</li> <!-- End of caret Tea -->
</ul> <!-- End of nested -->
</li> <!-- End of caret Beverage -->
</ul> <!-- End of myUL -->
<script>
var toggler = document.getElementsByClassName("caret");
var i;
for (i = 0; i < toggler.length; i++) {
toggler[i].addEventListener("click", function() {
this.parentElement.querySelector(".nested").classList.toggle("active");
this.classList.toggle("caret-down");
});
}
</script>
</body>
</html>
treeview example of the WAI-ARIA Authoring Practices 展示了如何拥有一棵树,其中一些项目是可扩展的父节点,一些项目是 hyperlinks:
<ul role="tree" aria-label="Foods">
<li role="treeitem" aria-expanded="true">
<span> Fruits </span>
<ul role="group">
<li role="none"> <a role="treeitem" href="/orange"> Oranges </a> </li>
<li role="none"> <a role="treeitem" href="/pineapple"> Pineapple </a> </li>
</ul>
</li>
</ul>
但是,如果我也想有一个“Fruits”页面,并且有一个既是父节点又是 hyperlink 的树项怎么办?
(对于键盘导航,将使用 Right Arrow
/Left Arrow
opening/closing 父节点的模式,以及 hyperlink 之后的 Enter
的模式。这类似于交互的 combobox with a tree popup。
对于鼠标交互,将保留当前模式:有一个可点击的图标 (aria-hidden
) 指示展开状态,opens/closes 节点,以及 link 本身的文本,它跟在link.)
例如:
<ul role="tree" aria-label="Foods">
<li role="none">
<a role="treeitem" aria-expanded="true" href="/fruits">
<span> Fruits </span>
<ul role="group">
<li role="none"> <a role="treeitem" href="/orange"> Oranges </a> </li>
<li role="none"> <a role="treeitem" href="/pineapple"> Pineapple </a> </li>
</ul>
</a>
</li>
</ul>
这虽然在技术上是正确的,但违反了 HTML 规范,该规范不允许 <a>
标签嵌套在其他 <a>
标签中。
经过大量搜索,我找到了
要使 <a>
元素成为 treeitem
,同时“包含”嵌套在组中的其他 <a>
元素,可以使用 aria-owns
属性。
这样,要求
Each parent node contains or owns an element with role group.
满意,同时遵循 HTML 规格。
<ul role="tree" aria-label="Foods">
<li role="none">
<a role="treeitem" aria-expanded="true" aria-owns="fruit-group" href="/fruits">
<span> Fruits </span>
</a>
<ul role="group" id="fruit-group">
<li role="none"> <a role="treeitem" href="/orange"> Oranges </a> </li>
<li role="none"> <a role="treeitem" href="/pineapple"> Pineapple </a> </li>
</ul>
</li>
</ul>
这不完全是您要找的东西,但我想我会把它分享给任何正在寻找类似的东西,至少从最终用户的角度来看完成同样的事情的人。
以下代码已从 w3school 的树视图示例中修改为具有可点击的箭头和父 link 项目。
原代码:https://www.w3schools.com/howto/howto_js_treeview.asp
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
ul, #myUL {
list-style-type: none;
}
#myUL {
margin: 0;
padding: 0;
}
.caret {
cursor: pointer;
-webkit-user-select: none; /* Safari 3.1+ */
-moz-user-select: none; /* Firefox 2+ */
-ms-user-select: none; /* IE 10+ */
user-select: none;
}
.caret::before {
content: "B6";
color: black;
display: inline-block;
margin-right: 6px;
}
.caret-down::before {
-ms-transform: rotate(90deg); /* IE 9 */
-webkit-transform: rotate(90deg); /* Safari */'
transform: rotate(90deg);
}
.nested {
display: none;
}
.active {
display: block;
}
</style>
</head>
<body>
<h2>Tree View</h2>
<p>A tree view represents a hierarchical view of information, where each item can have a number of subitems.</p>
<p>Click on the arrow(s) to open or close the tree branches.</p>
<ul id="myUL">
<li><span class="caret"><a href="https://en.wikipedia.org/wiki/Drink">Beverages</a></span>
<ul class="nested">
<li><a href="https://en.wikipedia.org/wiki/Water">Water</a></li>
<li><span class="caret">Juice</span>
<ul class="nested">
<li>Orange Juice</li>
<li>Apple Juice</li>
</ul>
</li> <!-- End of caret Tea -->
<li><span class="caret">Tea</span>
<ul class="nested">
<li>Black Tea</li>
<li>White Tea</li>
<li><span class="caret"></span><a href="https://en.wikipedia.org/wiki/Green_tea">Green Tea</a>
<ul class="nested">
<li>Sencha</li>
<li>Gyokuro</li>
<li>Matcha</li>
<li>Pi Lo Chun</li>
</ul>
</li>
</ul>
</li> <!-- End of caret Tea -->
</ul> <!-- End of nested -->
</li> <!-- End of caret Beverage -->
</ul> <!-- End of myUL -->
<script>
var toggler = document.getElementsByClassName("caret");
var i;
for (i = 0; i < toggler.length; i++) {
toggler[i].addEventListener("click", function() {
this.parentElement.querySelector(".nested").classList.toggle("active");
this.classList.toggle("caret-down");
});
}
</script>
</body>
</html>