Monday 6 January 2014

The progress element

The progress HTML element was introduced in HTML5 and is used to represents the completion progress of a task. Typically it is displayed as a progress bar but this can be overridden so is up to the web developer.

Developers should make sure it is associated with a label element, especially when the label is not immediately preceding it. To support older browsers that don't support the progress element, a textual description of the progress can be included within the element.

At the time of writing this article, support is pretty good for desktop with the exception of requiring at least IE10, mobile support isn't fantastic though.

Determinate vs indeterminate

Two types of progress bars can be used: determinate, where a completion percentage can be reported; or indeterminate, where progress is being made but the completion percentage is unknown.

A progress bar is determinate when the value attribute is set. The position helper attribute returns the completion percentage of the progress bar (ie. value / max).

A progress bar is indeterminate when no value attribute is specified, it can also be explicitly defined by specifying value="-1". Note that the position attribute will return -1 for an indeterminate progress bar.

progress vs meter

The progress element should not be used to represent a gauge, such as disk usage or a test score. The meter element should be used in this case. The progress element differs from the meter element in that it is only used to represent the progress of a task.

Usage

Determinate progress bar

<progress value="0" max="100">0%</progress>

Indeterminate progress bar

<progress>0%</progress>

Styling

CSS-Tricks has a great article by Pankaj Parashar on some advanced styling of the progress element. Unfortunately, currently styling is different for different browsers.

You target determinate progress bars using progress[value] and indeterminate ones with progress:not([value]), then use browser-specific pseudo-elements (which can be viewed in the shadow DOM) to style the different parts.

See the Pen The <progress> element by Daniel Imms (@Tyriar) on CodePen

Here is a more advanced example of progress bar displayed as a pie chart for WebKit-based browsers. Unfortunatley transform:rotate(attr(value deg)); doesn't work yet so it will be difficult to use this for a progress bar that isn't static.

See the Pen The <progress> element #2 by Daniel Imms (@Tyriar) on CodePen

Further reading

Read more on the progress element from the following sources: