Developing an Accessible Star Ratings Widget
August 24, 2010 at 9:00 am by Thierry Koblentz | In Accessibility, Development | 13 CommentsIn a hurry? Skip to the demo page.
Many ecommerce sites, social networking services, and online communities include rating or assessment features. Soliciting people’s opinion has even become a business model; there are now sites dedicated to rating products, services, businesses, and more.
The most common interface used to display votes is the “star rating system,” in which a particular number of points (often expressed as stars) is assigned to an item by each reviewer. We find this model on many sites, from Amazon to Yelp.
As Figure A shows, both visual interfaces are similar, but what makes these two solutions interesting is their markup base. One relies on <map>, the other on <img>.
You might think that most rating systems would be based on some markup proven to be semantic and "operational" across many User Agents — that is, that rating systems would be based on a specific set of HTML elements and attributes to which one applies behavior and style via JS and CSS. That would make sense, but it is far from the truth. When it comes to markup, authors try just about everything:
<a>,<img>,<span>,<li>,<map>,<div>,<input>,- and more…
The case of Microformats
Before presenting a few image-based techniques to mark up ratings, I think it is worth mentioning a basic and straightforward approach (from Microformats) that uses characters:
<abbr class="rating" title="3 stars">***</abbr>
- Pros
- It is straightforward and semantic.
- The markup is minimal.
- The method is not reliant on CSS.
- The method is not reliant on images.
- There is no HTTP request.
- Cons
- It is impossible to represent half values (i.e. 3.5 stars)
- It "works" only with asterisks ("star rating").
- Screen-readers, by default, do not expand abbreviations (which may not be a big deal in this case).
Note: I use "*" rather than ★ (★) because screen-readers (at least JAWS and NVDA) seem to ignore html entities.
Markup to display image-based ratings
When it comes to display images, authors have many options.
One image per rating
Using a single image:
<img src="4stars.png" alt="4 out of five">
- One star

- Two stars

- Three stars

- Four stars

- Five stars

- Pros
- Using one image per rating is straightforward and semantic.
- The method is not reliant on CSS.
- Minimal markup.
- Cons
- It creates many HTTP requests as there are many different images.
- On top of the performance issue, it can be a maintenance nightmare as authors have to deal with more assets (images to create, to push to a CDN, to modify when site colors change, etc.).
- Text selection is not possible in Opera (at least in version 9.52) as the alternate text is ignored
One image per unit
From the whatwg’s working draft:
<img alt="4 out of 5" src="one-star.png">
<img alt="" src="one-star.png">
<img alt="" src="one-star.png">
<img alt="" src="one-star.png">
<img alt="" src="no-star.png">
- One star
- Two stars
- Three stars
- Four stars
- Five stars
- Pros
- Using two
imgelements per rating diminishes the number of HTTP requests. - The method is not reliant on CSS.
- Cons
- In Opera, when images are disabled, alternate text is not selectable, and (in small-screen view) that text is rendered with a border which makes it less legible.
Note that this is taken from a controversial working draft. In my opinion, this method is not acceptable because the alternate text does not describe the image accurately and succinctly. Besides, if the basis of this approach is that these images represent content, then why leave some of them with no alt text?
On Ajaxian, for example, the author is using alternate text with every single image, which makes a lot of sense if he considers that each one is content:
<img [snip] alt="+" src="star1.png"/>
<img [snip] alt="+" src="star1.png"/>
<img [snip] alt="+" src="star1.png"/>
<img [snip] alt="-" src="star0.png"/>
<img [snip] alt="-" src="star0.png"/>
In any case, using as many images as there are stars versus using a single element (an img or something else) has the main advantage of facilitating voting mechanisms – where a user selects one of the stars to cast his vote. So we should keep this in mind…
A sprite for background images
The following technique is a adaptation of a strategy originally implemented by developers at Yahoo! Music:
Markup
<span class="rating r1 stars">1 of 5</span>
<span class="rating r2 stars">2 of 5</span>
<span class="rating r3 stars">3 of 5</span>
<span class="rating r4 stars">4 of 5</span>
<span class="rating r5 stars">5 of 5</span>
CSS
.stars {
background: transparent url(img/sprite.png) no-repeat;
}
.rating {
font-size: 0;
height: 19px;
overflow: hidden;
vertical-align: middle;
width: 96px;
display: block;
}
.r1 { background-position: -385px 0; }
.r2 { background-position: -288px 0; }
.r3 { background-position: -192px 0; }
.r4 { background-position: -96px 0; }
- One star
- 1 of 5
- Two stars
- 2 of 5
- Three stars
- 3 of 5
- Four stars
- 4 of 5
- Five stars
- 5 of 5
- Pros
- This method requires a single HTTP request as it relies on a single sprite image.
- Minimal "foot print".
- Cons
- Content is not revealed with images off.
- Nothing shows when the page is printed (a print stylesheet could take care of this issue).
- In Opera, the high contrast stylesheet makes all the stars disappear; the same is true in High Contrast Mode Optimization.
- Text selection is possible, but it’s not obvious (via highlighting).
A sprite in the markup
This approach is based on the TIP method, which uses a sprite image as an <img> element rather than a background image:
Markup
<span title="1 of 5" class="rating r1"><img width="0" height="1" src="sprite.gif" alt=""/>1 out of 5</span>
<span title="2 of 5" class="rating r2"><img width="0" height="1" src="sprite.gif" alt=""/>2 out of 5</span>
<span title="3 of 5" class="rating r3"><img width="0" height="1" src="sprite.gif" alt=""/>3 out of 5</span>
<span title="4 of 5" class="rating r4"><img width="0" height="1" src="sprite.gif" alt=""/>4 out of 5</span>
<span title="5 of 5" class="rating r5"><img width="0" height="1" src="sprite.gif" alt=""/>5 out of 5</span>
CSS
.rating {
position: relative;
height: 1.6em;
width: 8.1em;
overflow: hidden;
vertical-align: middle;
display: block;
}
.rating img {
position: absolute;
width: 40.5em;
height: 1.55em;
top: 0;
border: 1px solid #fff;
}
.r1 img { right: 0; }
.r2 img { left: -24.4em; }
.r3 img { left: -16.2em; }
.r4 img { left: -8.1em; }
- One star
1 out of 5- Two stars
2 out of 5- Three stars
3 out of 5- Four stars
4 out of 5- Five stars
5 out of 5
- Pros
- This method requires a single HTTP request.
- This technique is the only one of the four methods above that reveals content when Firefox users select "hide images" or "make images invisible" (from the developer’s toolbar).
- When images are unavailable a red "x" appears only in the highest rating (i.e. 5 out of 5) instead of in each one as it is the case with other solutions that rely on
imgelements. - Cons
- The display of images is reliant on CSS.
It is worth noting that unlike other Image Replacement techniques, this method allows:
- images to scale depending on text-size settings.
- images to be printed.
- alternate text to be easily selected as the whole image appears highlighted (Firefox).
- the image to not disappear in a high-contrast setting/stylesheet.
- alternate text selection in Opera (when images are disabled).
- borderless alternate text in Opera’s small screen view.
Markup to cast votes
Starting with a native mechanism
To cast votes, we need a low-level voting mechanism that allows simple user selection and submission. For this, we can rely on using a form with labels and controls:
Markup
<fieldset>
<legend>Rating</legend>
<label><input type="radio" name="movie" value="1_5">1/5</label>
<label><input type="radio" name="movie" value="2_5">2/5</label>
<label><input type="radio" name="movie" value="3_5">3/5</label>
<label><input type="radio" name="movie" value="4_5">4/5</label>
<label><input type="radio" name="movie" value="5_5">5/5</label>
</fieldset>
Result
Adding breaks and whitespace
For better legibility, we add <br> and whitespace.
Markup
<fieldset>
<legend>Rating</legend>
<label><input type="radio" name="movie" value="1_5"> 1/5</label><br>
<label><input type="radio" name="movie" value="2_5"> 2/5</label><br>
<label><input type="radio" name="movie" value="3_5"> 3/5</label><br>
<label><input type="radio" name="movie" value="4_5"> 4/5</label><br>
<label><input type="radio" name="movie" value="5_5"> 5/5</label>
</fieldset>
Result
Introducing the sprite image in the markup
For this solution, we are using a smaller sprite than the one in the example above. It is now composed of two single stars (“on” and “off”).
We place img elements inside the labels. We assume they will have no value without CSS support, thus we "hide" them by setting specific dimensions via their width and height attributes. Note that using 0 with both attributes would show a broken image in some UAs.
<form ...>
<fieldset>
<legend>Rating</legend>
<label class="one" title="1 out of 5"><input name="LandOf" value="1" checked="checked" type="radio"> 1/5<img src="star-sprite.gif" alt="" height="0" width="0"></label>
<label class="two" title="2 out of 5"><input name="LandOf" value="2" type="radio"> 2/5<img src="star-sprite.gif" alt="" height="0" width="0"></label>
<label class="three" title="3 out of 5"><input name="LandOf" value="3" type="radio"> 3/5<img src="star-sprite.gif" alt="" height="0" width="0"></label>
<label class="four" title="4 out of 5"><input name="LandOf" value="4" type="radio"> 4/5<img src="star-sprite.gif" alt="" height="0" width="0"></label>
<label class="five" title="5 out of 5"><input name="LandOf" value="5" type="radio"> 5/5<img src="star-sprite.gif" alt="" height="0" width="0"></label>
</fieldset>
</form>
Note that with the above markup, we can expect (in most browsers) field selection via label selection.
Considering Accessibility
Unfortunately, as is, this markup creates issues in at least two screen-readers: JAWS and NVDA (see test case for these bugs). The problem is related to the use of a title attribute and an empty string for alternate text.
The workaround to not confuse screen-reader users is to use "stars" as alternate text (alt) and use JavaScript to insert title on mouseover.
Better Markup
<fieldset>
<legend>Rating</legend>
<label><img src="img/small-sprite.gif" width="0" height="1" alt="stars"><input type="radio" name="movie" value="1_5"> 1/5</label><br>
<label><img src="img/small-sprite.gif" width="0" height="1" alt="stars"><input type="radio" name="movie" value="2_5"> 2/5</label><br>
<label><img src="img/small-sprite.gif" width="0" height="1" alt="stars"><input type="radio" name="movie" value="3_5"> 3/5</label><br>
<label><img src="img/small-sprite.gif" width="0" height="1" alt="stars"><input type="radio" name="movie" value="4_5"> 4/5</label><br>
<label><img src="img/small-sprite.gif" width="0" height="1" alt="stars"><input type="radio" name="movie" value="5_5"> 5/5</label>
</fieldset>
Result
Styling
Giving dimensions to the image via CSS
We use em to allow the image to grow or shrink depending on font-size.
Markup
Unchanged
CSS
img {
width:2.8em;
height:1.4em;
}
Result
As you can see already, clicking on an image selects the corresponding radio button. There is no need for scripting as implicit labeling produces this behavior (except in IE).
Removing the image from the flow
Styling the label with position:relative and the image with position:absolute with top/left values is enough to hide input and text inside the labels.
Markup
Unchanged
CSS
label {
position:relative;
}
img {
width:2.8em;
height:1.4em;
position:absolute;
top:0;
left:0;
}
Result
Displaying one star per label
We style the label so its dimensions match the height and width of a single star.
Markup
Unchanged
CSS
label {
position:relative;
height:1.4em;
width:1.4em;
overflow:hidden;
display:block;
}
img {
width:2.8em;
height:1.4em;
position:absolute;
top:0;
left:0;
}
Result
Displaying the stars horizontally
We remove the brs and we float the labels.
Markup
Unchanged
CSS
br {
display:none;
}
label {
position:relative;
height:1.4em;
width:1.4em;
overflow:hidden;
display:block;
float:left;
}
img {
width:2.8em;
height:1.4em;
position:absolute;
top:0;
left:0;
}
Result
Displaying the sprite image depending on rating
To set a "3 out of 5" rating, we apply the same class to the last two labels. This class will shift the position of the image inside the label.
Markup
<fieldset>
<legend>Rating</legend>
<label><img src="img/small-sprite.gif" width="0" height="1" alt="stars"><input type="radio" name="movie" value="1_5"> 1/5</label><br>
<label><img src="img/small-sprite.gif" width="0" height="1" alt="stars"><input type="radio" name="movie" value="2_5"> 2/5</label><br>
<label><img src="img/small-sprite.gif" width="0" height="1" alt="stars"><input type="radio" name="movie" value="3_5"> 3/5</label><br>
<label class="no_star"><img src="img/small-sprite.gif" width="0" height="1" alt="stars"><input type="radio" name="movie" value="4_5"> 4/5</label><br>
<label class="no_star"><img src="img/small-sprite.gif" width="0" height="1" alt="stars"><input type="radio" name="movie" value="5_5"> 5/5</label>
</fieldset>
CSS
br {
display:none;
}
label {
position:relative;
height:1.4em;
width:1.4em;
overflow:hidden;
float:left;
}
img {
width:2.8em;
height:1.4em;
position:absolute;
top:0;
left:0;
}
.no_star img {
left:-1.4em;
}
Result
Not relying on image alone to display information
It’s important to offer an alternative to the display of stars in case images are not available. This is because labels and radio buttons are styled to be on top of each other. A simple solution is to move input and text off-screen (i.e. using text-indent:-999em) and apply a background color to the labels.
Markup
No change
CSS
br {
display:none;
}
label {
position:relative;
height:1.4em;
width:1.4em;
overflow:hidden;
float:left;
background:teal;
margin-right:1px;
text-indent:-999em;
}
img {
width:2.8em;
height:1.4em;
position:absolute;
top:0;
left:0;
}
.no_star {
background:#ccc;
}
.no_star img {
left:-1.4em;
}
Note:
text-indentalso fixes a upwards jump of the image each time the controls get focus.- the right margin is to make sure background colors create squares and not rectangles (which would happen with adjacent labels sharing the same background color).
Result
Finishing touch
- We use the pseudo-class
:hoverto create some rollover effect, - We hide the fieldset border,
- We hide the legend,
- We style the cursor.
Markup
Unchanged
CSS
br {
display:none;
}
label {
position:relative;
height:1.4em;
width:1.4em;
overflow:hidden;
float:left;
background:teal;
margin-right:1px;
text-indent:-999em;
}
input {
position:absolute;
left:-999em;
top:.5em;
}
img {
width:2.8em;
height:1.4em;
position:absolute;
top:0;
left:0;
cursor: pointer;
}
.no_star {
background:#ccc;
}
.no_star img {
left:-1.4em;
}
label:hover {
opacity:.5;
filter:alpha(opacity=50);
}
fieldset {
border:0;
}
legend {
text-indent:-999em;
}
Note: label:hover is ignored by IE6 and in Opera the background color bleeds through the images. In the demo page, instead of using opacity, I am using a different sprite that shows four states.
Result
Displaying the ratings without allowing user interaction
We can make the ratings "read-only" by adding disabled and checked attributes in the appropriate input fields.
Markup
<fieldset>
<legend>Rating</legend>
<label><img src="img/small-sprite.gif" width="0" height="1" alt="stars"><input type="radio" name="movie" value="1_5" disabled> 1/5</label><br>
<label><img src="img/small-sprite.gif" width="0" height="1" alt="stars"><input type="radio" name="movie" value="2_5" disabled> 2/5</label><br>
<label><img src="img/small-sprite.gif" width="0" height="1" alt="stars"><input type="radio" name="movie" value="3_5" checked="checked"> 3/5</label><br>
<label class="no_star"><img src="img/small-sprite.gif" width="0" height="1" alt="stars"><input type="radio" name="movie" value="4_5" disabled> 4/5</label><br>
<label class="no_star"><img src="img/small-sprite.gif" width="0" height="1" alt="stars"><input type="radio" name="movie" value="5_5" disabled> 5/5</label>
</fieldset>
CSS
The rule using :hover has been removed
Giving more thought to the process
At this point, it is possible to cast votes without script support, but sighted users have no clue about their selection. So we use JavaScript to:
- give feedback to the user regarding his selection,
- give keyboard users a visual clue while they navigate through the radio buttons.
At the same time, we take advantage of using a script to insert title attributes that will create "tooltips" when users hover over the labels/stars.
Because of the lack of feedback regarding selection without JavaScript, we style labels and form controls only if there is script support. To do so we use JavaScript to set a flag on the html element and then we create a rule based on descendant selectors containing that hook. If the flag is missing, that rule does not apply and elements are not styled.
This is the demo page, the final product. To see how this solution behaves according to various settings, you may want to use your favorite developer tools to increase text-size, break image paths, disable JavaScript, turn CSS off, and more…
Wrap up
Coming up with a "acceptable" solution requires to identify users’ needs, User Agents’ peculiarities, User Agents’ settings and more – which means extensive testing.
In this process, users’ feedback is essential because following best practices is not always a sure thing. For example, as mentioned earlier, setting no value for the alt attribute of the images within the labels seem to be the safe thing to do, but it turns out that it creates issues with at least two screenreaders (see test case).
Also, feedback from assistive devices’ users allows to ignore some validation error messages – as the one that the Firefox Accessibility Toolbar reports (according to http://bestpractices.cita.uiuc.edu/html/nav/form/).
The goal here was not to fix everything, though. Being able to cast votes without a pointing device was one of my priorities, but improving the look and feel of the solution in Opera when images are disabled is not something I consider essential.
The most interesting part of this "journey" was to make the solution accessible to many users under various conditions, addressing issues such as:
- images off,
- javascript off,
- CSS off,
- a combination of the above.
It is also nice to know that this technique relies on img elements rather than background images, which allows the stars to:
- resize themselves according to the user’s settings,
- show in high contrast mode,
- be printed by default (unlike background images).
All of this comes without sacrificing performance, as this solution relies on this single sprite: ![]()
Late finding
I recently discovered the system Amazon has built for its voting page. It is quite interesting as they serve a different solution depending on script support. If there is script support, they use an image <map> (interesting approach), if there is no script support they use radio buttons. In both cases, the solution is accessible to keyboard users, and this helps to maximize access to a feature that is a core differentiator for the Amazon platform.
Note that they do not use JavaScript to replace the radio buttons with a image <map>; instead, they use noscript elements in which table markup contains radio buttons.
"Out of the box" solutions
- Dreamweaver®
- Spry Rating Widget
- YUI
- Star Rating Script for YUI
- Star Rating script with YUI
- JQuery
- Half-Star Rating Plugin
- jQuery Ajax Rater
- Simple Star Rating System
- 5 star rating system in PHP, MySQL and jQuery
- Wordpress
- GD Star Rating System for WordPress
- GD Star Rating
- Star Rating for Reviews
- Flash
- 5 Star rating system component
- Misc.
- How a star rating should be
- Starry widget 2
Special thanks
Special thanks to Victor Tsaran and Todd Kloots for their valuable feedback.
Share and extend: Bookmark with del.icio.us | digg it! | reddit!
YUI Theater — Nicholas Zakas and Victor Tsaran: “Accessibility on the Yahoo Homepage (58 min.)”
August 16, 2010 at 12:53 pm by Allen Rabinovich | In Accessibility, Development, YUI Theater | 4 CommentsIn June, Yahoo! hosted a BayJax meetup dedicated to web accessibility. Nicholas Zakas, Yahoo! homepage developer, and Victor Tsaran, Yahoo! senior accessibility program manager, gave a talk on the process of making Yahoo!’s homepage highly accessible.
We apologize for the uneven audio levels: there were technical issues with the microphones that we unfortunately were only able to adjust towards the second half of the talk.
If the video embed below doesn’t show up correctly in your RSS reader of choice, be sure to click through to watch the high-resolution version of the video on YUI Theater.
Other Recent YUI Theater Videos:
- Dennis Lembree: Making JavaScript Accessible — Dennis Lembree, an accessibility expert and the creator of AccessibleTwitter discusses the challenges of making JS-enabled sites accessible. The talk took place at the June 2010 BayJax meetup at Yahoo.
Share and extend: Bookmark with del.icio.us | digg it! | reddit!
YUI Theater — Dennis Lembree: “Making JavaScript Accessible (26 min.)”
August 16, 2010 at 12:46 pm by Allen Rabinovich | In Accessibility, YUI Theater | No CommentsIn June, at the BayJax meetup on web accessibility hosted by Yahoo!, the accessibility expert Dennis Lembree gave a talk on the challenges of making JavaScript-enabled websites accessible.
If the video embed below doesn’t show up correctly in your RSS reader of choice, be sure to click through to watch the high-resolution version of the video on YUI Theater.
Other Recent YUI Theater Videos:
- Nicholas Zakas and Victor Tsaran: Accessibility on the Yahoo Homepage — Nicholas Zakas, a principal developer of the Yahoo! homepage, and Victor Tsaran’s, Yahoo!’s senior accessibility manager, discuss the strategies and methods that made one of the most visited websites in the world fully accessible. The talk took place at the June 2010 BayJax meetup at Yahoo.
- Nicholas Zakas, Stoyan Stefanov, Ross Harmes, Julien Lecomte, Matt Sweeney: High Performance JavaScript — Five contributors to O’Reilly’s High Performance JavaScript discuss advanced JavaScript and DOM scripting optimizations at the April 2010 BayJax meetup at Yahoo.
- Christian Heilmann: YQL and YUI: Building Blocks for Quick Applications — The Yahoo! Developer Network’s international evangelist Christian Heilmann discusses his philosophy for creating fast, powerful, compelling applications using the Yahoo Query Language (YQL) and the Yahoo User Interface Library (YUI).
Share and extend: Bookmark with del.icio.us | digg it! | reddit!
YUI Theater — Todd Kloots: “Building Accessible Widgets with YUI 3″
November 23, 2009 at 8:39 am by Eric Miraglia | In Accessibility, YUI Theater | No CommentsWe wrap up YUI Theater coverage of YUICONF 2009 with a talk from Todd Kloots (@toddkloots) on the accessibility features of YUI 3: “Building Accessible Widgets with YUI 3.” Todd covers YUI’s support for keyboard handling, focus styling and management, ARIA roles and states, and much more. (Don’t miss Todd’s other YUICONF talk, “YUI 3 Sugar,” which is a great primer on other hidden gems in the library.)
If the video embed below doesn’t show up correctly in your RSS reader of choice, be sure to click through to watch the high-resolution version of the video on YUI Theater; the downloadable version is much smaller, optimized as it is for iPods, iPhones, and other handheld devices.
The Full Roster of YUICONF 2009 Videos on YUI Theater:
- Douglas Crockford: The State and Future of JavaScript — Yahoo! JavaScript Architect Douglas Crockford discusses the recent ECMA5 development process and efforts to improve the language in the future.
- Brendan Eich: ECMA Harmony and the Future of JavaScript — Brendan Eich, the creator of the world’s most popular programming language, talks about the struggle over the ES4 proposal and how it resulted in a specific set of proposals for ES5.
- Luke Smith: Events Evolved — YUI engineer Luke Smith provides a deep introduction to the YUI 3 event system including its support for DOM events, event delegation, synthetic events, and custom events.
- Todd Kloots: YUI 3 Sugar — YUI engineer Todd Kloots presents an indispensable introduction to YUI 3’s powerful suite of tools.
- Isaac Schlueter: Solving Problems with YUI 3 — YUI engineer Isaac Schlueter works through a real-world use case of building YUI 3’s forthcoming AutoComplete widget.
- Dav Glass: Contributing to YUI — YUI engineer Dav Glass introduces you to the YUI Gallery and steps through the process of making contributions to the YUI project.
- Allen Rabinovich: YUI 3 Infographics — YUI engineer Allen Rabinovich discusses the YUI 3 Charts implementation, currently under development.
- Reid Burke: Building YAP Applications with YUI — YUI engineer Reid Burke discusses the Yahoo! Application Platform and how you can use it, along with YUI, to reach Yahoo!’s vast audience.
- Matt Sweeney: YUI 3 Performance — YUI architect Matt Sweeney reviews principles of high-performance web development and looks at how best to implement those principles in YUI 3-based projects.
- Satyen Desai: A Widget Walkthrough — YUI engineer Satyen Desai provides a detailed tour of the YUI 3 widget subsystem.
- Todd Kloots: Building Accessible Widgets with YUI 3 — YUI engineer Todd Kloots demonstrates the accessibility toolkit built into YUI 3.
- Chad Auld: Introducing PHP Loader — Chad Auld of Yahoo! introduces the YUI PHP Loader, a flexible tool for loading modular JavaScript and CSS projects.
- Eric Ferraiuolo: Web App Development with YUI 3 — Eric Ferraiuolo of Oddnut Software talks about the nuances of deploying real-world web applications using YUI 3.
- Ron Adams: Automated Integration Testing with YUI Test, Selenium and Hudson — Yahoo! engineer Ron Adams discusses the creation of automated QA workflows that combine YUI Test, Selenium and Hudson to automate JavaScript unit tests.
- Stephen Woods: Creating Beautiful Documentation with YUI Doc — Yahoo! frontend engineer Stephen Woods provides a guided tour to YUI’s documentation engine, YUI Doc. YUI Doc is language-agnostic and can be used to document a variety of project styles.
- Matt Snider: Introducing the YUI 2.8.0 Storage Utility — Matt Snider, the lead frontend engineer for Mint.com (recently acquired by Intuit), contributed the YUI Storage Utility in the 2.8.0 release. In this session, he provides an overview of the Storage Utility’s features and the nuances of the various storage backends.
- Luke Smith: Debugging in YUI 3 — YUI engineer Luke Smith discusses the fine art of debugging web applications, looking at general tools and techniques and providing a few specific hints about debugging in YUI 3.
Subscribing to YUI Theater:
Share and extend: Bookmark with del.icio.us | digg it! | reddit!
YUI’s Todd Kloots in London for Accessibility/ARIA Tech Talk on Nov. 17
September 17, 2009 at 9:16 am by Eric Miraglia | In Accessibility, Development | No CommentsYahoo! accessibility specialist Todd Kloots will be in London in November for a tech talk hosted by Skills Matter. The talk, “More Accessible User Interfaces with ARIA,” will offer practical tips and design patterns for using ARIA to create accessible user interfaces that work across all of the various combinations of browsers and assistive technology that support ARIA.
The event is free; you can register on the Skills Matter website.
If you can’t wait until November to start diving into ARIA, Todd has you covered with a good library of blog posts and tech videos on the subject.
Todd Kloots: "Developing Accessible Widgets Using ARIA" @ Yahoo! Video
Share and extend: Bookmark with del.icio.us | digg it! | reddit!
ARIA Made Easier With YUI 3
August 3, 2009 at 1:24 pm by Todd Kloots | In Accessibility, Development | 2 CommentsAs mentioned in my talk Developing an Accessible Web 2.0 Widget Framework, one of the goals of YUI 3 is to make it easier for developers to build accessible user interfaces. To that end we’ve taken accessibility into consideration from the very start while building YUI 3, and the recent YUI 3.0.0 beta 1 release introduces several new additions that make it easier for developers to build ARIA-enabled widgets.
ARIA Attribute Support Added to Node
The Node Utility is YUI 3’s primary interface for interacting with the DOM, and it provides not only an abstraction model but built-in support for CSS Selector queries as a means of accessing HTML elements. Support for ARIA attributes has been added to the Node interface in the YUI 3.0.0 beta 1 release, allowing developers to use the expressive power of CSS Selector queries to apply and manage an element’s ARIA roles and states and properties.
Apply any of the ARIA attributes via Node’s set method. For example, to apply the role of toolbar to a <div> with an id of “toolbar”:
YUI().use('node', function(Y) {
var node = Y.get('#toolbar').set('role', 'toolbar');
});
In addition to Node’s built-in support for CSS selector queries, it also supports chaining and the ability to set multiple attributes on a single Node. When used together, these features of Node make it especially easy to apply the ARIA roles, states, and properties when building DHTML widgets with a large subtree.
For example, when building a menubar widget it is necessary to apply a role of menubar to the root DOM element containing the menubar, and the role of menu to the root DOM element containing each submenu. Additionally, as each submenu is hidden by default, the aria-hidden state will need to be applied to each submenu as well. The Node interface makes it possible to do all of this in one line of code:
YUI().use('node', function(Y) {
Y.get('#rootmenu').set('role', 'menubar').queryAll('.menu').setAttrs({ role: 'menu', 'aria-hidden': true });
});
Keyboard Support with the New Focus Manager Node Plugin
To work, ARIA requires developers provide keyboard access for widgets, since users of screen readers rely on the keyboard to navigate web sites and applications. As outlined in the ARIA specification and corresponding Best Practices document, providing keyboard access requires, in part, that each widget has one tab stop by default and is responsible for discretely managing focus for its descendants. Following these guidelines enables users to quickly navigate a page or application by using the tab key to move between widgets. Once a user has tabbed into a widget, they can then use other keys (the arrow keys for example) to move focus amongst the widget’s descendants.
The Focus Manager Node Plugin, which is available as of the YUI 3.0.0 beta 1 release, makes it easy to define a Node’s focusable descendants, define which descendant should be in the default tab flow, and define the keys that move focus among each descendant. Additionally, since the CSS pseudo class :focus is not supported on all elements in all A-Grade browsers, the Focus Manager Node Plugin provides an easy, cross-browser means of styling focus.
New ARIA Examples
For YUI 3.0.0 beta 1 we’ve also added a handful of examples that demonstrate the power of the Focus Manager Node Plugin to implement keyboard support to existing widgets and exercise Node’s new ARIA-related APIs.
Developers wishing to experience the benefits that ARIA provides can download the open-source NVDA Screen Reader and Firefox to test each example themselves. Alternatively, I’ve made screencasts of each example running with NVDA and Firefox.
YUI 3 Beta 1 ARIA Toolbar Video
YUI 3 Beta 1 Menu Button Video
YUI 3 Beta 1 ARIA Tabview Video
The Road Ahead
While YUI 3 is presently composed mostly of utilities, we are hard at work polishing our widget infrastructure and will soon begin building out widgets. With YUI 3 our goal is to make it as easy as possible to build accessible user interfaces, whether you are building a widget from scratch, or implementing one of ours. We think we’re off to a good start with ARIA support incorporated into the Node interface and the Focus Manager Node Plugin. So, I want to encourage developers to start using these interfaces, and to let us know what’s missing, what’s not working, and what it is.
Additional Resources
- Developing Accessible Widgets Using ARIA
- Improving Accessibility Through Focus Management
- Configuring Your Machine For Testing With A Screen Reader
Share and extend: Bookmark with del.icio.us | digg it! | reddit!
More Accessible YUI Grids Layouts with ARIA Landmark Roles
March 5, 2009 at 4:09 pm by Todd Kloots | In Accessibility, Development | 5 CommentsYUI Grids CSS has long been an important tool for developers wishing to create more accessible layouts. Through its support of source-order independent layouts, Grids enables control of the reading order of a page, allowing developers to place the most important content higher in the markup so that it can be quickly discovered by users of screen readers. However, while the role of each section of a Grid (e.g., navigation, main content, footer, etc.) is easily perceived through visual style and layout, it is not immediately perceived by users of screen readers because <div>s are inherently structural elements with no default semantic meaning.
The Benefit of Landmark Roles
ARIA Landmark Roles improve the content parsability of Grids for users of screen readers. By allowing developers to declare the intended purpose of each section of a layout, Landmark Roles provide semantic meaning to each section of a Grid, giving users of screen readers a high-level summary of how a page is organized. In addition, Landmark Roles significantly improves a Grid’s navigability. For example, the JAWS screen reader will announce all of the Landmarks when a page is loaded and allows users to quickly jump between them by pressing the semicolon key:
Using Landmark Roles
Of all the roles defined in the ARIA Specification, the Landmark Roles are among the easiest to implement since they don’t require JavaScript for keyboard support or state management. Landmark Roles are applied to an element using the role attribute and can be used to improve the semantics of any section of a Grid. For example, to declare a section of a Grid as navigation, simply set the role attribute to a value of “navigation”:
<div class="yui-b" role="navigation">
Presently the ARIA Specification defines seven different Landmark Roles:
Getting Started Is Easy
Since ARIA Landmark Roles are such a perfect complement to Grids, we’ve added built-in support to YUI Grids Builder, added a new section on using Landmarks to the Grids user guide, and created a new example to highlight usage of Landmarks Roles within YUI Grids CSS. Developers who are currently using Grids should definitely consider adding ARIA Landmark Roles to their markup to easily improve the accessibility of existing layouts.
Share and extend: Bookmark with del.icio.us | digg it! | reddit!

Copyright © 2006-2010 Yahoo! Inc. All rights reserved. Privacy Policy - Terms of Service
Powered by WordPress on Yahoo! Web Hosting.




