通过 translate3d 基于 Webkit 的模糊/扭曲文本后期动画

IT技术 javascript css text webkit blurry
2021-01-30 07:04:31

此问题似乎会影响所有基于 WebKit 的浏览器,包括 iPhone。

首先介绍一下背景。我正在处理的站点使用基于 JavaScript 的“滑块”动画。

我正在使用-webkit-transform: translate3d“驱动”实际动画。与基于 JavaScript 的方法不同,使用此方法时,一旦内容被动画化,文本就会变得模糊。这在 iPhone 上尤为明显。

我看到的一些解决方法是删除相对定位,我这样做了,并添加了一个规则-webkit-font-smoothing: antialiased,我也这样做了。这两种变化都没有产生丝毫的不同。

我可以在没有模糊文本的情况下正常工作唯一方法是对动画使用常规 JavaScript 并translate3d完全绕过我更喜欢使用translate3d因为它在支持 WebKit 的设备上的执行速度快得多,但在我的一生中,我无法弄清楚为什么它会以如此糟糕的方式影响文本。

任何建议或解决方案将不胜感激。

6个回答

这些似乎都不适合我,但我发现了一个有点脏的解决方案,它似乎可以解决问题:

top: 49.9%;
left: 49.9%;
-webkit-transform: translate(-50.1%, -50.1%);
transform: translate(-50.1%, -50.1%);
Fugly 浏览器的 Fugly 解决方案,以上都没有奏效,但这个奏效了。对我来说,Chrome/Webkit 是新的 IE,我需要一个又一个愚蠢的解决方法。
2021-03-14 07:04:31
对 Y 轴使用此技巧仅对我有用,而其他解决方案无效:translate(-50%, -50%)-> translate(-50%, -50.1%)有趣的是,增加或减少50.1一点点也不起作用......
2021-03-15 07:04:31
这不是通用的解决方案。当 50% 不起作用时有效,但在某些情况下它很糟糕,当 50% 看起来不错时。
2021-03-15 07:04:31
看,这将始终取决于屏幕的总宽度!没有简单的解决办法。如果您调整屏幕大小,您会看到效果发生了变化......
2021-04-02 07:04:31
这对我有用,但每个人都需要尝试一下,在我的情况下,我不得不使用 50.2
2021-04-12 07:04:31

正如@Robert 上面提到的,有时添加背景会有所帮助,但并非总是如此。

因此,对于 Dmitry 添加的示例,这不是您必须做的唯一事情:除了在后台,您必须告诉浏览器明确使用正确的抗锯齿,因此,有一个固定的 Dmitry 示例:http : //jsfiddle.net /PTDVF/1/

您需要在需要修复抗锯齿的块周围(或为其添加这些样式):

background: #FFF; /* Or the actual color of your background/applied image */
-webkit-font-smoothing: subpixel-antialiased;
我在使用 translateZ 时也遇到了同样的问题,对我来说,当我同时使用 translateX 和 translateY 而没有使用 translateZ 时它起作用了,就像这个转换: translateX(-50%) translateY(-50%); 也适用于透明背景
2021-03-14 07:04:31
那行得通,但如果我需要透明背景怎么办?background: transparent;会再次导致排版模糊:-(
2021-03-27 07:04:31
这刚刚救了我的a$$! background: rgba(0,0,0,0);. 在 iOS 上解决了一个非常讨厌的不需要的模糊
2021-03-31 07:04:31
Safari 11/High Sierra 2017 年底仍然受到影响,添加solid background-color(nottransparent或rgba(0, 0, 0, 0)`)是唯一有用的解决方案。
2021-04-11 07:04:31

我在 Ken Avila 的帖子中遇到了完全相同的问题:CSS: transform: translate(-50%, -50%) 使文本变得模糊

问题当然是我使用了 transform: translate(-50%, -50%) 这使我的居中内容变得模糊,但仅限于 osx 上的 safari。

变得模糊的不仅是文本,还有整个内容,包括图像。我继续阅读:http ://keithclark.co.uk/articles/gpu-text-rendering-in-webkit/,“模糊”是由于元素在非整数边界上呈现。

我还发现我可以避免在这篇文章的居中水平部分使用变换翻译:https : //coderwall.com/p/quutdq/how-to-really-center-an-html-element-via-css -position-absolute-fixed -唯一的缺点是我不得不引入一个包装器。

我发现使用 transform: translateY(-50%) 没有创建任何“模糊”,可能是因为我的元素有一个设定的高度,因此最终不会在非整数边界上呈现。

因此,我的解决方案最终是这样的:

.wrapper {
  position: fixed;
  left: 50%;
  top: 50%;
}
.centered {
  position: relative;
  left: -50%;
  -webkit-transform: translateY(-50%);
  -ms-transform: translateY(-50%);
  transform: translateY(-50%);
}
<div class="wrapper">
  <div class="centered">
    Content
  </div>
</div>

第一篇文章完美地解释了这个问题。关于仅设置 y 因为设置的高度我设法绕过它。函数 centerTarget(tar){ var y = Math.ceil(tar.height()/2), x = Math.ceil(tar.width()/2); tar.css('transform','translateX(' + x + 'px) translateY(' + y + 'px)'); }
2021-03-25 07:04:31
你的先生是个传奇!我刚刚花了最后几个小时尝试天知道有多少解决方案,直到这才奏效!真的非常感谢你!!!
2021-03-26 07:04:31
感谢您考虑添加包装器。我想不出任何缺点,而且似乎有效。
2021-04-05 07:04:31

您正在翻译的元素必须能被两个偶数整除。

重要的是,无论您想要移动一半的元素,它的宽度和高度都可以被 2 整除。与响应式图像非常相似,可以在不分割像素的情况下将物体移动 50%。

宽度为:503px 和高度为 500px 的 div 会导致模糊,无论您使用translateX 或Y 时移动它的方式或移动多少。使用transform,它利用GPU 图形加速器,应该会产生非常清晰、流畅的效果边缘。设置 box-sizing: border-box; 也可能是个好主意。以确保计算的宽度包括填充和边框。

使用百分比宽度时要小心。如果它与屏幕尺寸有关,那么其他屏幕像素宽度会导致这种模糊。

我发现 3d 转换图像仍然模糊,即使它们的尺寸可以被 2 整除。真的很模糊。
2021-03-14 07:04:31
我注意到只要框的高度是偶数(例如高度:400px),文本的模糊性就会消失。
2021-03-27 07:04:31
@QuentinEngles - 在某些情况下,我发现图像是否经过翻译。两件事, 1. 如果您要缩小图像,请确保宽度和高度均等分。IE:100 像素 x 112 像素 如果缩放到 99 像素的宽度,图像会看起来很模糊。因为高度不会是整数。2:使用 Windows 缩放的高分辨率显示器意味着您还必须考虑这些转换。将图像缩放到 100% 或 50% 以确保安全。
2021-04-10 07:04:31

我通过translate3d在任何动画发生之前向元素添加样式来解决这个问题

-webkit-transform: translate3d(0,0,0); 
这确实修复了我的子像素渲染,但也由于 translate3D 引入了模糊文本。它将它推送到渲染子像素的 GPU,但使其变得模糊。最好使用@neil-taylor 发布的解决方案一起解决问题
2021-03-28 07:04:31