在转换时使用宽度和变换会导致闪烁

chr*_*oni 5 html javascript css

看看这个JSBIN:http://jsbin.com/hufibisawa/1/edit?css,js,output

启动Chrome:

  1. 单击测试按钮
  2. 单击test2按钮
  3. 你会看到绿色条纹闪烁.我想这是因为"translate3d"不像"宽度"那样计算其像素

当使用"left"和"width"属性时,它可以很好地工作,但效果不是很好.原因是translate3d触发HW加速并使用子像素计算,这给出了非常平滑的动画.

这是一个错误吗?它可以解决吗?使用Firefox这很棒!那么也许是一个Chrome bug?

css

#test {
  position: absolute;
  transition: transform 1s ease-out, width 1s ease-out;
  left: 0;
  top: 0;
  transform: translate3d(0, 0, 0);
  width: 300px;
  height: 25px;
  background-color: red;
}

#test2 {
  position: absolute;
  transition: transform 1s ease-out, width 1s ease-out;
  left: 0;
  transform: translate3d(0, 25px, 0);
  top: 0;
  width: 300px;
  height: 25px;
  background-color: green;
}
Run Code Online (Sandbox Code Playgroud)

和JS

document.querySelector('#button').addEventListener('click', function () {

var el = document.querySelector('#test');
  el.style.width = '150px';
  el.style.transform = 'translate3d(0px, 0px, 0)';

  var el = document.querySelector('#test2');
  el.style.width = '150px';
  el.style.transform = 'translate3d(150px, 0px, 0)';

});

document.querySelector('#button2').addEventListener('click', function () {

var el = document.querySelector('#test');
  el.style.width = '300px';
  el.style.transform = 'translate3d(0px, 0px, 0)';

  var el = document.querySelector('#test2');
  el.style.width = '300px';
 el.style.transform = 'translate3d(0, 25px, 0)';

});
Run Code Online (Sandbox Code Playgroud)

i_l*_*ots 1

您可以通过从右侧设置绿色框的动画而不是从左侧移动它来解决此问题。EG http://jsbin.com/ximigitawe/1/