设置后,Chrome会略微更改RGBA颜色的Alpha值

Jer*_*oen 6 css google-chrome rgba

请考虑以下代码段:

var el = document.getElementById('x');
el.style.backgroundColor = "rgba(124, 181, 236, 0.25)";
alert(el.style.backgroundColor);
Run Code Online (Sandbox Code Playgroud)
<div id="x">Testing</div>
Run Code Online (Sandbox Code Playgroud)

在Windows 8.1上,这会返回backgroundColorIE 11和Firefox 37中的确切输入,但在Chrome 43中它会更改alpha值,并且警报显示:

rgba(124,181,236,0.247059)

请注意,alpha值意外返回0.247059而不是0.25.

我已经完成background-color规范以及rgba规范,更具体地说是关于alpha值的一点,但未能确定这是一个错误还是UA(在这种情况下是Chrome)允许这样做.

是否有任何相关规范解释Chrome的行为是否"被允许"?作为奖励,任何人都可以解释为什么 Chrome会巧妙地改变alpha值吗?


脚注:要检查它是否是"setter"(el.style.backgroundColor = ...)应该责备我还尝试在DOM内部的元素上声明样式.这将具有相同(意外)的结果.看到这个片段:

document.addEventListener("DOMContentLoaded", function(event) { 
  var el = document.getElementById('x');
  alert(el.style.backgroundColor);
});
Run Code Online (Sandbox Code Playgroud)
<div id="x" style="background-color: rgba(124, 181, 236, 0.25);">Testing</div>
Run Code Online (Sandbox Code Playgroud)

Sup*_*rfy 1

RGBA 的思想是用 32 位表示的。这意味着实际上不存在8 位 alpha 的精确0.25这样的东西。因此 0.247059 是实际正确的推断值。那么 Chrome 错了吗?或者它实际上是正确的吗?而其他浏览器给您提供的无效数字并不是页面上呈现内容的真实表示?

然后你可以争辩说 W3C 标准并不完全正确,它应该只允许使用 8 位 Alpha 完全设计的值。但这只是一个建议,而不是法律......

下面是 Chromium 自定义 webkit color.cpp 代码的精简版本,看起来正在执行颜色转换。但我不是铬专家 http://www.chromium.org/developers/how-tos/getting-around-the-chrome-source-code

来源:https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/platform/graphics/Color.cpp

#include <iostream>

using namespace std;
typedef unsigned RGBA32;

int colorFloatToRGBAByte(float f)
{
    return std::max(0, std::min(static_cast<int>(lroundf(255.0f * f)), 255));
}

RGBA32 makeRGBA32FromFloats(float r, float g, float b, float a)
{
    cout << "Alpha: " << a;
    return colorFloatToRGBAByte(a) << 24 | colorFloatToRGBAByte(r) << 16 | colorFloatToRGBAByte(g) << 8 | colorFloatToRGBAByte(b);
}

int main()
{
        RGBA32 t;
        t = makeRGBA32FromFloats (255.0f, 255.0f, 255.0f, 0.25f);
        cout << static_cast<unsigned>(t) << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)