CSS: Data URI Scheme

By Xah Lee. Date: . Last updated: .

Data URI Scheme lets you encode a image file's content directly in CSS, without linking a URL.

Data URI Scheme is useful because everytime you link to a image in CSS (such as for background image), browser needs to make a HTTP request, thus slowing down. (but if your web server is using HTTP2, it's not a problem.)

For example, suppose this is your CSS:

a[href*="twitter.com/"] {
background:url(https://twitter.com/favicon.ico) no-repeat left center;

this will match links to Twitter and add a icon in front of the link.

[see CSS 3 Selector Syntax]

You can encode it like this:

a[href*="twitter.com/"] {
no-repeat left center;

Inside the background:url(…) is the data URI.

The first part data:image/png;base64, is the MIME type followed by a comma.

The rest string is base64 encoded data of the image.

How to Convert Image to Base64 Encoding

First, if the image is “ico” format, best to convert to png. You can use ImageMagick, like this:

# convert to png using imagemagic
convert favicon.ico favicon.png

[see ImageMagick Tutorial]

Then, you should optimize the png file, make the file size smaller. You can use the program “optipng”.

# optimize the png, makes the file size smaller
optipng favicon.png

Now, you have a optimized png file.

Let's suppose the image we want to encode is named “my_img.png”.

Linux Shell

On Linux, you can use the command base64, like this:

base64 my_img.png | tr --delete '\n' > output.txt


echo base64_encode(file_get_contents("my_img.png"));


print open("my_img.png", "rb").read().encode("base64").replace("\n", "")

Python 3

import base64
print(base64.b64encode( open("my_img.png","rb").read() ).decode("ascii"))

Ruby 1.9

require "base64"
print Base64.strict_encode64(File.open("my_img.png", "rb").read)


use MIME::Base64 qw(encode_base64);
open FH, '<', 'my_img.png';
read(FH, $contents, 10000000);
print encode_base64($contents, "");

JavaScript (node.js)

let fs = require('fs');
console.log( fs.readFileSync('my_img.png').toString('base64') );


Data URI Scheme At http://tools.ietf.org/html/rfc2397

See also: CSS: Background Image

CSS Misc

  1. Computed Style
  2. Pseudo Class vs Pseudo Element
  3. Media Query
  4. Variable
  5. calc
  6. Reset
  7. user-select
  8. Data URI Scheme
  9. protocol-relative URL
  10. Default Unit
  11. Declaring Character Set in CSS File
  12. Jargons Explained: Tag, Element, Node, Object, Attribute, Property, Method
Liket it? I spend 2 years writing this tutorial. Help me spread it. Tell your friends. Or, Put $5 at patreon.

Or, Buy JavaScript in Depth

If you have a question, put $5 at patreon and message me.

Web Dev Tutorials

  1. HTML
  2. Visual CSS
  3. JS in Depth
  4. JS Object Ref
  5. DOM Scripting
  6. SVG
  7. Blog