使用CSS转换后的文本模糊:scale(); 在Chrome中


126

似乎最近有一个Google Chrome浏览器更新,导致在执行之后文字模糊transform: scale()。具体来说,我正在这样做:

@-webkit-keyframes bounceIn {
  0% {
    opacity: 0;
    -webkit-transform: scale(.3);
  }

  50% {
    opacity: 1;
    -webkit-transform: scale(1.05);
  }

  70% {
    -webkit-transform: scale(.9);
  }

  100% {
    -webkit-transform: scale(1);
  }
}

如果您在Chrome中访问http://rourkery.com,则应该在主要文本区域中看到问题。它以前没有这样做,并且似乎也没有影响其他Webkit浏览器(例如Safari)。还有其他一些关于人们在使用3d变换时遇到类似问题的帖子,但找不到关于2d变换的任何信息。

任何想法将不胜感激,谢谢!


刚刚使用Firefox和IE 10访问该站点,看不到问题。如果仅限于Chrome,则可能需要等待Google自行修复。
Nolonar 2013年

我没有看到任何模糊......我的Chrome V25 / PC上
VSYNC

我也早些时候遇到过这个问题,正如Nolonar提到的那样,我们必须等待Google对其进行修复。
raj_n

这不是解决方案,但我注意到仅当我使用CSS OptimizeLegibility时才出现此问题。
Bangkokian

链接断开。
Timothy003 '19

Answers:


77

我多次遇到此问题,似乎有2种解决方法(如下所示)。您可以使用这些属性之一来修复渲染,也可以同时使用这两个属性。

隐藏的背面可见性解决了该问题,因为它将动画简化为仅位于对象的正面,而默认状态为正面和背面。

backface-visibility: hidden;

TranslateZ也可以工作,因为它可以为动画添加硬件加速。

transform: translateZ(0);

这两个属性均可解决您遇到的问题,但有些人也喜欢添加

-webkit-font-smoothing: subpixel-antialiased;

以他们的动画来反对。我发现它可以更改网络字体的呈现方式,但也可以尝试使用该方法。


12
这些技术似乎都可以改善,但是我仍然无法使Chrome达到与Firefox相同的清晰度。
Michael Martin-Smucker 2014年

13
backface-visibility: hidden;在解决由不透明过渡引起的一些奇怪的模糊运动方面,我的确能奏效。奇怪的动作现在消失了,但是它却使我的div中的文本永久变得模糊。
ITWitch

13
正如@ykadaru所建议的那样,尝试将其添加perspective(1px)到您的transform:代码中,这在Chrome浏览器中对我有用,而其他任何问题都无法解决
Serge Eremeev

4
在Ubuntu 17.10中运行Gnome X11会话(Wayland关闭)的Chrome版本65.0.3325.162(正式版本)(64位)
不起作用

3
在Chrome 72中,前两个选项导致文本在转换期间和转换结束时变得模糊
Brandito

24

为了改善模糊度,尤其是。在Chrome上,尝试执行以下操作:

transform: perspective(1px) translateZ(0);
backface-visibility: hidden;

更新: 透视图增加了用户与z平面之间的距离,从技术上讲,它缩放了对象,使模糊效果看起来“永久”。在perspective(1px)上面就像是鸭子磁带,因为我们匹配我们正在试图解决的模糊。您可能会遇到以下CSS更好的运气:

transform: translateZ(0);
backface-visibility: hidden;

4
对我来说,这实际上使情况更糟。
balu

1
对我来说,这可以修复故障(不执行此操作,动画完成后元素将移动1px,进行变换:仅透视图(1px)即可解决此问题!)
Sergiu

@balu检查我的最新答案!摆脱perspective(1px)财产,看看它是否更好。
ykadaru

16

我发现调整比例比例会有所帮助。

使用scale(1.048)结束(1.05)似乎可以更好地逼近整个像素的字体大小,从而减少了子像素的模糊。

我还使用translateZ(0)了似乎可以调整转换动画中Chrome的最终舍入步骤的功能。这对我的悬停使用是一个优点,因为它可以提高速度并减少视觉噪音。但是,对于onclick函数,我不会使用它,因为转换后的字体似乎不那么酥脆。


1
那是对我有用的唯一方法。其他方法(背面可见性,添加过滤器,透视图和良好的旧translateZ)只会使情况变得更糟。尝试缩放到整个像素。例如,使用1,1429(16/14)的比例因子从14px变为16px。
雨果·德·亨里格

1
在没有工作的情况下为我工作translateZ(0),仅更改1.051.048
A. Volg

15

在没有运气的情况下尝试了这里的所有其他功能之后,最终为我解决此问题的是删除了该will-change: transform;属性。由于某种原因,它在Chrome(而不是Firefox)中造成了令人难以置信的缩放比例。


为什么有人会反对呢?我不明白...:((在某些版本的chrome中,这是一个完全有效的问题,看来“ will-change”通常还是很新的,可能不应该使用。有关更多信息,请参见greensock .com / will-change

有同样的问题。感谢您的发布。
Raine

我在Chrome 75上渲染材质设计组件时遇到了同样的问题。删除“将更改的” css样式可以解决此问题。
罗布

在Chrome 79中确认
Fareesh Vijayarangam

1
我有相反的will-change: transform;
看法

14

代替

transform: scale(1.5);

使用

zoom : 150%;

修复了Chrome中的文本模糊问题。


它可以提供帮助,但同时也会带来其他问题,例如有时会引入白色边框线
Kevin Kevin

1
不知道为什么要下票。当我将其应用于复选框时,它的效果要好于transform:scale()
Brian McCall 2015年

2
对于Firefox,请使用transform:scale()就像魅力一样工作而没有任何模糊。您将必须进行浏览器检测,并针对chrome / safari和Firefox采取相应措施。
Naisheel Verdhan 2015年

15
另一个问题是缩放似乎不适用于transition属性,因此无法用于CSS动画
ericgrosse

3
它可以有效地模糊对象,但也可以更改元素的位置。
user1156544

8

这一定是Chrome(版本56.0.2924.87)的错误,但以下内容为我修改了控制台('.0')中的CSS属性时的模糊性。我会报告。

filter: blur(.0px)

1
您的错误报告到哪里去了?
重氮

怕我什至不记得我将错误提交到哪里。确实如此。
andyw

我正在使用Bootstrap(4.4.1),Chrome(80.0.3987.132),Windows 10(视图放大了125%),并且下拉菜单中的文本模糊。使用菜单定位transform: translate3d();,这似乎引起了问题。没有建议的解决方案对我有用。除了/有点这个。仅当我先将其设置为某个正值(例如blur(0.1px)),然后更改为时,此方法才有效blur(0px)。由于该元素是动态的,并且还需要动态(JS)解决方案,因此这很糟糕:\
akinuri

7

桑德尔斯引导我找到答案。除了filter: scale不存在,但是filter: blur存在。

将下一个声明应用于看上去模糊的元素(在我的情况下,它们位于转换后的元素内):

backface-visibility: hidden;    
-webkit-filter: blur(0);

几乎完美地工作。“ 几乎 ”是因为我正在使用过渡,并且在过渡时,元素看起来并不完美,但是一旦完成过渡,它们就会完成。


-webkit-filter: blur(0);一个人为我工作。backface-visibility: hidden;之后重置缩放时,元素模糊。
凯·哈特曼

这对于Chrome来说有点可笑...如果我将blur(0px);其设置为无法解决问题。但是,如果我这样做blur(1px);,然后按向下箭头键,blur(0px);它看起来确实正确。转眼就刷新页面/不管我在CSS编写
汤姆Roggero

1
@TomRoggero这听起来不那么模糊属性值,而更多关于完成布局重绘的时间。您可以尝试在一段时间后使用JavaScript强制重绘元素。
加茹斯

5

我发现,问题以任何方式发生在相对转换上。translationX(50%),scale(1.1)或其他。提供绝对值始终有效(不会产生模糊的文字)。

这里提到的所有解决方案都没有用,我认为还没有解决方案(我在撰写本文时使用Chrome 62.0.3202.94)。

就我而言,transform: translateY(-50%) translateX(-50%)会导致模糊(我想使对话框居中)。

为了获得更多的“绝对”值,我不得不将十进制值设置为transform: translateY(-50.09%) translateX(-50.09%)

注意

我很确定,此值在不同的屏幕尺寸上会有所不同。我只是想分享我的经验,以防有人帮助。


我在做这个完全相同的事情时遇到了这个完全相同的问题。我将translate3d(-50%,-50%,0)放在模态中心。就我而言,我将值提高到-50.048%,看起来很完美。
克里斯·古铁雷斯


4

perspective(1px)为我工作。

transform: scale(1.005);

transform: scale(1.005) perspective(1px);


3

在我的情况下,以下代码导致字体模糊:

-webkit-transform: translate(-50%,-50%);
transform: translate(-50%,-50%);

只是添加zoom属性为我修复了它。进行缩放,以下对我有用:

zoom: 97%;   

4
没有Firefox支持zoom
Dustin Poissant

3

我刚刚在Chrome上发现模糊转换(translate3d,scaleX)的另一个尝试是将元素设置为“ display:inline-table ;”。在某些情况下(在X轴上)似乎迫使像素舍入。

我读到了Chrome下的亚像素定位是故意的,开发人员不会修复它。


3

2019更新
Chrome的显示错误仍未修复,尽管顾客没有错,但本网站全文中没有提供任何建议来解决此问题。我可以同意,我徒劳地尝试了其中的每一个:只有1个接近,这就是css规则:filter:blur(0); 这消除了将容器移动1px的麻烦,但不能解决容器本身及其可能包含的任何内容的模糊显示错误。

这就是现实:实际上没有解决此问题的方法,因此这里是针对易变网站的一种解决方法

案例
我目前正在开发一个流畅的网站,并具有3个div,所有div都以悬停效果为中心,并在宽度和位置上共享百分比值。Chrome错误发生在设置为left:50%的中心容器上;并转换:translateX(-50%); 常见的设置。

示例:首先是HTML ...

<div id="box1" class="box">
    Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry"s standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.
</div>

<div id="box2" class="box">
    Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry"s standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.
</div>

<div id="box3" class="box">
    Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry"s standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.
</div>

这是发生Chrome错误的CSS ...

*{margin:0; padding:0; border:0; outline:0; box-sizing:border-box;  background:#505050;}
.box {position:absolute; border:1px solid #fff; border-radius:10px; width:26%; background:#8e1515; padding:25px; top:20px; font-size:12pt; color:#fff; overflow:hidden; text-align:center; transition:0.5s ease-in-out;}
.box:hover {background:#191616;}
.box:active {background:#191616;}
.box:focus {background:#191616;}
#box1 {left:5%;}
#box2 {left:50%; transform:translateX(-50%);} /* Bugged */
#box3 {right:5%;}

这是固定的CSS ...

*{margin:0; padding:0; border:0; outline:0; box-sizing:border-box;  background:#505050;}
.box {position:absolute; border:1px solid #fff; border-radius:10px; width:26%; background:#8e1515; padding:25px; top:20px; font-size:12pt; color:#fff; overflow:hidden; text-align:center; transition:0.5s ease-in-out;}
.box:hover {background:#191616;}
.box:active {background:#191616;}
.box:focus {background:#191616;}
#box1 {left:5%;}
#box2 {left:37%;} /* Fixed */
#box3 {right:5%;}

错误的提琴: https
//jsfiddle.net/m9bgrunx/2/ 固定的提琴:https ://jsfiddle.net/uoc6e2dm/2/

如您所见,对CSS进行少量调整可以减少或消除使用transform进行定位的要求。这也可能适用于固定宽度的网站以及流畅的网站。


使用平移时会出现模糊现象,因为该元素最终可能会出现一半像素。现在有更好的替代方法可用于居中:flexbox示例网格示例
Timothy003 '19

我测试过的唯一一个似乎与转换中心有关的浏览器是Chrome,其他所有内容看起来都很清晰。我回头看,这个问题已经存在7年了!仍然有很多方法可以给猫咪剥皮,就像您说的那样,它甚至不再需要。
SJacks

这是令人难以置信的,但是过滤器:模糊(-0.1px); 帮助过我 !!。这到底是怎么工作的?
jt3k

3

我有着同样的问题。我使用以下方法修复了此问题:

.element {
  display: table
}

2
精神错乱,但有效;Chrome显然是新的IE
Arthur

上帝啊!ir的作品!我猜在PX中的表格'
fix'de

2

以上都不对我有用。我在弹出窗口中有此动画:

@keyframes pulse {
  from {
    transform: scale3d(1, 1, 1);
  }
  50% {
    transform: scale3d(1.05, 1.05, 1.05);
  }
  to {
    transform: scale3d(1, 1, 1);
  }
}

就我而言,应用此规则后,模糊效果消失了: -webkit-perspective: 1000;即使在Chrome检查器中将其标记为未使用。


它对我有用,并且也标记为未使用。我还添加will-change: transform;了修复元素边界模糊的功能。其他答案对我没有用。
JakubZawiślak

2

我的解决方案是:

显示:初始;

然后酥脆锋利


1

以上都不对我有用。

当我添加视角时它起作用了

即从

transform : translate3d(-10px,-20px,0) scale3d(0.7,0.7, 1)

我改为

transform : perspective(1px) translate3d(-10px,-20px,0) scale3d(0.7,0.7, 1)


添加perspective(1px)实际上对我来说更糟:(
balu

1

我通过添加以下内容解决了问题:

transform: perspective(-1px)

对我来说,这只是删除了scale()转换结果
jpenna

1

对于草木:

我在这里尝试了所有建议。但是没有用。我的大学找到了一个很好的解决方案,效果更好:

你不应该超过1.0

并且包括translateZ(0)在悬停中,但不包括在非悬停/初始位置。

例:

a {
    transition: all 500ms cubic-bezier(0.165, 0.840, 0.440, 1.000);
    transform: scale(0.8, 0.8);
}

a:hover {
    transform: translateZ(0)scale(1.0, 1.0);
}

1

我使用了所有答案的组合,这最终对我有用:

.modal .modal--transition {
  display: inline-table;
  transform: perspective(1px) scale(1) translateZ(0);
  backface-visibility: hidden;
  -webkit-font-smoothing: subpixel-antialiased;
}

1

使用Chrome时,我在Chrome上遇到文本模糊的问题,而在Firefox上却没有transform: translate(-50%,-50%)

好吧,我真的尝试了很多解决方法,例如:

transform: perspective(1px);
filter: blur(0);
transform: translateZ(0);
backface-visibility: hidden;

这些都不对我有用。

最后,我使元素的高度和宽度均匀。它为我解决了这个问题!!!

注意:可能因情况而异。但是肯定值得一试!


1

不幸的是,Version 81.0.4044.138 我已经从这些答案中尝试了许多示例,但我对Chrome的转换元素没有任何帮助

 transform-origin: 50% 50%;

这个

 transform-origin: 51% 51%;

对我有帮助


0

对我来说,问题是我的元素正在使用transformStyle: preserve-3d。我意识到,此应用程序实际上并不需要此功能,将其删除即可解决模糊问题。


0

我从代码中删除了此代码,transform-style: preserve-3d; 并添加了此代码- transform: perspective(1px) translateZ(0);

模糊消失了!


0

在Chrome 74.0.3729.169(当前版本为5-25-19)中,似乎并没有针对由于转换导致的某些浏览器缩放级别上出现的模糊进行任何修复。即使是简单的操作TransformY(50px)也会使元素模糊。在当前版本的Firefox,Edge或Safari中不会发生这种情况,而且似乎并非在所有缩放级别上都发生。


这就是我的事。我无法摆脱这种模糊效果。一种可行的解决方案是设置这些属性:top: 0, bottom: 0, left: 0; right: 0; margin: auto但是容器将占用其可能的全部空间(必须为宽度),因此,当内容应决定容器的大小时,此方法将无效。
kwiat1990 '19

0

仅使用CSS很难解决。

所以我用jQuery解决了。

这是我的CSS。

.trY {
   top: 50%;
   transform: translateY(-50%);
}

.trX {
   left: 50%;
   transform: translateX(-50%);
}

.trXY {
   top: 50%;
   left: 50%;
   transform: translate(-50%, -50%);
}

这是我的jQuery。

function tr_init() {
$(".trY, .trX, .trXY").each(function () {
    if ($(this).outerWidth() % 2 != 0) {
        var fixed_width = Math.ceil($(this).outerWidth() / 2) * 2;
        $(this).css("width", fixed_width);
    }
    if ($(this).outerHeight() % 2 != 0) {
        var fixed_height = Math.ceil($(this).outerHeight() / 2) * 2;
        $(this).css("height", fixed_height);
    }
})}

0

只是为了增加解决问题的热潮,将{border:1px solid#???}放在外观不好的对象周围就可以解决此问题。如果您有稳定的背景色,也​​要考虑这一点。没人提我想这太蠢了,嗯。



-1

如果你不这样做的文本将不会是模糊transitiontransform

只是这样做:

&:hover {
    transform: scale(1.1);
}

没有像过渡 transition: all .2s;

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.