`
wezly
  • 浏览: 490550 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Data URI在旺旺点灯(JS)上的应用

阅读更多

旺旺点灯(JS)实践经过:

因为要对SRP(Search Result Page)页面进行优化,我们想尽方法节约每一个连接,然后想到了Data URI,ok,先在旺旺点灯里尝试下。

我们都知道,要在实际应用中用上Data URI,必须针对IE6[1]/7使用MHTML。

第一次尝试的代码如下:DEMO

background:url({data uri});
*background:url({mhtml}); // IE6/7
似乎没有问题,但如果你用的是IE8,请在IE8兼容模式里看下,你会发现旺旺图片并没有显示出来。随后测试了多位同事的IE8,找到了原因:

IE8兼容模式下支持IE7的css hack(如 *),但并不支持mhtml,而我上面的写法使得支持 * hack的浏览器都使用了mhtml。

并且,非常郁闷的是,光IE8就有以下情况:

  • 1. 8.0.6001.18702IC,应该是一个早期的版本,支持data-uri和mhtml,没得说。[2]
  • 2. 8.0.7600.16385,有的默认打开是IE8 Mode,有的默认打开是IE8 Compat Mode,就是这个IE8 Compat Mode使得上面的写法产生了bug。
好了,因为是在JS中使用,解决方案也很简单,就是用JS判断下兼容模式,让IE8 Compat Mode也使用data-uri。

最后代码如下:

var compat_mode =  /trident\/\d/i.test(navigator.userAgent),
  css_text = 'background:url({data uri});' + compat_mode ? '' : '*background:url({mhtml});';
淘宝线上试点应用:SRP

最小文件尝试:将旺旺的css sprite进行各种拆分

图片大小为11.773K

我将图片进行了3种拆分(拆分工具:Firework),上下、左右、上下左右,试着寻找最小文件的组合规律,可惜暂时没有收获。

原始大小 压缩后大小 gzip后大小

一个大图

左右(两张图片)

上下(三张图片)

上下左右(6个小图标)

 

30.9K

30.8K

12.139K

35.5K

35.5K

8.094K

30.2K

30.1K

9.960K

38.4K

38.3K

10.811K


可以看到,如果按最优的方法(左右组合)来使用data-uri替换sprite,可节约3.7K和一个连接数。

CSS应用展望:

要在CSS里进行应用,可能还得先解决以下问题:

  • 1. 上面描述的IE8 Compat Mode,CSS中没有对应的hack方法
  • 2. 经测试,发现IE下同一个css文件加不同的时间戳,会被下载两次。
    而淘宝的页面时通过时间戳来控制文件缓存的,这意味着每次更改CSS文件都要保持"页面里的CSS路径"和"MHTML中引用"的完全一致。
  • 3. YUI Compressor的CSS压缩问题
    打开http://a.tbcdn.cn/sys/wangwang/tbww_v1.1_srp.js,我们会发现MHTML是写在注释里的,所以文件上线时需要保留这部分注释信息。
    通过YUI Compressor压缩JS的时候可以用 /*! ..... */ 这样的方法保留注释,而在压缩CSS的时候此方法无效。

对应的解决方案如下:

  • 1. 通过JS给html元素增加class='compat-mode',然后CSS代码如下
    .compat-mode .data-uri-cls, .data-uri-cls {
    	background:url({data-uri});
    }
    .data-uri-cls {
    	*background:url(mhtml);
    }
  • 2. 发现秦歌文章中的有一个CSS Expression的解决方案 [3]
  • 3. 等待YUI Compressor调整或利用ant先提取注释压缩完再加回去

参考文章

[1] IE6有个可以忽视的bug:打开mhtml格式的图片,再选中地址栏,按回车,浏览器崩溃。
[2] xp下载过来的IE8好像都是这个版本。
[3] 请注意,使用YUI Compressor压缩CSS Expression时可能会出错,Expression越复杂,出错几率越大。
分享到:
评论

相关推荐

    探究dataURI中使用SVG正确姿势

    综上所述,掌握在dataURI中正确使用SVG的方法,可以帮助开发者创建更高效、更具交互性的Web页面。结合JavaScript,可以实现动态SVG图形,提升用户体验。但在使用过程中,也要注意优化和处理好可能出现的兼容性问题。

    Data URI浅析

    它广泛应用于电子邮件标准和网络通信协议中,特别是在Data URI中用来传输图像等二进制数据。 Base64编码将每3个字节的二进制数据转换为4个字符的文本序列。这种转换增加了数据大小的大约33%,但使得数据可以在任何...

    .net 图片base64编码 Data URI scheme

    这些代码可以作为实际项目中的参考,帮助开发者快速地在.NET应用程序中实现图片的Base64编码和Data URI功能。 总结起来,.NET中的图片Base64编码结合Data URI方案,能够简化Web应用的图片处理,提升用户体验。...

    datauri:通过terminal或node.js生成Data-URI方案

    RUN 在datauri模块的顶部运行着许多grunt插件。 从图像为CSS创建base64编码的数据 -IMWEB日常工作流任务集合。 一个grunt插件,用于替换静态文件(例如img,js,css)中的url,并将它们放在模板中。 uri-从图像路径...

    Python库 | python_datauri-0.2.7-py2.py3-none-any.whl

    1. **转换文件为Data URI**:`python_datauri`提供了一个简单的API,允许用户将本地文件如图片、文本文件等转换成Data URI字符串,可以直接插入到HTML、CSS或JavaScript中。 2. **创建Data URI**:除了从文件创建外...

    Data URI和MHTML完整解决所有浏览器

    在实际应用中,Data URI常用于CSS和JavaScript中嵌入小图像,以减少HTTP请求并利用CSS和JS的缓存机制。MHTML则更适合于保存和分发包含多种资源的整个页面,例如电子邮件或离线网页。两者结合使用可以在不同浏览器...

    python-datauri:简化数据URI操作

    >> > from datauri import DataURI >> > uri = DataURI ( [removed]VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wZWQgb3ZlciB0aGUgbGF6eSBkb2cu' ) >> > uri . mimetype 'text/plain' >> > uri . charset 'utf-8' >> > uri . ...

    Nodejs进阶:如何将图片转成datauri嵌入到网页中去实例

    Node.js进阶知识点中,如何将图片转换为datauri并嵌入到网页中是一个实用的操作,尤其在需要减少HTTP请求或在某些特定情况下,直接在HTML中嵌入图片资源。以下对相关知识点进行详细说明。 首先,要了解什么是data...

    image-encoder:将图片编码为dataURI

    将图像编码为DataURI。 安装 通过凉亭安装。 $ bower install 1000ch/image-encoder 用法 var ie = new ImageEncoder ( 'path/to/image.png' ) ; ie . getDataURI ( ) . then ( function onFulfilled ( datauri ) {...

    iconfont到datauri「iconfont to datauri」-crx插件

    iconfont到datauri 用于将iconfont网站上的项目字体转为内嵌样式可用的datauri编码 支持语言:中文 (简体)

    android:scheme 通过uri跳转到APP应用指定Activity

    在Android开发中,`android:scheme` 是一个关键的概念,用于构建自定义URL协议,使得外部应用或系统可以通过特定的URI来启动我们的应用程序中的特定Activity。这个特性在很多场景下非常有用,比如分享链接、广告点击...

    A_APP通过Uri调用B_APP(Uri含两个应用包)demo最新版

    下面我们将详细探讨如何在Android上实现"A_APP通过Uri调用B_APP"的流程,以及如何处理包含两个应用包的情况。 首先,我们需要了解Android的Intent和Uri的概念。Intent是Android系统中用于启动Activity、Service或者...

    Android识别TextView的Uri并在自己的应用程序中打开

    综上所述,Android识别TextView的Uri并在自己的应用程序中打开是通过Linkify转换链接、自定义Intent Filter以及在Activity中处理Intent来实现的。这个过程使得开发者能够更好地控制用户与应用内的链接交互,提升用户...

    DataURI:一个方便的类,用于在 PHP 中处理数据 URI

    自述文件埃里克沃特2015-01-25 DataURI PHP 库#这个项目是什么# DataUri ... 这很笨拙,但在应用程序中是可以接受的,但如果宿主项目本身用作 Composer 依赖项,则会变得困难,因为自定义存储库定义(按设计)不包含在

    Go-SVGdatauri用于在CSS中内联小型SVG图标

    Go语言提供了一个名为Go-SVGdatauri的工具,专门用于将SVG图标转换为data URI格式,以便于在CSS中直接引用。 data URI是一种在Web内容中嵌入资源的方式,它允许将图片、字体等数据编码为Base64字符串,并直接放在...

    Data URI scheme详解和使用实例及图片base64编码实现方法

    Data URI scheme是在RFC2397中定义的,目的是将一些小的数据,直接嵌入到网页中,从而不用再从外部文件载入。比如上面那串字符,其实是一张小图片,将这些字符复制黏贴到火狐的地址栏中并转到,就能看到它了,一张1...

    to-datauri:从图像路径获取数据 uri

    to-datauri 从图像源 url 获取数据 uri。 用法 var toDataURI = require('to-datauri'); toDataURI(imagePath, function (error, uri) { // do things. });

    datauri-generator:用于从文件URI转换为数据URI的命令行程序

    数据生成器用于从文件转换为[removed]写入文件datauri -f=file.png >> file.png.txt# makes a file "file.png.txt" containing the data URI安装只需运行npm install -g 。 现在,您可以全局使用datauri命令。依存...

    css-img-datauri-stream:css-img-datauri-stream

    CSS本地图像参考->数据URI转换接受文件... #用法css-img-datauri-stream(文件[,选择]) file - CSS文件转换opts -可选对象,其“maxImageSize”成员指定一个字节大小超过该局部图像的引用将不被转换到数据的URI。

Global site tag (gtag.js) - Google Analytics