【发布时间】:2015-12-05 09:37:47
【问题描述】:
在 one of my other questions 中,解决渲染问题的解决方案是使用值rgba(255, 255, 255, 255) 而不是transparent. 我们使用rgba(0, 0, 0, 0) 进行测试,这仍然纠正了问题,这意味着它是@987654334 的定义@ 导致错误。但是,查看transparent 的W3C CSS3 Specification(和MDN reference)会发现rgba(0, 0, 0, 0) 和transparent 应该相等:
透明
完全透明。这个关键字可以被认为是 透明黑色的简写,rgba(0,0,0,0),它是计算出来的 价值。
那是什么?为什么两个看似相同的值会产生不同的结果?我查看了 RGBA 的the formatting,并寻找了类似的问题(无济于事)。每个提到从transparent 到rgba(0,0,0,0) 的转换的问题/答案总是包含“应该”或“根据”字样。(例如here)。实际的区别是什么,为什么它会改变输出这么多?
注意:这发生在大多数(如果不是全部)Internet Explorer 版本中。我们也知道它发生在某些版本的 Firefox 中。然而 Chrome 和 Safari 并没有显示这种行为,这让我们相信 -webkit 中有某种补丁。
为了能够将此作为错误提交,我们需要使用最少的代码重现问题。所以,从我的另一个问题转移过来,这里是使用 transparent 与 rgba(0,0,0,0) 的比较,以及当我们同时使用两者时会发生什么。
透明
@keyframes spin{
0% {transform:rotateZ(0deg);}
50% {transform:rotateZ(360deg);border-radius:60%;}
100%{transform:rotateZ(720deg);}
}
.spinme{
display:inline-block;
position:relative;
left:0;
top:0;
margin:0.2rem;
width:0.8rem;
height:0.8rem;
border:0.2rem solid black;
border-radius:0%;
outline: 1px solid transparent;
transform:rotateZ(0deg);
animation: spin infinite 4s;
}
<div class="spinme"></div>
RGBA(0,0,0,0)
@keyframes spin{
0% {transform:rotateZ(0deg);}
50% {transform:rotateZ(360deg);border-radius:60%;}
100%{transform:rotateZ(720deg);}
}
.spinme{
display:inline-block;
position:relative;
left:0;
top:0;
margin:0.2rem;
width:0.8rem;
height:0.8rem;
border:0.2rem solid black;
border-radius:0%;
outline: 1px solid rgba(0,0,0,0);
transform:rotateZ(0deg);
animation: spin infinite 4s;
}
<div class="spinme"></div>
两者
正如@andyb 所指出的,在单独的元素上同时使用两者时会出现奇怪的行为。你会认为只有一个会摇晃,但他们都会摇晃。如图所示:
@keyframes spin{
0% {transform:rotateZ(0deg);}
50% {transform:rotateZ(360deg);border-radius:60%;}
100%{transform:rotateZ(720deg);}
}
.spinme{
display:inline-block;
position:relative;
left:0;
top:0;
margin:0.2rem;
width:0.8rem;
height:0.8rem;
border:0.2rem solid black;
border-radius:0%;
outline: 1px solid rgba(0,0,0,0);
transform:rotateZ(0deg);
animation: spin infinite 4s;
}
.spinme:nth-of-type(2){
outline: 1px solid transparent;
}
<div class="spinme"></div>
<div class="spinme"></div>
对于那些无法在 Internet Explorer 中测试的人,这里是问题的动画 .gif:
这是transparent在左边,rgba在中间,两者都在右边。
正如@Abhitalks 指出的那样,我误读了参考资料,但我将在问题中留下以下内容,以表明我们已经考虑过这种可能性,或者万一遗漏/忽略了某些事情。
感谢@juan-cv 的回答,我决定尝试创建一个测试来查找每个浏览器中transparent 的计算值,并得出以下结论:
$('p').text($('p').css("background-color"));
p{background-color:transparent;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p></p>
如果您在 Chrome/Safari 中查看此内容,那么您很可能会看到(如果您不这样做,请评论)rgba(0,0,0,0)。但是在 IE 中,您可能仍会看到transparent。我正在阅读MSDN 参考并发现:
不支持透明关键字。
这解释了为什么浏览器显示不同的结果。然而,它并没有解释他们的transparent 版本实际上被定义为什么。我查看了旧的 CSS1 和 CSS2 w3c 规范,但找不到旧的定义。 transparent 是什么意思?
【问题讨论】:
-
不知道任何细节:它们应该相等并不意味着它们被渲染引擎平等地处理。
transparentexisted beforergba被引入,因此负责transparent的代码可能在代码的另一部分,然后是处理颜色的代码。例如。可能有一个标志transparent用于元素和一个颜色属性,而transparent可能完全省略渲染,rgba(0,0,0,0)可能仍然渲染它但透明。 -
我刚刚阅读了上一个问题。这里至少有一些浏览器明显存在错误行为。我建议创建一个最小的测试用例来演示问题并将其提交给受影响的浏览器供应商。 @t.niese 上面的评论听起来非常合理。
-
我几乎可以肯定这也是 IE11 和 Edge 中的一个错误。在 IE11 或 Edge 中查看 this quick fiddle。摇摆不定的元素似乎也会影响使用
outline-color:1px solid rgba(0, 0, 0, 0)的其他元素。它可能不仅仅是透明 vs rgba -
如果您有 microsoft.com 帐户,我建议您在此处提交错误报告:connect.microsoft.com/IE
-
Firefox (nightly 2015-09-09) 在
transparent和rgba(0,0,0,0)之间的 DOM 级别也表现出显着差异。例如,前景色不能明显地设置为零四元组——而是node.style.color='rgba(0,0,0,0)'立即导致node.style.color==='transparent'。此外,具有零 alpha 值的 any 颜色属性将“计算”为transparent(无论是否全为零)——例如:node.style.borderLeftColor='rgba(255,255,255,0)'导致getComputedStyle(node).borderLeftColor === 'transparent'。
标签: css internet-explorer colors computed-style