Nội dung Text: Pro CSS Techniques- P7

272 CHAPTER 12 ■ STYLING LISTS
■Note In case you’re thinking “Hang on, you’ve replaced one CSS selector of current with five different
contextual selectors . . . and you still need to update the body element. What’s the benefit?” Agreed, on
a small, simple site there may not be a massive benefit to doing this. But like the body style switching tech-
nique, this approach could be used to change a number of different parts of the page, thanks to inheritance,
which would negate the need for making multiple changes in the document. One change higher up the doc-
ument tree can affect multiple child elements. It’s a good way to start thinking about things, and this is
a great—and simple—practical example to start off with.
Styling Definition Lists
So far, we’ve focused on unordered and ordered lists. They are great mechanisms for suggest-
ing hierarchy and collecting together groups of related things, such as a collection of links
used in a header or a simple to-do list. However, these are not the only kinds of lists available
to you in XHTML. There is another, oft-misunderstood list that can be incredibly useful for
suggesting relationships between items: the definition list. You can also do quite a lot with it in
CSS—and after all, isn’t that the purpose of this book?
The basic markup required for a definition list is as follows:
SLR
Abbreviation of Single Lens Reflex
A specific type of camera - one that uses a mirror to display the
exact image to be captured through the viewfinder
SLR cameras are usually used by professional, semi-professional and
hobbyists as they offer greater creative control than a point-and-shoot
camera
The building blocks are
• dl—for definition list
• dt—for definition term
• dd—for definition description
The premise behind the definition list is that a relationship exists between two parts: the
dt contains the item you are referring to, while the content of the dd provides further informa-
tion about or related to that dt element. You can also have multiple dd elements, as our example
shows, and you can even include other block-level elements inside the dd element (in fact, you
could place an unordered list inside the dd). Unfortunately, you cannot place block-level ele-
ments inside the dt element, as much as you might be tempted to. That said, definition lists
have a number of possible practical uses, including
• Schedules for events
• Critiques of goods, hotels, services, etc.
• Descriptions of geographic locations

CHAPTER 12 ■ STYLING LISTS 273
In fact, the list could go on for pages, but we would rather cut to the chase and look at
some of the styling choices you might make.
■Note Some people propose using definition lists for marking up dialogue. Actually, “some people” is the
W3C in this case: “Another application of DL, for example, is for marking up dialogues, with each DT naming
a speaker, and each DD containing his or her words” (www.w3.org/TR/html4/struct/lists.html#h-10.3).
However, despite this sanctioned use, many web standards evangelists think this is not an appropriate use
for the definition list, that in fact the W3C is wrong to suggest this use. Who’s right and who’s wrong? This is
a proverbial can of worms that we won’t open up—it’ll just get messy.
Example 1: Schedule of Events
Take this sample XHTML:
20th August
Beachbuggin - VW meet at Southsea Seafront (all day schedule)
VW Festival Leeds
3rd September
VW Action - Herts County Showground
9th September
Vanfest - Three Counties Showground, Malvern
This (as yet) unstyled definition list would appear as shown in Figure 12-18.
Figure 12-18. An unstyled definition list
In the sample code, we’ve used relative positioning to move the dt where we want it (we
could have chosen a float but that would require the usual float-clearing workarounds).
Because the dd content will take up more vertical space, we’ll apply a border to their left edge
rather than a border to the right edge of the dt element. This helps to separate the two parts
quite effectively:
.schedule dt {
position: relative;
left: 0;
top: 1em;

274 CHAPTER 12 ■ STYLING LISTS
width: 14em;
font-weight: bold;
}
.schedule dd {
border-left: 1px solid silver;
margin: 0 0 0 7em;
padding: 0 0 .5em .5em;
}
This simple transformation can be seen in Figure 12-19.
Figure 12-19. A definition list, styled using positioned dt elements
Example 2: A Critique of Goods
Let’s consider another example: a product critique of some kind. It includes an image and
some text in the dt, with the actual comments in the dd where they should be. Here’s the basic
HTML for this:
Union Jack Chair
What can I say? This is the perfect tool for sitting on ...
The default layout of the definition list isn’t ideal for this, and the image could benefit
from some treatment. Here’s the CSS we need, which includes some simple background
images that are applied to the dt and dd elements, respectively:
.critique dt {
font-size:2em;
font-family:Arial, Helvetica, sans-serif;
clear:left;
border-bottom:1px solid red;
background: url(dt-bg.jpg) repeat-x bottom;
}

CHAPTER 12 ■ STYLING LISTS 275
.critique dt img {
display:block;
border:2px solid black;
float:left;
margin:0 10px 10px 0;
}
.critique dd {
margin:10px 0 60px 0;
border-bottom:2px solid silver;
background: url(dd-bg.jpg) repeat-x bottom;
}
Figure 12-20 shows the effect. Does it look like a definition list now?
Figure 12-20. A more “defined” style
If you’ve determined that the markup you are after for a given purpose is a definition list,
you would do well to check out Russ Weakley’s tutorial on Maxdesign.com (www.maxdesign.
com.au/presentation/definition/index.htm), which includes a gallery of styling options.
Summary
With the humble ordered, unordered, and definition lists, you can create a raft of features on
a web page and style it in CSS to suit almost any whim. It’s no longer a technique that’s exclu-
sive to just a handful of in-the-know web standards snobs with their shiny, up-to-the-minute
browsers—it’s something that enjoys excellent support across current browsers. There is no
excuse for not using lists where a list is the perfect candidate for the job. Simple markup com-
bined with some clever CSS and some nice graphical touches—it’s a winner every time. And
with that, it’s time to look at the oft-uncharted territory of styling for print and other media.

CHAPTER 13
■■■
Styling for Print and
Other Media
I t may come as something of a revelation to people that CSS is not just about presentation of
a web page on a computer screen—that there are ways of controlling layout, colors, and even
the sound of certain parts of your web page for other media. These other uses for CSS may not
be so well known for a few reasons, perhaps reasons that you can identify with:
• The boss (or client) has never requested a media-specific design from you.
• It’s been “on the radar” but has never been investigated because you’ve heard that
browser support is a bit flaky.
• There aren’t enough hours in the day to worry about other media—it’s a challenge just
to get the screen display working cross-browser.
If any of these ring true, then we hope that after reading this chapter you’ll realize that there are
enough goodies to be found in this area to justify spending just a little extra time on style
sheets for other media types. First things first, then: how do you tell the browser, or user agent,
what style sheets to pay attention to and which ones to ignore?
■Note In most cases, when dealing with CSS you’ll hear people referring to the browser, but a web browser
is just one type of user agent, defined as the piece of software that’s used to access the web page. Because
we’re dealing with other media types, you may encounter this slightly less user-friendly term in this chapter.
Introducing Media Types
There are many different media types that you can apply to CSS, some of which are more useful
than others, and they let you specify the look, feel, or sound of the web page that is linked to the
CSS files. In this section, we’ll look at the various media types that are available (as gleaned from
the official source, namely the W3C: www.w3.org/TR/REC-CSS2/media.html#q1). However, rather
than list them all and suggest wonderfully practical ways to use them, we’ll break the list down into
two categories: useful and not-so-useful (read: which ones you’re likely to use on a day-to-day
basis in the foreseeable future and those that you won’t touch in a month of Sundays).
277

278 CHAPTER 13 ■ STYLING FOR PRINT AND OTHER MEDIA
The Useful Media Types
This list includes the media types that you will truly find a use for on regular occasions:
• screen—For color computer screens
• print—For printed versions of the document
• projection—For presentation or kiosk versions of the document (where toolbars are
removed, and the display renders completely full screen)
• all—For styles that are suitable for all devices
■Note Kiosk mode (as mentioned above in the projection media type) is where a computer runs the
software full screen while preventing users from accessing system functions—for example, by hiding
the Taskbar in Windows or file menus.
We’ll be using (or covering briefly) these media types in this chapter’s examples.
The Not-So-Useful Media Types
Remember what we were saying about those media types that you’d never use in a month of
Sundays? Well, here they are, listed for your soon-to-be-ignored pleasure:
• aural—For use with speech synthesizers or talking browsers
• braille—For Braille-tactile feedback devices
• embossed—For paged Braille printers
• handheld—For handheld devices (for example, small-screen PDAs and cell phones)
• tty—For media using a fixed-pitch character grid, such as Teletypes, terminals, or
portable devices with limited display capabilities
• tv—For television-type devices
■Note A Braille-tactile feedback device translates alphabetical characters on screen into the Braille equiv-
alent through a series of “pins” that are raised on the fly. Visually impaired users would normally pass their
fingertips over a page of characters and feel the characters, but in one of these devices, the raised pins
scroll past underneath the user’s fingertips.
We won’t focus on these types because, while the reasoning behind them is good, support
for their usage may be nonexistent. However, we’ll expand on the aural and handheld types in
the section “Style Sheets for Other Media Types” later in this chapter.

CHAPTER 13 ■ STYLING FOR PRINT AND OTHER MEDIA 279
Specifying the Media Type
Next, let’s look at how you can tell the user agent which medium (or media) the styles you are
asking it to render should apply to.
Adding a media Attribute to the link Element
Arguably, the simplest method for linking to a style sheet is to use the link element, like so:
This code tells the user agent that the link is to a style sheet and where it can find the link
(css/mainstylesheet.css). The user agent will then deal with the link however it sees fit. You
can, however, “scope” the use of the CSS contained in that style sheet with the media attribute:
In this example, only devices that will be displaying the content on a large screen will do any-
thing with that style sheet. And where screen is concerned, that pretty much means a PC
(Windows, Mac, Linux, etc.) and a web browser (Firefox, IE, and so on).
Adding a media Attribute to the @import Statement
If you are using the @import method for linking to a style sheet (perhaps to throw older, non-
standards-friendly browsers like Netscape 4 off the scent), you could use the following syntax:
@import url("css/printstylesheet.css") print;
There is a small problem with this approach, however: IE versions 6 and earlier won’t deal
with this syntax (at the time of this writing, IE 7 didn’t understand this construct either), so
you’re probably going to have to use the previous method for linking wholesale to a CSS file.
■Note You can place the @import statement in a style block as shown in the example, or you can embed
that @import statement in another style sheet that is already linked to the document, but the @import
statement must be at the beginning of that style sheet, not after any other CSS selectors.
Adding the Media to Specific Selectors within a Style Sheet
Finally, you can embed some media-specific styles within another style sheet like so:
body {font-size:62.5%;
h1 {
color:red;
}
h2 {

280 CHAPTER 13 ■ STYLING FOR PRINT AND OTHER MEDIA
color:blue;
}
@media print {
h1 {
color:black;
}
h2 {
color:gray;
}
}
Creating a Print Style Sheet
In our experience, the greatest use you’ll have for different media types is with printed output.
There are a few quirks to be aware of (and we’ll cover those), but it’s very well supported in
general and can be put to great use.
We’ve mentioned the various techniques that you can use to link to a style sheet with dif-
ferent media. Our preference is to do the following:
• Create a basic CSS file that contains generic visual styles that are understood by most
browsers. Avoid CSS layout and anything that could be considered intermediate-to-
advanced CSS. This CSS file is attached to the document using a link element but
without specifying any media type whatsoever.
• Create a second style sheet that is used for more advanced screen styles and use the
@import statement embedded in the basic.css file to attach it. Netscape 4 won’t see this
advanced file, but other newer browsers will.
• Create a print-only style sheet and attach it using the link element with media="print".
■ Note You should declare the print style sheet last (link to it even after any block
inside the HTML page). If you declare the print style sheet first, you could undo any values set there in the
subsequent generic style sheets if they are not scoped for screen or some other medium.
Translating that English into markup, we get this in the document:
Simple print test

CHAPTER 13 ■ STYLING FOR PRINT AND OTHER MEDIA 281
and in the basic CSS file:
@import url("advanced.css");
What Do You Put in a Print CSS File?
There are not any real hard-and-fast rules about what should or shouldn’t go into a print CSS
file. However, let’s take a moment to consider some of the characteristics of the printed format.
Keep in mind that in print you can’t do the following:
• Click on navigation items to take you to another piece of paper
• Conduct a search or carry out a calculation
• Zoom in or out on a map or resize text using a text widget of some kind
• “E-mail this story to a friend”
• Scroll the page
• Send feedback
What you can do with print CSS is almost the reverse of the previous list:
• Hide all navigation elements that are no longer any use
• Hide search facilities or other interactive form elements
• Hide controls that affect on-screen display
• Hide links that spawn some browser or application functionality
In fact, anything that you can click on or interact with on screen may need some kind of
alternative treatment for print. Examples include hiding the element entirely or removing
some display attribute that no longer works in the printed format (for example, removing
underlines in body text links).
■Note In most browsers, you do not need to be too concerned about dealing with background images that
appear on screen; they are usually set not to print by default and, as such, are unlikely to need any special
print-only treatment. One exception is Opera, which will print backgrounds out by default (or at least it does
in versions 8 and 9 that we tested), but this can easily be unset in the File ➤ Print Options menu. If you have
a sufficient number of Opera users, you might want to override background images for given elements, for
example, body {background-image:none;}, so that users do not have to specify this for themselves—
but it’s not a major consideration that you need to worry about.

282 CHAPTER 13 ■ STYLING FOR PRINT AND OTHER MEDIA
Resetting Layout
One of the first things you should consider with a print layout is resetting any layout mecha-
nisms you’ve used for the screen view. This involves removing floats, absolute positioning,
padding, and margins. You may want to go through each element and create a print alterna-
tive for each, but that may take time. We suggest using the old “sledgehammer-to-crack-a-nut”
approach: apply several styles to several different elements in one go, and then deal with the
exceptions.
Our travel web site is a good example that we can now prep for print. First things first; let’s
link to the necessary CSS files:
TravelGo.com - Getting you there since 1972
Here’s the first part of the print CSS for this site. As you can see, we list all the elements
that have been manipulated in one way or another and then reset the CSS back to basics:
body, div, img, h1, h2, h3, ul, ol, li, a, form {
position:static;
float:none;
padding:0;
margin:0;
}
This won’t fix all the problems for the print view, mainly because of specificity reasons
(remember reading about that as far back as Chapter 3?). Some of the rules in the main style
sheet have a higher specificity and so, despite our redefinitions in the print CSS, the generic
styles previously declared are more specific. So, we’ll need to add some selectors to target
those elements and they must have the same (or greater) specificity (see the additions in
bold):
body, div, img, h1, h2, h3, ul, ol, li, a, form,
div#breadcrumb,
div#header,
body#cols3 #content-wrapper {
position:static;
float:none;
padding:0;
margin:0;
}

CHAPTER 13 ■ STYLING FOR PRINT AND OTHER MEDIA 283
■Note We are resetting some, but not all, values that were specified in the advanced style sheet. That
advanced style sheet was imported but had no media type specified. The style sheet will therefore automati-
cally apply to any medium, and what we’re doing here is overriding some styles for print.
Another approach is to create two link elements in the document head: one that links to a screen CSS file
with the media="screen", and the second file to the print CSS file. The problem with this approach is that
the print view is starting from scratch as it sees none of the styles applied for screen. You end up having to
come up with new styles. In our experience, it’s easier to take the main style sheet (by not applying a media
type) and then reset the layout aspects for print as required.
Hiding Navigation and Other Interactive Elements
The next step is to identify what parts of the page can be removed entirely from print. In the
travel site, it would be the parts shown in Figure 13-1.
Figure 13-1. Navigation areas that have little use for print
If we hide these elements, we’ll be left with just the page logo, the breadcrumb trail (which
we suggest be left in for print as it is an orientation device as much as it is a navigation device),
and the page content. It would have been easier, of course, to hide the header area as a whole,
but that would also cause the site branding to disappear. Therefore, we’ve suggested picking
out specific elements to hide and ones that should remain in the printout. To hide these cho-
sen elements, we can simply apply one rule as follows:
#headerlinks, #headersearch, #tablinks, #navigation, #related, #footer {
display:none;
}
With the layout aspects reset and all superfluous navigation items hidden, we end up with
the results shown in Figure 13-2 (which shows a print preview in Firefox). The print preview
facility is not always a perfect rendering of how it will appear on the printed page (there can be

284 CHAPTER 13 ■ STYLING FOR PRINT AND OTHER MEDIA
some quirky bugs), but it’s a great way of testing your printed page without wasting reams and
reams of paper before you get it just right. Internet Explorer on Windows also offers a preview
that you can access from the File menu.
Figure 13-2. A simpler document for print, but still some issues to correct
Correcting Minor Issues Inherited from the Screen Style Sheet
A closer look at Figure 13-2 reveals some slight issues. These issues result from our decision to
apply generic rules to a wide range of elements and our expectation that everything will work
out of the box—which does not always happen. In the example, a height applied to the h1—
which was there solely for the purpose of creating space for the reflected background image
underneath the logo text—is adding unnecessary whitespace; the breadcrumb trail items
could also benefit from additional space between them. A couple of tweaks added to the print
CSS file will correct these issues:
h1 {
background:none !important;
height:33px !important;
}
#breadcrumb ul li ul li {
padding-left:14px !important;
}
■Note In general, for print CSS files you should specify measurements using cm, mm, or em rather than px
(pixels are for screen display), particularly where fonts, margins, and padding are concerned. However, we’ve
specified pixels in our tweaks as they relate directly to images that are also expressed in terms of pixels.

CHAPTER 13 ■ STYLING FOR PRINT AND OTHER MEDIA 285
So, how are we doing with the print-only makeover? Figure 13-3 shows the progress so far,
but as with many things in life there’s still room for further refinements if you make the effort.
Figure 13-3. The final result? There’s always more to do!
Tips for Even Better Printed Pages
Our previous example showed a simple printout that you can achieve by resetting certain CSS
properties and redefining others. There is more that you can do to improve matters, though:
• Use serif fonts. Because of the low resolution that monitors provide, and the fact that
a large number of users do not have something like ClearType (www.microsoft.com/
typography/cleartype/tuner/Step1.aspx) enabled, small-sized serif fonts often look poor
on screen—there simply aren’t enough pixels available to render all the little flourishes (or
serifs) at the ends of letters. It’s no mistake that a large number of web sites use sans-serif
fonts (such as Verdana, Arial, and Helvetica) on screen; the lack of serifs makes them eas-
ier to render and thus easier to read. On screen. For the printed version, though, you can
quite easily use a serif font, such as Georgia or Times New Roman. Serif fonts provide
extra shape to the letters and can often help distinguish among similar-looking charac-
ters; the serifs also create an implied horizontal line that’s supposed to aid readability.
• If you’ve lost background images for print, you might be able to work around this by
including an inline image that is hidden in the main style sheet (give it a unique id so
that you can reference it) with a display:none but is made visible in your print CSS file
using display:block or display:inline. The downside is that you are including an
image that, for the vast majority of users, will not be seen but will still get downloaded
to the client. If that’s something that concerns you (and it probably depends on how big
the image is), you could use CSS-generated content to dynamically write in the image—for
example, in the print style sheet, div.offer:after {content: ""}. But remember that IE 7 and earlier won’t pay any attention to
that code. Certainly, the former technique enjoys better support.

286 CHAPTER 13 ■ STYLING FOR PRINT AND OTHER MEDIA
• Bullet points missing? In the previous chapter, we suggested that applying background
images was the best method for creating custom list item symbols. When you print
them, though, the images won’t show. For that reason you should redefine the display for
print so that the image is attached using list-style-image (or simply remove the cus-
tom bullet styles altogether and go with the basic styles that the browser would apply).
• Provide special offers for printouts. While the browser will, by default, print information
such as the date, URL, and page number, you can add custom information for the printed
version. As an example, if on our travel site you found the perfect vacation and printed out
the details, you could include a print-only section on how to make a booking. This sec-
tion might include a telephone number and a reference number, while the screen view
would instead display a link to the e-commerce section of the site to make an online
booking.
This is just a small selection of ideas that you can almost certainly expand on
depending on the nature of the web site that you run or maintain. Once again, A List
Apart has some excellent ideas about the topic in the articles “CSS Design: Going to Print”
(http://alistapart.textdrive.com/articles/goingtoprint) and “Designing for Context
with CSS” (http://alistapart.textdrive.com/articles/designingforcontext).
Things to Watch Out For
With a little care and attention, you can create web pages that perfectly suit the printed
medium. Yet be aware that there are some things you need to take into account.
Checking Your Page Width
If you have defined a width for your page using pixels, you will need to redefine that for print
using a real-world measurement such as centimeters, millimeters, or inches. Be sure to allow
for the fact that the printer your site visitor is using may not be able to print right up to the edges.
If you take a US letter or A4 sized piece of paper, measure its width, then take off a couple of
centimeters or a quarter inch from either side, that should give you a printable page width.
Printing Errors with CSS Positioning
If you have reset all the positioning properties as suggested earlier in this chapter, you will
probably not run into difficulties. However, be sure to try printing a web page with a lot of
content—a page that you would expect to run into several printed pages—to make sure that
the entire web page prints. Using floats and absolute position can affect the printout, result-
ing in only the first page getting printed. If this happens, double-check the CSS for the
container of the content that is being “clipped” and ensure that you have set float:none and
position:static.
■ Note In case you’re wondering “What’s that static value? And why haven’t we heard about it before?”
it’s because that’s the browser’s default positioning model. You would not normally need to set this your-
self—we only have to do this to get around a known printing problem.

CHAPTER 13 ■ STYLING FOR PRINT AND OTHER MEDIA 287
Getting Feedback About Your “Funny Printouts”
Despite all your hard work, someone is bound to ask, “Why does your page not print out
properly?” Many users expect that what they see on screen will be replicated in the printout.
Remember that you can use print CSS itself to address the issue (e.g., perhaps a block of text
that reads “This page has been crafted for perfect printing...” that is hidden on screen but set
as display:block for the printed version).
An alternative method is to use generated content using the :after pseudo-attribute,
which is covered in Chapter 3 and Appendix A. However, as previously mentioned, the support
for this is still not there (keep in mind that IE 7 and earlier do not support this feature).
Advanced Print CSS Techniques
Hiding and showing or restyling content dependent on the medium is fairly straightforward
stuff once you’ve grasped the basics. In this section, we’ll examine some more advanced fea-
tures that introduce some extra dynamics into the usually static world of print. This is where
browser support can get a little flakier, though, so be sure to treat these as “nice-to-haves”
rather than as essential features that must be available to all browsers.
Inserting URLS in Printed Pages
The great thing about reading a web page with links is that when you see an underlined
phrase you can click on that link and immediately investigate another avenue. With that page
printed out, you have no way of following that link, so you have a couple of choices:
• Suppress the underline (or any other link styling, such as bold text) for print so that it
doesn’t get in the way needlessly; there’s no point signifying a link that can’t be followed.
• Choose the opposite route—instead of hiding the link styling, expand on it and dynam-
ically create a printed version of the web address (whatever is in that link’s href attribute).
The latter is definitely doable, but it requires some slightly advanced CSS (not supported
by IE 7 or earlier) or a JavaScript solution.
Using Generated Content to Write Out the URL
Here is the basic CSS that does the job of writing out links on the page (be sure to add this only
to the print CSS file):
a:after {
content: " (" attr(href) ") ";
}
This code tells the browser to get the value of an attribute (the href attribute, as detailed
in the parentheses) and then place that value in a string that begins and ends with parenthe-
ses. If you are familiar with JavaScript, it’s equivalent to
" (" + this.getAttribute('href') + ")"
but there is no concatenation symbol such as + or &. In this example HTML:

288 CHAPTER 13 ■ STYLING FOR PRINT AND OTHER MEDIA
Building Flickr Applications with PHP
it would render on the printed version like so:
Building Flickr Applications with PHP
(http://www.apress.com/book/bookDisplay.html?bID=10079)
■ You probably wouldn’t want every link on the page to get this treatment, so you may want to scope it
Tip
by using a contextual selector, for example #bodycontent a:after {content: " (" attr(href) ")
";}.
Using JavaScript and the DOM to Write Out the URL
Because of the flaky support for this, you can turn to JavaScript and the Document Object
Model (DOM) to do the same thing. The following script accomplishes these goals:
• Looks through the document and finds all links
• Gets the href attribute from each link and adds it to a new span element that is created
on the fly
• Adds the new span into the link
function findLinks()
{
var el = document.getElementsByTagName("a");
for (i=0;i

CHAPTER 13 ■ STYLING FOR PRINT AND OTHER MEDIA 289
#bodycontent a span {
display:none;
}
@media print {
#bodycontent a span {
display:inline;
}
}
You can see the result in Figure 13-4.
Figure 13-4. The top part shows the screen rendering; the bottom shows the content revealed for
the printout.
This is a fairly simple script to address the issue, but it works. However, you can do a lot
better than this. When looking at a block of content, a long URL directly after the text can
make it a little difficult to read, regardless of the benefit offered by having the reference there.
Wouldn’t it be great if you could simply create a footnote from each link and just place a num-
ber after the link that references the footnote link? Well, you can thank Aaron Gustafson for
devising a JavaScript technique that does just that, all ready for you to download and imple-
ment (http://alistapart.textdrive.com/articles/improvingprint).
Selective Printing Using the DOM and CSS
One final advanced technique that you might like to consider is mixing together DOM script-
ing and CSS to create specific printable areas of a page. An example of how this works is a FAQ
page that contains many blocks of content. You might want to print only one section of that
page; by using JavaScript you can dynamically toggle display attributes of different sections so
that only the part you want printed is shown—but without affecting the screen view.
This is a fairly involved technique, which is covered thoroughly (a chapter in its own right!)
in Web Standards Creativity by Cameron Adams et al. (friends of ED, February 2007), although
you can also read about the technique online on my personal blog (http://lloydi.com/blog/
2006/03/21/how-to-print-selective-sections-of-a-web-page-using-css-and-dom-scripting-2/).

290 CHAPTER 13 ■ STYLING FOR PRINT AND OTHER MEDIA
Style Sheets for Other Media Types
As we mentioned at the beginning of this chapter, the support for other media types is very
spotty indeed, and what you can do with it is severely limited. Because this book is all about
providing practical advice that works in the real world, we won’t explore all the various CSS
property values that you can use with audio style sheets (it’s highly unlikely that such a discus-
sion would be of use to most readers), but we’ll look at a few media types.
The Projection Media Type
Another media type that does have a modicum of support is projection. As far back as version 4,
Opera has supported this type, but what does it do? Projection is intended for use with presentation
versions of a web page; all browser toolbars and the like are removed, and the information is
presented in full screen. A good example is S5 (http://meyerweb.com/eric/tools/s5/), a web
page–based presentation format that CSS guru Eric Meyer devised and which is used by many
web standards advocates throughout the world. In Opera you trigger the Projection mode by choosing
View ➤ Full Screen. The example HTML that follows shows how you might create content that
appears only when viewed in this full-screen mode:
Projection test
.projection-only {
display:none;
}
@media projection {
.projection-only {
display:block;
}
}
Can you see anything below?
Well howdi y'all!
If you have a copy of Opera, try it out—it works! But you will probably find it an interesting
idea for all of a few seconds. Firefox and IE will not render the projection content when viewed
in full-screen mode, so you have to ask yourself: What benefit can you get from using this?

CHAPTER 13 ■ STYLING FOR PRINT AND OTHER MEDIA 291
The Aural Media Type
With the aural CSS properties, you should be able to control the pitch, speed, tone, and other
attributes for speech-synthesized versions of the web page to great effect, but support for this is
very much lacking. To date, we’ve only seen (or rather heard) one good application of this: a plug-
in for Firefox called Firevox, which is definitely worth downloading (http://firevox.mozdev.org/
installation.html) and checking out to see what should be possible with this technology. You
can find out more about the various CSS aural properties and values at the W3C (www.w3.org/
TR/REC-CSS2/aural.html), or for a simpler example try the W3Schools introduction to this topic
(www.w3schools.com/css/css_ref_aural.asp).
The Handheld Media Type
Another example of “great in theory, but almost useless in practice,” the handheld media type
is perfect for specifying styles that can be used for a cell phone–based browser, Blackberry, or
similar device. However, the mobile market (phones in particular) are almost a law unto them-
selves and have devised various strategies for rendering web pages in the struggle to gain
a competitive edge. At http://css-discuss.incutio.com/?page=HandheldStylesheets you’ll
find a quote that pretty much sums up the sorry state of handheld support:
Some current phones apply “screen” styles as well as “handheld” styles, others ignore both,
and in some cases the phone carrier runs pages through a proxy that strips styles out even
if the phone could recognize them, so it’s a crapshoot figuring out what will get applied.
So, all bets are off! It’s good to be aware that the media type exists and what its intended
use is, but, seriously, don’t waste effort in trying to design a slick interface for a given handheld
device and expect it to honor only your handheld styles and ignore the screen styles—and cer-
tainly don’t expect the next handheld to do the same!
The All Media Type
The all media type is pretty much superfluous. If you want a style sheet to be rendered on all
devices, you may just as well not set a media type at all and let the device, browser, or user
agent work it out for itself.
Summary
The ability to create specific style sheets for different media seems, on the face of it, to be
a very powerful tool. However, in practice you are limited in what you can do. It seems a shame
to end on a sour note, but we hope the things that you can do with the print medium more
than make up for the rest. Now, if only the mobile market could decide on a standard and stick
with it, we could do great things with those devices just as we can with the printed medium.
Well, we can hope—and a good place to start is with Blue Flavor’s presentation on mobile web
design, which can be found at www.blueflavor.com/presentations/DesigningforMobile.pdf.
We’ve covered a lot of ground in the preceding chapters. You may well have mastered nearly
everything there is to know about CSS except, perhaps, for one thing: what happens when things
don’t go as planned? In the next chapter we’ll look at techniques for identifying where and why
things go wrong and, more importantly, what you can do to put things right again.