当前位置: 代码迷 >> JavaScript >> 我如何使用requestAnimationFrame而不是translate3d?
  详细解决方案

我如何使用requestAnimationFrame而不是translate3d?

热度:12   发布时间:2023-06-05 10:21:47.0

由于浏览器的行为,translate3d将矢量元素渲染为纹理,因此我现在需要使用简单的2d转换,但这意味着性能受到损害。 我试图找到一个解决方案,并提出了requestAnimationFrame ,但是我不知道如何在我的情况下使用它:

$document.bind(events['move'], function(e) {
                    $('.slide-panel.shown').find('.close-panel').trigger('click');
                    var valueX = getTransform($elem,'posX'),
                        valueY = getTransform($elem,'posY'),
                        zoom = getTransform($elem,'zoom'),
                        translateX,
                        translateY;
                    if (is_touch_device()) {
                        translateX = valueX + (e.originalEvent.touches[0].pageX - mouse.x);
                        translateY = valueY + (e.originalEvent.touches[0].pageY - mouse.y);
                    } else {
                        translateX = valueX + (e.pageX - mouse.x);
                        translateY = valueY + (e.pageY - mouse.y);
                    }

                    $elem.css({
                        'transform': 'translate3d(' + translateX +'px, ' + translateY +'px, 0) scale('+zoom+')',
                        '-webkit-transform': 'translate3d(' + translateX +'px, ' + translateY +'px, 0) scale('+zoom+')',
                        '-moz-transform': 'translate3d(' + translateX +'px, ' + translateY +'px, 0) scale('+zoom+')'
                    });
                    console.log($elem.css('transform'))
                        mouse.update(e);
                        e.preventDefault();
                    });

涉及到很多事情,但是本质上,这是我的使用translate3d来移动元素的拖放代码的一部分,我需要以某种方式摆脱translate3d的使用,而只在动画框架内使用translate

我认为requestAnimationFrame不会在这里解决您的性能问题。

您正在使用事件处理程序,该事件处理程序在每个“刻度”上搜索元素。 您可以做的就是缓存从DOM请求的元素:

(function () {
    var $closeElement = $('.slide-panel.shown').find('.close-panel');

    $document.bind(events['move'], function(e) {
        $closeElement.trigger('click');

        // rest of your animation code.
    });
}());

移动时会触发多少个事件?

如果有很多事件,您可以尝试限制动画。 雷米·夏普(Remy Sharp)上有一篇很棒的文章介绍了如何执行此操作: :

实际上,您可以将带有第三个参数z = 0的translate3d()与通常的translate()一起使用。

或像translate3d(0,0,0)一样使用它来强制硬件提升,然后使用简单的translate()进行移动。 所有的转换功能都是可加速的,但是translate3d()函数似乎迫使浏览器使用GPU。

当然,您可以使用reqestAnimationFrame()来递归地调用某些函数以在重新绘制屏幕之前更改元素,这将为您提供最佳的性能。 但是,如果您还想要一些轻松的效果(通过CSS的“ animation”属性中的“ ease”参数可以轻松实现),则可以在动画中自己实现它,或者创建一些基于时间的函数。 [这里] [1]是我所谈论的例子。