Data URL简介与使用

栏目: 后端 · 前端 · 发布时间: 5年前

内容简介:编者按:本文作者高峰,360奇舞团前端工程师,W3C性能工作组/WOT工作组成员。相信大家在前端开发的过程中,都应该处理过图片,其中有一项就是我们会在loader中将小的图片转为base64。那么这个base64是什么呢?我们为什么要将其转为base64呢?其实这种格式的图片,我们可以称为Data URL,下面让我们一起来简单了解下。

编者按:本文作者高峰,360奇舞团前端工程师,W3C性能工作组/WOT工作组成员。

相信大家在前端开发的过程中,都应该处理过图片,其中有一项就是我们会在loader中将小的图片转为base64。那么这个base64是什么呢?我们为什么要将其转为base64呢?

其实这种格式的图片,我们可以称为Data URL,下面让我们一起来简单了解下。 (PS:由于平台限制,如果想查看文中的交互效果,可以点击文章最后的“ 阅读原文 ”)

1. 简介

Data URL ,是以 data: 模式为前缀的URL,允许内容的创建者将较小的文件嵌入到文档中。与常规的URL使用场合类似,下面会具体介绍可以将Data URL用在哪些地方。

Data URL data: 前缀、MIME类型(表明数据类型)、 base64 标志位(如果是文本,则可选)以及数据本身四部分组成

语法格式如下:

data:[<mediatype>][;base64],data

mediatype 是一个MIME(Multipurpose Internet Mail Extension)类型字符串,如 image/jpeg 表示一个JPEG图片文件。如果省略,默认值为 text/plain;charset=US-ASCII

2. Data URL的优缺点

  1. Data URL的优势

    和传统的外部资源引用,Data URL有着以下优势:

  • 当访问外部资源很麻烦或受限时,可以将外部资源转为Data URL引用(这个比较鸡肋)

  • 当图片是在服务器端用程序动态生成,每个访问用户显示的都不同时,这是需要返回一个可用的URL(场景较少)

  • 当图片的体积太小, 占用一个HTTP会话 不是很值得时(雪碧图可以出场了)

  • Data URL的缺点

    虽然Data URL允许使用者将文件嵌入到文档中,这在某些场景下较为合适,但是Data URL也有一些缺点:

    • 体积更大:Base64编码的 数据体积通常是原数据的体积4/3 ,也就是Data URL形式的图片会比二进制格式的图片体积大1/3

    • 不会缓存:Data URL形式的图片 不会被浏览器缓存 ,这意味着每次访问这样的页面时都被下载一次。这是一个使用效率方面的问题——尤其当这个图片被整个网站大量使用的时候。

    3. 如何获取base64编码

    1. Linux/Mac OS X下可以使用 uuencode 命令

      uuencode -m <源文件> <转码后标识>

      如执行 uuencode -m hello-base64 hello ,会得到如下结果:

      begin-base64 644 hello

      aGVsbG8gYmFzZTY0 // 此处为base64编码,对应文本内容为 'hello base64'

      === =

    2. 使用原生Web API编码/解码

      Javascript中有两个函数负责编码和解码base64字符串,分别是 atobbtoa

      两者都只针对Data URL中的data进行处理。

      btoa('hello base64') // "aGVsbG8gYmFzZTY0"

      atob ( 'aGVsbG8gYmFzZTY0' ) // "hello base64"

    • atob() : 负责解码已经使用base64编码了的字符串。

    • btoa() : 将二进制字符串转为base64编码的ASCII字符串。

  • Canvas的 toDataURL 方法

    Canvas提供了 toDataURL 方法,用于获取canvas绘制内容,将其转为base64格式。

    如下图所示,文本框中的内容即为canvas中绘制内容的base64格式。

    Data URL简介与使用

    Html:

    <canvas id="testCanvas" width="200" height="100"></canvas>

    < textarea id = "testCanvas-content" > < / textarea >

    JS:

    var canvas = document.getElementById('testCanvas');

    if ( canvas . getContext ) {

    var ctx  = canvas . getContext ( '2d' ) ;

    // 设置字体

    ctx . font  = "Bold 20px Arial" ;

    // 设置对齐方式

    ctx . textAlign  = "left" ;

    // 设置填充颜色

    ctx . fillStyle  = "#0f0" ;

    // 设置字体内容,以及在画布上的位置

    ctx . fillText ( "hello base64" , 10 , 30 ) ;

    // 描边颜色

    ctx . strokeStyle  = "#0f0" ;

    // 绘制空心字

    ctx . strokeText ( "hello base64" , 10 , 80 ) ;

    // 获取 Data URL

    document . getElementById ( 'testCanvas-content' ) . value  = canvas . toDataURL ( ) ;

    }

  • 使用FileReader API的 readAsDataURL 方法

    FileReader API提供的 readAsDataURL 方法能够返回一个基于base64编码的Data URL。

    如下所示,选择文件后返回Data URL。

    注意,别选大的文件,选个小的试试就行,LOL。

    Data URL简介与使用

    Html:

    <div class="demo-area">

    < input type = "file" id = "testReadAsDataURL" >

    < textarea id = "testReadAsDataURL-content" > < / textarea >

    < / div >

    JS:

    var reader = new FileReader()

    reader . onload  = function ( e ) {

    var textarea  = document . getElementById ( 'testReadAsDataURL-content' ) ;

    textarea . value  = reader . result

    }

    document . getElementById ( 'testReadAsDataURL' ) . onchange  = function ( e ) {

    var file  = e . target . files [ 0 ]

    reader . readAsDataURL ( file )

    }

  • 4. Data URL能用在何处呢?

    最开始已经说了 Data URL ,是以 data: 模式为前缀的URL,使用场合与常规URL相同,即常规URL能够使用的场合,Data URL也可以使用。如:浏览器地址栏、link中引入css文件、script中引入js文件、img src中引入图片、video中引入视频、iframe中引入网页、css background url引入背景。

    1. 在浏览器地址栏中使用Data URL

      在浏览器地址栏中使用Data URL,打开上述canvas中绘制的内容

      注意:chrome 从56开始将Data URL标记为“不安全”,从60开始屏蔽从页面打开的 Data URI 网址,可以 右键新标签打开 。详情(http://www.cnblogs.com/ziyunfei/p/6753002.html)

      Html:

      <a href="base64内容" target="_blank" id="setDataURLInHref"></a>
    2. script/img/video/iframe 等标签的 src 属性内使用Data URL

      以在script中使用Data URL为例(在原文中点击按钮之后,会弹出alert,alert的内容通过Data URL设定):

      Data URL简介与使用

      JS:

      var scriptDataURL = `data:text/javascript;base64,YWxlcnQoJ+WcqHNjcmlwdOS4reS9v+eUqERhdGEgVVJMJykK`

      // 对应文本为:alert('在script中使用Data URL')

      $ ( '#setDataURLInScriptBtn' ) . click ( function ( ) {

      $ ( '<script>' ) . attr ( 'src' , scriptDataURL ) . appendTo ( $ ( 'body' ) )

      } )

    3. <link> 标签的href中使用Data URL

      如下图,看在原文中点击按钮,会发现按钮中文字的颜色变成了红色,样式通过Data URL设定。

      Data URL简介与使用

      JS:

      var linkDataURL = `data:text/css;base64,I3NldERhdGFVUkxJbkxpbmtCdG57Y29sb3I6IHJlZDt9Cg==`

      // 对应内容为:setDataURLInLinkBtn{color: red;}

      $ ( '#setDataURLInLinkBtn' ) . click ( function ( ) {

      $ ( '<link rel="stylesheet" type ="text/css">' ) . attr ( 'href' , linkDataURL ) . appendTo ( $ ( 'head' ) )

      } )

    4. 在css样式 background 的url中使用Data URL

      执行下面代码,会将上面Canvas创建的图片的Data URL作为背景展示。

      Data URL简介与使用

      JS:

      const bgDataURL = $('#testCanvas-content')[0].value

      $ ( '#setDataURLInBG' ) . css ( 'background-image' , `url( ${ bgDataURL } )` )

    5. 参考链接

    1. MDN Data URLs:https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs

    关于奇舞周刊

    《奇舞周刊》是360公司专业前端团队「 奇舞团 」运营的前端技术社区。关注公众号后,直接发送链接到后台即可给我们投稿。

    Data URL简介与使用


    以上所述就是小编给大家介绍的《Data URL简介与使用》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

    查看所有标签

    猜你喜欢:

    本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

    Python Cookbook

    Python Cookbook

    Alex Martelli、Anna Ravenscroft、David Ascher / 高铁军 / 人民邮电出版社 / 2010-5-1 / 99.00元

    本书介绍了Python应用在各个领域中的一些使用技巧和方法,从最基本的字符、文件序列、字典和排序,到进阶的面向对象编程、数据库和数据持久化、 XML处理和Web编程,再到比较高级和抽象的描述符、装饰器、元类、迭代器和生成器,均有涉及。书中还介绍了一些第三方包和库的使用,包括 Twisted、GIL、PyWin32等。本书覆盖了Python应用中的很多常见问题,并提出了通用的解决方案。书中的代码和方......一起来看看 《Python Cookbook》 这本书的介绍吧!

    XML、JSON 在线转换
    XML、JSON 在线转换

    在线XML、JSON转换工具

    XML 在线格式化
    XML 在线格式化

    在线 XML 格式化压缩工具

    Markdown 在线编辑器
    Markdown 在线编辑器

    Markdown 在线编辑器