的 回答: 强>
c
c00c00000000
Red = c00c
Green = 0000
Blue = 0000
c00000
该 用于解析遗留属性上的颜色的规则 涉及现有答案中提到的其他步骤。截断组件为2位数部分描述为:
一些例子:
oooFoooFoooF 000F 000F 000F <- replace, pad and chunk 0F 0F 0F <- leading zeros truncated 0F 0F 0F <- truncated to 2 characters from right oooFooFFoFFF 000F 00FF 0FFF <- replace, pad and chunk 00F 0FF FFF <- leading zeros truncated 00 0F FF <- truncated to 2 characters from right ABCooooooABCooooooABCoooooo ABC000000 ABC000000 ABC000000 <- replace, pad and chunk BC000000 BC000000 BC000000 <- truncated to 8 characters from left BC BC BC <- truncated to 2 characters from right AoCooooooAoCooooooAoCoooooo A0C000000 A0C000000 A0C000000 <- replace, pad and chunk 0C000000 0C000000 0C000000 <- truncated to 8 characters from left C000000 C000000 C000000 <- leading zeros truncated C0 C0 C0 <- truncated to 2 characters from right
以下是该算法的部分实现。它不处理用户输入有效颜色的错误或情况。
function parseColor(input) { // todo: return error if input is "" input = input.trim(); // todo: return error if input is "transparent" // todo: return corresponding #rrggbb if input is a named color // todo: return #rrggbb if input matches #rgb // todo: replace unicode code points greater than U+FFFF with 00 if (input.length > 128) { input = input.slice(0, 128); } if (input.charAt(0) === "#") { input = input.slice(1); } input = input.replace(/[^0-9A-Fa-f]/g, "0"); while (input.length === 0 || input.length % 3 > 0) { input += "0"; } var r = input.slice(0, input.length / 3); var g = input.slice(input.length / 3, input.length * 2 / 3); var b = input.slice(input.length * 2 / 3); if (r.length > 8) { r = r.slice(-8); g = g.slice(-8); b = b.slice(-8); } while (r.length > 2 && r.charAt(0) === "0" && g.charAt(0) === "0" && b.charAt(0) === "0") { r = r.slice(1); g = g.slice(1); b = b.slice(1); } if (r.length > 2) { r = r.slice(0, 2); g = g.slice(0, 2); b = b.slice(0, 2); } return "#" + r.padStart(2, "0") + g.padStart(2, "0") + b.padStart(2, "0"); } $(function() { $("#input").on("change", function() { var input = $(this).val(); var color = parseColor(input); var $cells = $("#result tbody td"); $cells.eq(0).attr("bgcolor", input); $cells.eq(1).attr("bgcolor", color); var color1 = $cells.eq(0).css("background-color"); var color2 = $cells.eq(1).css("background-color"); $cells.eq(2).empty().append("bgcolor: " + input, "<br>", "getComputedStyle: " + color1); $cells.eq(3).empty().append("bgcolor: " + color, "<br>", "getComputedStyle: " + color2); }); });
body { font: medium monospace; } input { width: 20em; } table { table-layout: fixed; width: 100%; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> <p><input id="input" placeholder="Enter color e.g. chucknorris"></p> <table id="result"> <thead> <tr> <th>Left Color</th> <th>Right Color</th> </tr> </thead> <tbody> <tr> <td> </td> <td> </td> </tr> <tr> <td> </td> <td> </td> </tr> </tbody> </table>
这是Netscape日子的延续:
丢失的数字被视为0 [...]。不正确的数字简单地解释为0.例如,值#F0F0F0,F0F0F0,F0F0F,#FxFxFx和FxFxFx都是相同的。
它来自博客文章 关于Microsoft Internet Explorer的颜色解析有点咆哮 它非常详细地介绍了它,包括不同长度的颜色值等。
如果我们依次从博客文章中应用规则,我们会得到以下信息:
用0替换所有无效的十六进制字符
chucknorris becomes c00c0000000
填写下一个可被3整除的字符总数(11 - > 12)
c00c 0000 0000
分成三个相等的组,每个组件代表RGB颜色的相应颜色分量:
RGB (c00c, 0000, 0000)
将每个参数从右向下截断为两个字符
这给出了以下结果:
RGB (c0, 00, 00) = #C00000 or RGB(192, 0, 0)
这是一个展示的例子 bgcolor 在行动中的属性,以产生这个“惊人的”色样:
bgcolor
<table> <tr> <td bgcolor="chucknorris" cellpadding="8" width="100" align="center">chuck norris</td> <td bgcolor="mrt" cellpadding="8" width="100" align="center" style="color:#ffffff">Mr T</td> <td bgcolor="ninjaturtle" cellpadding="8" width="100" align="center" style="color:#ffffff">ninjaturtle</td> </tr> <tr> <td bgcolor="sick" cellpadding="8" width="100" align="center">sick</td> <td bgcolor="crap" cellpadding="8" width="100" align="center">crap</td> <td bgcolor="grass" cellpadding="8" width="100" align="center">grass</td> </tr> </table>
这也回答了问题的其他部分;为什么 bgcolor="chucknorr" 产生黄色?好吧,如果我们应用规则,字符串是:
bgcolor="chucknorr"
c00c00000 => c00 c00 000 => c0 c0 00 [RGB(192, 192, 0)]
这给出了淡黄色的金色。当字符串以9个字符开始时,我们这次保留第二个C因此它最终成为最终颜色值。
当有人指出你可以做的时候我最初遇到过这种情况 color="crap" 而且,它出来了棕色。
color="crap"
的 查克·诺里斯 强> 是统计数据 的 C 强> 浏览器读入十六进制值。
因为a,b,c,d,e,f是 十六进制的字符
浏览器 chucknorris 转换成 c00c00000000 十六进制值。
chucknorris
然后 c00c00000000 十六进制值转换为 的 RGB 强> 格式(除以3)
c00c00000000 =&GT; R:c00c,G:0000,B:0000
R:c00c,G:0000,B:0000
浏览器只需要2位数字即可显示颜色。
R:c00c,G:0000,B:0000 =&GT; R:c0,G:00,B:00 =&GT; c00000
R:c0,G:00,B:00
最后,表明 bgcolor = c00000 在网络浏览器中。
bgcolor = c00000
这是一个展示的例子
<table> <tr> <td bgcolor="chucknorris" cellpadding="10" width="150" align="center">chucknorris</td> <td bgcolor="c00c00000000" cellpadding="10" width="150" align="center">c00c00000000</td> <td bgcolor="c00000" cellpadding="10" width="150" align="center">c00000</td> </tr> </table>
WHATWG HTML规范具有解析传统颜色值的确切算法: https://html.spec.whatwg.org/multipage/infrastructure.html#rules-for-parsing-a-legacy-colour-value
用于解析颜色字符串的代码Netscape Classic是开源的: https://dxr.mozilla.org/classic/source/lib/layout/layimage.c#155
例如,请注意每个字符都被解析为十六进制数字,然后转换为32位整数 的 没有检查溢出 强> 。只有八个十六进制数字适合32位整数,这就是为什么只考虑最后8个字符的原因。在将十六进制数字解析为32位整数之后,然后将它们除以16,将它们截断为8位整数,直到它们适合8位,这就是忽略前导零的原因。
更新:此代码与规范中定义的内容不完全匹配,但唯一的区别是几行代码。我认为这些线路被添加(在Netscape 4中):
if (bytes_per_val > 4) { bytes_per_val = 4; }
原因是浏览器可以 的 不明白 强> 它并尝试以某种方式将其转换为它可以理解的内容,在这种情况下转换为十六进制值!...
chucknorris 以。。开始 c 这是十六进制中识别的字符,也是将所有未识别的字符转换为 0 !
0
所以 chucknorris 以十六进制格式变为: c00c00000000 ,所有其他角色成为 0 和 c 他们仍然在哪里......
现在他们被3除以 RGB (红色,绿色,蓝色)...... R: c00c, G: 0000, B:0000 ...
RGB
R: c00c, G: 0000, B:0000
但我们知道RGB的有效十六进制只有2个字符,意味着 R: c0, G: 00, B:00
R: c0, G: 00, B:00
所以真正的结果是:
bgcolor="#c00000";
我还添加了图像中的步骤作为快速参考: