又抓到虫子了:IE中奇怪的应用CSS的BUG

  由于IE系浏览器对标准的支持不够好,导致Web开发中经常需要去处理浏览器兼容性问题,特别有些莫名其妙的问题很让人头疼,今天要说这个问题就是这样的,先从插入CSS的三种方法说起:

 

外部样式(External Style Sheet)

  当样式需要应用于很多页面时,外部样式表将是理想的选择。在使用外部样式表的情况下,你可以通过改变一个文件来改变整个站点的外观。每个页面使用 <link> 标签链接到样式表。<link> 标签在(文档的)头部:

1
2
3
<head>
<link rel="stylesheet" type="text/css" href="mystyle.css" />
</head>

内部样式(Internal Style Sheet)

  当单个文档需要特殊的样式时,就应该使用内部样式表。你可以使用 <style> 标签在文档头部定义内部样式表,就像这样:

1
2
3
4
5
6
7
<head>
<style type="text/css">
  hr {color: sienna;}
  p {margin-left: 20px;}
  body {background-image: url("images/back40.gif");}
</style>
</head>

内联样式(Inline Styles)

  由于要将表现和内容混杂在一起,内联样式会损失掉样式表的许多优势。请慎用这种方法,例如当样式仅需要在一个元素上应用一次时。要使用内联样式,你需要在相关的标签内使用样式(style)属性。Style 属性可以包含任何 CSS 属性。

1
<p style="color: sienna; margin-left: 20px">This is a paragraph</p>

多重样式(Multiple Styles)

  如果外部样式、内部样式和内联样式同时应用于同一个元素,就是使多重样式的情况,一般情况下优先级如下:

 

  (外部样式)External style sheet <(内部样式)Internal style sheet <(内联样式)Inline style

 

  之所以说是一般情况是因为可以使用!important来改变这种顺序,比如外部样式如果某个样式项使用了!important来提高优先级,其优先级将比内联样式高。还有个例外的情况就是如果外部样式放在内部样式的后面,则外部样式将覆盖内部样式:

1
2
3
4
5
6
7
8
9
10
11
12
13
<head>
<!--内部样式-->
<style>
    h3{color:green;}
</style>
 
<!--外部样式style.css-->
<!--h3{color:blue;}-->
<link rel="stylesheet" type="text/css" href="style.css"/>
</head>
<body>
    <h3>测试!</h3>
</body>

  文字的颜色将是蓝色,因为外部样式的蓝色覆盖了内部样式的绿色,这在主流浏览器中表现都是一致的,包括IE在内。然而另外一种方式插入样式,IE就表现出它的另类了。这种方法是使用脚本在外部样式前插入内部样式,即上面的内部样式用脚本创建出来,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
(function(){
    var agent = window.navigator.userAgent.toLowerCase();
    var is_op = (agent.indexOf("opera") != -1);
    var is_ie = (agent.indexOf("msie") != -1) && document.all && !is_op;
    var is_ch = (agent.indexOf("chrome") != -1);
 
    var cssStr="h3 {color:green;}";
    var s=document.createElement("style");
    var head=document.getElementsByTagName("head").item(0);
    var link=document.getElementsByTagName("link");
    link=link.item(0);
 
    if(is_ie)
    {
        if(link)
            head.insertBefore(s,link);
        else
            head.appendChild(s);
        document.styleSheets.item(document.styleSheets.length-1).cssText=cssStr;
    }
    else if(is_ch)
    {
        var t=document.createTextNode();
        t.nodeValue=cssStr;
        s.appendChild(t);
        head.insertBefore(s,link);
    }
    else
    {
        s.innerHTML=cssStr;
        head.insertBefore(s,link);
    }
})();

  在Firefox/Chrome/Safari/Opera中测试文字都是蓝色的,符合内部样式如果插入到外部样式前的话,外部样式将覆盖内部样式的原则,然而在IE下却是绿色的,也就是说IE在加载完页面文档,运行了脚本插入了内部样式之后,就把文字颜色设置成绿色了而忽略了后面外部样式。不知道大家是否也碰到这样的问题,欢迎讨论......

posted @   梦想天空(山边小溪)  阅读(3912)  评论(4编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示