使用 CSS 转换后的模糊文本: scale () ; 在 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 变换的东西。

任何想法都可以,谢谢!

216318 次浏览

我有这个问题很多次,似乎有两种方法来解决它(如下所示)。您可以使用其中一个属性来修复呈现,或者同时使用两个属性。

后视可见性隐藏解决了这个问题,因为它简化了动画只是对象的前面,而默认状态是前面和后面。

backface-visibility: hidden;

TransateZ 也可以在动画中添加硬件加速。

transform: translateZ(0);

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

-webkit-font-smoothing: subpixel-antialiased;

他们的动画对象。我发现它可以改变网页字体的渲染效果,但也可以尝试这种方法。

而不是

transform: scale(1.5);

使用

zoom : 150%;

解决了 Chrome 中的文字模糊问题。

你可以用 cssfilter来解决这个问题。

.element {
filter: blur(0);
}

关于供应商前缀,请自己做。 -webkit-filter-ms-filter。 细节在这里 Http://browser.colla.me/show/css_transformation_scale_cause_blurring

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

将下一个声明应用于看起来模糊的元素(在我的例子中,它们位于转换后的元素中) :

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

差不多运行得很好。“ 差不多了”是因为我使用了一个转换,在转换过程中,元素看起来并不完美,但是一旦转换完成,它们就完美了。

当不能使用缩放 + 缩放组合时,尝试使用 zoom: 101%;进行复杂的设计。

为了改善模糊性,特别是在 Chrome 上,试试这样做:

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

更新: 观点增加了用户和 z 平面之间的距离,从技术上来说,z 平面缩放了物体,使得模糊看起来是“永久性的”。上面的 perspective(1px)类似于 鸭式胶带,因为我们正在匹配我们试图解决的模糊问题。下面的 css 可能会给你带来更好的运气:

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

在我的案例中,下面的代码导致了模糊的字体:

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

只要添加缩放属性就可以修复它:

zoom: 97%;

我发现调整规模比率略有帮助。

(1.05)上使用 scale(1.048)似乎可以产生更好的近似于全像素字体大小的效果,减少亚像素模糊。

我还使用了 translateZ(0),它似乎调整了 Chrome 在转换动画中的最后一个舍入步骤。这对我的悬停使用是一个加分,因为它提高了速度,减少了视觉噪音。然而,对于 onclick 函数,我不会使用它,因为转换后的字体看起来不那么清晰。

需要补充的是,如果要翻译的元素的高度为奇数个像素,就会出现这个问题。因此,如果您可以控制元素的高度,将其设置为偶数将使内容显得清晰

这肯定是 Chrome (Version 56.0.2924.87)的一个 bug,但是下面修复了我在控制台(’.0’)更改 css 属性时的模糊问题。我会上报的。

filter: blur(.0px)

对我来说,问题是我的元素使用的是 transformStyle: preserve-3d。我意识到,这实际上并不需要的应用程序和删除它固定的模糊。

以上这些对我都不管用。 我为弹出窗口制作了这个动画:

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

在我的案例中,应用这个规则后,模糊效果消失了: 即使在 Chrome 检查器中被标记为未使用的 -webkit-perspective: 1000;

我找到了一个更好、更干净的解决方案:

.element{
transform:scale(0.5)
transform-origin: 100% 0;
}

或者

.element{
transform:scale(0.5)
transform-origin: 0% 0;
}

感谢这篇文章: 用变换防止模糊渲染: 尺度

我发现,这个问题发生在相对变换的任何方面。翻译 X (50%) ,比例(1.1)或什么的。提供绝对值总是有效的(不会产生模糊的文本)。

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

在我的例子中,transform: translateY(-50%) translateX(-50%)会导致模糊(我想在对话框中心)。

为了达到更多的“绝对”值,我必须将十进制值设置为 transform: translateY(-50.09%) translateX(-50.09%)

注意

我很确定,这个值在不同的屏幕尺寸上是不同的。我只是想分享一下我的经历,以防对谁有帮助。

以上这些对我来说都不管用。

我加入透视效果很好

来自

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

我改变主意了

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

我补充道:

transform: perspective(-1px)

在尝试了这里的一切没有运气,什么最终修复这个问题是 移除will-change: transform;属性。由于某些原因,它在 Chrome 中造成了可怕的模糊缩放效果,但在 Firefox 中却没有。

我从代码 transform-style: preserve-3d;中删除了这个 然后加了这个 transform: perspective(1px) translateZ(0);

侠影消失了!

合唱:

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

你不应该超过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);
}

另一个修正我刚刚发现的模糊变换(转换3d,scaleX)在 Chrome 上的尝试是设置元素为 “ 显示: 内联表;”。 它似乎在某些情况下迫使像素舍入(在 X 轴上)。

我读到在 Chrome 下的亚像素定位是有意的,但是开发者不会修复它。

在 Chrome 74.0.3729.169中,当前版本为5-25-19,似乎没有任何修复方法可以解决由于转换导致的某些浏览器缩放级别的模糊问题。即使是简单的 TransformY(50px)也会模糊元素。在当前版本的 Firefox、 Edge 或 Safari 中不会出现这种情况,而且似乎不会在所有缩放级别都出现这种情况。

我使用了所有答案的组合,这是最后对我起作用的:

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

2019年更新 < br/> Chrome 显示器的 bug 仍然没有修复,虽然不是用户的错,但是本网站提供的所有建议都无助于解决这个问题。我可以同意,我已经尝试了每一个徒劳的: 只有1接近,这是 css 规则: 过滤器: 模糊(0) ; 这消除了移动容器的1px,但不解决模糊显示错误的容器本身和任何内容可能有。

事实是: 这个问题根本没有解决办法,所以这里有一个流动网站的解决方案

凯斯
我目前正在开发一个流动的网站,并有3个 div,都与悬停效果和共享的宽度和位置的百分比值为中心。Chrome 错误发生在中心容器上,该容器被设置为左: 50% ; 转换: transateX (- 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%;}

被窃听的小提琴: < a href = “ https://jsfiddle.net/m9bgrunx/2/”rel = “ nofollow norefrer”> https://jsfiddle.net/m9bgrunx/2/
固定小提琴: < a href = “ https://jsfiddle.net/uoc6e2dm/2/”rel = “ nofollow norefrer”> https://jsfiddle.net/uoc6e2dm/2/

正如您所看到的,对 CSS 的少量调整可以减少或消除使用转换进行定位的需求。这也可以适用于固定宽度的网站以及流体。

我也有同样的问题,我用:

.element {
display: table
}

我的解决办法是:

显示: 初始化;

然后又脆又锋利

当我使用 transform: translate(-50%,-50%)的时候,我面对的是 Chrome 上的模糊文本问题,而不是 Firefox 上的。

我真的试过很多变通方法,比如:

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

这些对我都没用。

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

注意: 它可能取决于不同的用例,但是值得一试!

单靠 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);
}
})}

从这些答案中我已经尝试了很多例子,不幸的是没有任何帮助 铬 Version 81.0.4044.138 我已经增加了转换元素

 transform-origin: 50% 50%;

这个

 transform-origin: 51% 51%;

对我有帮助

只是添加到修复狂热,把{ orders: 1px 实心 # ? ? ? }解决了我的问题。 如果你有一个稳定的背景颜色,考虑这一点。 这真是太蠢了,没有人想到要提起我猜,嗯嗯。

在我的示例中,错误在于将动画设置为动画元素(一个 SVG)的父 div。父 div 有一些疯狂的宽度,比如466.667像素。把它设成奇数也没用。但是: 使用动画定位 SVG 本身(而不是父容器)。

对于未来的读者来说: 对我来说,问题在于我加了一句:

perspective: 2500px;

移除此属性解决了问题。

所以,我尝试了以上所有的解决方案,但是都没有效果!

我在 React App 的 index.html 中有一个模态根 div。我正在呈现一个 Modal 组件(。如果有必要的话。首先,我定位模式本身固定,使其左上50% ,并应用一个过渡(-50% ,-50%)得到它的中心。

如果 Chrome 浏览器的缩放比率不是100% ,我就会放大和缩小,并注意到模态内容的模糊性。可能是110% 或者90-80-75% 等等,没关系。除了100% 的变焦,它真的很模糊和丑陋。

因此,我决定摆脱整个基于过渡的解决方案,我以前的中心的孩子。模态元件模态元件。

我定位我的模态根固定,使它顶部左右底部0,所以它总是100vh 和 wv。然后,我将其设置为一个 Flex 容器,并通过居中对齐项和调整内容来定位它的子容器。

但是!总是有但是的。Mode-root 在默认情况下有一个 z-index: -1。我决定如果模式被打开,就用编程方式将其更改为59。我还应用了一个覆盖,使页面的其余部分变暗,即。覆盖,其 z 指数为60。实际的模态内容(。模式)的 z 指数为61。

我还想动画的入口时,该元素出现,所以我玩的边缘,而不是应用任何类型的过渡到它。这是一个立方贝塞尔动画,处理边缘-顶部的适合百分比在动画,但在结束时,它是边缘-顶部0没有过渡属性。

有点遗憾,不得不重新工作的组件,但在测试之后,它的工作相当不错。

摘要:

  • 最高母容器固定,覆盖整个页面
  • 根据希望与模态交互的需要设置最高的父容器的 z-index -1或[ custom- value ](模态是打开的)
  • 如果模态关闭,则将容器的 z-index 设置为 -1
  • 使容器成为一个伸缩容器,并将其子容器放在中心
  • 通过边距值而不是转换来动画子元素

我希望它能对你们有些人有所帮助:)

这就是对我有效的方法:

body { perspective: 1px; }

我有一个 div,它有一个小的透视变化,以提供一个微妙的3D 效果。Div 中的文本模糊不清,我尝试了这里的所有建议,但都没有用。

奇怪的是,我发现在文本元素上设置“ filter: Heritage;”极大地提高了清晰度,尽管我不明白为什么。

以下是我的代码,以防万一:

网址:

<div id="NavContainer">
<div id="Nav">
<label>Title</label>
<nav>
<a href="/">home</a>
<a href="/link1">link1</a>
<a href="/link2">link2</a>
</nav>
</div>
</div>

传真:

    #NavContainer {
position: absolute;
z-index: 1;
top: 0;
left: 20px;
right: 20px;
perspective: 80vw;
perspective-origin: top center;
}


#Nav {
text-align: right;
transform: rotateX(-5deg);
}


#Nav > nav > a,
#Nav > label {
display: inline-block;
filter: inherit;
}


#Nav > label {
float: left;
font-weight: bold;
}

尝试播放动画块上的缩放值。 在我的例子中,缩放: 99.6% ; 完全修复了模糊的文本。但是,例如,99.7% 的值文本仍然是模糊的,因此在每种情况下,这个值可能会有所不同。

对我起作用的是移除 backdrop-filter: blur(8px);。虽然这个过滤器只应用于 <div>的背景,而不是它的文本,似乎仅仅是这个属性的存在使 Chrome 在与 transform: scale();一起使用时略微模糊了文本。