- From: Charles Pritchard <chuck@jumis.com>
- Date: Wed, 25 Apr 2012 13:58:17 -0700
- To: public-webapps-ui@w3.org
This is a note on <audio controls>, a modern UI widget introduced in HTML5 and its implementation in IE and WebKit. Other widgets, such as <select> were introduced long ago. Through improved CSS support, we're able to style old element appearances though that styling may not carry forward to the element when it is active. With <select> we can do something like: <select style="-webkit-appearance: none;" />. This "hides" the toggle arrow typically seen in select and lets us do more customization of the select presentation. We're still not able to style the <option> menu of <select> beyond the basics of background and text. So, let's consider <select> as the old way. The new way can be seen with <audio controls>. 1. Exposing the full API. The actions of the <audio> element are pretty well exposed to the scripting environment. This allows authors to create their own "controls" implementation and simply use the <audio> tag. We can do something similar with <select> by hiding the tag and using stock HTML and ARIA, of course. That's a big part of why ARIA came about. 2. Exposing sub-element styling The components of the <audio> element can be styled using pseudo-selectors in WebKit. They are lengthy, but each UI element inside of the audio tag can be changed, example: audio::-webkit-media-controls-volume-slider-container { background: blue; } 3. Allowing partial implementations. This is one is most similar to traditional input elements. An <audio controls> item may simply spawn a new window or controller which blocks the visible UI. That's one of the benefits of native tags, they can degrade gracefully or otherwise be enhanced through user preferences. As for best practices that come from this, I've learned a few things: 1. Pseudo-selectors are difficult to predict. The Web Components project may help standardize this process. There is no standard saying that the <audio> element should have a volume slider, or that the slider should be in a particular position in the element. Still, what we have with WebKit lets us do a lot. We can transform widgets, change colors, we can even draw over them with <canvas>. 2. Keyboard events are important and somehow still get neglected. Until recently, the <audio> tag didn't receive focus in WebKit. One would have to do something like this: <button onclick="audio.pause()" tabindex="-1"><audio tabindex="0" controls /></button>. The audio tag still does not respond well in WebKit to keyboard events. For a good contrast, take a look at IE. In IE9, one could focus, and use arrow keys to skip ahead as well as change the volume. Microsoft's keyboard events seem to work quite well. In some sense, they set a standard for keyboard events. Left and right scan through the audio file in increments, up and down change volume, space and enter pause. 3. Element appearance should be flexible to height width and scale. WebKit's pseudo-selectors work pretty well. We can't change the position of elements but we can hide them with display none and we can draw over them with Canvas. We know their height in proportion to the host element. We know width scales with the timeline filling the extra room and we know that the play button and the volume buttons span the timeline area. We can estimate that WebKit will, at some point, allow <audio controls> with very narrow widths. They are currently allowed but result in play and volume buttons overlapping each other. It seems reasonable that the play button would take priority. Currently, authors have to handle the situation manually through the use of pseudo-selectors. We've already seen with <input type="checkbox" /> that implementations can be very uneven when it comes to behaving well with CSS height and width. It's fortunate that we have some tools at our disposal to work around these issues in some native implementations. One final note on scaling: bitmaps matter. Both Chromium and IE teams have noticed that their play and volume buttons become pixelated when the element is enlarged. That's because they're using simple bitmaps and they assumed smaller sizes. The first response to fix this was to create larger bitmaps. This allows the implementation to adapt, showing a higher resolution image when the element is larger. It's likely that vector graphics will also be used in future releases. So we'll see bitmaps (PNG) in use when the size of the element is small, say around 50 pixels in height, and we'll see vector (SVG) when the elements are larger, maintaining quality. In the meantime, with WebKit, authors can apply fixes , if they're up for the work. -Charles
Received on Wednesday, 25 April 2012 20:58:40 UTC