Insight
Display Text on Web Pages With Flash
By Jonathan Snook et al
Excerpted from The Art & Science Of CSS (SitePoint)
Dateline: June 6, 2007
Discuss this in the Web design forum
There are almost as many techniques for image replacament as there are Web developers. The concept behind all these image replacements tricks is that the text normally displayed by HTML is hidden and replaced by an image. This means that any user with a CSS-enabled browser will see the replaced text, but the user agents that don't support CSS will just see the plain text
One major downside of image replacement is that it requires a lot of manual labor.
Every heading that you want to include on a site has to be created in Photoshop, cut up,
saved as an image, and included in your CSS.
If you’re creating content regularly, this work can become very time consuming;
sometimes it’s just impossible. Imagine a site that has a content management system
with multiple authors, none of whom have access to—let alone know how to use—a
graphics program. It’s simply not feasible to have someone there just to create image-replaced
headings.
But what if you had a system that automatically created nice headings, in a typeface of
your choice, without you having to do anything to the HTML? That would be heaven. And
there is such a system: sIFR.
Scalable Inman Flash Replacement is now in its second version (with a third already in
beta) and, after being around for a couple of years, is rock solid. You’ll need to download
some source files from the sIFR homepage in order to get it going. Don’t worry, I’ll wait around while you download it.
sIFR works like this: you include a JavaScript file on your pages that scans for headings,
copies the text from inside those headings, and uses that text inside a Flash object that
replaces the HTML text. The Flash object contains the font you want, so the text is
automatically formatted the way you want it, and you don’t have to do any customization
work. sIFR also scales the Flash object appropriately to fill the same amount of space that
the HTML text occupied, so your text replacement will be the same size.
Technically, the HTML text isn’t replaced, it’s just hidden, so the text remains fully
accessible. If Flash isn’t available, the sIFR JavaScript detects that and leaves the page
untouched; if JavaScript isn’t turned on, the page will remain in its normal state. This way
users see nice headings if their browsers allow it, but if their browsers don’t handle these
headings, they degrade to perfectly readable text.
For a beautiful example of sIFR, take a look at the Noodlebox site. Noodlebox’s
introduction text and other headings all use a custom typeface that reinforces its identity
and also produces a more refined design, as can be seen below.

The next illustration shows the result when sIFR
is unavailable, due to the user’s lack of
either Flash or JavaScript. The HTML
text acts as a backup and provides an
approximation of the designer’s real
vision. It’s a win–win situation! Those users
who have Flash and JavaScript reap
the benefits; those without are none the
wiser.

Supplying Basic Markup and CSS
It’s more likely with Flash replacement than with image replacement that some of your
users will experience the degraded version, so you should pay careful attention to the
styles that they will see if Flash and JavaScript are turned off.
Let’s imagine that the font we’d really like to use for our h1 headings is Cooper Black, but
we know that not many people have that on their computers. Instead, we’ll have those
users view our headings in Georgia, or some similar serif font:
flash-replacement.css (excerpt)
h1 {
color: #06C;
font-size: 250%;
font-family: Georgia, serif;
line-height: 1.45em;
}
Note: sIFR can be affected by extra whitespace inside your HTML tags. For code readability, I normally write my HTML like this:
<h1>
Going to the snow!
</h1>
The actual HTML text is on a new line and indented one more tabstopthan the tag itself. However, with sIFR,
that whitespace that appears before the HTML text will produce a one-character space at the beginning of the
Flash replacement—not good! To use this technique, you’ll need to code your HTML as follows:
<h1>Going to the snow!</h1>
No spaces, no worries. The basic page looks like the illustration below.
Time to make it all Coopery!
Supplying the Typeface
The quest to allow Web users access to a wider range of fonts on HTML pages has been
regularly thwarted by patchy browser implementations and the legalities of sharing
typefaces. sIFR circumvents these limitations by embedding a particular typeface inside
a Flash file. In order to use a particular font on your site, you have to open up the special
sIFR Flash template and create a new .swf file that copies the font from your computer.
It’s really easy to do this. As shown below, we just open up sifr.fla, select the text
object on the stage (the one that says “Do not remove this text”), and change its font to
the one we need. Then, when we publish that movie as a .swf, it will contain all the data
needed to reproduce the headings in that font.

Don’t have the IDE? Never fear, multiple repositories of precompiled sIFR .swfs are available on the Internet,
giving those users without the Flash IDE a wide range of fonts to choose from In fact, one of them happens to
be maintained by an author of this book!
You should generally call your .swf files by the fonts that they include, so that you can
identify them easily later. As we’ve just created a .swf for the Cooper Black font, we could
call the .swf file cooper_black.swf. Once we have this .swf, it’s ready to be included on the web page.
Customizing the JavaScript
There’s one script file that we need to include on the web page, and that’s sifr.js—you’ll
find it in the package you downloaded from the official sIFR site. To start out, it just needs
to be inserted in the head of your page:
flash-replacement.html (excerpt)
<script type="text/javascript" src="scripts/sifr.js"></script>
You’ll need to take a look inside the JavaScript file to configure the file specifically for the
site. You don’t need to be concerned with most of it—it’s 11KB of tricky Flash detection
and DOM manipulation—but right at the bottom you’ll see these few lines:
If (typeof sIFR == “function" && !sIFR.UA.bIsIEMac)
{
sIFR.setup();
}
Don’t remove any of that code; you’ll have to insert some of your own code in order to
indicate which headings you want to replace and what you want to replace them with:
scripts/sifr.js (excerpt)
if(typeof sIFR == “function" && !sIFR.UA.bIsIEMac)
{
sIFR.setup();
sIFR.replaceElement(named({sSelector: “h1",
sFlashSrc: “flash/cooper_black.swf", sBgColor: “#FFFFFF",
sColor: “#0066CC", sWmode: “transparent"}));
}
sIFR.replaceElement specifies a replacement rule that you want sIFR to apply. You can have
as many of these as you like, each effecting a different type of element. The function takes a
number of arguments that effect the display of the Flash replacement. There are a few of these arguments, but the named ones you’ll use most often are:
- sSelector
sSelector is the CSS selector defining element(s) that you wish to replace. It uses a
simplifi ed CSS syntax, allowing you to select elements using the CSS selectors “#”, “>”,
and “.”, as well as the whitespace descendant selector. If you select multiple elements
be sure to separate them with commas: “,”.
- sFlashSrc
sFlashSrc defines the location of the Flash movie you want to use to replace the text.
This file determines the font you’ll be using for your Flash replacement.
- sBGColor
sBGColor defines the background color you wish to use for the Flash replacement.
- sColor
sColor defines the color of the text in the Flash replacement.
- sWmode
sWmode defines the Window mode of the Flash replacement object. It allows you to set
the transparency of the movie, and can be specifi ed either as transparent or opaque. In
transparent mode, sBackgroundColor will be ignored and the movie background will be
transparent. In opaque mode the background color will be displayed. Some browsers
have trouble displaying transparency; in such cases sWmode will fall back to the opaque
mode. Just in case, make sure you set a background color even if you choose to use
transparent mode, so that you won’t be caught out in this situation.
You can supply to the function any of a number of other arguments, which will control
everything from text transformation to alignment and padding. If you wish to read about
them, the best place to look
is in the documentation
that comes with the sIFR
package.
Once that replacement rule
has been added to the end
of the sifr.js file, it will
perform that replacement
when the page loads.
Using the rule above,
our page would look like the illustration below.
You’ll notice that the heading is now shown twice. The upper display is the Flash
replacement, the lower is the HTML text. They’re both displayed simultaneously because
we haven’t yet included any of the special sIFR CSS.
Including the CSS
Inside the sIFR package is a CSS file called sIFR-screen.css, which we should include if we
want the Flash replacement headings to display properly. This CSS hides any HTML text
that has been replaced by Flash, so we don’t see the double display as shown above. Once
we include this file, the page should look like the next illustration.
Tweaking the CSS
sIFR-screen.css contains several default rules for h1 to h5 elements that help to determine
the dimensions of the Flash replacements. In order to understand how you should use
these rules, you need to understand how sIFR does its job and how fonts relate to one
another.
You saw above that the Flash replacement and the HTML text are different
lengths when displayed side by side. This discrepancy arises as a result of the fact that
the font used in the Flash replacement differs from that used in the HTML, and because
different fonts have different character metrics (including width, spacing, and so on).
This difference in length becomes a particular problem when a line of text starts to wrap
onto the next line. If the HTML text isn’t wrapping but the Flash text is, sIFR will shrink
the size of the Flash text so that it fits onto one line. This means that the size of the Flash
replacement may be inconsistent, depending upon the number of characters in the HTML
text. Conversely, if the HTML text is wrapping when the Flash text isn’t, then the sIFR will make the Flash characters really big in order to fill the space taken by two lines of HTML
text. If the metrics of the Flash text don’t match the metrics of the HTML text, the size
of the Flash text will become variable for different character lengths. Compared with the
previous figures, the Flash text below is smaller.

In order to let you pre-empt this potential problem, sIFR applies a class to the HTML
element to let you know when Flash has been detected: sIFR-hasFlash. You know that once this class has been applied
the HTML text will be replaced by Flash, so
you can tweak the text properties of the HTML
to match the properties of the Flash text,
achieving the same character heights, linelengths,
and so on.
In order to ensure our Cooper Black Flash text
displays at the same length as our Georgia
HTML text, we can modify the letter-spacing,
giving the Georgia font a bit more space
between characters to stretch it out:
.sIFR-hasFlash h1 {
letter-spacing: 0.142em;
}
To see your tweaked HTML text alongside the Flash replacement, comment out the style near the top of sIFR-screen.css that applies to the sIFRalternate class, like so:
/*
span.sIFR-alternate {
…
}
*/
When you examine the comparison below, you’ll notice the heading lengths are
almost identical:
As you can see below, with proper metric adjustment of the HTML text, Flash
replacement maintains consistent sizing through varying character lengths and multiple
lines.
Once you’ve tweaked the metrics to cause the headings to appear exactly as you want,
remember to add visibility: hidden to the rule, so that the user doesn’t see the HTML text
being distorted while the Flash replacement performs its calculation:
sIFR-screen.css (excerpt)
.sIFR-hasFlash h1 {
visibility: hidden;
letter-spacing: 0.142em;
}
After you’ve implemented all these changes for your particular font, you can sit back and
relax. sIFR will now automatically change any h1s on your pages to Cooper Black without
your having to lift a finger.
sIFR is superb for headings that require a unique typeface. However, it lacks the flexibility
of image replacement. You can’t distort the text, apply image masks, or make any other
radical changes to the text beyond what Flash can normally do to text.
The other disadvantage to sIFR is that it can be a little resource-intensive. If you have a
number of Flash-replaced headings on your page, the calculation time can weigh down
page loading and affect the responsiveness of your interface. For that reason it’s a good idea
to use it sparingly and not apply it to large slabs of body text.
sIFR can also replace links, but you do lose some natural link functionality simply by
way of the link being in Flash. Right-clicking the link won’t bring up the normal browser
context menu; mousing over the link won’t indicate where it will lead. So, as with
anything that could impact on usability, use sIFR carefully and with full knowledge of the
consequences.
|