[contents]

W3C

HTML Techniques for WCAG 2.0

W3C Working Draft 30 July 2004

This version:
http://www.w3.org/TR/2004/WD-WCAG20-HTML-TECHS-20040730/
Latest version:
http://www.w3.org/TR/WCAG20-HTML-TECHS/
Previous version:
http://www.w3.org/TR/2003/WD-WCAG20-HTML-TECHS-20031209/
Editors:
Michael Cooper, Watchfire
Wendy Chisholm, W3C

Abstract

This document provides information to Web content developers who wish to satisfy the success criteria of "Web Content Accessibility Guidelines 2.0" [WCAG20] (currently a Working Draft). It includes techniques, code examples, and references to help authors satisfy each success criterion. The techniques in this document are specific to Hypertext Markup Language content [HTML4], [XHTML1] although some techniques contain Cascading Style Sheet solutions [CSS1]. Deprecated examples illustrate techniques that content developers should not use. The techniques listed in this document are suggestions on how to conform to WCAG 2.0. However, they may not be the only way to satisfy each success criterion.

Note: WCAG 2.0 is a Working Draft and the cross-references between success criteria and techniques are not fully established.

This document will be part of a series of documents published by the W3C Web Accessibility Initiative (WAI) to support WCAG 2.0.

Status of this Document

This section describes the status of this document at the time of its publication. Other documents may supersede this document. A list of current W3C publications and the latest revision of this technical report can be found in the W3C technical reports index at http://www.w3.org/TR/.

Publication as a Working Draft does not imply endorsement by the W3C Membership. This is a draft document and may be updated, replaced or obsoleted by other documents at any time. It is inappropriate to cite this document as other than work in progress.

This document is prepared by the Web Content Accessibility Guidelines Working Group (WCAG WG) to show how HTML Techniques for WCAG 2.0 might read. This draft is not yet based on consensus of the WCAG Working Group nor has it gone through W3C process. This Working Draft in no way supersedes HTML Techniques for WCAG 1.0 published as a W3C Note September 2000. The WCAG WG intends to publish this as a Working Group Note at the same time or soon after WCAG 2.0 becomes a Recommendation.

Please refer to "Issue tracking for WCAG 2.0 Techniques for HTML/XHTML" for a list of open issues related to this Working Draft. The History of Changes to HTML Techniques for WCAG 2.0 Working Drafts is also available.

The Working Group welcomes comments on this document at public-comments-wcag20. The archives for this list are publicly available.

This document has been produced as part of the W3C Web Accessibility Initiative (WAI). The goals of the WCAG WG are discussed in the Working Group charter. The WCAG WG is part of the WAI Technical Activity.


Table of Contents


Introduction

This is the HTML Techniques for Web Content Accessibility Guidelines 2.0 (WCAG 2.0). The guidelines provide a generic description of the requirements for a Web site that is accessible to people with disabilities. The HTML techniques provide an interpretation of the guidelines as applied to HTML and XHTML. This interpretation represents the best thinking of the Web Content Accessibility Guidelines working group and as such is a good guide to achieve conformance to WCAG 2.0. The Working Group strongly encourages authors to implement these techniques. Additionally the Working Group strongly encourages manufacturers of authoring tools to support the process of authoring content that conforms to these techniques, and encourages manufacturers or user agents, including assistive technologies, to implement the behaviors described by these techniques. However, these techniques do not provide a final definition of WCAG conformance and it is possible to meet guideline requirements without following these techniques. As new methods of conforming to the guidelines come to the attention of the Working Group, these techniques will be updated.

These techniques are intended for use both with HTML 4.01 and with XHTML 1.0/1.1. To encourage migration to newer technologies, examples for techniques are XHTML unless there is a specific reason to present an HTML example. Some references have not yet been updated to point preferentially to XHTML. This will be adjusted in a future draft of this document.

Note: Techniques in this document are known to contain errors. Recommendations will be rendered obsolete by future drafts. The purpose of this document is to receive feedback about the content of the techniques to ensure that future drafts are more accurate and useful. These techniques should not be implemented by people attempting to attain WCAG conformance at this time.

Future Work

User agent support information is not included in this draft. In future drafts, the WCAG WG intends to provide this information to help authors decide which techniques to implement. Providing this information requires extensive user agent and assistive technology testing. The WCAG WG welcomes submissions of test result information that demonstrates user agent or assistive technology support (or lack of support) of existing techniques. Submissions of additional techniques are also welcome.

As work on the technology-specific checklists progresses, we expect to clearly distinguish between techniques required for conformance versus those that are optional. That distinction is not made in this Working Draft. The issue is captured as Issue #772 -"How do we make it clear that there are some techniques that are sufficient and some that are optional?"

1 Metadata

This section discusses how to use metadata to increase the accessibility of Web content. Metadata is information about the content rather than the content itself. For example, the author, the creation date, expiration date, or primary language of the document. Metadata can be used by search engines to help users find content that has been made accessible or it can be used by the user agent (browser) to render the presentation in a way that fits the user's needs.

For more general information about Metadata refer to:

Editorial Note: The WCAG WG anticipates that a separate techniques document will focus on metadata, semantic web issues, and RDF and will be referenced from this section.

1.1 The !doctype statement

This technique relates to the following sections of the guidelines:

Task:

Use the !doctype statement to define the HTML or XHTML version of your document.

Validating to a published formal grammar and declaring that validation at the beginning of a document lets the user know that the structure of the document is sound. It also lets the user agent know where to look for semantics if it needs to. The W3C Validation Service validates documents against a whole list of published grammars.

It is preferable to validate to grammars that have been designed with accessibility in mind. Refer to the Technologies Reviewed for Accessibility.

Example:

This is an example defining an English-language document as using the HTML 4.01 Transitional DTD.

 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"     
     "http://www.w3.org/TR/html4/loose.dtd"> 
<html>   
   <head>     
      ...   
   </head>   
   <body>  
      ...   
   </body> 
</html>

1.2 The title element

This technique relates to the following sections of the guidelines:

Task:

Use the title element to describe the document.

All documents, including individual frames in a frameset, should have a title element that defines in a simple phrase the purpose of the document. This helps users to orient themselves within the site quickly without having to search for orientation information in the body of the page.

Note that the (mandatory) title element, which only appears once in a document, is different from the title attribute, which applies to almost every HTML 4.01 element.

Example:

This example defines a document's title.

 
<html xmlns="http://www.w3.org/1999/xhtml">   
   <head>     
      <title>The World Wide Web Consortium</title>     
   </head>   
   <body>     
      ...   
   </body> 
</html>

1.3 The address element

This technique relates to the following sections of the guidelines:

Task:

Use the address element to define a page's author.

Editorial Note: Describe how to use address to indicate contact information on the Web page.

Editorial Note: Question whether there is a particular accessibility benefit to this. If not, we should remove.

Editorial Note: Link to General technique about semantic markup.

Example:

This element can be used to provide information about the creator of the page.

 
<address>   
   This document was written by    
   <a href="mailto:yourname@example.com">Your Name</a> 
</address>

This technique relates to the following sections of the guidelines:

Provide a reference to a glossary.

If your page uses terms that are defined in a glossary document, use link rel = "glossary" to reference the glossary of terms used on the page. This enables users to access the glossary quickly using user agent features.

2 Navigational Supports

2.1 Meta redirect

This technique relates to the following sections of the guidelines:

Task:

Do not create a timed redirect.

meta http-equiv of "{timeout}; url=... " is often used to automatically redirect users. The meta element should be used specify metadata for a document including keywords, and information about the author. Please refer to the section on automatic page refresh for information on why META should not be used to redirect or auto-refresh pages.

Editorial Note: MC: I think we should clearly separate out the "surprise" problem from the misuse of meta problem, which isn't actually a violation. Also update the above link to the appropriate General techs location.

It is acceptable to use the meta element to create a redirect when the timeout is set to zero. However, it is preferable to use server-side methods to accomplish this.

Editorial Note: Refer to HTTP techniques here.

Deprecated Example:

This is a deprecated example which, using the meta element, forwards the user from one page to another after a timeout. However, this markup is non-standard, it disorients users, and it can disrupt a browser's history of visited pages.

 
<html xmlns="http://www.w3.org/1999/xhtml">
   <head>     
      <title>Don't use this!</title>     
      <meta http-equiv="refresh"
      content="5; url=http://www.example.com/newpage" />   
   </head>   
   <body>     
      <p>       
         If your browser supports Refresh, you'll be       
         transported to our        
         <a href="http://www.example.com/newpage">new site</a>        
         in 5 seconds, otherwise, select the link manually.     
      </p>   
   </body> 
</html>
Example:

The meta element is used here to create an immediate redirect. This is not preferred but is acceptable.

 
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>     
    <title>Meta Redirect Example</title>     
    <meta http-equiv="refresh" content="0; url=http://www.example.com/newpage" />
  </head>   
  <body>     
    <p>Please view our <a href="http://www.example.com/newpage">new site</a>.</p>
  </body> 
</html>
Example:

Editorial Note: Are there any examples we can use that are not deprecated? .htaccess is a server-side technique, perhaps point to that (after a server-side techniques document exists)

To be completed.

2.2 Meta refresh

This technique relates to the following sections of the guidelines:

Task:

Do not cause a page to refresh automatically.

meta http-equiv of "refresh" is often used to periodically refresh pages. If the time interval is too short, people who are blind will not have enough time to make their screen readers read the page before the page refreshes unexpectedly and causes the screen reader to begin reading at the top.

Deprecated Example:

This is a deprecated example that changes the user's page at regular intervals. Content developers should not use this technique to simulate "push" technology. Developers cannot predict how much time a user will require to read a page; premature refresh can disorient users. Content developers should avoid periodic refresh and allow users to choose when they want the latest information.

 
<html xmlns="http://www.w3.org/1999/xhtml">   
  <head>     
    <title>HTML Techniques for WCAG 2.0</title>     
    <meta http-equiv="refresh" content="60" />   
  </head>   
  <body>
    ...     
  </body> 
</html>

3 Headings

3.1 Section headings

This technique relates to the following sections of the guidelines:

Task:

Use HTML header elements h1 through h6, in order, to define the structure of the document.

Since some users skim through a document by navigating its headings, it is important to use them appropriately to convey document structure. Users should order heading elements properly. For example, in HTML, h2 elements should follow h1 elements, h3 elements should follow h2 elements, etc. Content developers should not "skip" levels (e.g., h1 directly to h3).

Long documents are often divided into a variety of chapters, chapters have subtopics and subtopics are divided into various sections, sections into paragraphs, etc. These semantic chunks of information make up the structure of the document.

Sections should be introduced with the HTML heading elements ( h1-h6 ). Other markup may complement these elements to improve presentation (e.g., the hr element to create a horizontal dividing line), but visual presentation is not sufficient to identify document sections.

Editorial Note: Edit this section to clarify "semantic chunks," "other markup," "introducing sections," "navigating its headings," etc.

Some authors object to using the HTML header elements because the default presentation in many browsers is unattractive. The appropriate solution is to use CSS to achieve the desired visual effect. Combined with classes and ids, a variety of presentational styles can be achieved while retaining a logical outline in the semantic structure.

Editorial Note: Link to General technique about semantic markup.

Example:

Note that in HTML, heading elements (H1 - H6) only start sections, they don't contain them as element content. This HTML markup shows how style sheets may be used to control the appearance of a heading and the content that follows:

 
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>Cooking techniques</title>
      <style type="text/css">
        /* Indent heading and following content */
        div.section2 { margin-left: 5% }     
      </style>   
  </head>   
  <body>     
    <h1>Cooking techniques</h1>     
    <p>       
      ... some text here ...     
    </p>     
    <div class="section2">       
      <h2>Cooking with oil</h2>       
        ... text of the section ...     
    </div>     
    <div class="section2">       
      <h2>Cooking with butter</h2>       
        ... text of the section ...     
    </div>   
  </body> 
</html>

3.2 Header misuse

This technique relates to the following sections of the guidelines:

Task:

Do not user headers solely for visual effects.

Do not use headings to create font effects; use style sheets to change font styles for example.

4 Language

This section explains how and why to mark changes in language as well as identifying the primary language used for content. Many assistive technologies handle a variety of languages. When the language is not identified, assistive technologies often make a best guess using the default language set by the user. This often results in confusing pronunciations or displays.

Editorial Note: Needs clarification. "handle languages" "default language set by user" "confusing pronunciations" Perhaps add some sound clips and transcripts of confusing pronunciations and displays.

Editorial Note[#580] Note that RFC1766 has now been obsoleted by RFC3066

4.1 Identifying the primary language

This technique relates to the following sections of the guidelines:

Task:

Use the lang attribute of the html element to define the document's language.

It is good practice to identify the primary language of a document, either with markup (as shown in the example) or through HTTP headers. The lang attribute allows assistive technology to orient and adapt to the pronunciation and syntax that are specific to the language of the page. This attribute may also play a major role in the emerging global, multi-lingual, simultaneous translation web environment.

Editorial Note: Note the HTTP headers is not an HTML technique. But we should have some way of speaking to the effects of HTTP headers and the preference with respect to the lang attribute.

Example:

This example defines the content of an HTML document to be in the French language.

 
<html lang="fr" xmlns="http://www.w3.org/1999/xhtml">   
  <body>     
    ...document écrit en français...   
  </body>
</html>

4.2 Identifying changes in language

This technique relates to the following sections of the guidelines:

Task:

Use the lang attribute to identify the natural language used in a document.

If you use a number of different languages on a page, make sure that any changes in language are clearly identified by using the lang or xml:lang attribute according to the HTML or XHTML version you use.

Note that HTML only offers the use of the lang attribute, while XHTML (transitionally) allows both attributes or only xml:lang, respectively, since lang was removed in XHTML 1.1

Identifying changes in language are important for a number of reasons:

  • It will allow braille translation software to follow changes in language, e.g., substitute control codes for accented characters, and insert control codes necessary to prevent erroneous creation of Grade 2 braille contractions.

    Editorial Note: We may want to put a glossary at the end of the document defining things like "Grade 2 braille contractions").

  • Similarly, speech synthesizers that "support" multiple languages will be able to speak the text in the appropriate accent with proper pronunciation. If changes are not marked, the synthesizer will try its best to speak the words in the primary language it works in. Thus, the French word for car, "voiture" would be pronounced "voter" by a speech synthesizer that uses English as its primary language.

  • Marking changes in language can benefit future developments in technology, for example users who are unable to translate between languages themselves will be able to use machines to translate unfamiliar languages.

Example:

This example uses the lang attribute of the span element to define one phrase as French and another as Italian.

 
<p>
   And with a certain <span lang="fr">je ne sais
   quoi</span>, she entered both the room, and his life,   
   forever. &quot;My name is Natasha,&quot; she said.   
   &quot;<span lang="it">Piacere,</span>&quot; he   
   replied in impeccable Italian, locking the door. 
</p>
Example:

This example demonstrates the use of the xml:lang attribute defining a quote written in German. This snippet could be included by an XHTML 1.1 document where lang is not allowed.

<blockquote xml:lang="de">
   <p>Da dachte der Herr daran, ihn aus dem Futter zu schaffen,
   aber der Esel merkte, daß kein guter Wind wehte, lief fort
   und machte sich auf den Weg nach Bremen: dort, meinte er,
   könnte er ja Stadtmusikant werden.</p>
</blockquote>

5 Text Markup

The techniques in this category demonstrate how to add structure to pieces of text. They refer to "inline" tags that allow control over the presentation of specific words and phrases in the document.

5.1 Emphasis

This technique relates to the following sections of the guidelines:

Task:

Use the strong and em elements, rather than b and i, to denote emphasis.

The em and strong elements were designed to indicate structural emphasis that may be rendered in a variety of ways (font style changes, speech inflection changes, etc.). The b and i elements were deprecated in HTML 4.01 and XHTML because they were used to create a specific visual effect.

Editorial Note: Link to General technique about semantic markup.

Example:

This example shows how to use the em and strong elements to emphasize text.

 
...What she <em>really</em> meant to say was, 
&quot;This isn't ok, it is <strong>excellent</strong>!...

5.2 Abbreviations

This technique relates to the following sections of the guidelines:

Task:

Use the abbr element to expand abbreviations where they first occur.

Mark up abbreviations with abbr and use title to indicate the expansion.

Editorial Note[#295] Where and when and how often to indicate the expansion is still under discussion.

This also applies to shortened phrases used as headings for table row or columns. If a heading is already abbreviated provide the expansion in abbr. If a heading is long, you may wish to provide an abbreviation as described in Terse substitutes for header labels.

Editorial Note: There are a number of questions about abbreviation and Acronym. Although these have undergone much discussion, there is not yet enough consensus to create solid techniques. These issues include: * uncertain whether these elements need to be marked up on the first occurrence on the page or for every instance, * unclear on the distinction between abbreviations and acronyms, in English and other languages, * the HTML Working group has proposed removing the acronym element in favor of a single abbreviation element for all cases, * how common must a word be before it need not be marked up this way.

Example:

This example shows how to use the abbr element properly.

 
<p>Welcome to the <abbr title="World Wide Web">WWW</abbr>!</p>
Example:

This example shows how to use the abbr attribute in a table heading.

 
<table>   
  <tr>     
    <th>First name</th>     
    <th abbr="SS#">Social Security Number</th>   
  </tr>   
  ... 
</table>

5.3 Acronym

This technique relates to the following sections of the guidelines:

Task:

Use the acronym element to expand acronyms where they first occur.

Mark up acronyms with acronym and use title to indicate the expansion.

Editorial Note[#295] Where and when and how often to indicate the expansion is still under discussion.

Example:

This example shows how to use the acronym element.

 
<acronym title="Keep It Simple Stupid">KISS</acronym>

This technique relates to the following sections of the guidelines:

Do not create blinking content with the blink element.

Do not use the blink element to create blinking content.

Editorial Note: If this is because we disapprove of blink we should provide an alternative technique. If it's because we disapprove of blinking, we should say so and point to something.

5.5 Marquee

This technique relates to the following sections of the guidelines:

Task:

Do not create scrolling text with the marquee element.

Do not use the marquee element to create scrolling text.

Editorial Note: If this is because we disapprove of marquee we should provide an alternative technique. If it's because we disapprove of moving content, we should say so and point to something.

5.6 Short Quotations (future)

This technique relates to the following sections of the guidelines:

Task:

Use the q element to mark up short inline quotations.

The q element marks up inline quotations.

NOTE:The q element, though designed for semantic markup, is unsupported, or poorly-supported, in most browsers. So this is a future technique.

Editorial Note: Link to General technique about semantic markup.

5.7 Long quotations

This technique relates to the following sections of the guidelines:

Task:

Use the blockquote element to mark up block quotations.

The blockquote element marks up block quotations.

Editorial Note: Link to General technique about semantic markup.

Example:

This example marks up a longer quotation with blockquote :

 
<blockquote cite="http://www.example.com/loveslabourlost">   
  <p>     
    Remuneration! O! that's the Latin word for     
    three farthings. --- William Shakespeare     
    (Love's Labor Lost).   
  </p> 
</blockquote>

5.8 Misuse of blockquote

This technique relates to the following sections of the guidelines:

Task:

DO NOT use the blockquote element for formatting effects such as indentation.

Only use blockquote to indicate a quotation. Do not use it to create an indented effect on the page. blockquote is a semantic element and using it improperly can confuse the user.

Editorial Note: We need to provide pointers to alternate ways to achieve the desired effect.

5.9 Use of the title attribute

Task:

Use the title attribute where appropriate.

In general, one can provide supplementary information about elements using the title attribute. The attribute value contains the content. Refer to Conditional Content in the User Agent Accessibility Guidelines for information on how this information may be presented to the user.

Note that while the title attribute is permitted and can be used as supplemental content for most elements in HTML, there are some elements for which particular usages are recommended for accessibility purposes. Refer to:

There are also situations in which accessibility requirements are that title should not be used, even though it is permitted by HTML. Refer to:

Editorial Note: It is expected that the Techniques Gateway will define what "supplementary information" is and how it should be used.

5.10 Supplemental meaning cues

This technique relates to the following sections of the guidelines:

Task:

Use the span element with the title attribute to provide generic meaning cues.

Words that may have ambiguous meanings, because they are unfamiliar terms, idioms, contractions, or have multiple meanings can be clarified with the title attribute. If there is not a special element for the type of disambiguation to be performed, apply this to a span element.

5.11 Markup and style sheets rather than images: the example of math

This technique relates to the following sections of the guidelines:

Task:

Wherever possible, use markup rather than images to convey information.

Editorial Note: Does this section fit best here or with images or on its own? Perhaps pull bit about ascii art from images and combine with this into a separate section called "Markup and Style Sheets" ? or perhaps create a more general section in Gateway Techniques that would discuss benefits of marking text as text rather than developing raster images.

Using markup (and style sheets) where possible rather than images (e.g., a mathematical equation, link text instead of image button) promotes accessibility for the following reasons:

  • Text may be magnified or interpreted as speech or braille.

  • Search engines can use text information.

As an example, consider these techniques for putting mathematics on the Web:

  • Ensure that users know what variables represent, for example, in the equation "F = m * a", indicate that F= Force, m = mass, a = acceleration.

  • For straightforward equations, use characters, as in "x + y = z"

  • For more complex equations, mark them up with MathML [MATHML] or TeX. Note. MathML can be used to create very accessible documents but currently is not as widely supported or used as TeX.

  • Provide a text description of the equation and, where possible, use character entity references to create the mathematical symbols. A text alternative must be provided if the equation is represented by one or more images.

TeX is commonly used to create technical papers that are converted to HTML for publication on the Web. However, converters tend to generate images, use deprecated markup, and use tables for layout. Consequently, content providers should:

  1. Make the original TeX (or LaTeX) document available on the Web. There is a system called "AsTeR" [ASTER] that can create an auditory rendition of TeX and LaTeX documents. Note. These tools work primarily in the English environment and may not work so well with speech synthesizers whose primary language is not English.

  2. Ensure that the HTML created by the conversion process is accessible. Provide a single description of the equation (rather than "alt" text on every generated image as there may be small images for bits and pieces of the equation).

Editorial Note: Link to General technique about semantic markup.

5.12 CSS instead of presentational markup

Task:

Use structural markup with CSS instead of presentational markup.

Avoid using the following HTML elements, and use the appropriate CSS instead.

Editorial Note: Include a list of each HTML element that should be replaced, and the CSS property/value(s) that can be used. Talk about structural markup a bit too, and/or cross reference.

5.13 Use non-deprecated presentational markup

This technique relates to the following sections of the guidelines:

Task:

If you must use HTML elements to control font information, use big and small, which are not deprecated.

5.14 Eight other structural elements (to identify citations, code fragments, deleted text, and others)

This technique relates to the following sections of the guidelines:

Task:

Use structural elements as needed.

The HTML 4.01 specification defines the following structural elements for miscellaneous markup needs:

cite

Contains a citation or a reference to other sources.

dfn

Indicates that this is the defining instance of the enclosed term.

code

Designates a fragment of computer code.

samp

Designates sample output from programs, scripts, etc.

kbd

Indicates text to be entered by the user.

var

Indicates an instance of a variable or program argument.

ins

Indicates text inserted into a document.

del

Indicates text deleted from a document.

Editorial Note: How often are these elements used? Are they supported by assistive technologies? The code element is used often in W3C documents, what about elsewhere? Should we keep this section? Perhaps keep it but make it clear it is for completeness and information?

Editorial Note: This is about several elements so perhaps should be split up. But it's really just a list of structural elements. Do we need that list in techniques? Can we point to some resource (e.g., HTML spec) in a single technique and say "use structural elements per the HTML spec"? Or do we have to list every possible structural element we want people to use - including the obvious ones like p?

Editorial Note: Link to General technique about semantic markup.

6 Lists

The HTML list elements dl , ul , and ol should only be used to create lists. Do not use lists for formatting effects such as indentation. Refer to information on CSS and tables for layout in the CSS Techniques [WCAG10-CSS-TECHNIQUES].

Until either CSS2 is widely supported or user agents allow users to control rendering of lists through other means, authors should consider providing contextual clues in unnumbered nested lists. Non-visual users may have difficulties knowing where a list begins and ends and where each list item starts. For example, if a list entry wraps to the next line on the screen, it may appear to be two separate items in the list. This may pose a problem for legacy screen readers.

Editorial Note: Do we still need this note? How is current support for nested lists? Which versions of which screen readers handle nested lists well?

Editorial Note: From 2003-07-30 teleconference: We need techniques for UL, OL, DL, examples that don't rely on CSS, and technique for older AT that don't support nested lists well

6.1 Ordered lists

This technique relates to the following sections of the guidelines:

Task:

Format ordered lists so their items can be followed logically.

Ordered lists help non-visual users navigate. Non-visual users may "get lost" in lists, especially in nested lists and those that do not indicate the specific nest level for each list item. Until user agents provide a means to identify list context clearly (e.g., by supporting the ':before' pseudo-element in CSS2), content developers should include contextual clues in their lists.

For numbered lists, compound numbers are more informative than simple numbers. Thus, a list numbered

1
  1.1
  1.2
    1.2.1
  1.3
2
  2.1

provides more context than the same list without compound numbers, which might be formatted as follows:

 1.
    1.
    2.
       1.   
    3. 
 2.   
    1.

and would be spoken as "1, 1, 2, 1, 2, 3, 2, 1", conveying no information about list depth.

[CSS1] and [CSS2] allow users to control number styles (for all lists, not just ordered) through user style sheets.

Editorial Note: As above, how well do current screen readers support nested lists? How well is the support for CSS control of list styles?

Example:

The CSS2 style sheet in this example shows how to specify compound numbers for nested lists created with either UL or OL elements. Items are numbered as "1", "1.1", "1.1.1", etc.

 
<style type="text/css">    
li {
  display: block;
}
li:before {
  content: counters(item, ".");       
  counter-increment: item;
}
ul, ol {
  counter-reset: item;
}
</style>

6.2 Abuse of list markup

This technique relates to the following sections of the guidelines:

Task:

Do not use list elements for presentational effects.

Do not use list elements, such as the ul and ol elements, to achieve indentation effects when a list is not indicated. The most common example of this misuse is to use list container elements without li children.

Editorial Note: We need to provide pointers to alternate ways to achieve the desired effect.

6.3 Use style sheets to change list bullets

Task:

Use CSS, not images, to change list bullets.

To change the bullet style of unordered list items created with the li element, use style sheets. In CSS, it is possible to specify a fallback bullet style (e.g., "disc") if a bullet image cannot be loaded.

Editorial Note: Should this be moved to CSS?

Example:

This example sets bullets in an unordered list to an image called "star.gif", or, alternatively, a disc.

 
<html xmlns="http://www.w3.org/1999/xhtml">   
   <head>     
      <title>Using style sheets to change bullets</title>     
      <style type="text/css">       
         ul { list-style: url(star.gif) disc }     
      </style>   
   </head>   
   <body>     
      <ul>       
         <li>Audrey</li>       
         <li>Laurie</li>       
         <li>Alice</li>     
      </ul>   
   </body> 
</html> 				
Example:

To further ensure that users understand differences between list items indicated visually, content developers should provide a text label before or after the list item phrase:

 
<html xmlns="http://www.w3.org/1999/xhtml">   
   <head>     
      <title>Bullet styles example</title>     
      <style type="text/css">       
         .newtxt {          
            font-weight: bold;         
            color: red;         
            background-color: yellow        
         }       
         .newbullet {          
            list-style : url(yellow.gif) disc        
         }     
      </style>   
   </head>   

   <body>     
      <ul>       
         <li class="newbullet">Roth IRA          
            <span class="newtext">(New)</span></li>       
         <li>401(k)</li>     
      </ul>   
   </body> 
</html> 				

7 Data Tables

This section discusses the accessibility of tables and elements that one can put in a table element.

Editorial Note: The resolution of issue 248 will effect this section. Include definition of "data table" here and "layout table" in the next section.

Editorial Note: Describe how to determine if a table is a data table or a layout table. Discuss why it is so important to mark up data tables correctly. Show bad example (e.g., Matt's W3N stock table) and the issues created by bad markup. Use real examples or create derivatives.

7.1 The caption element

This technique relates to the following sections of the guidelines:

Task:

Use the caption element to describe the nature of data tables. (optional)

Provide a caption via the caption element. A table caption describes the nature of the table in one to three sentences. Two examples:

  1. "Cups of coffee consumed by each senator."

  2. "Who spends the most on pollution cleanup?"

7.2 The title attribute on the table element

Task:

Use the title attribute to provide additional descriptive information. (optionalsummary or caption are preferred)

The title attribute does not imply additional meaning or context and can be applied to any element; the summary attribute and caption element were designed specifically for use on tables. Thus, titleis not the preferred method to provide a description of a data table.

7.3 Summarizing tables

Task:

Use the summary attribute to describe the purpose and structure of tables. (optional)

It is rare to use both the caption element and the summary attribute since one or the other should be enough to provide a description.

Summaries are useful for non-visual readers. A summary may also describe how the table fits into the context of the current document. Two examples:

  1. "This table charts the number of cups of coffee consumed by each senator, the type of coffee (decaf or regular), and whether taken with sugar."

  2. "Total required by pollution control standards as of January 1, 1971. Commercial category includes stores, insurance companies and banks. The table is divided into two columns. The left-hand column is 'Total investment required in billions of dollars'. The right--hand column is 'Spending' and is divided into three sub-columns. The first sub-column is titled '1970 actual in millions of dollars', the second is '1971 planned in millions of dollars', and the third is 'Percent change, 1970 versus 1971.' The rows are industries." [NBA, 1996].

Editorial Note: There is still not consensus about the ideal use of summaries for tables. A discussion about summaries began but there is still need for more review and comments on this. See also Summaries of layout tables.

7.4 Terse substitutes for header labels

Task:

Use the abbr attribute on th elements to provide terse substitutes for header labels. (optional)

When supported, short heading labels will decrease repetition and reading time when tables are read aloud.

7.5 Identifying groups of rows

This technique relates to the following sections of the guidelines:

Task:

Use thead to group repeated table headers, tfoot for repeated table footers, and tbody for other groups of rows. (optional)

Editorial Note: Describe the use and benefits of row structure elements. Clearly explain when it is a good idea to use these. Use Joe's example of tbody.

7.6 Identifying groups of columns

This technique relates to the following sections of the guidelines:

Task:

Use the colgroup and col elements to group columns. (optional)

Editorial Note: Describe the use and benefits of column structure elements. Much of this may be theoretical.

7.7 Specifying the set of data cells for which each header cell provides header information

This technique relates to the following sections of the guidelines:

Task:

Use the scope attribute to specify the set of data cells for which each header cell provides header information.

When browsers and assistive technologies know which headers apply to which data cells, the header information is available for each cell and can be displayed or read in association with the data.

Editorial Note: Need support information for scope, headers, and axis techniques. Provide information to help determine which technique (scope, headers, or axis) to use.

7.8 Associating header cells with data cells

This technique relates to the following sections of the guidelines:

Task:

Use the headers attribute on each data cell to associate a list of header cells that provide header information.

For more complicated tables (where the scope attribute can not be applied because the relationship applies to more than two headers), the headers attribute allows you to associate more than two headers with each data cell.

7.9 Categorizing data cells

This technique relates to the following sections of the guidelines:

Task:

Use the axis attribute to place a cell into a conceptual category.

Conceptual categories can be used to group data that might be similar but fall under different headings. For example, "meals" is a category that could be applied to numbers that fall under both the "San Jose" and "Seattle" headings.

Editorial Note: Andrew Kirkpatrick asks what specific accessibility benefits axis brings. Although testing shows assistive technology support for this, it is unclear how this brings equivalency to non-disabled people, since in fact people who are not using AT currently do not have access to the axis information. We need to know more about how axis is intended to be used in the general case, and how using it benefits accessibility.

7.10 Misuse of the pre element

This technique relates to the following sections of the guidelines:

Task:

Do not use the pre element to create tabular layout.

The pre element is not used to create tabular layout; the table elements is used. Watch out for pre markup within a table.

Editorial Note: Is using br a separate issue or included in the pre issue? Perhaps make this more general? i.e., use tables appropriately, don't use pre or br to format data?

7.11 Row and column headings

This technique relates to the following sections of the guidelines:

Task:

Use the th element to indicate which cells contain header information. (only applies to data tables)

For information about table headers, refer to the table header algorithm and discussion in the HTML 4.01 Recommendation [HTML4], section 11.4.3

Example:

This example shows how to associate data cells (created with td ) with their corresponding headers by means of the headers attribute. The headers attribute specifies a list of header cells (row and column labels) associated with the current data cell. This requires each header cell to have an id attribute.

A speech synthesizer might render this tables as follows:

Caption: Cups of coffee consumed by each senator Summary: This table charts the number of cups of coffee consumed by each senator, the type of coffee (decaf or regular), and whether taken with sugar. Name: T. Sexton, Cups: 10, Type: Espresso, Sugar: No Name: J. Dinnen, Cups: 5, Type: Decaf, Sugar: Yes

Editorial Note: Link to General technique about semantic markup.

 
<table border="1" summary="This table charts the number of 
  cups of coffee consumed by each senator, the type of coffee 
  (decaf or regular), and whether taken with sugar.">
  <caption>Cups of coffee consumed by each senator</caption>
  <tr>
    <th id="header1">Name</th>
    <th id="header2">Cups</th>
    <th id="header3" abbr="Type">Type of Coffee</th>
    <th id="header4">Sugar?</th>
  </tr>
  <tr>
    <td headers="header1">T. Sexton</td>
    <td headers="header2">10</td>
    <td headers="header3">Espresso</td>
    <td headers="header4">No</td>
  </tr>
  <tr>
    <td headers="header1">J. Dinnen</td>
    <td headers="header2">5</td>
    <td headers="header3">Decaf</td>
    <td headers="header4">Yes</td>
  </tr>
</table>
Example:

This example associates the same header ( th ) and data ( td ) cells as the previous example, but this time uses the scope attribute rather than headers . scope must have one of the following values: "row", "col", "rowgroup", or "colgroup". Scope specifies the set of data cells to be associated with the current header cell. This method is particularly useful for simple tables. It should be noted that the spoken rendering of this table would be identical to that of the previous example. A choice between the headers and scope attributes is dependent on the complexity of the table. It does not affect the output so long as the relationships between header and data cells are made clear in the markup.

 
<table border="1" summary="This table charts ...">
  <caption>Cups of coffee consumed by each senator</caption>
  <tr>
    <th scope="col">Name</th>
    <th scope="col">Cups</th>
    <th scope="col" abbr="Type">Type of Coffee</th>
    <th scope="col">Sugar?</th>
  </tr>
  <tr>
    <td>T. Sexton</td>
    <td>10</td>
    <td>Espresso</td>
    <td>No</td>
  </tr>
  <tr>
    <td>J. Dinnen</td>
    <td>5</td>
    <td>Decaf</td>
    <td>Yes</td>
  </tr>
</table>
Example:

This example shows how to create categories within a table using the axis attribute.

This table lists travel expenses at two locations: San Jose and Seattle, by date, and category (meals, hotels, and transport). The following image shows how a visual user agent might render it. [Description of travel table]

Travel Expense Report table as rendered by a visual user agent.

 
<table border="1">
  <caption>Travel Expense Report</caption>
  <tr>
    <th></th>
    <th id="header2" axis="expenses">Meals</th>
    <th id="header3" axis="expenses">Hotels</th>
    <th id="header4" axis="expenses">Transport</th>
    <td>subtotals</td>
  </tr>
  <tr>
    <th id="header6" axis="location">San Jose</th>
    <th></th>
    <th></th>
    <th></th>
    <td></td>
  </tr>
  <tr>
    <td id="header7" axis="date">25-Aug-97</td>
    <td headers="header6 header7 header2">37.74</td>
    <td headers="header6 header7 header3">112.00</td>
    <td headers="header6 header7 header4">45.00</td>
    <td></td>
  </tr>
  <tr>
    <td id="header8" axis="date">26-Aug-97</td>
    <td headers="header6 header8 header2">27.28</td>
    <td headers="header6 header8 header3">112.00</td>
    <td headers="header6 header8 header4">45.00</td>
    <td></td>
  </tr>
  <tr>
    <td>subtotals</td>
    <td>65.02</td>
    <td>224.00</td>
    <td>90.00</td>
    <td>379.02</td>
  </tr>
  <tr>
    <th id="header10" axis="location">Seattle</th>
    <th></th>
    <th></th>
    <th></th>
    <td></td>
  </tr>
  <tr>
    <td id="header11" axis="date">27-Aug-97</td>
    <td headers="header10 header11 header2">96.25</td>
    <td headers="header10 header11 header3">109.00</td>
    <td headers="header10 header11 header4">36.00</td>
    <td></td>
  </tr>
  <tr>
    <td id="header12" axis="date">28-Aug-97</td>
    <td headers="header10 header12 header2">35.00</td>
    <td headers="header10 header12 header3">109.00</td>
    <td headers="header10 header12 header4">36.00</td>
    <td></td>
  </tr>
  <tr>
    <td>subtotals</td>
    <td>131.25</td>
    <td>218.00</td>
    <td>72.00</td>
    <td>421.25</td>
  </tr>
  <tr>
    <th>Totals</th>
    <td>196.27</td>
    <td>442.00</td>
    <td>162.00</td>
    <td>800.27</td>
  </tr>
</table>

8 Tables for layout

Editorial Note: Refer to section (to be written) at beginning of "Data Tables" that provides information about deciding if a table is used for data or layout.

However, when it is necessary to use a table for layout, the table must linearize in a readable order. When a table is linearized, the contents of the cells become a series of paragraphs (e.g., down the page) one after another. Cells should make sense when read in row order and should include structural elements (that create paragraphs, headings, lists, etc.) so the page makes sense after linearization.

Also, when using tables to create a layout, do not use structural markup to create visual formatting. For example, the TH (table header) element, is usually displayed visually as centered, and bold. If a cell is not actually a header for a row or column of data, use style sheets or formatting attributes of the element.

8.1 Layout tables (deprecated)

This technique relates to the following sections of the guidelines:

Task:

Avoid layout tables.

Authors should consider using style sheets for layout and positioning. This technique deprecates the use of layout tables. Do not use the table element for layout purposes unless the desired effect absolutely cannot be achieved using CSS.

8.2 Table elements allowed in layout tables

This technique relates to the following sections of the guidelines:

Task:

Only use the td, table, and trelements and the border, cellspacing, and cellpadding attributes in layout tables. Do not use th, tbody, caption, colgroup, tfoot, and thead in layout tables.

The th element is used to create header information for data cells. When the th element is used, user agents and assistive technologies might try to associate the contents of the cell with others in the same column or row. If a user knows the table is used for layout, they can use different navigation strategies to make sense of the table.

Editorial Note: The HTML 4.01 spec seems to preclude using the td element for anything except data. The HTML WG has said that tables are only for data (full stop). We need to solicit HTML WG feedback about this section.

Editorial Note: A discussion was started about what other elements are required, allowed, or forbidden in layout tables (excluding the HTML WG philosophy against layout tables) but further review and comment is needed. Note that in HTML 4 tbody is technically a required element for all tables.

8.3 Summaries of layout tables

Task:

If the summary is used on a layout tables, the value must be null (summary="").

Using a null summary is similar to a null alt-text; the author is indicating that the table is used for presentation purposes.

Editorial Note: There is still not consensus about the ideal use of summaries for tables. A discussion about summaries began but there is still need for more review and comments on this. See also Summarizing tables.

8.4 Linear reading order of tables

This technique relates to the following sections of the guidelines:

Task:

Create a logical reading order of cells in layout tables.

Editorial Note: Instead of providing a linear text alternative, ensure that the table can be linearized.

Tables used to lay out pages where cell text wraps pose problems for older screen readers that do not interpret the source HTML or browsers that do not allow navigation of individual table cells. These screen readers will read across the page, reading sentences on the same row from different columns as one sentence.

For example, if a table is rendered like this on the screen:

 

There is a 30% chance of       Classes at the University  

rain showers this morning,     of Wisconsin will resume   

but they should stop before    on September 3rd. 

the weekend.

This might be read by a screen reader as:

There is a 30% chance of Classes at the University rain showers this morning, of Wisconsin will resume but they should stop before on September 3rd. the weekend.

Screen readers that read the source HTML will recognize the structure of each cell, but for older screen readers, content developers may minimize the risk of word wrapping by limiting the amount of text in each cell. Also, the longest chunks of text should all be in the last column (rightmost for left-to-right tables). This way, if they wrap, they will still be read coherently. Content developers should test tables for wrapping with a browser window dimension of "640x480".

Editorial Note:  See issue 251 for internationalization issue (not much).

Since table markup is structural, and we suggest separating structure from presentation, we recommend using style sheets to create layout, alignment, and presentation effects. Thus, the two columns in the above example could have been created using style sheets. Please refer to the section on style sheets for more information.

It is usually very simple to linearize a table used to layout a page - simply strip the table markup from the table. There are several tools that do this, and it is becoming more common for screen readers and some browsers to linearize tables.

However, linearizing data tables requires a different strategy. Since data cells rely on the information provided by surrounding and header cells, the relationship information that is available visually needs to be translated into the linear table.

For example, specify the column layout order. The natural language writing direction may affect column layout and thus the order of a linearized table. The dir attribute specifies column layout order (e.g., dir="rtl" specifies right-to-left layout).

Editorial Note: also the case for layout tables?

Editorial Note: Provide an example

Editorial Note: again, there are tools to help produce linearized versions of data tables. We will provide a link

This markup will also help browsers linearize tables (also called table "serialization"). A row-based linear version may be created by reading the row header, then preceding each cell with the cell's column header. Or, the linearization might be column-based. Future browsers and assistive technologies will be able to automatically translate tables into linear sequences or navigate a table cell by cell if data is labeled appropriately. The WAI Evaluation and Repair Tools Working Group maintains a list of tools some of which help authors determine if tables will linearize in a readable order. Refer to [WAI-ER].

Quicktest! To get a better understanding of how a screen reader would read a table, run a piece of paper down the page and read your table line by line.

9 Links

This section explains how to create hyperlinks that are compatible and comprehensible to users of assistive technologies.

9.1 Supplement link text with the title attribute

This technique relates to the following sections of the guidelines:

Task:

Where appropriate, use the title attribute of the a element to clarify links.

Editorial Note: We're not sure how the title attribute should relate to the link text.

This technique relates to the following sections of the guidelines:

Use text alternatives for images which are used as links.

When an image is used as the content of a link, specify a text alternative for the image. The text alternative should describe the function of the link.

Example:

This example uses the alt attribute of the img element to describe a graphical link.

 
<a href="routes.html">
   <img src="topo.gif" alt="Current routes at Boulders Climbing Gym" /> 
</a> 				
Example:

If you provide link text, use empty quotes as the alt attribute value of the img element. (e.g.: alt="") Note that this text will appear on the page next to the image.

Editorial Note: Need more clarification that this is null alt-text and not a space? Point to a section in images that describes null alt-text in more detail.

 
<a href="routes.html">
  <img src="topo.gif" alt="" />
  Current routes at Boulders Climbing Gym
</a>

This technique relates to the following sections of the guidelines:

Combine adjacent image and text links that point to the same resource.

Many kinds of links have both a text and iconic link adjacent to each other. Often the text and the icon link are rendered in separate links, in part to create a slight visual separation from each other. Visually they appear to be the same link, but they are experienced by many people as two identical links and can be confusing. To avoid this, some authors omit alternative text from the image, but then there is a link with an unclear destination. The preferred method to address this is to put the text and image together in one link, and provide null alternative text on the image to eliminate duplication of text.

Editorial Note: [#226] We need to make a recommendation about what to do if a text and image link are adjacent to each other but in separate table cells.

Example:

An icon and text link are side by side. The alt text for the image is the same as the text link beside it, leading to a "stutter" effect as the link is read twice.

 
<a href="products.html">
  <img src="icon.gif" alt="Products page" />
</a>
<a href="products.html">
  Products page
</a>
Example:

An icon and text link are side by side. In an attempt to remove the "stutter" the alt text for the image is null. However, now one of the links has an unknown destination.

 
<a href="products.html">
  <img src="icon.gif" alt="" />
</a>
<a href="products.html">
  Products page
</a>
Example:

An icon and text are within the same link. The icon has null alt text and the text beside it describes the link.

 
<a href="products.html">
  <img src="icon.gif" alt="" />
  Products page
</a>

9.4 Link groups

This technique relates to the following sections of the guidelines:

Task:

Group links structurally and identify the group with the title attribute.

Group links via one of the following mechanisms (in descending order of preference):

  • ul or ol

  • div

  • map

When links are grouped into logical sets (for example, in a navigation bar that appears on every page in a site) they should be marked up as a unit. Navigation bars are usually the first thing someone encounters on a page. People who are sighted are often able to ignore navigation parts and start reading the content of the page. Someone using a screen reader must first listen to the text of each link in the navigation bar before reading the interesting content. There are several ways to mark up content so that a user with a screen reader can jump over the navigation bar and avoid reading all of the links.

Although graphical menus and link groups are accessible when alt attributes are used, there are advantages to creating navigation menus that are completely text-based. Graphical text is not easily scalable. The size of graphical text cannot be increased easily by those who may need a larger font. Alternatively, text based menus allow for relative font sizes to be used on menu links. Relative font sizes can be easily increased in most browsers without the use of assistive technology.

Editorial Note: The above paragraph outlines benefits for using text-based navigation. It may be appropriate to expand these ideas into an optional technique in a future draft.

9.5 tabindex to skip link groups (future)

This technique relates to the following sections of the guidelines:

Task:

Use the HTML 4.01 tabindex attribute to allow users to jump to an anchor after the set of navigation links. This attribute is not yet widely supported.

Editorial Note: This creates user agent problems, this technique needs to say don't do it.

9.6 Skipping link groups

This technique relates to the following sections of the guidelines:

Task:

Include a link that allows users to skip over grouped links.

If there are five or more navigation links and/or other content that comes before the main content of the page then the skip navigation technique should probably be used. If there are twenty links and other elements before the main content, one of these techniques definitely should be used. The link should be at or very near the top of the page; it is a link with a local target just before the beginning of the main content.

Editorial Note: Issue 241 describes user agent issues and workarounds for this.

Example:

In this example, the map element groups a set of links, the title attribute identifies it as a navigation bar, tabindex is set on an anchor following the group, and a link at the beginning of the group links to the anchor after the group. Also, note that the links are separated by non-link, printable characters (surrounded by spaces).

 
<map title="Navigation Bar">
  <p>
    [<a href="#how">Bypass navigation bar</a>] 
    [<a href="home.html">Home</a>] 
    [<a href="search.html">Search</a>] 
    [<a href="new.html">New and highlighted</a>] 
    [<a href="sitemap.html">Site map</a>]
  </p>
</map> 
<h1>
  <a id="how" name="how" tabindex="1">How to use our  site</a>
</h1>
<!-- content of page -->

9.7 Hide link groups

This technique relates to the following sections of the guidelines:

Task:

Provide a style sheet that allows users to hide the set of navigation links.

Some designers would prefer not to have the skip link visible to all users. There are several techniques used to hide the skip link.

  • Use an image that otherwise needs no text alternative and place the link text as alt text on that image. When using the tab key the link text will be heard by a screen reader and without a screen reader the href can be observed in the status bar of IE. E.g., <a href="#main"><img src="spacer.gif" width="1" height="1" alt="Skip Navigation"></a>

  • Use the same foreground and background colors on the link text (assume back text on white background in code example). When using the tab key the link text will be heard by a screen reader and without a screen reader the href can be observed in the status bar of IE. It may be useful to consider making the link visible when the mouse is moved over the link or the link receives focus with the tab key.

  • Hide the skip link by positioning it off screen with CSS, e.g., a.skip {position: absolute; left: -1000em; width: 20em;}. When using the tab key the link text will be heard by a screen reader and without a screen reader the href can be observed in the status bar of IE.

Do not hide the skip link using the display property; either display:none or display:hidden. Screen readers will not speak text with display:none and sometimes will not speak text with display:hidden.

9.8 Keyboard access

This technique relates to the following sections of the guidelines:

Task:

Use the accesskey attribute of navigational elements to allow rapid keyboard access.

Keyboard access to active elements of a page is important for many users who cannot use a pointing device. User agents may include features that allow users to bind keyboard strokes to certain actions. HTML 4.01 allows content developers to specify keyboard shortcuts in documents via the accesskey attribute.

Note: Until user agents provide an overview of which key bindings are available, provide information on the key bindings.

Editorial Note: The Protocols and Formats working group has suggested that the accesskey attribute needs to be re-engineered. Threads discussing this are at and .

Example:

In this example, if the user activates Alt + C (in most user agents), the link will be followed.

 
<a accesskey="C" href="doc.html">XYZ company home page</a>
Example:

This example assigns "U" as the accesskey (via accesskey ). Typing the access key modifier plus the key, e.g., Alt + U, gives focus to the label, which in turn gives focus to the input control, so that the user can input text.

 
<form action="submit" method="post">
  <p>
    <label for="user" accesskey="U">name</label> 
    <input type="text" name="user" id="user" />
  </p>
</form>

9.9 Automatic activation of keyboard shortcuts

This technique relates to the following sections of the guidelines: