Home How do I give text or an image a transparent background using CSS?
Reply: 23

How do I give text or an image a transparent background using CSS?

Stijn Sanders
Stijn Sanders Published in 2009-04-30 09:00:02Z

Is it possible, using CSS only, to make the background of an element semi-transparent but have the content (text & images) of the element opaque?

I'd like to accomplish this without having the text and the background as two separate elements.

When trying:

p {
  position: absolute;
  background-color: green;
  filter: alpha(opacity=60);
  opacity: 0.6;

span {
  color: white;
  filter: alpha(opacity=100);
  opacity: 1;
  <span>Hello world</span>

It looks like child elements are subjected to the opacity of their parents, so opacity:1 is relative to the opacity:0.6 of the parent.

KesaVan Reply to 2014-03-30 08:31:18Z

Either use a semi-transparent PNG image or use CSS3:


Here's an article from css3.info, Opacity, RGBA and compromise (2007-06-03).

Community Reply to 2017-05-23 10:31:36Z

Opacity of background, but not the text has some ideas. Either use a semi-transparent image, or overlay an additional element.

Peter Mortensen
Peter Mortensen Reply to 2011-05-25 11:14:45Z

The problem is, that the text actually HAS full opacity in your example. It has full opacity inside the p tag, but the p tag is just semi-transparent.

You could add an semi-transparent PNG background image instead of realizing it in CSS, or separate text and div into 2 elements and move the text over the box (for example, negative margin).

Otherwise it won't be possible.


Just like Chris mentioned: if you use a PNG file with transparency, you have to use a JavaScript workaround to make it work in the pesky Internet Explorer...

Peter Mortensen
Peter Mortensen Reply to 2011-05-25 11:17:40Z

A while back, I wrote about this in Cross Browser Background Transparency With CSS.

Bizarrely Internet Explorer 6 will allow you to make the background transparent and keep the text on top fully opaque. For the other browsers I then suggest using a transparent PNG file.

Community Reply to 2017-05-23 12:10:41Z

It's better to use a semi-transparent .png.

Just open Photoshop, create a 2x2 pixel image (picking 1x1 can cause an Internet Explorer bug!), fill it with a green color and set the opacity in "Layers tab" to 60%. Then save it and make it a background image:

<p style="background: url(green.png);">any text</p>

It works cool, of course, except in lovely Internet Explorer 6. There are better fixes available, but here's a quick hack:

p {
    _filter: expression((runtimeStyle.backgroundImage != 'none') ? runtimeStyle.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src='+currentStyle.backgroundImage.split('\"')[1]+', sizingMethod=scale)' : runtimeStyle.filter,runtimeStyle.backgroundImage = 'none');
Slipp D. Thompson
Slipp D. Thompson Reply to 2017-05-23 11:54:59Z

In Firefox 3 and Safari 3, you can use RGBA like Georg Schölly mentioned.

A little known trick is that you can use it in Internet Explorer as well using the gradient filter.

background-color: rgba(0, 255, 0, 0.5);
filter: progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr='#7F00FF00', EndColorStr='#7F00FF00');

The first hex number defines the alpha value of the color.

Full solution all browsers:

.alpha60 {
    /* Fallback for web browsers that doesn't support RGBa */
    background: rgb(0, 0, 0) transparent;
    /* RGBa with 0.6 opacity */
    background: rgba(0, 0, 0, 0.6);
    /* For IE 5.5 - 7*/
    filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000);
    /* For IE 8*/
    -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000)";

This is from CSS background transparency without affecting child elements, through RGBa and filters.

Screenshots proof of results:

This is when using the following code:

     <meta http-equiv="X-UA-Compatible" content="IE=edge" >
    <title>An XHTML 1.0 Strict standard template</title>
     <meta http-equiv="content-type" content="text/html;charset=utf-8" />
    <style type="text/css" media="all">
         .transparent-background-with-text-and-images-on-top {
             background: rgb(0, 0, 0) transparent;   /* Fallback for web browsers that doesn't support RGBa */
            background: rgba(0, 0, 0, 0.6);   /* RGBa with 0.6 opacity */
             filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000);  /* For IE 5.5 - 7*/
            -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000)";  /* For IE 8*/

     <div class="transparent-background-with-text-and-images-on-top">
         <p>Here some content (text AND images) "on top of the transparent background"</p>
        <img src="http://i.imgur.com/LnnghmF.gif">

Ruslan López Carro
Ruslan López Carro Reply to 2015-03-30 20:45:51Z

This is the best solution I could come up with, NOT using CSS 3. And it works great on Firefox, Chrome and Internet Explorer as far as I can see.

Put a container DIV and two child DIVs in the same level, one for content, one for background. And using CSS, auto-size the background to fit the content and put the background actually in the back using z-index.

    .container {
      position: relative;
    .content {
      position: relative;
      color: White;
      z-index: 5;
    .background {
      position: absolute;
      top: 0px;
      left: 0px;
      width: 100%;
      height: 100%;
      background-color: Black;
      z-index: 1;
      /* These three lines are for transparency in all browsers. */
      -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";
      filter: alpha(opacity=50);
      opacity: .5;
<div class="container">
  <div class="content">
    Here is the content.
    <br />Background should grow to fit.
  <div class="background"></div>

Peter Mortensen
Peter Mortensen Reply to 2011-05-25 11:28:36Z

Here is a jQuery plugin that will handle everything for you, Transify (Transify - a jQuery plugin to easily apply transparency / opacity to an element’s background).

I was running into this problem every now and then, so I decided to write something that would make life a lot easier. The script is less than 2 KB and it only requires 1 line of code to get it to work, and it will also handle animating the opacity of the background if you like.

Community Reply to 2017-05-23 12:26:38Z

Almost all these answers assume the designer wants a solid color background. If the designer actually wants a photo as the background the only real solution at the moment is JavaScript like the jQuery Transify plugin mentioned elsewhere.

What we need to do is join the CSS working group discussion and make them give us a background-opacity attribute! It should work hand in hand with the multiple-backgrounds feature.

Slipp D. Thompson
Slipp D. Thompson Reply to 2016-02-06 11:17:21Z

This method allows you to have an image in the background and not only a solid color, and can be used to have transparency on other attributes such as borders. No transparent PNG images are required.

Use :before (or :after) in CSS and give them the opacity value to leave the element at its original opacity. Thus you can use :before to make a faux element and give it the transparent background (or borders) you want and move it behind the content you want to keep opaque with z-index.

An example (fiddle) (note that the DIV with class dad is just to provide some context and contrast to the colors, this extra element is actually not needed, and the red rectangle is moved a bit down and to the right to leave visible the background behind the fancyBg element):

<div class="dad">
    <div class="fancyBg">
        Test text that should have solid text color lets see if we can manage it without extra elements

with this CSS:

.dad {
    background: lime; border: 1px double black; margin: 1ex 2ex;
    padding: 0.5ex; position: relative; -k-z-index: 5;
.fancyBg {
    border: 1px dashed black; position: relative; color: white; font-weight: bold;
    z-index: 0; /*background: black;*/
.fancyBg:before {content:'-'; display: block;
    position: absolute; background: red; opacity: .5;
    top: 2ex; right: -2ex; bottom: -2ex; left: 2ex;
    /*top: 0; right: 0; bottom: 0; left: 0;*/
    z-index: -1;

In this case .fancyBg:before has the CSS properties you want to have with transparency (red background in this example, but can be an image or borders). It's positioned as absolute to move it behind .fancyBg (use values of zero or whatever is more appropriate for your needs).

DragonBear Reply to 2013-01-08 20:00:39Z

background-color:rgba(255,0,0,0.5); as mentioned above is the best answer simply put. To say use CSS3, even in 2013, is not simple because the level of support from various browsers changes with every iteration.

While background-color is supported by all major browsers (not new to CSS3) [1] the alpha transparence can be tricky, especially with Internet Explorer prior to version 9 and with border color on Safari prior to version 5.1. [2]

Using something like Compass or SASS can really help production and cross platform compatibility.

[1] W3Schools: CSS background-color Property

[2] Norman's Blog: Browser Support Checklist CSS3 (October 2012)

Touhid Rahman
Touhid Rahman Reply to 2013-05-20 23:36:50Z

CSS3 has an easy solution of your problem. Use:


Here, rgba stands for red, green, blue and alpha value. Green value is obtained because of 255 and half transparency is obtained by 0.5 alpha value.

Peter Mortensen
Peter Mortensen Reply to 2016-04-11 18:54:35Z

You can solve this for Internet Explorer 8 by (ab)using the gradient syntax. The color format is ARGB. If you are using the Sass preprocessor you can convert colors using the built-in function "ie-hex-str()".

background: rgba(0,0,0, 0.5);
-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#80000000')";
Peter Mortensen
Peter Mortensen Reply to 2016-04-11 18:55:46Z

If you are a Photoshop guy, you can also use:

 #some-element {
  background-color: hsla(170, 50%, 45%, 0.9); // **0.9 is the opacity range from 0 - 1**


#some-element {
  background-color: rgba(170, 190, 45, 0.9); // **0.9 is the opacity range from 0 - 1**
Peter Mortensen
Peter Mortensen Reply to 2016-04-11 18:57:20Z

You can use pure CSS 3: rgba(red, green, blue, alpha), where alpha is the level of transparency you want. There is no need for JavaScript or jQuery.

Here is an example:

    background:rgba(192.233, 33, 0.5)
Peter Mortensen
Peter Mortensen Reply to 2016-04-11 18:59:43Z

There is a trick to minimize the markup: Use a pseudo element as the background and you can set the opacity to it without affecting the main element and its children:



Relevant code:

p {
  position: relative;
p:after {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: #fff;
  -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";
  opacity: .6;
  z-index: -1;
/*** The following is just for demo styles  ***/

body {
  background: url('http://i.imgur.com/k8BtMvj.jpg') no-repeat;
  background-size: cover;
p {
  width: 50%;
  padding: 1em;
  margin: 10% auto;
  font-family: arial, serif;
  color: #000;
img {
  display: block;
  max-width: 90%;
  margin: .6em auto;
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed a ligula ut nunc dignissim molestie.
  <img src="http://i.imgur.com/hPLqUtN.jpg" alt="" />

Browser support is Internet Explorer 8 and later.

  • pseudo elements
  • opacity
premgowda Reply to 2014-11-18 11:05:59Z
<div align="center" style="width:100%;height:100%;background:white;opacity:0.5;position:absolute;z-index:1001">
    <img id="search_img" style="margin-top:20%;" src="../resources/images/loading_small.gif">


Peter Mortensen
Peter Mortensen Reply to 2016-04-11 19:00:31Z

There's an easier solution to put an overlay over an image on the same div. It's not the right use of this tool. But works like a charm to make that overlay using CSS.

Use an inset shadow like this:

box-shadow: inset 0 0 0 1000px rgba(255, 255, 255, 0.9);

That's all :)

Peter Mortensen
Peter Mortensen Reply to 2016-04-11 19:01:24Z

If you're using Less, you can use fade(color, 30%).

Pushp Singh
Pushp Singh Reply to 2016-06-03 12:09:42Z

In order to make the background of an element semi-transparent but have the content (text & images) of the element opaque. You need to write css code for that image and you have to add one attribute called opacity with minimum value. e.g.

   position: relative;
   background-color: cyan;
  opacity: 0.7;

// lesser the value more will be transparency, ore the value less will be transparency.

Vijay Sharma
Vijay Sharma Reply to 2016-12-29 09:40:00Z

You can use RGB color with opacity like this color code in RGB (63,245,0) and add opacity like (63,245,0,0.5) and also add RGBA replace RGB. A use for opacity


Cengkuru Michael
Cengkuru Michael Reply to 2017-02-11 08:00:03Z

I normally use this class for my work. Its pretty good.

.transparent {
  filter: alpha(opacity=50); /* internet explorer */
  -khtml-opacity: 0.5;      /* khtml, old safari */
  -moz-opacity: 0.5;       /* mozilla, netscape */
  opacity: 0.5;           /* fx, safari, opera */

Alireza Reply to 2017-10-20 02:41:59Z

You can use RGBA (red, green, blue, alpha) in the CSS, something like this:

So simply do something like this gonna work in your case:

p {
  position: absolute;
  background-color: rgba(0, 255, 0, 0.6);

span {
  color: white;
You need to login account before you can post.

About| Privacy statement| Terms of Service| Advertising| Contact us| Help| Sitemap|
Processed in 0.406667 second(s) , Gzip On .

© 2016 Powered by mzan.com design MATCHINFO