3. Embedding Images and Media
Few websites are solely
textual, and most both decorate the theme of the site with graphical
elements and embed images and media into the body of the content. As you
might imagine, the watchword for doing this for the mobile variant of
your site is efficiency: Graphics can represent a significant part of
the overall download size of a page, and because each requires a
separate request to be fetched from the server, graphics can exacerbate
the effect of latency in the mobile network.
It's advisable to keep the
number of images in your overall page template to a minimum: perhaps a
logo, a gradient fill, and a few icons. Graphical elements that appear
on each and every page should ideally be cached, so make sure the web
server is specifying a liberal expiry time for such images.
For images within the content of
the site (such as illustrations accompanying articles, images in blog
posts, and the like), common sense should also prevail to give your
users a good experience. Don't use excessively high resolutions for your
images: Although desktop browsers (and some mobile browsers) easily
resize a large image if its dimensions exceed the boundary, you can
waste valuable bandwidth in getting redundant extra pixels to the mobile
device. You may also want to provide highly compressed versions of
photos — using JPEG format, in particular — that mobile devices can
download quickly, even if the quality is slightly degraded. As for
placement within the text, the usage of floating or inline images is
somewhat riskier than simply having full-width images between
paragraphs. Device support for CSS {float:}
rules is erratic, and you probably want to use the full width of the
screen to make the image as discernable as possible anyway.
With images in mobile
sites, you typically need to understand the characteristics of the
target device. Whether it is a logo across the header of the site or an
inline image inside the body of a page, it is important to know what the
width of the screen is, in particular.
Screen dimensions are a vital
part of a good mobile device characteristics database, and you should be
able to key their values off the user-agent header that arrives in the
HTTP request (or the mobile plug-in will do it automatically for you).
Some mobile browsers also provide their screen dimensions explicitly in
the headers: Microsoft Windows Mobile devices use the UA-pixels header
(although its values are sometime wildly inaccurate).
Knowing the physical dimension
of the screen hardware of a device is only a start though. If you are
placing an image in an article, for example, you probably want to
provide a margin around it that matches that given to the adjacent text.
Figure 5
shows an embedded image perfectly sized for the physical screen of an
Apple iPhone (320 pixels wide), but which, with the page's default
padding of 8 pixels, runs off the right side of the screen. First, this
looks bad as it is, but the device now renders a page wider than its
screen. On the iPhone, the browser responds to this by introducing a
horizontal scroll bar (as shown in Figure 6). This is likely to be disconcerting when the user is scrolling down the article and it "plays" from side to side.
An image that takes the
padding and margins of the containing layout into account looks much
nicer and eliminates any horizontal scroll issues the browser might
introduce. In Figure 7, the same image has been reduced to 304 pixels in width (which is the physical screen minus 8 pixels on each side).
But on a rotatable touch-screen device, of course, you immediately have a new problem. When viewed in landscape mode, as in Figure 8, it is the other dimension of the device that becomes the constraint or target.
When faced with these
various dimension-related challenges, you must decide how much work you
want your web server to do to address them and how much you expect of
the device. Will your web server be emitting images perfectly scaled to
the dimensions you need for each type of device and each possible
rotation? Are these scaled on the fly (and presumably cached)? Do you
have vast directories of preprocessed images? If your images are hosted
on another service, such as Flickr, how do you rescale them?
Or should you simply send a
standard resolution of the image to the device, hoping that the browser
can rescale it appropriately? Or explicitly set image scaling in the
embedding markup, using <img> width and height attributes or CSS {width:} and {height:} rules — and hope that the fidelity of the image does not suffer too much?
All of these techniques may
have a role to play. Relying on the device to rescale images is
certainly an option if the target devices are known to be capable smart
phones with fast connections and good graphics acceleration: You can
send overly high-resolution images that the device can scale down and
decide that the increased download time and client-side rescaling
overhead are tolerable. And using conditional CSS is one of the easiest
ways to rescale images for dealing with screen rotation.
But on the whole,
experience would suggest that server-side manipulation of images is
ultimately unavoidable. Some older devices will struggle badly with the
memory overhead of receiving a large image, let alone then having to
scale it — and the responsiveness of the scaling and page rendering
suffers badly as a result.
3.1. Other Media
You can assume that all
mobile devices can support most image formats on a page. You can also
assume that support for any other sort of embedded media is highly
variable.
Embedded video is feasible on
some devices, but the exact nature of its delivery is itself a
challenge. Apple devices don't support Flash, for example, so trying to
embed a classic YouTube video player into a page targeting that device
(and indeed many mid- and low-end devices) is fruitless. If delivery of
video is critical for your website, it's probably advisable to use image
thumbnails that, when clicked, download a video file or start a stream,
rather than trying to embed them in-line to the page. It is still
important to know which video formats, frame rates, codecs, and so on
are supported by each of your target devices, and this is important
information that you can gather from mobile device capabilities
databases.
Flash — or at least on mobile,
Flash Lite — is installed on a large number of devices worldwide and is
available as a plug-in for mobile browsers. However, it is very rare to
see mobile websites using Flash extensively and deliberately, perhaps
because of the well-publicized lack of support for it in Apple's iconic
iPhone device.
The Scalable Vector Graphics
(SVG) standard is supported on many device operating systems and is a
viable option for embedding and displaying line art (such as diagrams or
maps) in a mobile page. However, native support in desktop browsers has
been slow in coming, so few desktop websites use SVG extensively.
Mobile developers may be wary of relying on SVG for their mobile medium
alone.
Support for code-based
elements in pages, such as Java applets or Microsoft ActiveX objects,
should be considered non-existent on mobile devices — although,
fortunately, these are little used on contemporary websites anyway.