图像替换新技术 状态域方法

 更新时间:2010年01月28日 22:44:39   作者:  
熟悉css的开发者一定知道图像替换技术,也深知它的意义,Dave Shea 曾在他的一篇文章对此做了详细的总结
参看Dave Shea's excellent summaryPaul Young 在分析现存的所有方法的优缺点之后,提出了一种新的方法,并将其命名为“状态域方法”(The StateMethod),本文将详细介绍该方法的原理:

该方法检查图片是否禁用,并不是请求服务器上的图片,因为那样会导致一次额外的http请求。作者创建了一个巧妙的方法。

在大多数浏览器中,Image对象可以实例化并追溯到一个无效的URL(http://0),这样很容易检测Image的状态。如果禁用,onerror事件将触发,在js文件的开头,j建立一个新的图像对象:

var img = new Image();

但是,有两个古怪的浏览器对此方法并不兼容。在Gecko浏览器中,不论Image是否被禁用。Onerror事件总是 被触发。所幸的是,另外一种可行的方案可以解决此问题--给html元素附加一个无效的背景图片,然后通过getComputedStyle方法获得 style属性。如果Image禁用,其属性为none或url(invalid-url:):

 if (img.style.MozBinding != null)
 {
   img.style.backgroundImage = "url(" +document.location.protocol + "//0)";
   var bg = window.getComputedStyle(img,'').backgroundImage;

   if (bg != "none" && bg !="url(invalid-url:)" || document.URL.substr(0, 2) == "fi")
   {
    document.enableStateScope("images-on", true);
   }
 }

另外一个富有挑战性的浏览器是safari,如果请求是一个无效的URL,safari的状态栏将出现错误提示,但页面 布局不受任何影响。如果用户的状态栏处于开启状态,报错将一直持续,这很不专业,同样,作者研究了另外一种可行的方案。如果Image来自于1*1的 gif图像,且被数据编码。如果Image禁用,其宽度将为0,以下为在safari中测试的情况:

 else
 {
   img.style.cssText ="-webkit-opacity:0";
   if (img.style.webkitOpacity == 0)
   {
     img.onload = function()
     {
      document.enableStateScope("images-on", img.width > 0);
     }
     img.src = 
      "data:image/gif;base64," +
      "R0lGODlhAQABAIAAAP///wAAACH5BAE" +
      "AAAAALAAAAAABAAEAAAICRAEAOw==";
   }
}

最后,对于其它浏览器,在开始初始化Image对象时,仅仅需要测试onerror触发事件。

   else
   {
     img.onerror = function(e)
     {
      document.enableStateScope("images-on", true);
     }
     img.src = "about:blank";
   }

状态域是可以切换的

可以创建一个系统让用户在文本和替代图像之间切换。

查看示例(示例文件由Paul Young提供)

class属性添加到html之上而不是body或其它子元素之上,主要原因在于在图像替换之前,body需要全面加载。如果“image-on”不添加到html之上。当状态域启用时,将会出现闪动。

图像替换技术是css中相当重要的一部分。鉴于现存图像替换技术的缺点,作者花大量时间另辟蹊径,方法独到,值得借鉴。

示例下载tate-scope-image-replacement.zip

翻译原文:http://www.denisdeng.com/?p=235

英文原文http://www.sitepoint.com/article/image-replacement-state-scope/

相关文章

  • 基于Javascript实现弹出页面效果

    基于Javascript实现弹出页面效果

    弹出层效果是一个很实用的功能,很多网站都采用了这种方式实现登录和注册,下面小编通过本文给大家分享具体实现代码,对js弹出页面效果相关知识感兴趣的朋友一起学习吧
    2016-01-01
  • JavaScript指定字段排序方法sortFun函数

    JavaScript指定字段排序方法sortFun函数

    这篇文章主要介绍了JavaScript指定字段排序方法sortFun函数,数组的排序方法是sort,但是它并不支持根据指定的字段进行排序,而sortFun可以根据指定的字段进行排序,需要的朋友可以参考下
    2023-05-05
  • JavaScript检测弹出窗口是否已经关闭的方法

    JavaScript检测弹出窗口是否已经关闭的方法

    这篇文章主要介绍了JavaScript检测弹出窗口是否已经关闭的方法,涉及javascript中window属性的closed属性的使用技巧,需要的朋友可以参考下
    2015-03-03
  • 微信小程序实现图片预览功能

    微信小程序实现图片预览功能

    这篇文章主要为大家详细介绍了微信小程序实现图片预览功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • 详解JavaScript基于面向对象之继承

    详解JavaScript基于面向对象之继承

    这篇文章主要介绍了JavaScript基于面向对象之继承,感兴趣的小伙伴们可以参考一下
    2015-12-12
  • JS实现动态添加DOM节点和事件的方法示例

    JS实现动态添加DOM节点和事件的方法示例

    这篇文章主要介绍了JS实现动态添加DOM节点和事件的方法,涉及javascript事件响应及针对页面dom元素节点与属性的动态操作相关实现技巧,需要的朋友可以参考下
    2017-04-04
  • JavaScript实现列表分页功能特效

    JavaScript实现列表分页功能特效

    最近在做一个小项目,有时需要制作静态页面网站,而一旦涉及到文章的分页,实现起来非常麻烦,自己又刚入门,对js不是很熟悉,所以就拿来练练手。
    2015-05-05
  • JS获取页面窗口大小的代码解读

    JS获取页面窗口大小的代码解读

    本节实例给出一个获取浏览器当前窗口大小的方法。当浏览器窗口大小变化时,显示的值会随时变化
    2011-12-12
  • JavaScript中使用Callback控制流程介绍

    JavaScript中使用Callback控制流程介绍

    这篇文章主要介绍了JavaScript中使用Callback控制流程介绍,本文讲解了callback的一些问题和优化后的写法并给出代码实例,需要的朋友可以参考下
    2015-03-03
  • 详解JavaScript原始数据类型Symbol

    详解JavaScript原始数据类型Symbol

    以前提到 JavaScript 原始数据类型时,我们知道有Number,String,Null,Boolean,Undefined这几种。ES6 引入了新的基本数据类型Symbol和BigInt。今天我们就来了解下Symbol类型。Symbol类型是为了解决属性名冲突的问题,顺带还具备模拟私有属性的功能。
    2021-05-05

最新评论