JavaScript插入动态样式

本文介绍了如何在HTML页面中动态添加CSS样式,包括使用<link>元素加载外部样式文件和<style>元素嵌入式定义CSS。文章详细解释了两种方法的实现步骤,并讨论了不同浏览器的兼容性问题,特别强调了在<head>元素中添加<style>元素的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

能够把CSS样式包含到HTML页面中的元素有两个。其中,<link>元素用于包含来自外部的文件,而<style>元素用于指定嵌入的样式。与动态脚本类似,所谓动态样式是指在页面刚加载时不存在的样式;动态样式是在页面加载完成后动态添加到页面中。

我们以下面这个典型的<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}");
 

 

 

 

转自:http://www.w3cmm.com/dom/insert-css.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值