jau*_*unt 62 css internet-explorer colors css3 computed-style
在我的其他一个问题中,修复渲染问题的解决方案是使用值rgba(255, 255, 255, 255)而不是transparent.我们测试使用rgba(0, 0, 0, 0),这仍然纠正了问题,这意味着它的定义transparent会导致错误.但是,查看W3C CSS3规范(和MDN参考)可以transparent发现rgba(0, 0, 0, 0)并且 transparent应该相同:
透明
完全透明.此关键字可以视为透明黑色的简写,rgba(0,0,0,0),这是其计算值.
什么给出了什么?为什么两个看似相同的值会产生不同的结果呢?我研究了RGBA 的格式,并寻找类似的问题(无济于事).每一个问题/答案,从提到的转换transparent,以rgba(0,0,0,0)总是在词"应该"或"根据"了.(例如这里).什么是实际差异,为什么它会如此改变输出?
注意:这种情况发生在大多数(如果不是全部)Internet Explorer版本中.我们也知道它出现在某些版本的Firefox中.但是,Chrome和Safari不会显示此行为,导致我们相信存在某种补丁-webkit.
为了能够将此作为错误提交,我们需要使用最少量的代码重现问题.所以,从我的另一个问题转移,这里是使用transparentvs 的比较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;
}Run Code Online (Sandbox Code Playgroud)
<div class="spinme"></div>Run Code Online (Sandbox Code Playgroud)
@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;
}Run Code Online (Sandbox Code Playgroud)
<div class="spinme"></div>Run Code Online (Sandbox Code Playgroud)
正如@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;
}Run Code Online (Sandbox Code Playgroud)
<div class="spinme"></div>
<div class="spinme"></div>Run Code Online (Sandbox Code Playgroud)
对于那些无法在Internet Explorer中测试的人,这里是问题的动画.gif:
这是transparent在左侧,rgba中间和右侧.
正如@Abhitalks所指出的那样,我误读了这个引用,但是我会在问题中留下以下的内容,以表明我们已经考虑过这种可能性,或者万一被错过/忽略了.
感谢@ juan-cv的回答,我决定尝试创建一个测试来查找transparent每个浏览器的计算值,并提出以下建议:
$('p').text($('p').css("background-color"));Run Code Online (Sandbox Code Playgroud)
p{background-color:transparent;}Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p></p>Run Code Online (Sandbox Code Playgroud)
如果您在Chrome/Safari中查看此内容,则很可能会看到(如果您没有,请发表评论)rgba(0,0,0,0).但是在IE中,你可能会看到它transparent.我正在阅读MSDN参考资料,发现:
不支持transparent关键字.
这解释了浏览器显示不同结果的原因.然而,它并没有解释他们的版本transparent实际定义为什么.我查看了旧的CSS1和CSS2 w3c规范,找不到旧的定义.什么transparent意思?
rgba()是一个计算项目颜色和透明度的函数,当你想控制项目的颜色和alpha时,它非常有用,特别是如果你不想完全透明的话.作为一个函数,你告诉浏览器你想要绘制项目的颜色和透明度,这比JS更接近JS.
另一方面,"透明"是一种CSS属性,用于标识项目将完全透明,而无需计算颜色和alpha.作为CSS属性而不是函数,每个浏览器以不同的方式应用它,因此它与浏览器用于应用此属性的方法有很大不同.
编辑 好的,你说我在答案中与此相矛盾:
透明
完全透明.此关键字可以视为透明黑色的简写,rgba(0,0,0,0),这是其计算值.
好吧,我不反对.一件事是W3C标准的规范,另一件事是由不同浏览器的开发人员实现该标准.我不打破IE的代码来证明我在说什么,因为它有点违法,直接要求微软的人看到他们的答案.
我告诉你的是,它们是不能以相同的方式处理透明和rgba(0,0,0,0)的浏览器.那是因为透明属性比rgba(0,0,0,0)函数要老得多(你比rgba()更喜欢吗?),而且很有可能,虽然IE已经为rgba开发了一种有效的方法(r, g,b,a),他们仍然使用透明属性的旧方法.
您必须记住的一件事是,没有Web浏览器符合W3C标准100%,这就是为什么必须在大多数新属性中添加制造商的特定扩展(moz- webkit-等)
想想为什么四次写同样的东西是如此荒谬,当使用标准属性解决所有问题时,你自己会回答,因为在IE中使用透明和rgba(0,0,0,0)是不一样的.
我一直在尝试transparent使用Chrome中的价值代码,安装在运行Windows 7操作系统的笔记本电脑上.
我自己也没有任何晃动.因此,我希望此问题特定于某些浏览器和操作系统,具体取决于特定浏览器和操作系统决定如何呈现您的元素.
此问题可能与您的浏览器是否使用硬件加速有关.现在,有一种方法可以强制您的浏览器使用硬件加速:让您的浏览器认为3D转换正在应用于元素.
您可以通过向元素添加以下属性来实现:
.fake3Dtransformation {
-webkit-transform: translate3d(0, 0, 0);
-moz-transform: translate3d(0, 0, 0);
-ms-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
/* Other transform properties here */
}
Run Code Online (Sandbox Code Playgroud)
虽然我不完全确定这是否会解决使用时的摇摆问题transparent(因为我无法重现问题),但理论上应用这种"黑客"应该会给你最流畅的渲染.查看例如.这篇文章了解更多信息.
因此,对于您的演示代码,您最终会得到:
@keyframes spin{
0% {transform:rotateZ(0deg);}
50% {transform:rotateZ(360deg);border-radius:60%;}
100%{transform:rotateZ(720deg);}
}
#spinme{
-webkit-transform: translate3d(0, 0, 0);
-moz-transform: translate3d(0, 0, 0);
-ms-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
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);
animation: spin infinite 4s;
}
#spinme:nth-of-type(2){
outline: 1px solid transparent;
}Run Code Online (Sandbox Code Playgroud)
<div id="spinme"></div>
<div id="spinme"></div>Run Code Online (Sandbox Code Playgroud)
好消息:
https://jsfiddle.net/z2r7ypy7/4/
| 归档时间: |
|
| 查看次数: |
3224 次 |
| 最近记录: |