- Key Takeaways
- Using Negative Text-indent — The Phark Method
- The Scott Kellum Method
- Using Margin — Radu Darvas Technique
- Using Padding — The Langridge Method
- Using Small font-size — The Lindsay Method
- Using Display — Fahrner Image Replacement
- Using Overflow — The Leon Dwyer Method
- Using Absolute Positioning — The Levin Technique
- Using a Bogus Image — Radu Darvas Shim
- Using Actual Image — Phark Method with Inline Image
- Using Clip-path
- Using Pseudo Element — Nash Image Replacement
- Conclusion
- Frequently Asked Questions (FAQs) about CSS Image Replacement
Image replacement in CSS has had a wide and varied history. In this modern age, if you are still looking to do so, there are many image replacement techniques that still work today. It is important to note that some of these could in fact be penalized by Google soon (if not already), so use sparingly. However, you never know when a CMS or project will force you to need to get out the image replacement kit! Here is that historical kit, in what might be the last image replacement technique list you’ll need before the web moves beyond this entirely.
Key Takeaways
- CSS image replacement has a long history and many techniques are still in use today, although some may be penalized by Google for SEO reasons.
- The Phark method, which uses a negative text-indent to move the text outside the browser window, is the most commonly used technique. However, it does not work when the text is right-aligned and can be problematic on older devices.
- The Scott Kellum method improves performance by setting the text-indent to 100%, eliminating the need for the browser to render a large box. The text remains accessible to screen readers with this method.
- The Radu Darvas technique uses large negative margins to force the text outside of the browser window. This method is not as efficient for the browser to perform.
- The Nash Image Replacement technique uses a pseudo element to push the text aside. This method is compatible with Internet Explorer 8 and above.
Using Negative Text-indent — The Phark Method
This is the most common technique that most web developers have used at one point or another. The idea here is to move the text far outside the browser window by setting a large negative text-indent
:
.replace-indent {
width: 264px;
height: 106px;
background: url("assets/logo.png");
text-indent: -9999px;
}
Here is a CodePen demo showing how the heading looks with the text hidden using text-indent
:
See the Pen Image replacement indenting by SitePoint (@SitePoint) on CodePen.
The text is still accessible by screen readers using this method. However, this solution won’t work when the text is right aligned. The browser also needs to render a very large box for our header due to the text-indent
value which can be problematic on very old devices.
The Scott Kellum Method
Instead of setting a large negative text-indent
, you can set it to 100%. This way the browser won’t need to create a large box and the performance will improve. You don’t need any extra markup to use this method. Here is the CSS that you need:
.replace-scott {
width: 264px;
height: 106px;
background: url("assets/logo.png");
text-indent: 100%;
white-space: nowrap;
overflow: hidden;
}
Setting overflow
to hidden
hides the text and whitespace: nowrap
keeps it from moving onto the next line. The text will still be read by screen readers in this method. Here is a demo of this technique:
See the Pen Image Replacement – Scott Kellum Technique by SitePoint (@SitePoint) on CodePen.
Using Margin — Radu Darvas Technique
This technique also forces the text outside of the browser window but uses margins to do so. The idea here is to apply very large negative left margin and give your header a correspondingly large width.
.replace-margin {
width: 2264px;
height: 106px;
background: url("assets/logo.png") top right no-repeat;
margin: 0 0 0 -2000px;
}
Just like the previous case, our logo is used as a background image for the heading. Here is a demo to show how this technique works, first without the margin and then with the margin applied:
See the Pen Image Replacement – Margin Technique by SitePoint (@SitePoint) on CodePen.
If you keep scrolling to the right you will eventually see the background for first heading. In reality, you won’t have to worry about the scrollbar because the large negative margin compensates for the width (as you can see with the second heading). Keep in mind that this method is not as efficient for the browser to perform because the browser has to draw a really large box.
Using Padding — The Langridge Method
This time we push the text outside of our header using the padding-top
property. The property is to be set to a value that is equal to the height of our logo. However, this alone is not enough and we also have to use overflow: hidden
to hide the text.
.replace-padding {
width: 264px;
height: 0;
background: url("assets/logo.png");
padding: 106px 0 0 0;
overflow: hidden;
}
Compared to the previous two methods, this property does a much better job performance wise. It also offers the same level of accessibility as the previous two methods. Below is a demo of this technique, the first heading does not have the padding background, while the second one does:
See the Pen Image Replacement – Padding Technique by SitePoint (@SitePoint) on CodePen.
Using Small font-size
— The Lindsay Method
Another way to hide text is make it very small and set its color to the background of your logo. This works without affecting accessibility but you might face SEO penalties because of the tiny font size and camouflaged color.
.replace-font {
width: 264px;
height: 106px;
background: url("assets/logo.png");
font-size: 1px;
color: white;
}
Here is a demo for this method, the first image without the font-size
fix and the second one with it in action:
See the Pen Image Replacement – font-size Technique by SitePoint (@SitePoint) on CodePen.
You will still face problems if your logo does not have a flat background color to allow perfect blending. In that case, you can set the color to transparent
.
Using Display — Fahrner Image Replacement
Unlike other methods, this one requires you to add some extra markup. The idea here is to wrap your text in a <span>
element and set its display
property to none
. The markup in this case would be:
<h1 class="replace-display">
<span>SitePoint</span>
</h1>
The CSS would be:
.replace-display {
width: 264px;
height: 106px;
background: url("assets/logo.png");
}
.replace-display span{
display: none;
}
Here is a demo with the display
of our <
span>
element set to none
:
See the Pen Image Replacement – Display Technique by SitePoint (@SitePoint) on CodePen.
This method, while easy to implement, results in poor accessibility. This is because elements with display
set to none
are ignored by screen readers. The exact same issue occurs with visibility
set to hidden
so you can’t use that one either. What you can do is set opacity
to 0
. This will hide the element while still keeping it accessible to screen readers.
Using Overflow — The Leon Dwyer Method
We have already used the overflow
property to hide our text after adding some padding. This time we will use just the overflow
property to hide the element completely. Using this technique requires that you wrap your text in a <span>
element just like the previous method. Our CSS this time around looks like so:
.replace-overflow {
width: 264px;
height: 106px;
background: url("assets/logo.png");
}
.replace-overflow span {
display: block;
width: 0;
height: 0;
overflow: hidden;
}
We set the width and height of our span element to zero. This forces the text inside the element to move out of its box. The text is then hidden by the overflow: hidden
property. Here is a CodePen demo illustrating this technique:
See the Pen Image Replacement – Overflow Technique by SitePoint (@SitePoint) on CodePen.
The text is still accessible to screen readers. Hence, there are no accessibility issues.
Using Absolute Positioning — The Levin Technique
This method also requires an additional <span>
element to work. However, the <span>
element is not wrapped around the text but used to position our image. Here is the markup for this method:
<h1 class="replace-position">
<span></span>SitePoint
</h1>
Here is the CSS:
.replace-position {
width: 264px;
height: 106px;
position: relative;
}
.replace-position span {
background: url("assets/logo.png");
width: 100%;
height: 100%;
position: absolute;
}
The demo for image replacement with absolute positioning is visible below:
See the Pen Image Replacement – Absolute Positioning Technique by SitePoint (@SitePoint) on CodePen.
Notice that the width and height are set to 100% to completely cover our header element. The only problem with this technique is that the images you use must be completely opaque. If that’s not the case then users will be able to see the text through your image.
Using a Bogus Image — Radu Darvas Shim
This method also requires a bogus image in addition to our usual <span>
element to work properly. The image is a 1×1 pixel transparent GIF. Its main purpose is to show users the alt text if images are turned off. Here is the markup:
<h1 class="replace-image-span">
<img src="assets/transparent.gif" alt="SitePoint" />
<span>SitePoint</span>
</h1>
This is the CSS that you need to apply:
.replace-image-span {
width: 264px;
height: 106px;
background: url("assets/logo.png");
}
.replace-image-span span{
display: none;
}
The demo below should make it clear how this method works:
See the Pen Image Replacement – Bogus Image Technique by SitePoint (@SitePoint) on CodePen.
Even though the actual text is hidden, screen readers will still be able to read the alt tag. So, this method does not create any accessibility issues. The only problem here is that the <img>
tag is non-semantic and bogus in this case. Moreover, you will see the text two times if both the CSS as well as the images are turned off.
Using Actual Image — Phark Method with Inline Image
This time, we will use an actual image for image replacement. The image has alt text that will be shown when images are turned off. Here is the markup:
<h1 class="replace-image-link">
<img src="assets/logo.png" alt="SitePoint" />
</h1>
The following CSS does the actual replacement:
.replace-image-link {
width: 264px;
height: 106px;
background: url("assets/logo.png");
text-indent: -9999px;
}
The demo below illustrates how this technique works:
See the Pen Image Replacement – Actual Image Technique by SitePoint (@SitePoint) on CodePen.
The image you will see now is not from the <img>
tag but from the background
property. Besides the issue with large negative text-indent that we discussed earlier, this technique does not seem to be good for SEO. One advantage that this technique offers over others is that the image will still be visible with CSS turned off and images kept on but one questions why you wouldn’t just keep the image there on its own…
Using Clip-path
The clip-path
property hides everything that is outside the path specified by you. We can use it to clip our text and hide it. The text will still be accessible to screen readers but would be hidden visually. Here is the markup:
<h1 class="replace-clip-path">
<span>SitePoint</span>
</h1>
This is the CSS that you need to apply:
.replace-clip-path {
width: 264px;
height: 106px;
background: url("assets/logo.png");
}
.replace-clip-path span{
clip-path: polygon(0px 0px, 0px 0px, 0px 0px, 0px 0px);
}
You can change the values of clip-path
to see how the text is being clipped:
See the Pen Image Replacement – clip-path Technique by SitePoint (@SitePoint) on CodePen.
The only problem with this technique is that browser support is not good enough just yet. SitePoint recently published an article on the clip-path
property which discusses the property in much more detail. By the time browser support is ready for this, it’s likely to be unnecessary in most situations as image replacement techniques become redundant.
Using Pseudo Element — Nash Image Replacement
This technique uses a pseudo element to push the text aside. Here is the markup:
<h1 class="replace-pseudo">
SitePoint
</h1>
The following CSS makes this technique work:
.replace-pseudo {
width: 264px;
height: 106px;
overflow: hidden;
}
.replace-pseudo:before{
content: url("assets/logo.png");
}
Here is the demo to show this technique in action:
See the Pen Image Replacement – Psuedo Element Technique by SitePoint (@SitePoint) on CodePen.
The pseudo element pushes the text aside. The text then overflows and is hidden by using the overflow: hidden
property. One issue with this technique is that it only works with Internet Explorer 8 and above.
Conclusion
Each of the techniques I discussed above has its own pros and cons. In general, these aren’t likely to be good for SEO in the near future and if you can avoid using them entirely — now is the time to move beyond these! In an upcoming article here at SitePoint, we will be looking at how the industry is moving beyond these and what current best practice is today. If you have any other techniques that you would like to reminisce over or if you have something else to add regarding the techniques we discussed, please comment below.
Update from PatCat (30/06/2016): The article originally stated that using images in site headers would negatively affect SEO and accessibility. This isn’t true. In fact, the opposite could be true with Google’s potential penalizations for image replacement. I’ve since corrected the article, thank you to the keen eyes of commenters for bringing this to my attention!
Frequently Asked Questions (FAQs) about CSS Image Replacement
What is the concept of CSS Image Replacement?
CSS Image Replacement is a technique used in web development to replace text elements with images. This is often done for aesthetic reasons or to improve the overall user experience. The text is replaced with an image, but it remains accessible to screen readers and search engines, ensuring that the website remains accessible and SEO-friendly. This technique is commonly used for logos and icons, where a high-quality image can enhance the visual appeal of the website.
How does the text-indent method work in CSS Image Replacement?
The text-indent method is one of the most commonly used techniques for CSS Image Replacement. It works by pushing the text off the visible screen using a large negative indent. This leaves space for the background image to be displayed. The text remains accessible to screen readers and search engines, but it is not visible to users. This method is simple and effective, but it has some limitations, such as not working correctly with right-to-left languages.
What are the limitations of the text-indent method?
While the text-indent method is widely used, it has a few limitations. Firstly, it doesn’t work well with right-to-left languages. Secondly, it can cause issues with keyboard navigation as the focus area can be off-screen. Lastly, it doesn’t work well with inline elements, as the text-indent property affects block-level elements.
How does the Phark method work in CSS Image Replacement?
The Phark method, named after its creator, is another technique used for CSS Image Replacement. It involves using a large background image that is clipped using the overflow:hidden property. The text is then pushed off the visible area using negative text-indent. This method works well with both block and inline elements, and it doesn’t cause issues with keyboard navigation.
What is the Leahy/Langridge method of CSS Image Replacement?
The Leahy/Langridge method is a CSS Image Replacement technique that uses a combination of padding and negative text-indent to replace text with an image. This method is more complex than the text-indent or Phark methods, but it has the advantage of working well with right-to-left languages and it doesn’t cause issues with keyboard navigation.
How can I replace an image in an img tag using CSS?
Replacing an image in an img tag using CSS can be done by using the content property in combination with the ::before or ::after pseudo-elements. This allows you to insert content before or after the content of an element. However, this method has limitations as the content property doesn’t work with img, br, and input elements.
Can I replace an image with another image using CSS only?
Yes, you can replace an image with another image using only CSS. This can be done by using the background property to set the new image as the background of the element. The original image can then be hidden using the visibility property or by setting its opacity to 0.
What are the best practices for CSS Image Replacement?
When using CSS Image Replacement, it’s important to ensure that the website remains accessible and SEO-friendly. This means that the text should remain accessible to screen readers and search engines. It’s also important to consider the limitations of each method and choose the one that best fits your needs. Lastly, always test your website in different browsers to ensure that the image replacement works correctly.
Can CSS Image Replacement affect SEO?
If done correctly, CSS Image Replacement should not negatively affect SEO. The text that is replaced with an image remains accessible to search engines, so it can still be indexed and ranked. However, it’s important to use relevant and descriptive alt text for the images to ensure that they can be understood by search engines.
Is CSS Image Replacement still relevant with modern web development techniques?
Yes, CSS Image Replacement is still a relevant technique in modern web development. While there are now other ways to incorporate images into a website, such as using SVGs or icon fonts, CSS Image Replacement remains a useful technique for certain use cases, such as when a high-quality image is needed or when maintaining accessibility and SEO-friendliness is a priority.
Baljeet is a writer and web developer based in India. Although he is a full-stack developer, he is most passionate about things related to the front-end. He has been involved with web development for more than five years now.