繼續上一部分,我們要看一下顏色。火狐好像不管三七二十一都會轉變為rgb格式,不過我們通常比較習慣的是hex格式。這就用到以下兩函式。
var rgb2hex = function(rgb)
var tohex = function(x)
我們用正規表示式在檢測其是否為rgb格式,是就用rgb2hex來轉換它。但如果是red,green等值呢,火狐就一反常態,轉換為hex格式,但ie依然如故。我們沒有辦法,自己做乙個雜湊,把常用的顏色都弄進去,然後一一匹對便是。
if(style.search(/background|color/) != -1)
if(!!color[value])
if(value == "inherit")
if(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/.test(value))else if(/^#/.test(value))
return value;
}
基本上是對於css的精確取值就是這樣,顯然它還存在許多不足之處,但對於布局用的和常用的樣式都實現了。還提供了乙個判斷頁面渲染模式的常數q,為了方便,方法名與jquery同名(只能取值,不能賦值,以後有空慢慢與我的addsheet函式整合到一起)。
(function()
var propcache = ;
var propfloat = !+"\v1" ? 'stylefloat' : 'cssfloat';
var camelize = function(attr));
}var memorize = function(prop)
var getieopacity = function(el)else
if(filter)
}return 1;
}var convertpixelvalue = function(el, value)
var rgb2hex = function(rgb)
var tohex = function(x)
var getstyle = function (el, style)
value = el.currentstyle[memorize(style)];
//特殊處理ie的height與width
if (/^(height|width)$/.test(style))else
}}else
value = document.defaultview.getcomputedstyle(el, null).getpropertyvalue(style)
}//下面部分全部用來轉換上面得出的非精確值
if(!/^\d+px$/.test(value))
//轉換百分比,不包括字型
if(/%$/.test(value) && style != "font-size")
//轉換border的thin medium thick
if(/^(border).+(width)$/.test(style));
if(value == "medium" && getstyle(el,s) == "none")
return !!window.xdomainrequest ? b[value][0] : b[value][1];
}//轉換margin的auto
if(/^(margin).+/.test(style) && value == "auto")
return "0px";
}//轉換top|left|right|bottom的auto
if(/(top|left|right|bottom)/.test(style) && value == "auto")
//轉換顏色
if(style.search(/background|color/) != -1)
if(!!color[value])
if(value == "inherit")
if(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/.test(value))else if(/^#/.test(value))
return value;}}
return value;//如 0px
}var css = function()
}var _ = function(el);
gene.height = function();
return el
}if(!window._)
_.q = isquirk;
})()
用法如下:
window.onload = function();
我們可以用這個東西研究一下document.body與document.documentelement。
function text()
測試屬性
document.body
document.documentelement
width
height
margin-left
margin-right
margin-top
margin-bottom
padding-left
padding-right
border-left-width
border-right-width
渲染模式
topleft
offsettop
offsetleft
clienttop
clientleft
offsetwidth
clientwidth
scrollwidth
執行**
執行**
在標準模式下,火狐等瀏覽器中我們看到offsetwidth等值最大為1007,因為火狐的offsetwidth不大於clientwidth,而clientwidth是不包含滾動條(滾動條的寬都固定為17px)。在ie中,offsetwidth是比clientwidth多了兩個border,由此發現問題,1024-1003-17=4,4應該是兩個auto生成,而這個auto應該為border的值,這兩個border在ie中是固定死,不能通過以下手段修改。
換言之,在標準模式下,ie的html是存在不可修改的寬為2px的border。也換言之,我的程式是有個bug,沒有正確顯示出html的border為2px,囧。
再看怪癖模式,
width
height
margin-left
margin-right
margin-top
margin-bottom
padding-left
padding-right
border-left-width
border-right-width
渲染模式
topleft
offsettop
offsetleft
clienttop
clientleft
offsetwidth
clientwidth
scrollwidth
執行**
火狐等沒有所謂的怪癖模式,直接看ie的。發現那神秘的2px又出現,這時出現在document.body的clienttop,clientleft中。那麼怪癖模式下的document.body的clienttop,clientleft又相當於css的什麼概念呢?我們來看微軟給出的一幅老圖,那時ie5獨步天下,沒有所謂標準模式與怪癖模式之分,因此這幅圖的東西都是按怪癖模式表示的。
不難看出,clientleft相當於borderleft,clienttop相當於bordertop。至於上面的border-left-width與border-right-width,就不要看了,是錯誤,因為我當初就沒有考慮這兩個元素在標準模式與怪癖模式下的問題。既然document.body的邊框區就達1024px了,那麼html元素的臉往**擱呢?!對不起,在微軟早期的設想,body元素才是代表文件(乙個強有力的證據是,在怪癖模式下,網頁的滾動條是位於body元素中)。模準模式連同火狐那幫失敗者宣揚的各種沒有市場份額的「標準」,都是在微軟極不情願下支援的。你看,documentelement這樣累贅傻氣的名字像是微軟起的嗎?!如果是微軟,它應該就叫html,和document.boy那樣簡潔。搞到在標準模式下,我們取scrollleft,要用document.documentelement.scrollleft,因為這時body不存在滾動條;在怪癖模式下,要用document.body,雖然微軟以打補丁的方法新增上document.documentelement(真拗口,難怪網景會失敗),但滾動條的位置不是說變就變。
什麼是SOLID原則(第2部分)
翻譯自 what s the deal with the solid principles?part 2 在文章的 第1部分,我們主要討論了前兩個 solid 原則,它們分別是單一職責原則和開閉原則。在這一部分,我們將按照首字母縮略詞中的順序來處理接下來的兩個原則。讓我們啟程吧!在 solid 原則...
重構練習 大二作業 第2部分
現在開始修改資料結構。當初我在寫 的時候不知道抽了什麼風,過載了一大堆比較函式,還都是友元函式。friend bool operator bigamount ba1,bigamount ba2 friend bool operator long long ba1,bigamount ba2 frie...
頭盔2與頭盔3 第1部分
因此,helm3終於被釋放了。每個人都向蒂勒說再見,但這並不是helm3的唯一變化。讓我們討論其他變化。是的,tiller已被刪除,這是一件好事,但要了解為什麼我們需要獲得一些背景知識。tiller是helm的伺服器端 在kubernetes集群上執行 元件,其主要目的是使多個不同的運營商可以使用同...