css – rgba(0,0,0,0)和transparent之间有什么区别?

one of my other questions,修复渲染问题的解决方案是使用值rgba(255,255,255,255)而不是透明。我们测试使用rgba(0,0,0,0),这仍然纠正了这个问题,这意味着它是透明的定义导致错误。然而,查看W3C CSS3 Specification(和MDN reference)的透明度显示rgba(0,0,0,0)和transparent应该相等:

transparent

Fully transparent. This keyword can be considered a
shorthand for transparent black, rgba(0,0,0,0), which is its computed
value.

那么什么给了?为什么两个看似相同的值会产生不同的结果?我已经看过RGBA的the formatting,并寻找类似的问题(无济于事)。每个问题/答案提到从透明到rgba(0,0,0,0)的转换总是有’应该’或’根据’。(例如here)。实际的差别是什么,为什么会改变输出这么多?

N.B:这发生在大多数(如果不是全部)Internet Explorer版本中。我们也知道它发生在一些版本的Firefox。但是Chrome和Safari不显示这种行为,导致我们相信在-webkit中有一些补丁。

为了能够提交这个bug,我们需要使用最少的代码重现问题。所以,从我的其他问题转移,这里是使用透明vs 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的问题:

Comparison in an animated .gif

这是在左边透明,在中间rgba,和在右边。

正如@Abhitalks所指出的,我错读了参考文献,但是我将在问题中留下下面的内容,以表明我们已经考虑过这种可能性,或者如果某些东西被遗漏/被忽略。

感谢@ juan-c-v的答案,我决定尝试创建一个测试,以找到计算的值在每个浏览器的透明,并提出了以下:

$('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中,你可能会看到透明的静止。我正在阅读MSDN参考,发现:

The transparent keyword is not supported.

这解释了为什么浏览器显示不同的结果。然而,它不解释任何地方他们的版本的透明实际上定义为。我浏览了旧的CSS1和CSS2 w3c规格,找不到一个旧的定义。透明是什么意思?

rgba()是一个计算一个项目的颜色和透明度的函数,当你想要控制一个项目的颜色和alpha时,这是非常有用的,尤其是如果你不想完全透明。作为一个函数,你告诉浏览器你想要绘制的项目的颜色和透明度,这是更接近JS比CSS。

另一方面,“transparent”是一个CSS属性,它标识一个项目将是完全透明的,而不进行颜色和alpha的计算。作为一个CSS属性而不是一个函数,每个浏览器以不同的方式应用它,因此它与浏览器应用此属性使用的方法有很大不同。

编辑
好吧,你说我矛盾在我的答案:

transparent

Fully transparent. This keyword can be considered a shorthand for
transparent black, rgba(0,0,0,0), which is its computed value.

嗯,我不矛盾。一件事是W3C标准的规范,另一件事是不同浏览器的开发者对该标准的实现。我不会打破IE的代码来证明我在说什么,因为它有点非法,直接问微软的家伙看到他们的答案。

我告诉你的是,他们是浏览器,不处理透明和rgba(0,0,0,0)在同样的方式。这是因为透明属性比rgba(0,0,0,0)函数更老(你喜欢比rgba()更多?),最有可能的是,虽然为IE开发了一个有效的方法为rgba g,b,a),他们仍然使用具有透明属性的旧方法。

你总是要记住的一件事是,没有web浏览器满足W3C标准到100%,这就是为什么在大多数新的属性必须添加制造商的特定扩展(moz- webkit-等)

想想为什么这么荒谬的写同样的事情四次,当一切都将使用标准属性解决,你自己会回答,因为它是不一样的使用透明和rgba(0,0,0,0)在IE 。

http://stackoverflow.com/questions/32479188/whats-the-difference-between-rgba0-0-0-0-and-transparent

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:css – rgba(0,0,0,0)和transparent之间有什么区别?