How to replace inline text with images using CSS
I would like to replace the text ("Word 1 Word2 Word3 Word4") in the following HTML with images using CSS. I would like the images to be displayed horizontally just like text.
<div id="aSentence">
<p>
<span id="word1">Word1  </span>
<span id="word2">Word2  </span>
<span id="word3">Word3  </span>
<span id="word4">Word4  </span>
</p>
</div>
I've read and tried a couple of methods from mezzoblue and some other sites, but my conclusion is that these methods seem to require the text spacing to be surrounded by some type of element that will cause the words to not line up horizontally.
Any ideas on how I can achieve this goal? I would like (if possible) to make the solution "available" for firmwares, etc.
Thanks a
lot , Prembo.
PS: I tried to implement some of these methods - none of them worked as expected: TextReplacement.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
<title>Text Replacement by Image using CSS</title>
<style type="text/css" title="currentStyle" media="screen">
@import "TextReplacement.css";
</style>
</head>
<body id="bodyId">
<div id="centerContainer">
<h1><span>Comparison of Various Techniques</span></h1>
<p class="noteText">(NOTE: only text "Word1" is being replaced by image)</p>
<div id="mainBodyContainer">
<div class="techniqueContainer">
<h2>Technique 1: FIR</h2>
<ul id="t1List">
<li id="t1w1"><span>Word1. </span></li>
<li id="t1w2"><span>Word2. </span></li>
<li id="t1w3"><span>Word3. </span></li>
<li id="t1w4"><span>Word4. </span></li>
</ul>
<p class="techniqueComment">Word 1 and corresponding image disappear completely.</p>
</div>
<div class="techniqueContainer">
<h2>Technique 2: Radu</h2>
<ul id="t2List">
<li id="t2w1"><span>Word1. </span></li>
<li id="t2w2"><span>Word2. </span></li>
<li id="t2w3"><span>Word3. </span></li>
<li id="t2w4"><span>Word4. </span></li>
</ul>
<p class="techniqueComment">All disapppear completely.</p>
</div>
<div class="techniqueContainer">
<h2>Technique 3: Rundle</h2>
<ul id="t3List">
<li id="t3w1"><span>Word1. </span></li>
<li id="t3w2"><span>Word2. </span></li>
<li id="t3w3"><span>Word3. </span></li>
<li id="t3w4"><span>Word4. </span></li>
</ul>
<p class="techniqueComment">No effect - image and text visible.</p>
</div>
<div class="techniqueContainer">
<h2>Technique 4: Leahy/Langridge</h2>
<ul id="t4List">
<li id="t4w1"><span>Word1. </span></li>
<li id="t4w2"><span>Word2. </span></li>
<li id="t4w3"><span>Word3. </span></li>
<li id="t4w4"><span>Word4. </span></li>
</ul>
<p class="techniqueComment">Image appears above Word1.</p>
</div>
<div class="techniqueContainer">
<h2>Technique 5: Dwyer</h2>
<ul id="t5List">
<li id="t5w1"><span>Word1. </span></li>
<li id="t5w2"><span>Word2. </span></li>
<li id="t5w3"><span>Word3. </span></li>
<li id="t5w4"><span>Word4. </span></li>
</ul>
<p class="techniqueComment">Word 1 and corresponding image disappear completely. Same as Technique 1.</p>
</div>
<div class="techniqueContainer">
<h2>Technique 6: Jason</h2>
<div id="t6List" class="borderContainer">
<span id="t6w1">Word1. </span>
<span id="t6w2">Word2. </span>
<span id="t6w3">Word3. </span>
<span id="t6w4">Word4. </span>
</div>
<p class="techniqueComment">Same as Technique 3 - Rundle.</p>
</div>
</div>
</div>
</body>
</html>
And the CSS file: TextReplacement.css
* {
margin: 0;
padding: 0;
}
body {
margin: 0;
padding: 0;
font-family: verdana, "trebuchet MS", helvetica, sans-serif;
}
#centerContainer {
margin-left: auto; /* centres container */
margin-right: auto; /* centres container */
margin-top: 18px;
}
#mainBodyContainer {
width: 900px;
margin-left: auto;
margin-right: auto;
margin-bottom: 20px;
font-size: 1.8em;
font-weight: bold;
}
#mainBodyContainer h2{
font-size: 1.2em;
font-weight: bold;
font-style: italic;
color: green;
}
div.techniqueContainer{
text-align: center;
margin-bottom: 30px;
}
p.techniqueComment{
font-size: 0.5em;
font-weight: normal;
font-style: italic;
color: red;
}
p.noteText{
font-size: 1em;
font-weight: normal;
font-style: italic;
color: blue;
}
#mainBodyContainer ul{
list-style: none;
border: 1px solid #820000;
}
#mainBodyContainer ul li{
display: inline;
}
/* TECHNIQUE 1: FIR */
li#t1w1 {
width: 250px;
height: 61px;
background-image: url(http://stackoverflow.com/content/img/so/logo.png);
}
li#t1w1 span {
display: none;
}
/* TECHNIQUE 2: Radu */
li#t2w1 {
width: 2250px;
height: 61px;
background: url(http://stackoverflow.com/content/img/so/logo.png) top right;
margin: 0 0 0 -2000px;
}
/* TECHNIQUE 3: Rundle */
li#t3w1 {
width: 250px;
height: 61px;
background: url(http://stackoverflow.com/content/img/so/logo.png);
text-indent: -9999px;
}
/*TECHNIQUE 4: Leahy/Langridge. */
li#t4w1 {
width: 250px;
padding: 61px 0 0 0;
height: 0;
background: url(http://stackoverflow.com/content/img/so/logo.png) no-repeat;
overflow: hidden;
}
/*TECHNIQUE 5: Dwyer. */
#t5{
}
#t5List{
list-style: none;
border: 1px solid #820000;
}
#t5List li{
display: inline;
}
li#t5w1 {
width: 250px;
height: 61px;
background-image: url(http://stackoverflow.com/content/img/so/logo.png);
}
li#t5w1 span{
display: block;
width: 0;
height: 0;
overflow: hidden;
}
/* TECHNIQUE 6: Jason */
li#t6w1 {
}
#t6w1{
text-indent: -5000px;
background: url(http://stackoverflow.com/content/img/so/logo.png) no-repeat 0 0;
overflow: hidden;
}
a source to share
It's easy:
span {text-indent: -5000px; background: url(../images/yourimage.jpg) no-repeat 0 0; overflow: hidden;}
Try it. you will see that it works.
Whatever you do, DO NOT USE JAVASCRIPT to achieve this effect. too easy in CSS
You can also select an unordered list:
<ul>
<li>word</li>
...
</ul>
ul {list-style-type: none; margin: 0; padding: 0;}
li {list-style-type: none; float: left;}
a source to share
Did you mean to keep the HTML as is, but show an image instead of text? If so, it can be done like this:
#word1 {
display:block;
width:100px; /* width of image */
height:80px; /* height of image */
background:url(image.jpg) top left no-repeat; /* sets image as background of span */
text-indent:-999999px; /* this hides the text so the image is not obstructed */
}
Now the text remains and is SEO optimized, but it can look impressive with fancy images.
a source to share
Hi, I prepared a test page about a year ago on this issue, but I am linking this just for interest due to the fact that it triggers the soup tag plus may face the "images disabled" issue. Its pure CSS.
Update: It is intended for repeated images, so it is not a single slice replacement method.
a source to share
What's your original idea? What do you want to achieve? If you want to show images to your visitors, just use a tag IMG
and attach words to the attribute ALT
.
Otherwise, if these images are really not content, but part of the presentation layer, I'm afraid you have chosen the wrong markup. SPAN
have no meaning. You will prefer to choose an unordered list, which you can design however you wish.
Edit
Ok, as per your answer, you really need a presentation level solution. You can choose the standard CSS2 property text-shadow
for the drop shadow effect. It works in Safari, Opera and Konqueror, and for other browsers you can use some JavaScript .
( SPAN
is a simple container element that you can style.)
a source to share
One technique that I have used with great effect is to essentially pull the text out of the display area. Not sure if it has a name and it always requires sewing, but essentially this:
height: {someHeight};
line-height: {someHeight x 3};
overflow: hidden;
letter-spacing: -1.1em; /* roughly */
The first line leaves the height for the element, the second pushes the text past that height (font size depends, x3 is just a good starting point), the third hides it from the display, and the last core blocks are the width of the text.
a source to share
I personally prefer the Rundle text-indent technique because it is simple and elegant with no extra markup. If you change the mapping to inline-block it will work for you. For browsers that don't support inline block use one of the methods here: http://blog.mozilla.com/webdev/2009/02/20/cross-browser-inline-block/ (also check the comments, there are some more there simple sentences). I agree with @Jason that making a complex solution to this just for people with css enabled and images disabled is probably overkill.
a source to share