JavaScript插入動(dòng)態(tài)樣式實(shí)現(xiàn)代碼
更新時(shí)間:2012年02月22日 17:19:31 作者:
能夠把CSS樣式包含到HTML頁(yè)面中的元素有兩個(gè)。其中,<link>元素用于包含來(lái)自外部的文件,而<style>元素用于指定嵌入的樣式
與動(dòng)態(tài)腳本類似,所謂動(dòng)態(tài)樣式是指在頁(yè)面剛加載時(shí)不存在的樣式;動(dòng)態(tài)樣式是在頁(yè)面加載完成后動(dòng)態(tài)添加到頁(yè)面中。
我們以下面這個(gè)典型的<link>元素為例:
<link rel="stylesheet" type="text/css" href="style.css">使用DOM代碼可以很容易的動(dòng)態(tài)創(chuàng)建出這個(gè)元素:
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);
以上代碼在所有主流瀏覽器中都可以正常運(yùn)行。需要注意的是,必須將<link>元素添加到<head>而不是<body>元素,才能保證在所有瀏覽器中的行為一致。整個(gè)過(guò)程可以用一下函數(shù)來(lái)表示:
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")
加載外部樣式文件的過(guò)程是異步的,也就是加載樣式與執(zhí)行JavaScript代碼的過(guò)程沒(méi)有固定的次序。
另一種定義樣式的方式是使用<style>元素來(lái)包含嵌入式CSS,如下所示:
<style>
body { background-color: red; }
</style>
按照相同的邏輯,下列DOM代碼應(yīng)該是有效的:
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中運(yùn)行,在IE中則會(huì)報(bào)錯(cuò)。IE將<style>視為一個(gè)特殊的、與<script>類似的節(jié)點(diǎn),不允許訪問(wèn)其子節(jié)點(diǎn)。事實(shí)上,IE此時(shí)拋出的錯(cuò)誤與向<script>元素添加子節(jié)點(diǎn)時(shí)拋出的錯(cuò)誤相同。解決IE中的這個(gè)問(wèn)題的辦法,就是訪問(wèn)元素的styleSheet屬性,該屬性又有一個(gè)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);
與動(dòng)態(tài)添加嵌入式腳本類似,重寫后的代碼使用了try-catch語(yǔ)句來(lái)捕獲IE拋出的錯(cuò)誤,然后再使用針對(duì)IE的特殊方式來(lái)設(shè)置樣式。一次通用的解決方案如下:
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}");
我們以下面這個(gè)典型的<link>元素為例:
<link rel="stylesheet" type="text/css" href="style.css">使用DOM代碼可以很容易的動(dòng)態(tài)創(chuàng)建出這個(gè)元素:
復(fù)制代碼 代碼如下:
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);
以上代碼在所有主流瀏覽器中都可以正常運(yùn)行。需要注意的是,必須將<link>元素添加到<head>而不是<body>元素,才能保證在所有瀏覽器中的行為一致。整個(gè)過(guò)程可以用一下函數(shù)來(lái)表示:
復(fù)制代碼 代碼如下:
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")
加載外部樣式文件的過(guò)程是異步的,也就是加載樣式與執(zhí)行JavaScript代碼的過(guò)程沒(méi)有固定的次序。
另一種定義樣式的方式是使用<style>元素來(lái)包含嵌入式CSS,如下所示:
<style>
body { background-color: red; }
</style>
按照相同的邏輯,下列DOM代碼應(yīng)該是有效的:
復(fù)制代碼 代碼如下:
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中運(yùn)行,在IE中則會(huì)報(bào)錯(cuò)。IE將<style>視為一個(gè)特殊的、與<script>類似的節(jié)點(diǎn),不允許訪問(wèn)其子節(jié)點(diǎn)。事實(shí)上,IE此時(shí)拋出的錯(cuò)誤與向<script>元素添加子節(jié)點(diǎn)時(shí)拋出的錯(cuò)誤相同。解決IE中的這個(gè)問(wèn)題的辦法,就是訪問(wèn)元素的styleSheet屬性,該屬性又有一個(gè)cssText屬性,可以接受CSS代碼,如下面的例子所示:
復(fù)制代碼 代碼如下:
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);
與動(dòng)態(tài)添加嵌入式腳本類似,重寫后的代碼使用了try-catch語(yǔ)句來(lái)捕獲IE拋出的錯(cuò)誤,然后再使用針對(duì)IE的特殊方式來(lái)設(shè)置樣式。一次通用的解決方案如下:
復(fù)制代碼 代碼如下:
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}");
相關(guān)文章
JavaScript監(jiān)聽(tīng)文本框回車事件并過(guò)濾文本框空格的方法
這篇文章主要介紹了JavaScript監(jiān)聽(tīng)文本框回車事件并過(guò)濾文本框空格的方法,涉及javascript操作文本框獲取、清空及刪除空格的技巧,需要的朋友可以參考下2015-04-04ionic實(shí)現(xiàn)可滑動(dòng)的tab選項(xiàng)卡切換效果
這篇文章主要為大家詳細(xì)介紹了ionic實(shí)現(xiàn)可滑動(dòng)的tab選項(xiàng)卡切換效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08Bootstrap面板(Panels)的簡(jiǎn)單實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了Bootstrap面板(Panels)的簡(jiǎn)單實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03超詳細(xì)小程序定位地圖模塊全系列開(kāi)發(fā)教學(xué)
這篇文章主要介紹了超詳細(xì)小程序定位地圖模塊全系列開(kāi)發(fā)教學(xué),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11JS中的算法與數(shù)據(jù)結(jié)構(gòu)之集合(Set)實(shí)例詳解
這篇文章主要介紹了JS中的算法與數(shù)據(jù)結(jié)構(gòu)之集合(Set),結(jié)合實(shí)例形式詳細(xì)分析了javascript中集合的概念、原理、定義及相關(guān)操作技巧,需要的朋友可以參考下2019-08-08