Javascript does-webkit过滤器:灰度(100%);引起虫子?
开始阅读前: 显然这个错误现在已经被修复了,我不再在Chrome 52.0.2743.82和早期版本中遇到这个错误了 原始问题 我正在为chrome创建一个扩展,并创建了一个上下文菜单,其中有几个选项: 从技术上讲,它工作得很好,问题是,菜单的每个条目都有一个指定给它的图标,用css设计样式。通常,图标在悬停之前是灰色的。这已经运行了很长一段时间了,从昨天起它就坏了,我不知道我改变了什么,可能导致了这一切 现在的状态是,当我打开菜单时(通过jQuery发生,它只是一个div,大部分时间是隐藏的),所有图标在我悬停之前都是不可见的。因此,如果我现在将鼠标移到“呼叫”上,它看起来如下所示: 当我解开它时,图标保持可见,看起来就像它应该的那样。所以基本上我可以在鼠标悬停一次时显示所有图标 现在有三件事让我头脑发热:Javascript does-webkit过滤器:灰度(100%);引起虫子?,javascript,html,css,google-chrome,webkit,Javascript,Html,Css,Google Chrome,Webkit,开始阅读前: 显然这个错误现在已经被修复了,我不再在Chrome 52.0.2743.82和早期版本中遇到这个错误了 原始问题 我正在为chrome创建一个扩展,并创建了一个上下文菜单,其中有几个选项: 从技术上讲,它工作得很好,问题是,菜单的每个条目都有一个指定给它的图标,用css设计样式。通常,图标在悬停之前是灰色的。这已经运行了很长一段时间了,从昨天起它就坏了,我不知道我改变了什么,可能导致了这一切 现在的状态是,当我打开菜单时(通过jQuery发生,它只是一个div,大部分时间是隐藏的
- 有些东西处于a状态
- 你将它悬停,它进入状态b并停留在状态b
- 或者当你再次打开它时进入c状态
slideUp
和slideDown
函数隐藏和显示,因此它永远不会重置,只是不时隐藏和显示。现在,当我将所有图标悬停以使其可见时,关闭菜单(单击使用它的某个位置)并再次打开,图标不可见-webkit-filter: grayscale(100%);
filter: grayscale(100%);
filter: gray;
filter: url("data:image/svg+xml;utf8,<svg version='1.1' xmlns='http://www.w3.org/2000/svg' height='0'><filter id='greyscale'><feColorMatrix type='matrix' values='0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0' /></filter></svg>#greyscale");
-webkit过滤器:灰度(100%);
滤镜:灰度(100%);
过滤器:灰色;
过滤器:url(“数据:image/svg+xml;utf8,#灰度”);
现在当我注释掉-webkit过滤器时:灰度(100%)代码>,图标当然不会变灰,但它们会按应有的方式显示
那么f是如何工作的呢?尝试以下方法来强制重新绘制图形:
$(el).css("opacity", .99);
setTimeout(function(){
$(el).css("opacity", 1);
},20);
这样,所有内容都必须重新计算和重新绘制,并且对于最终用户来说几乎不可见。如果可行,您可以尝试将其添加到css样式中,以强制在样式之间重新绘制,以避免javascript开销/多余代码
-webkit-filter: grayscale(100%);
filter: grayscale(100%);
filter: gray;
opacity: 0.99;
filter: url("data:image/svg+xml;utf8,<svg version='1.1' xmlns='http://www.w3.org/2000/svg' height='0'><filter id='greyscale'><feColorMatrix type='matrix' values='0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0' /></filter></svg>#greyscale");
-webkit过滤器:灰度(100%);
滤镜:灰度(100%);
过滤器:灰色;
不透明度:0.99;
过滤器:url(“数据:image/svg+xml;utf8,#灰度”);
问题是这些过滤器被图形硬件绘制缓存,一些缓冲区被缓存在某个地方,而不是在更新时重新计算
这很可能是一个bug,最好报告为bug
我在一个使用大量灰度图像和悬停效果的页面上也看到了这个问题。即使切换标签也能纠正这一问题。这看起来像是某种Chrome渲染错误。听起来你可以在显示之前切换一个影响css的布局道具来掩盖错误,直到它得到修复。这些年来,我不得不使用很多类似的技巧,尤其是在chrome上。嗨,Tom,试着用jQuery来实现这个效果。我不得不与很多Google Chrome bug作斗争,特别是CSS,这就是为什么我真的不喜欢这个不完整的浏览器。Kk,在不久的将来会有任何修复吗?我注意到WebKit/Blink过滤器也有类似的问题,这似乎是过度优化的结果。通常,这些类型的错误会在删除供应商前缀时修复。