Ошибка с translate3d в Chrome v.44?

Chrome 44 (44.0.2403.89 м) только что выпущен, и у меня возникают проблемы при использовании translate3d. (в версиях Mac и Windows)


Это влияет на плагины, такие как fullPage.js и, следовательно, тысячи страниц на данный момент. (Открытая проблема на fullpage.js github)

Мне кажется, что, применяя два разных значения перевода к одному и тому же элементу последовательно после короткого периода времени, он перезапускает свою позицию до 0, когда я применяю новое значение, в результате чего предыдущий переход будет пропущен.

Мне не удалось полностью изолировать его и воспроизвести как чистую, как хотелось бы, но это насколько я могу сделать:

http://jsfiddle.net/9ksx000q/3/

Чтобы воспроизвести его, просто прокрутите вниз. Вы заметите, как это происходит в предыдущем разделе каждого прокрутки, если вы делаете это последовательно. Например: вы увидите первый красный раздел дважды.

Если вы откроете тот же тест с любым другим браузером, вы не увидите проблемы.

Применяемые переходы в моем случае следующие (они зависят от размера видового экрана):

translate3d(0px, -641px, 0px);
translate3d(0px, -1282px, 0px);
translate3d(0px, -1923px, 0px);

Но между 1-м и 2-м и 3-м и 4-м они возвращаются к translate3d(0,0,0);, в результате чего первая часть будет отображаться снова и снова в качестве начальной точки.

Ответы

Ответ 1

Он работает, если вы просто назовете его в animation frame

http://jsfiddle.net/9ksx000q/4/

Угадайте, что проблема заключается в том, что анимация и вычисление позиции происходят одновременно, что приводит к тому, что вещи становятся странными.

requestAnimationFrame(function () {
    var dtop = element.position().top;

    element.addClass('active').siblings().removeClass('active');

    canScroll = false;

    var translate3d = 'translate3d(0px, -' + Math.ceil(dtop) + 'px, 0px)';
    $('#container').css(getTransforms(translate3d));

    //after animations finishes we allow to scroll again
    setTimeout(function () {
        canScroll = true;
    }, 1000);    
    //1000s is the time set to the in the CSS for the container
    //transition: all 1000ms ease-in-out;
});