- From: Bryan Garaventa <bryan.garaventa@ssbbartgroup.com>
- Date: Sat, 21 Mar 2015 00:23:34 +0000
- To: James Craig <jcraig@apple.com>, Birkir Gunnarsson <birkir.gunnarsson@deque.com>
- CC: Joseph Scheuhammer <clown@alum.mit.edu>, Joanmarie Diggs <jdiggs@igalia.com>, Alexander Surkov <surkov.alexander@gmail.com>, "Dominic Mazzoni" <dmazzoni@google.com>, W3C WAI Protocols & Formats <public-pfwg@w3.org>
>> The problem in this particular case is exacerbated by the
>> recommendation that CSS selectors be used on the attribute to control
>> visual display as it would encourage using aria-hidden="false" rather
>> than removing the attribute when content is no longer hidden.
> Is this a hypothetical problem, or do you have a real-world example of someone do this?
This is actually something that people have been recommending and implementing for quite a while now.
E.G
ARIA Tab Panel Example
http://accessibility.athena-ict.com/aria/examples/tabpanel2.shtml
" 5. CSS selectors are used to bind aria-hidden and CSS display:none."
form with aria
http://accessibility.athena-ict.com/aria/examples/form.shtml
" 5. CSS selectors are used to bind aria-hidden and CSS display:none."
AngularJS: Developer Guide: Accessibility
https://docs.angularjs.org/guide/accessibility
"In its default setup, ngAria for ngShow is actually redundant. It toggles aria-hidden on the directive when it is hidden or shown. However, the default CSS of display: none !important, already hides child elements from a screen reader. It becomes more useful when the default CSS is overridden with properties that don't affect assistive technologies, such as opacityor transform. By toggling aria-hidden dynamically with ngAria, we can ensure content visually hidden with this technique will not be read aloud in a screen reader."
Association of Assistive Technology Act Programs Home Page
http://www.ataporg.org/webtips.html
"Sometimes content (such as form error messages) can be hidden or revealed based on the user interaction. With ARIA and CSS, a developer can focus on changing semantic ARIA values while allowing CSS to toggle the visual presentation. CSS of [aria-hidden:true] {display:none} will hide content when aria-hidden has a value of true. By toggling an element's aria-hidden value between true and false, the content will automatically display or hide visually as well."
Web applications and ARIA FAQ - Accessibility | MDN
https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Web_applications_and_ARIA_FAQ
"Though on its own ARIA will not change any styles, as with any HTML attributes, CSS can take advantage of ARIA attributes as element selectors. This may provide a convenient mechanism to style ARIA-enabled widgets."
The above appeared in the top ten list for me on Google when I searched for binding aria-hidden with css display:none...
The reason why so many people do this, is because it has suggested for years that this should be done in the spec at
http://www.w3.org/TR/wai-aria/states_and_properties#aria-hidden
" It is recommended that authors key visibility of elements off this attribute, rather than change visibility and separately have to remember to update this"
-----Original Message-----
From: James Craig [mailto:jcraig@apple.com]
Sent: Friday, March 20, 2015 4:22 PM
To: Birkir Gunnarsson
Cc: Joseph Scheuhammer; Joanmarie Diggs; Alexander Surkov; Dominic Mazzoni; W3C WAI Protocols & Formats
Subject: Re: aria-hidden (updates need to implementation guide or spec)
> On Mar 20, 2015, at 6:29 AM, Birkir Gunnarsson <birkir.gunnarsson@deque.com> wrote:
>
> +1 to the idea.
> On a related note, I would like to propose a slight alteration to the
> definition table at the bottom of the aria-hidden entry.
>
> Currently:
> definition for aria-hidden="false" is the following:
> "The element is exposed to the accessibility API as if it was rendered. "
>
> Propose to update this to:
> The element *and all its descendants* is exposed to the accessibility
> API as if it was rendered, .
No. That breaks everything. It's the exact nightmare implementation scenario that Alex and I are trying to avoid.
If an really author wants that, they should explicitly add it to every node in the tree.
> (I know the meaning is essentially the same, I would just like to
> emphasize this point(.
> I have noticed confusion in situations where aria-hidden="false"
> overrides visible rendering of content.
> <div aria-hidden="false" role="tabpanel" class="active"> <input
> type="hidden" value="3"> <label for="inp1">Please enter the number of
> meals you would like to purchase</label> <input id="inp1"
> type="number"> </div> is not the same as:
> <div role="tabpanel" class="active">
> <input type="hidden" value="3">
> <label for="inp1">Please enter the number of meals you would like to
> purchase</label> <input id="inp1" type="number"> </div> The former
> exposes two inputs to assistive technologies, whereas the latter only
> exposes one.
I think you're probably seeing this in WebKit or Blink (Am I right? It's fixed in WebKit now, by the way.) and that is not the intended behavior. It is one of the problems we're trying to solve. aria-hidden=false should not "unhide" anything except the current node and its text node children. The "do what I mean" behavior you are expecting is nearly impossible to implement.
The issue was that the spec was previously ambiguous about inheritance of aria-hidden, so edge cases like this arose.
> The problem in this particular case is exacerbated by the
> recommendation that CSS selectors be used on the attribute to control
> visual display as it would encourage using aria-hidden="false" rather
> than removing the attribute when content is no longer hidden.
Is this a hypothetical problem, or do you have a real-world example of someone do this?
> Maybe the solution to this is to update the html to accessibility api
> mapping so that <input type="hidden"> is automatically mapped to
> aria-hidden="true" in the browser accessibility API (after all input
> elements are not allowed to have children, so this should not cause
> confusion).
It already is[1], and should be. We're just trying to keep it that way.
James
[1] input[type=hidden] is not mapped to [aria-hidden=true] per se, but it is not rendered, which is more-or-less the same thing.
> Thanks
> -B
>
>
>
>
>
> On 3/19/15, James Craig <jcraig@apple.com> wrote:
>> We made some modifications to aria-hidden a few months ago to clarify
>> implementation.
>> Diff:
>> https://github.com/w3c/aria/commit/91346abccb1a6a0210c60e10ccb5ef5689
>> 16ae8b
>>
>> Summary: It was an spec artifact that the default value for
>> aria-hidden was false. In spirit there had alway been and assumption
>> a undefined value meant "undefined" not false, but the property was
>> boolean, which led to implementation confusion. We clarified this a
>> while ago by adding a new, default "undefined" value:
>>
>>> false: The element is exposed to the accessibility API as if it was
>>> rendered.
>>> true: The element is hidden from the accessibility API.
>>> undefined (default): The element's hidden state is determined by the
>>> user agent based on whether it is rendered.
>>
>> and some clarifying text:
>>
>>> User agents determine an element's hidden status based on whether it
>>> is rendered, and the rendering is usually controlled by CSS. For
>>> example, an element whose display property is set to none is not
>>> rendered. An element is considered hidden if it, or any of its
>>> ancestors are not rendered or have their aria-hidden attribute value set to true.
>>
>>
>> Current editor's draft:
>> http://rawgit.com/w3c/aria/master/aria/aria.html#aria-hidden
>>
>> I have been asked by some WebKit engineers to explain this a bit
>> more. From an implementation perspective, I think it can be
>> summarized as this loosely worded pseudo code. Indentation implies
>> blocks, but I tried to phrase it as a sentence so that it'd be
>> understandable by screen readers that are not verbalizing white space.
>>
>> 1. If element is rendered
>> and aria-hidden is not true on current element
>> and aria-hidden is not true on any ancestor:
>> -> element is not hidden. Expose to accessibility API.
>>
>> 2. If original element is not rendered
>> and aria-hidden is false on original element:
>> for each ancestor element:
>> if current ancestor element is rendered
>> or current ancestor element is explicitly set as
>> aria-hidden=false:
>> continue
>> else:
>> -> original element is hidden. Do not expose to
>> accessibility API
>> end loop
>> -> original element is not hidden. Expose to accessibility API.
>>
>> 3. If node type is text node
>> and parent element is not "hidden" (as defined above)
>> -> text node is not hidden. Expose to accessibility API.
>>
>> Thoughts? I'm trying to decide if this should go in the spec or in
>> the implementation guide.
>>
>> Thanks,
>> James Craig
>>
>>
>>
>>
Received on Saturday, 21 March 2015 00:24:07 UTC