Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何提高该指令在滚动时转换不透明度的性能?_Javascript_Jquery_Angularjs_Parallax - Fatal编程技术网

Javascript 如何提高该指令在滚动时转换不透明度的性能?

Javascript 如何提高该指令在滚动时转换不透明度的性能?,javascript,jquery,angularjs,parallax,Javascript,Jquery,Angularjs,Parallax,我已经花了几个小时来改进这个指令,但似乎没什么进展。有人能推荐进一步的改进吗 .directive("scrollFade", function($window) { return function(scope, element, attrs) { var ngWindow = angular.element($window); var offset = 100; function scrollAndFade(){ var to

我已经花了几个小时来改进这个指令,但似乎没什么进展。有人能推荐进一步的改进吗

.directive("scrollFade", function($window) {
      return function(scope, element, attrs) {

      var ngWindow = angular.element($window);
      var offset = 100;

      function scrollAndFade(){
        var top_of_element = element.offset().top + offset;
        var bottom_of_window = ngWindow.scrollTop() + $window.innerHeight;

        if (top_of_element < bottom_of_window) {
          element[0].style.opacity = 1;
        } else {
          element[0].style.opacity = 0;
        }
      }

      ngWindow.bind("scroll", function() {
        _.debounce(function() {
           window.requestAnimationFrame(scrollAndFade);
        }, 50);
      });

      };
    })
不科学的绩效比较:
我有两个建议:

假设您没有在代码中的任何观察者或模板中使用元素不透明性,我怀疑您不需要调用$scope.apply

在调用requestAnimationFrame后,您正在解除抖动。您可以在它之前尝试去抖动,这样滚动条上的事件侦听器就去抖动了

ngWindow.bind("scroll", function() {
  _.debounce(function() {
     window.requestAnimationFrame(scrollAndFade);
  }, 50);
});
但我怀疑这是一个非常小的优化,因为唯一的变化是不透明度,并且您正在使用requestAnimationFrame进一步将更改推迟到浏览器觉得方便的时候


跳过jQuery计算高度不会提高性能。这有点疯狂,但似乎确实有效果。让我再探索一下,看看这是真的还是假的。@user2864740完全是不科学的胡说八道,但看看那些山峰。它们看起来确实更低。很可能是缓存或滚动速度相关或其他原因。这很有趣。你为什么要使用window.requestAnimationFrame?你能解释一下怎么做吗?我不知道如何用这种方式组织它。@EmptyPockets我在答案中添加了一段代码。谢谢@Michal,我用你的建议更新了我的帖子。删除$scope.apply是可行的,但它似乎与您提供的代码片段不符。没有错误,只是不起作用。
ngWindow.bind("scroll", function() {
  _.debounce(function() {
     window.requestAnimationFrame(scrollAndFade);
  }, 50);
});