分享好友 前端技术首页 频道列表

Data URL和图片

技巧心得  2016-09-29 15:560

Data URL给了我们一种很巧妙的将图片“嵌入”到HTML中的方法。跟传统的用img标记将服务器上的图片引用到页面中的方式不一样,在Data URL协议中,图片被转换成base64编码的字符串形式,并存储在URL中,冠以mime-type。本文中,我将介绍如何巧妙的使用Data URL优化网站加载速度和执行效率。

1. Data URL基本原理

图片在网页中的使用方法通常是下面这种利用img标记的形式:

   <img src=http://www.admin10000.com//document/"images/myimage.gif ">

这种方式中,img标记的src属性指定了一个远程服务器上的资源。当网页加载到浏览器中时,浏览器会针对每个外部资源都向服务器发送一次拉取资源请求,占用网络资源。大多数的浏览器都有一个并发请求数不能超过4个的限制。这意味着,如果一个网页里嵌入了过多的外部资源,这些请求会导致整个页面的加载延迟。而使用Data URL技术,图片数据以base64字符串格式嵌入到了页面中,与HTML成为一体,它的形式如下:

 <img src=http://www.admin10000.com//document/"data:image/gif;base64,R0lGODlhMwAxAIAAAAAAAP///
yH5BAAAAAAALAAAAAAzADEAAAK8jI+pBr0PowytzotTtbm/DTqQ6C3hGX
ElcraA9jIr66ozVpM3nseUvYP1UEHF0FUUHkNJxhLZfEJNvol06tzwrgd
LbXsFZYmSMPnHLB+zNJFbq15+SOf50+6rG7lKOjwV1ibGdhHYRVYVJ9Wn
k2HWtLdIWMSH9lfyODZoZTb4xdnpxQSEF9oyOWIqp6gaI9pI1Qo7BijbF
ZkoaAtEeiiLeKn72xM7vMZofJy8zJys2UxsCT3kO229LH1tXAAAOw==">

从上面的base64字符串中你看不出任何跟图片相关的东西,但下面,我们将传统的img写法和现在的Data URL用法左右对比显示,你就能看出它们是完全一样的效果。但实际上它们是不一样的,它们一个是引用了外部资源,一个是使用了Data URL。

 

几乎所有的现代浏览器都支持Data URL格式,包括火狐浏览器,谷歌浏览器,Safari浏览器,opera浏览器。IE8也支持,但有部分限制,IE9完全支持。

2. 为什么Data URL是个好东西

Data URL能用在很多场合,跟传统的外部资源引用方式相比,它有如下独到的用处:

  • 当访问外部资源很麻烦或受限时
  • 当图片是在服务器端用程序动态生成,每个访问用户显示的都不同时。
  • 当图片的体积太小,占用一个HTTP会话不是很值得时。

Data URL也有一些不适用的场合

  • Base64编码的数据体积通常是原数据的体积4/3,也就是Data URL形式的图片会比二进制格式的图片体积大1/3。
  • Data URL形式的图片不会被浏览器缓存,这意味着每次访问这样页面时都被下载一次。这是一个使用效率方面的问题——尤其当这个图片被整个网站大量使用的时候。

然而,Data URL这些不利的地方完全可以避免或转化。本文的重点就是要讨论这个问题。

3. 在CSS里使用Data URL

当第一次看到Data URL的作用和用法时,你也许会很不疑惑,“为什么要麻烦的将图片转换成base64编码字符串,还要嵌入的网页中,将HTML代码弄的混乱不堪,甚至还会有性能上的问题。”

诚然,无法否认缓存在浏览器性能中的重要作用——如何能将Data URL数据也放入浏览器缓存中呢?答案是:通过CSS样式文件。CSS中的url操作符是用来指定网页元素的背景图片的,而浏览器并不在意URL里写的是什么——只要能通过它获取需要的数据。所以,我们就有了可以将Data URL形式的图片存储在CSS样式表中的可能。而所有浏览器都会积极的缓存CSS文件来提高页面加载效率。

假设我们的页面里有一个很小的div元素,我们想用一种灰色的斜纹图案做它的背景,这种背景在当今的网站设计者中非常流行。传统的方法是制作一个3×3像素的图片,保存成GIF或PNG格式,然后在CSS的background-image属性中引用它的地址。而Data URL则是一种更高效的替代方法,就像下面这样。

下面是CSS代码:

.striped_box
  {
  width: 100px;
  height: 100px;
  background-image: url("data:image/gif;base64,R0lGODlhAwADAIAAAP///8zMzCH5BAAAAAAALAAAAAADAAMAAAIEBHIJBQA7");
  border: 1px solid gray;
  padding: 10px;
  }

在我们的HTML里放入下面的代码:

<div class="striped_box">
这是一个有条纹的方块
</div>

实际输出效果就是下面这样

这是一个有条纹的方块

在这个例子中,Data URL的使用是完全符合场景的。它避免了让这个小小的背景图片独自产生一次HTTP请求,而且,这个小图片还能同CSS文件一起被浏览器缓存起来,重复使用,不会每次使用时都加载一次。只要这个图片不是很大,而且不是在CSS文件里反复使用,就可以以Data URL方法呈现图片降低页面的加载时间,改善用户的浏览体验。

4. 将图片转换成Data URL格式的方法

用Data URL来展示图片的例子以及它的好处我们说完了,下面我们转入下一个问题,如何将图片转换成Base64编码的字符串。其实网上有很多工具都可以使用,下面列举了几个。其中一个是在线工具,一个Mac OS X桌面应用。

Data URL总结

IE6/7是不支持Data URL技术的,不幸的是在中国还有很多用户在使用这种古老的浏览器。希望各方面包括官方和民间都多做努力工作,让现代浏览器(谷歌浏览器,火狐浏览器,IE11+)尽快的占领市场,这是我们Web程序员最大的愿望。

查看更多关于【技巧心得】的文章

展开全文
相关推荐
反对 0
举报 0
评论 0
图文资讯
热门推荐
优选好物
更多热点专题
更多推荐文章
在react项目中使用require引入图片不生效
如果使用create-react-app和require导入图像,require返回一个ES模块而不是字符串。这是因为在file-loader中,esModule选项是默认启用的。用以下方式之一导入图像:const image = require('../path/to/image.jpg').default;// ORimport image from '../path/t

0评论2023-03-08786

react中循环节点的方式以及图片引用的方式
import React from 'react'import img from '../public/img/001.jpg' // 此时img是一个变量,在下面直接使用该变量即可引入该图片class New extends React.Component{constructor(props) {super(props)this.state = {msg: '直接定义的数据',list1: [h11111/h1

0评论2023-03-08959

react-native,如何得到图片的实际大小?
import resolveAssetSource from 'resolveAssetSource';et icon =  require('./images/1.png'); let source = resolveAssetSource(icon);// source.width, source.height`

0评论2023-03-08744

react-quill 富文本编辑器 ---- 图片处理
import React,{Component} from 'react';import ReactQuill,{ Quill } from 'react-quill';import 'react-quill/dist/quill.snow.css';import { Button ,Modal,message} from 'antd';import MYURLfrom '../api/config';im

0评论2023-03-08415

用 JavaScript 实现网页图片等比例缩放
在处理网页图片时,特别是一些图片列表的应用里面,很难保证图片统一大小,直接设置图片大小又会导致图片拉伸,造成图片模糊,本文介绍的代码可以在图片加载完成后自动按比例调整图片大小。 !-- // 说明:用 JavaScript 实现网页图片等比例缩放 function Draw

0评论2023-03-08541

javascript预览上传的本地图片 js上传文件预览
 form      div    input type="file" name="updFile" /    /div    div /div    script type="text/javascript"        function Change() {            var x = document.getElementById("updFile");         

0评论2023-03-08431

JavaScript支持IE和FireFox浏览器自动缩放图片代码
本人在做某网站时碰到一个问题,即“要对某网页中一个DIV内所有的图片进行缩放,使超出500像素宽的图片按比例缩放至500像素宽”,在网上搜索了很久,只找到了一个以下代码,可让网页上的所有图片自动缩放,代码如下: script language="JavaScript"var imgObj

0评论2023-03-08722

css实现图片翻转 css使图片旋转
!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"html xmlns="http://www.w3.org/1999/xhtml"headmeta http-equiv="Content-Type" content="text/h

0评论2023-03-08577

(转)JAVA中解决Filter过滤掉css,js,图片文件等问题
在加入过滤器时,会出现网页可以加载,但是网页中的js,css等文件无法加载的问题。因为在网页加载时,先将整个网页加载,然后加载网页中的js,css等文件,而在进行js,css文件加载时,会被过滤器过滤掉。因此在过滤器中加入一个对css,js等文件的判断,就可以

0评论2023-03-08794

css实现你的网页图片半透明效果 网页设计如何设置图片半透明
style type="text/css" !-- .clarity {  filter: Alpha(Opacity=25, FinishOpacity=100, Style=3, StartX=0, StartY=1, FinishX=1024, FinishY=768); } -- /style首先在你的网页中建立一个样式,然后在把这个样式用在你的图片上。至于代码的意思请往下看!!!

0评论2023-03-08686

纯css3代码写九宫格效果 css九宫格 图片布局
主要用到css3中的transition和布局知识。代码如下1 !DOCTYPE html2 html lang="en"3 head4 meta charset="UTF-8"5 meta name=""6 title标题/title7 /head8 style type="text/css"9 *{margin: 0;padding: 0;} 10 body{background: url(images/bg.jpg);}

0评论2023-03-08797

转 Div+Css控制背景图片水平垂直居中显示 背景铺满全屏
在Web开发中我们经常要碰到这样的问题:在为一个页面设置背景图片之后往往希望图片能够在分辨率比较大的情况下水平垂直都居中显示。通常水平居中显示在Css中是很容易做到的,而垂直居中就需要使用一些Css的技巧:1. 首先为了能使得网站能够根据浏览器大小自适

0评论2023-03-08628

CSS Filter 代替 图片 实现 渐变背景效果。
以前欲做一个渐变的背景,一般都是用图片。一次偶然发现用CSS Filter 可以实现相同的效果,而最重要的好处是它可以省去你去下载图片所使用时间。htmlheadmeta http-equiv="Content-Type" content="text/html; charset=shift_jis"titleUntitled Document/t

0评论2023-03-08679

利用node压缩、合并js,css,图片 node 压缩
1.安装nodejshttp://nodejs.org/2.安装各自的node packagejs我用的是UglifyJS github地址:https://github.com/mishoo/UglifyJScss我用的是clean-css github地址:https://github.com/GoalSmashers/clean-css图片用的是node-smushit    github地址:https

0评论2023-03-08348

css3动画 --- 网站背景图片渐变且切换
!DOCTYPE htmlhtmlheadmeta charset="utf-8"titleCSS3全屏背景图片缩小渐变自动切换代码/title!-- link rel="stylesheet prefetch" href="http://fonts.useso.com/css?family=Raleway:300" --style type="text/css"*{margin:0;padding:0;}.slideshow

0评论2023-03-08678

如何使用css、布局横向导航栏 如何使用css,布局横向导航栏图片
使用css布局横向导航栏,css应用给网页样式的方式,就相当于,给人怎么去穿上衣服,不同的衣服有不同的穿法,这里我们使用的是内联式。在这里 我们可以适当的把值调的大一点,这样我们就可以很容易的对比。!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Trans

0评论2023-03-08906

CSS兼容各种浏览器的一些写法 css兼容各种浏览器的一些写法图片
1.DOCTYPE 影响 CSS 处理2.FF: div 设置 margin-left, margin-right 为 auto 时已经居中, IE 不行3.FF: body 设置 text-align 时, div 需要设置 margin: auto(主要是 margin-left,margin-right) 方可居中4.FF: 设置 padding 后, di

0评论2023-03-08408

更多推荐