圖像替換新技術(shù) 狀態(tài)域方法
該方法檢查圖片是否禁用,并不是請求服務(wù)器上的圖片,因為那樣會導(dǎo)致一次額外的http請求。作者創(chuàng)建了一個巧妙的方法。
在大多數(shù)瀏覽器中,Image對象可以實例化并追溯到一個無效的URL(http://0),這樣很容易檢測Image的狀態(tài)。如果禁用,onerror事件將觸發(fā),在js文件的開頭,j建立一個新的圖像對象:
var img = new Image();
但是,有兩個古怪的瀏覽器對此方法并不兼容。在Gecko瀏覽器中,不論Image是否被禁用。Onerror事件總是 被觸發(fā)。所幸的是,另外一種可行的方案可以解決此問題--給html元素附加一個無效的背景圖片,然后通過getComputedStyle方法獲得 style屬性。如果Image禁用,其屬性為none或url(invalid-url:):
if (img.style.MozBinding != null)
{
img.style.backgroundImage = "url(" +document.location.protocol + "http://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);
}
}
另外一個富有挑戰(zhàn)性的瀏覽器是safari,如果請求是一個無效的URL,safari的狀態(tài)欄將出現(xiàn)錯誤提示,但頁面 布局不受任何影響。如果用戶的狀態(tài)欄處于開啟狀態(tài),報錯將一直持續(xù),這很不專業(yè),同樣,作者研究了另外一種可行的方案。如果Image來自于1*1的 gif圖像,且被數(shù)據(jù)編碼。如果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觸發(fā)事件。
else
{
img.onerror = function(e)
{
document.enableStateScope("images-on", true);
}
img.src = "about:blank";
}
狀態(tài)域是可以切換的
可以創(chuàng)建一個系統(tǒng)讓用戶在文本和替代圖像之間切換。
class屬性添加到html之上而不是body或其它子元素之上,主要原因在于在圖像替換之前,body需要全面加載。如果“image-on”不添加到html之上。當狀態(tài)域啟用時,將會出現(xiàn)閃動。
圖像替換技術(shù)是css中相當重要的一部分。鑒于現(xiàn)存圖像替換技術(shù)的缺點,作者花大量時間另辟蹊徑,方法獨到,值得借鑒。
示例下載:tate-scope-image-replacement.zip
翻譯原文:http://www.denisdeng.com/?p=235
英文原文:http://www.sitepoint.com/article/image-replacement-state-scope/
相關(guān)文章
JavaScript指定字段排序方法sortFun函數(shù)
這篇文章主要介紹了JavaScript指定字段排序方法sortFun函數(shù),數(shù)組的排序方法是sort,但是它并不支持根據(jù)指定的字段進行排序,而sortFun可以根據(jù)指定的字段進行排序,需要的朋友可以參考下2023-05-05JavaScript檢測彈出窗口是否已經(jīng)關(guān)閉的方法
這篇文章主要介紹了JavaScript檢測彈出窗口是否已經(jīng)關(guān)閉的方法,涉及javascript中window屬性的closed屬性的使用技巧,需要的朋友可以參考下2015-03-03JS實現(xiàn)動態(tài)添加DOM節(jié)點和事件的方法示例
這篇文章主要介紹了JS實現(xiàn)動態(tài)添加DOM節(jié)點和事件的方法,涉及javascript事件響應(yīng)及針對頁面dom元素節(jié)點與屬性的動態(tài)操作相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2017-04-04詳解JavaScript原始數(shù)據(jù)類型Symbol
以前提到 JavaScript 原始數(shù)據(jù)類型時,我們知道有Number,String,Null,Boolean,Undefined這幾種。ES6 引入了新的基本數(shù)據(jù)類型Symbol和BigInt。今天我們就來了解下Symbol類型。Symbol類型是為了解決屬性名沖突的問題,順帶還具備模擬私有屬性的功能。2021-05-05