武林網(wǎng)(www.survivalescaperooms.com)文章簡(jiǎn)介:熟悉css的開發(fā)者一定知道圖像替換技術(shù),也深知它的意義,Dave Shea 曾在他的一篇文章對(duì)此做了詳細(xì)的總結(jié),參看 Dave Shea’s excellent summary ,Paul Young 在分析現(xiàn)存的所有方法的優(yōu)缺點(diǎn)之后,提出了一種新的方法,并將其命名為“狀態(tài)域方法”(The State Method),
熟悉css的開發(fā)者一定知道圖像替換技術(shù),也深知它的意義,Dave Shea 曾在他的一篇文章對(duì)此做了詳細(xì)的總結(jié),參看 Dave Shea’s excellent summary ,Paul Young 在分析現(xiàn)存的所有方法的優(yōu)缺點(diǎn)之后,提出了一種新的方法,并將其命名為“狀態(tài)域方法”(The State Method),本文將詳細(xì)介紹該方法的原理:
現(xiàn)存方法的缺點(diǎn):
新的圖像替換方法:
新的圖像替換技術(shù)需要借助于js來實(shí)現(xiàn),但很容易執(zhí)行,只需要將一小段js引入到頭部即可。一旦js執(zhí)行,響應(yīng)的規(guī)則前將附加“.image-on”,只要客戶端的圖片未被禁用,規(guī)則就會(huì)生效,下面是一條應(yīng)用到h1“狀態(tài)域方法”的聲明:
h1 {
width: 100px;
height: 50px;
}
@media screen {
.images-on h1 {
text-indent: -10000px;
background-image: url(image.png);
overflow: hidden;
}
}
第一條規(guī)則總是生效,第二條只有在image未被禁用時(shí)生效。“text-indent”使文字偏移于屏幕之外,“overflow:hidden”主要用來在FF下放置錨點(diǎn)在被點(diǎn)擊時(shí)其焦點(diǎn)偏移于屏幕之外。
第二條規(guī)則包繞在@media screen中,主要用來保證圖像替換只發(fā)生在屏幕閱讀器中,而不是在打印狀態(tài)下執(zhí)行。如果不這樣處理,頁(yè)面打印時(shí),多數(shù)用戶將看到一個(gè)很大的空隙而不是有意義的文本。
該項(xiàng)技術(shù)執(zhí)行起來很快。因?yàn)槲谋酒朴谄聊恢?,圖像可以包含透明元素,透過圖像本身,你看不到任何文本。Js執(zhí)行很快,幾乎是瞬時(shí)的,它充分利用瀏覽器本身的特性。
方法解析
“狀態(tài)域方法”是在一種假定的狀態(tài)下,快速使css規(guī)則生效的方法,其上下文背景為document,這樣避免了瀏覽器遍歷DOM樹。應(yīng)用“狀態(tài)域方法”有兩個(gè)理由:
“狀態(tài)域方法”通過使用下面的script給html附加一個(gè)class。
document.enableStateScope = function(scope, on)
{
var de = document.documentElement;
if (on)
de.className += " " + scope;
else
de.className = de.className.replace(
new RegExp("//b" + scope + "//b"), "");
};
這段js有一點(diǎn)小問題,在示例頁(yè)中切換功能并不生效,我重新修改了一下,代碼如下:
function hasClass(ele,cls) {
return ele.className.match(new RegExp('(//s|^)'+cls+'(//s|$)'));
}
function addClass(ele,cls) {
if (!this.hasClass(ele,cls)) ele.className += " "+cls;
}
function removeClass(ele,cls) {
if (hasClass(ele,cls)) {
var reg = new RegExp('(//s|^)'+cls+'(//s|$)');
ele.className=ele.className.replace(reg,' ');
}
}
document.enableStateScope = function(scope, on) {
var de = document.documentElement;
On ? addClass(de,scope) : removeClass(de,scope);
};
上面的hasClass、addClass、removeClass方法借用的是《Pro JavaScript Techniques》提供的方法。如果你使用過jquery,方法將更簡(jiǎn)單。
“狀態(tài)域”可以通過下面的方法來切換:
if (condition == true) {
document.enableStateScope("myScope", true);
}
如果“狀態(tài)域”為“on”,狀態(tài)域的名字將附加到規(guī)則的選擇器之前,下面這條規(guī)則在條件為真時(shí)會(huì)將錨點(diǎn)的顏色變成blue。
a { color: red; }
.myScope a { color: blue; }
正如你所預(yù)想的那樣,狀態(tài)域圖像替代技術(shù)是通過檢查圖像是否被禁用而工作的。如果未被禁用,將激活“image-on”狀態(tài)域,這很直接了當(dāng)。
新聞熱點(diǎn)
疑難解答
圖片精選