Implement RGBA() colors for modern web browsers

!!! See update version »»» (CANVAS Free version)

I tried to implement rgba to see if I can get it work, unfortunately I had encountered these issues:

  • Internet Explore 6+ won't render rgba() and doesn't accept rgba()as valid backgound-color
  • Firefox 2.0- and Opera 9.21- does not understand rgba(), too
  • Safari 2.0+ seems to work well with rgba()

Apparently, I need to do some hacks for Firefox 2, Opera 9 and IE6+.

For Internet Explorer, I found that I can use Alpha Component which seems to a very little known by many developers.

"In many cases, color is expanded to include the Alpha component (#AARRGGBB) in the Internet Explorer 5.5 filters."

Alpha Component seems to be great for Internet Explorer to render any hex colors with any opacity.

Also, it came to my mind that I can use gradient filter for any block elements with hasLayout and all I need to do is to set both the start and end colors for gradient to be the same color.

Here's what the sample CSS codes for IE may look like:

<style> .element{ /*color = black, opacity = 0.6 */ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000,endColorstr=#99000000); /*AARRGGBB*/ zoom: 1 } </style>

Now we're done with IE, then we can hack Firefox and Opera

Since both Firefox and Opera do support CANVAS, I planed to use an abstract CANVAS component to generate a Base 64 encoded translucent image then apply this image to the background.

In order to do this, I use a method toDataUrl() supported by both Fire and Opera to get the uri of background-image

Here's what the sample CSS codes for Firefox and Opera may look like:

.element{ /*color = black, opacity = 0.6 */ background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAGElEQVQYlWPkYOZ6xkAEYCJG0ahC6ikEAJ/nAQ92k8jOAAAAAElFTkSuQmCC); }

Note that Firefox 3 will start to support rgba() or maybe newer versions of Opera will do, too. So I do check the DOM support for rgab() before I start to hack a browser

var p_useRGBA = false; try { p_useRGBA = document.createElement('var'); //Firefox2-, Opera 9.02- will return empty string //IE will throw an Error for invalid assignment of background-color p_useRGBA.style.backgroundColor = 'rgba(255,255,255,1)' ; p_useRGBA = !!p_useRGBA.style.backgroundColor; }catch(err){ p_useRGBA = false ;}; alert( p_useRGBA );

Finally, I've got my little JavaScript library done, which is compatible and tested with IE6, IE7, Safari 2.0+, Firefox 2.0, Opera 9.21+

Just feel free to use or extend it or you can simply grab my static HTML example.

Cheers!

Hedger Wang

Examples

consectetuer adipiscing elit. S

switch backgroud color

m dolor sit amet, consectetuer adipiscing elit. Suspendisse varius ante vitae nunc. Nam interdum tortor id risus vehicula elementum. Cras sollicitudin diam. Vivamus iaculis iaculis dui. Morbi venenatis eros ut nisl. Aliquam ornare ullamcorper urna. Maecenas mauris lacus, cursus et, feugiat et, aliquet sed, nibh. Nullam vitae dui. Mauris dapibus. Curabitur eu ipsum.Fusce semper imperdiet risus. Pellentesque tortor turpis, rutrum fringileptos hymenaeos. Cras pede. Vestibulum lobortis commodo sem. Cras id elit sagittis ligula vulputate ornare. Integer justo lorem, volutpat non, m nec, auctor in, nisl. Nunc odio. Vivamus tincidunt scelerisque dia

consectetuer adipiscing elit. S

switch backgroud color

m dolor sit amet, consectetuer adipiscing elit. Suspendisse varius ante vitae nunc. Nam interdum tortor id risus vehicula elementum. Cras sollicitudin diam. Vivamus iaculis iaculis dui. Morbi venenatis eros ut nisl. Aliquam ornare ullamcorper urna. Maecenas mauris lacus, cursus et, feugiat et, aliquet sed, nibh. Nullam vitae dui. Mauris dapibus. Curabitur eu ipsum.Fusce semper imperdiet risus. Pellentesque tortor turpis, rutrum fringileptos hymenaeos. Cras pede. Vestibulum lobortis commodo sem. Cras id elit sagittis ligula vulputate ornare. Integer justo lorem, volutpat non, m nec, auctor in, nisl. Nunc odio. Vivamus tincidunt scelerisque dia

consectetuer adipiscing elit. S

switch backgroud color

m dolor sit amet, consectetuer adipiscing elit. Suspendisse varius ante vitae nunc. Nam interdum tortor id risus vehicula elementum. Cras sollicitudin diam. Vivamus iaculis iaculis dui. Morbi venenatis eros ut nisl. Aliquam ornare ullamcorper urna. Maecenas mauris lacus, cursus et, feugiat et, aliquet sed, nibh. Nullam vitae dui. Mauris dapibus. Curabitur eu ipsum.Fusce semper imperdiet risus. Pellentesque tortor turpis, rutrum fringileptos hymenaeos. Cras pede. Vestibulum lobortis commodo sem. Cras id elit sagittis ligula vulputate ornare. Integer justo lorem, volutpat non, m nec, auctor in, nisl. Nunc odio. Vivamus tincidunt scelerisque dia

consectetuer adipiscing elit. S

switch backgroud color

m dolor sit amet, consectetuer adipiscing elit. Suspendisse varius ante vitae nunc. Nam interdum tortor id risus vehicula elementum. Cras sollicitudin diam. Vivamus iaculis iaculis dui. Morbi venenatis eros ut nisl. Aliquam ornare ullamcorper urna. Maecenas mauris lacus, cursus et, feugiat et, aliquet sed, nibh. Nullam vitae dui. Mauris dapibus. Curabitur eu ipsum.Fusce semper imperdiet risus. Pellentesque tortor turpis, rutrum fringileptos hymenaeos. Cras pede. Vestibulum lobortis commodo sem. Cras id elit sagittis ligula vulputate ornare. Integer justo lorem, volutpat non, m nec, auctor in, nisl. Nunc odio. Vivamus tincidunt scelerisque dia

consectetuer adipiscing elit. S

switch backgroud color

m dolor sit amet, consectetuer adipiscing elit. Suspendisse varius ante vitae nunc. Nam interdum tortor id risus vehicula elementum. Cras sollicitudin diam. Vivamus iaculis iaculis dui. Morbi venenatis eros ut nisl. Aliquam ornare ullamcorper urna. Maecenas mauris lacus, cursus et, feugiat et, aliquet sed, nibh. Nullam vitae dui. Mauris dapibus. Curabitur eu ipsum.Fusce semper imperdiet risus. Pellentesque tortor turpis, rutrum fringileptos hymenaeos. Cras pede. Vestibulum lobortis commodo sem. Cras id elit sagittis ligula vulputate ornare. Integer justo lorem, volutpat non, m nec, auctor in, nisl. Nunc odio. Vivamus tincidunt scelerisque dia