为什么Internet Explorer中的3位十六进制颜色代码值有不同的解释?

时间:2015-02-16 23:12:26

标签: html internet-explorer colors

Internet Explorer究竟是如何解释它们的,以及在哪个指南或标准集下?

例如:

#FFF

例如,

在Google Chrome浏览器中显示为白色,而在Internet Explorer中(我在8和9上测试过它)显示为黑色。

我用来测试的代码如下:

<body bgcolor="#ffffff"> vs. <body bgcolor="#fff">

(我知道bgcolor已被弃用,这对我手边的工作来说非常方便。

我也知道这是一个错误,并且可以通过在十六进制代码中附加几个数字(总共6个)来轻松修复它,但我只是想看看为什么它会发生的背后的科学,如果有解释的话。

2 个答案:

答案 0 :(得分:16)

因为你&#34;有兴趣看到它背后的科学原因,如果有解释它&#34; ......

<强> TLDR:

&#39;颜色值&#39;不是普遍的&#39;。

缩写/简写三位十六进制#RGB形式在CSS规范中描述,而不是在HTML中描述。 因此,除了&#34; style&#34;之外的属性中的三位数形式。或者在某些浏览器中,<style>标记内部不会被解释为有效颜色 https://en.wikipedia.org/wiki/Web_colors



深度:

我从CSS 1 spec, Color units (6.3)开始(因为它介绍了一些我不必重复的术语/概念),它指定:

  

颜色是关键字或数字RGB规范。

     

建议的关键字颜色名称列表为:浅绿色,黑色,蓝色,   紫红色,灰色,绿色,石灰,栗色,海军蓝,橄榄色,紫色,红色,银色,   蓝绿色,白色和黄色。这16种颜色取自Windows   VGA调色板及其RGB值未在此定义   说明书

BODY {color: black; background: white }
H1 { color: maroon }
H2 { color: olive }
     

RGB颜色模型用于数字颜色规范。   这些示例都指定了相同的颜色:

EM { color: #f00 }              /* #rgb */
EM { color: #ff0000 }           /* #rrggbb */
EM { color: rgb(255,0,0) }      /* integer range 0 - 255 */
EM { color: rgb(100%, 0%, 0%) } /* float range 0.0% - 100.0% */
     

十六进制表示法的RGB值格式为&#39; #&#39;   紧接着是三个或六个十六进制字符。   三位RGB符号(#rgb)将转换为六位数形式   (#rrggbb)复制数字,而不是添加零。例如,   #fb0扩展为#ffbb00。这可以确保白色(#ffffff)可以   使用短符号(#fff)指定并删除所有依赖项   关于显示器的颜色深度。

     

功能表示法中RGB值的格式为&#39; rgb(&#39;   然后是逗号分隔的三个数值列表(或者   三个整数值,范围为0-255或三个百分比值   在0.0%到100.0%的范围内)然后是)&#39;。空白字符   允许在数值周围。

     

应修剪数值范围之外的值。三条规则   因此,下面是相同的:

EM { color: rgb(255,0,0) }       /* integer range 0 - 255 */
EM { color: rgb(300,0,0) }       /* clipped to 255 */
EM { color: rgb(110%, 0%, 0%) }  /* clipped to 100% */
     

RGB颜色在sRGB颜色空间中指定。 UAs可能会有所不同   它们代表这些颜色的保真度,但使用sRGB   提供了一个明确,客观可衡量的定义   颜色应该是,这可能与国际标准有关。

在CSS的背景下,关于浏览器支持,唯一的2&#39;有趣的&#39;我能找到的东西是:

  • 支持样式表(版本3及更高版本,IE3 Mac除外)的所有浏览器都支持这种三字符十六进制颜色的简写形式 (来源:1,{{ 3}},&#34;优化CSS颜色&#34;由King AB提供)
    请注意该文本的历史时间范围.. IE3 ...在Mac上...像FireFox 1或Chrome这样的浏览器甚至不在当时......
  • 两种rgb()方法受到Internet Explorer 3不支持的影响 来源:2(非常好读)



根据1 bgcolor仅针对<body><table><tr><th><td>。 (因此就遗留规范而言,例如,不能在<div>上使用它。)

所有这些都属于CDATA - 类型:%Color;
这是HTML4 spec, the attribute

<!ENTITY % Color "CDATA" -- a color using sRGB: #RRGGBB as Hex values -->

<!-- There are also 16 widely known color names with their sRGB values:

    Black  = #000000    Green  = #008000
    Silver = #C0C0C0    Lime   = #00FF00
    Gray   = #808080    Olive  = #808000
    White  = #FFFFFF    Yellow = #FFFF00
    Maroon = #800000    Navy   = #000080
    Red    = #FF0000    Blue   = #0000FF
    Purple = #800080    Teal   = #008080
    Fuchsia= #FF00FF    Aqua   = #00FFFF
 -->

这里的神奇短语是:&#34; 使用defined的颜色: #RRGGBB 作为十六进制值&#34;。

如果我戴着规范实施者的帽子读到这个,我必须同意我没有看到指定的简短的3位数#RGB符号,我不会实现它(我也没有实现RGB(DDD,DDD,DDD))。

至于所有以前(HTML4)指定元素的sRGB(见上文) 这意味着,就规范而言,有效“颜色代码”的格式是有效的。不会很快改变..



结论:

仅接受 指定颜色(来自指定/支持的列表)或“十六进制”三元组&#39; (格式#RRGGBB)HTML属性bgcolor上的sRGB颜色值不是错误;这是按规格!
跨浏览器解决方案:..请参阅规格☺

如果在解析/渲染引擎上错误地为bgcolor指定了一个不支持该值的短手颜色值,那么要么没有任何反应,要么显示出非预期的颜色;实际上你输入了HTML5, the bgcolor attribute is obsoleted ..
最值得注意的是,对于MS IE和MS Outlook,颜色看起来几乎是黑色。例如:#ff0(速记)将变为#0f0f00(而不是#ffff00)。另一个例子:#07c将成为#00070c等。
然而其他一些实现将#ff0变为#000ff0,将#07c变为#00007c !! 如果错误地为RGB(RRR,GGG,BBB)指定bgcolor值,则会出现各种颜色,例如RGB(255,255,255)可能会变成非常暗的绿色 'Chuck Norris'-land 等。

所以这里我们有一个有趣的例子,微软的Internet Explorer(包括IE11在内的所有已知版本)遵循规范,很多人仍在抱怨..
我找到了无数关于&#34; 3位数色值速记&#39; bug&#39;对于例如MS IE解决的bgcolor - 属性&#34; (跨越15年),使用MS IE HTML解析/呈现引擎的替代浏览器以及大多数基于本地app / web的电子邮件 - 客户端包括Gmail,(所有版本)Outlook(-Express),Lotus Notes,Android等等。(例如source1234等。)

为什么投诉/错误支持?
因为其他一些浏览器(如FireFox,Chrome)以其他格式支持颜色值,然后在HTML&#39}属性#RRGGBBbgcolor为什么其他人会支持它?
我只有2个猜测:(a)它是&#34; BrowserWar 1&#34;的剩余部分。其中一场战斗是围绕着#34;我的浏览器可以让人感觉到&#39;更大的cr @ p-code然后是竞争对手&#34;,但更有可能的是(b)重用CSS颜色值解析器中的代码... 最终我会这样做好吧



额外:

为什么2015年的任何人仍然关心bgcolor
为什么这仍然会产生如此多的bug-rapports和问题?
答案是 HTML电子邮件 ...
理论上(对于毫无戒心的网络开发者),它只是HTML和CSS&#39; ..
在实践中,它是非常难以理解的5。想一想:所有跨浏览器的问题都存在于3的强大之中! 它必须在众多平台上运行更多电子邮件客户端(实际上仍在使用的传统&#39;应用程序的负载),它还必须在基于Web的客户端中工作如Gmail,AOL,Yahoo,Hotmail等 他们不仅必须编码可以想象的最低公分母(很多技术在十年前已经被认为是古老的),他们甚至必须尝试适应“#10;与一些基于Web的客户的布局/风格。

他们的典型结构是一个大背景表,然后是一个div,然后是一个主表,如果需要,还有嵌套表... 根据{{​​3}}(anno 2014),将事情放到更深入的角度来看:
&#34; 事实证明,最可靠的编码背景颜色的方法是使用HTML bgcolor属性,在表格和td级别上使用6位十六进制代码&#34 ;



显然,这个混乱&#39;不会很快消失,对于网络开发者来说,常见的事情就是编写/设计HTML电子邮件...因此,我认为完全理解(并回答此问题)仍然非常重要2015年和不久的将来。

希望这有帮助!

PS:MS IE&#39; filter: progid:DXImageTransform.Microsoft.gradient也不接受3位十六进制速记颜色值,但现在提醒人们注意“颜色值不是”的概念环球&#39;,这不是一个惊喜(而不是1,除非它被指定它会接受这样的值。)

答案 1 :(得分:2)

我也能够在IE11中重新创建它。如您所知,它是一个已弃用的属性。我假设你的网页&amp;浏览器正在尝试将代码解释为HTML5,并且它们的优雅降级存在一个错误来处理这个问题。所以它就是休息。

正如@Aaron Vanston指出的那样,使用内联样式或CSS,您仍然可以使用速记十六进制来应用颜色。

我甚至不会浪费时间写出bgcolor作为属性。如果我在我正在处理的事情中遇到它,我会删除它以支持

style="background-color: #fff"

或CSS替代

body {
    background-color: "#fff";
}