html - 变换比例上的不稳定文本

标签 html css

当我尝试在鼠标悬停时缩放 div 时,文本会摇晃/抖动并且动画不流畅。这在 FireFox 中尤为明显,但在 Chrome 中也可以看到。

我可以做些什么来使动画流畅?

JS fiddle :https://jsfiddle.net/jL4dbxf9/

.mtw { 
  max-width: 200px;
  margin: 0 auto; 
}
.mt .mp {
  text-align: center;
}
.mt .mp .ma {
  color: #fff;
  font: 800 40px OpenSansBold, Arial, Helvetica, sans-serif;
  min-height: 60px;
}
.mt .header-blue {
  background: blue;
}
.mt {
  transition: all 0.4s linear;
}
.mt:hover{
  z-index: 1;	
  transform: scale(1.1);
  -webkit-transform: scale(1.1);
  -moz-transform: scale(1.1);
  -o-transform: scale(1.1);
  -ms-transform: scale(1.1);	
}
<div class="mtw">
  <div class="mt">
    <div class="header-blue">
      <h2 class="mp">
        <span class="ma">49</span>
      </h2>
    </div>
  </div>
</div>

最佳答案

所以你在这里有很多事情要做,不幸的是,当你处理测量/排列 channel 、抗锯齿、硬件加速、透视等的一些细微差别时,它需要浏览器之间的各种事情。 .

.mtw {
  max-width: 200px;
  margin:0 auto; 
}
.mt .mp { text-align: center }
.mt .mp .ma {
  color: #fff;
  font: 800 40px OpenSansBold, Arial, Helvetica, sans-serif;
  min-height: 60px;
}
.mp { margin: 0 }
.mt .header-blue {
  background: blue;
}
.mt {
  transition: all 0.4s linear;
  backface-visibility: hidden;
  -webkit-font-smoothing: subpixel-antialiased;
}
.mt:hover {
  z-index: 1;
  -webkit-transform: scale(1.1) translate3d( 0, 0, 0) perspective(1px);
     -moz-transform: scale(1.1) translate3d( 0, 0, 0) perspective(1px);
       -o-transform: scale(1.1) translate3d( 0, 0, 0) perspective(1px);
      -ms-transform: scale(1.1) translate3d( 0, 0, 0) perspective(1px);
          transform: scale(1.1) translate3d( 0, 0, 0) perspective(1px);
}

/* --- cleaner way --- */
#boom {
  color: #fff;
  background-color: blue;
  font: 800 40px OpenSansBold, Arial, Helvetica, sans-serif;
  min-height: 60px;
  max-width:200px;
  margin:0 auto;
  text-align: center;
  transition: transform 0.4s linear;
  backface-visibility: hidden;
  -webkit-font-smoothing: subpixel-antialiased;
  will-change: transform;  
}
#boom:hover {	
  -webkit-transform: scale(1.1) translate3d( 0, 0, 0) perspective(1px);
     -moz-transform: scale(1.1) translate3d( 0, 0, 0) perspective(1px);
       -o-transform: scale(1.1) translate3d( 0, 0, 0) perspective(1px);
      -ms-transform: scale(1.1) translate3d( 0, 0, 0) perspective(1px);
          transform: scale(1.1) translate3d( 0, 0, 0) perspective(1px);
}

/* --- Another way --- */
#weee {
  color: #fff;
  background-color: blue;
  font: 800 40px OpenSansBold, Arial, Helvetica, sans-serif;
  min-height: 60px;
  max-width:200px;
  margin:0 auto;
  text-align: center;
  transition: font-size 0.4s linear;
  backface-visibility: hidden;
  -webkit-font-smoothing: subpixel-antialiased;
  will-change: font-size;
}
#weee:hover {
  font-size: 120px;
}
<div class="mtw">
  <div class="mt">
    <div class="header-blue">
      <h2 class="mp">
        <span class="ma">49</span>
      </h2>
    </div>
  </div>
</div>

<br/><br/>

Or, cleaner way....
<div id="boom">50</div>

<br/><br/>

Or, an entirely different way...
<div id="weee">51</div>

因此,如果我们查看更改,我们会看到添加了一些内容...

backface-visibility: hidden; = 用户不关心背面,将其从合成器考虑中移除...

-webkit-font-smoothing: subpixel-antialiased; = 我确定字体很酷,但你重新尝试重新绘制所有像素特定的阴影,顺利地运行...... .

translate3d( 0, 0, 0) = 'ol hack 在某些情况下强制硬件加速并让 gpu 帮忙。

margin: 0 = 在你的 h2 上,从考虑中删除用户代理边距垃圾......

perspective(1px) = 因为你正在转换,提醒它家在哪里...

在这些之间,希望您能看到您期望的结果,希望对您有所帮助,干杯!

哦,还有一个简短的 PS:您不需要那么多元素来完成同一件事(除非您的示例比我们看到的更多),我会尝试改掉这个习惯。一个元素和一些文本可以通过更干净的 DOM 提供相同的结果,并且合成器线程在执行其操作时需要关心的更少。

附录;最终,使用 scale 时,您将遇到分辨率损失,因为它正在通过光栅化在 2d 平面上调整元素尺寸及其子元素的大小。避免模​​糊效果越大的东西被缩放是不可避免的(据我今天所知),除非你想重构说一个带有缩放的 Canvas ,或者更容易但更容易地对待它的实例,而不是只在这个场景中定位字体,因为它是唯一真正需要保持清晰的东西。因此,请参阅添加的示例,该示例将 font-size 定位为矢量。干杯!

关于html - 变换比例上的不稳定文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52708013/

相关文章:

html - 下拉菜单在 Windows Chrome 中切断字母

css - 将我的 Wordpress 页脚的颜色更改为纯黑色?

用于外部导航元素的 jQuery slidetoggle

javascript - 在 AngularJS 深度过滤方面需要帮助

c# - 如何仅为按钮事件设置进度条

html - 如何使 html 中的图像变暗(不是 css)

html - 使用 border-radius 创建一个完全对称的圆而不指定高度或宽度

javascript - 使用 Ctrl + w 按 "X"后无法使用 "stay on this page"图标关闭 IE 11 浏览器

javascript - 如何在数字周围制作静态按钮?

javascript - 如何更改骨架自动加载的样式表的路径