- From: 马金花儿 via GitHub <sysbot+gh@w3.org>
- Date: Fri, 05 Mar 2021 08:21:15 +0000
- To: public-css-archive@w3.org
Dafrok has just created a new issue for https://github.com/w3c/csswg-drafts:
== [css-a11y] Need a semantic option that can describe "focusable" or "accessible" ==
Recently I've been working on an accessibility feature and I found that CSS lacks an attribute to describe the focusable of elements, in other words, the semantics is incomplete.
For the non-visually impaired people, hiding multi-level submenus in navigation maybe help improve the user experience. For example:
```html
<style>
.main-menu>li {
position: relative;
display: inline-block;
}
.sub-menu {
position: absolute;
top: 100%;
display: none;
}
.main-menu > li:hover .sub-menu {
display: block;
}
</style>
<nav>
<ul class="main-menu">
<li>
<span>MENU A</span>
<ul class="sub-menu">
<li><a>Menu A-1</a></li>
<li><a>Menu A-2</a></li>
</ul>
</li>
<li><a>MENU B</a></li>
</ul>
</nav>
```
In the case above, the only way to reach the submenus is hover on the item `MENU A`. We can't focus the submenus by press the tab key. Obviousily it's unfriendly with visual impaired people.
I tried several ways, finnaly I found that I could only solve this problem by hacking CSS. If we want an element to be both focusable and invisible, we should setting its `opacity` to zero instead of setting `visibility` to `hidden`. If we want an element to be focusable without flow and hot areas, we should setting its `transform` to `scale(0)` and `position` to `fixed` instead of setting `display` to `none`.
I also refered to the implementation of Bootstrap, one of the most famous UI framework in the world. It uses the class "sr-only" to hide an element while keeping it accessible. To my regret, it's a hacking too.
```css
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
overflow: hidden;
clip: rect(0,0,0,0);
white-space: nowrap;
-webkit-clip-path: inset(50%);
clip-path: inset(50%);
border: 0;
}
```
This kind of practices destroys the original semantics. I can't correctly express that an element is **currently invisible or non-existent** but **accessible**. So I have a proposal: Add an attribute or option to CSS standard to describe at least scenes below to keep semantic integrity.
1. An element is invisible but focusable. (`visibility: hidden` & focusable)
2. An element is non-exists but focusable. (`display: none` & focusable)
When a focusable but visually unreachable element is about to be focused, the `:focus` and `:focus-within' pseudo class should be triggered, but still remain its invisible visually.
Please view or discuss this issue at https://github.com/w3c/csswg-drafts/issues/6082 using your GitHub account
--
Sent via github-notify-ml as configured in https://github.com/w3c/github-notify-ml-config
Received on Friday, 5 March 2021 08:21:17 UTC