與動態指令碼類似,所謂動態樣式是指在頁面剛載入時不存在的樣式;動態樣式是在頁面載入完成後動態添加到頁面中。
我們以下面這個典型的<link>元素為例:
<link rel="stylesheet" type="text/css" href="style.css">使用DOM代碼可以很容易的動態建立出這個元素: 複製代碼 代碼如下:var link = document.createElement("link");
link.rel = "stylesheet";
link.type = "text/css";
link.href = "style.css";
var head = document.getElementsByTagName("head")[0];
head.appendChild(link);
以上代碼在所有主流瀏覽器中都可以正常運行。需要注意的是,必須將<link>元素添加到<head>而不是<body>元素,才能保證在所有瀏覽器中的行為一致。整個過程可以用一下函數來表示: 複製代碼 代碼如下:function loadStyles(url) {
var link = document.createElement("link");
link.rel = "stylesheet";
link.type = "text/css";
link.href = url;
var head = document.getElementsByTagName("head")[0];
head.appendChild(link);
}
loadStyles("style.css")
載入外部樣式檔案的過程是非同步,也就是載入樣式與執行JavaScript代碼的過程沒有固定的次序。
另一種定義樣式的方式是使用<style>元素來包含嵌入式CSS,如下所示:
<style>
body { background-color: red; }
</style>
按照相同的邏輯,下列DOM代碼應該是有效: 複製代碼 代碼如下:var style = document.createElement("style");
style.type = "text/css";
style.appendChild(document.createTextNode("body{background-color:red;}"));
var head = document.getElementsByTagName("head")[0];
head.appendChild(style);
以上代碼可以在Firefox、Safrai、Chrome和Opera中運行,在IE中則會報錯。IE將<style>視為一個特殊的、與<script>類似的節點,不允許訪問其子節點。事實上,IE此時拋出的錯誤與向<script>元素添加子節點時拋出的錯誤相同。解決IE中的這個問題的辦法,就是訪問元素的styleSheet屬性,該屬性又有一個cssText屬性,可以接受CSS代碼,如下面的例子所示: 複製代碼 代碼如下:var style = document.createElement("style");
style.type = "text/css";
try {
style.appendChild(document.createTextNode("body{background-color:red}"));
} catch (ex) {
style.styleSheet.cssText = "body{background-color:red}";
}
var head = document.getElementsByTagName("head")[0];
head.appendChild(style);
與動態添加嵌入式指令碼類似,重寫後的代碼使用了try-catch語句來捕獲IE拋出的錯誤,然後再使用針對IE的特殊方式來設定樣式。一次通用的解決方案如下: 複製代碼 代碼如下:function loadStyleString(css) {
var style = document.createElement("style");
style.type = "text/css";
try {
style.appendChild(document.createTextNode(css));
} catch (ex) {
style.styleSheet.cssText = css;
}
var head = document.getElementsByTagName("head")[0];
head.appendChild(style);
}
loadStyleString("body{background-color:red}");