【问题标题】:Why is text getting blurry and wobbles during 2d scale transform为什么在 2d 比例变换期间文本变得模糊和摆动
【发布时间】:2018-06-18 16:26:13
【问题描述】:

我想让这张卡片在悬停时缩放(包括其中的元素),但是在转换过程中(当您悬停卡片时)文本会摇晃/抖动,并且在缩放期间和之后变得模糊(有时,有一些比例比其他人多,我认为这是由于亚像素值四舍五入)。

如何消除转换过程中的摇晃和模糊?

  • 我不关心 IE 浏览器,我只希望它在最新的 Chrome 中工作。

  • 好像是transition属性引起的。

Codepen #1: https://codepen.io/x84733/pen/yEpYxX

.scalable {
  transition: 0.3s ease-in-out;
  box-shadow: 0 6px 10px rgba(0,0,0,0.14);
}
.scalable:hover {
  transform: scale(1.05);
  box-shadow: 0 8px 40px rgba(0,0,0,0.25);  
}

.card {
  width: 100%;
  background: white;
  padding: 20px;
}

body {
  width: 50%; 
  height: 100%; 
  background: #999;
  padding: 20px;
}
<div class="card scalable">
  <div>here's some description</div>
</div>

更新:

我刚刚发现,当您以编程方式对其进行动画处理时,它不会摇晃/抖动:

我可以在 JS 中以某种方式使用它吗?

Codepen: https://codepen.io/anon/pen/LqXwOb?editors=1100

.anim {
  animation: scale 0.3s ease-in-out infinite alternate;
}

@keyframes scale {
  to { transform: scale(1.05) }
}

.scalable {
  transition: 0.3s ease-in-out;
  box-shadow: 0 6px 10px rgba(0,0,0,0.14);
}
.scalable:hover {
  transform: scale(1.05);
  box-shadow: 0 8px 40px rgba(0,0,0,0.25);  
}

.card {
  width: 100%;
  background: white;
  padding: 20px;
}

body {
  width: 50%; 
  height: 100%; 
  background: #999;
  padding: 20px;
}
<div class="el anim card scalable">
  <div>here's some description</div>
</div>

【问题讨论】:

  • 我不知道是什么原因造成的。您是否尝试过设置 backface-visibility: hidden,这对我有用。
  • @Countingstuff 刚刚尝试将此规则添加到指定的代码笔中,但仍然不起作用。文字在转换过程中变得模糊和摇摆
  • @Countingstuff 有正确的答案。添加 backface-visibility: hidden 在类和悬停解决它!
  • @AdrianDanlos 它没有,它在转换过程中仍然摇晃,并且在缩放后变得模糊,请参阅此代码笔:codepen.io/anon/pen/aXRdXV
  • 你说得对-_-

标签: css scale css-transforms


【解决方案1】:

您可以考虑使用带有透视图的translateZ,而不是使用比例。确保最初定义透视图以避免快速移动光标时的不良影响:

.scalable{
  transition: 0.3s ease-in-out;
  box-shadow: 0 6px 10px rgba(0,0,0,0.14);
  transform:perspective(100px);
}

.scalable:hover {
  transform:perspective(100px) translateZ(5px);
  box-shadow: 0 8px 40px rgba(0,0,0,0.25);  
}

.card {
  width: 100%;
  background: white;
  padding: 20px;
}

body {
  width: 50%; 
  height: 100%; 
  background: #999;
  padding: 20px;
}
<div class="card scalable">
  <div>here's some description</div>
</div>

减少模糊效果的一个想法是从负平移开始,然后回到 0:

.scalable{
  transition: 0.3s ease-in-out;
  box-shadow: 0 6px 10px rgba(0,0,0,0.14);
  transform:perspective(100px) translateZ(-5px);
}

.scalable:hover {
  transform:perspective(100px) translateZ(0px);
  box-shadow: 0 8px 40px rgba(0,0,0,0.25);  
}

.card {
  width: 100%;
  background: white;
  padding: 25px;
}

body {
  width: 50%; 
  height: 100%; 
  background: #999;
  padding: 20px;
}
<div class="card scalable">
  <div>here's some description</div>
</div>

【讨论】:

  • 谢谢,它有效,但是文本变得非常模糊,伙计
  • 对了,我怎么知道100px perspective 是我需要使用的值?为什么不呢,比如说200px
  • @Un1 是的,我正在尝试找出模糊...对于您可以阅读的值:developer.mozilla.org/en-US/docs/Web/CSS/perspective .. 它与比例有点不同,因为它定义了与对象的距离,所以基本上我设置了一个等于 100px 的距离,然后我从它移动了 5px。因此,只需调整值以接近您想要达到的规模。
  • @Un1 检查更新,第二个想法可能会降低模糊效果
  • 谢谢,效果更好。它仍然会在负比例上变得模糊,因为translateZ 将元素转换为纹理并不管方向如何都对其进行光栅化。但是如果你使用像"Noto sans" 这样的字体和像-20px 这样更大的值,那几乎是难以察觉的
【解决方案2】:

还将原点从 100% 添加到 104%。这将防止跳跃和模糊的最终结果

.scalable {
  backface-visibility: hidden;
  transition: all 0.3s ease-in-out;
  transform-origin: 100% 104%;
}

.scalable:hover {
  backface-visibility: hidden;
  transform: scale(1.04);  
}

干杯!

【讨论】:

  • 感谢您的代码,伙计,但文本在转换过程中仍然“摇晃”(跳跃)并且最终变得模糊。我认为这是因为transition 插值,即使linear 也会给我们相同的结果。 (我使用的是最新的 Chrome):codepen.io/anon/pen/zeMVXQ
猜你喜欢
  • 2015-11-11
  • 2014-04-24
  • 2020-07-02
  • 2016-01-18
  • 1970-01-01
  • 2017-01-28
  • 2014-12-08
  • 2017-09-19
  • 2017-09-13
相关资源
最近更新 更多