在滚动角度样式上更改css

spr*_*hip 29 angularjs

我想在用户滚动角度方式时更改CSS元素.

这是使用JQuery方式的代码

$(window).scroll(function() {
    if ($(window).scrollTop() > 20 && $(window).scrollTop() < 600) {
        $('header, h1, a, div, span, ul, li, nav').css('height','-=10px');
    } else if ($(window).scrollTop() < 80) {
        $('header, h1, a, div, span, ul, li, nav').css('height','100px');
    }
Run Code Online (Sandbox Code Playgroud)

我尝试使用以下代码执行Angular方式,但$ scope.scroll似乎无法正确拾取滚动数据.

forestboneApp.controller('MainCtrl', function($scope, $document) {
    $scope.scroll = $($document).scroll();
    $scope.$watch('scroll', function (newValue) {
        console.log(newValue);
    });
});
Run Code Online (Sandbox Code Playgroud)

Muchos gracias amigos!

Mic*_*ley 65

请记住,在Angular中,DOM访问应该在指令内发生.这是一个简单的指令,它根据scrollTop窗口设置变量.

app.directive('scrollPosition', function($window) {
  return {
    scope: {
      scroll: '=scrollPosition'
    },
    link: function(scope, element, attrs) {
      var windowEl = angular.element($window);
      var handler = function() {
        scope.scroll = windowEl.scrollTop();
      }
      windowEl.on('scroll', scope.$apply.bind(scope, handler));
      handler();
    }
  };
});
Run Code Online (Sandbox Code Playgroud)

我不清楚你到底想要什么样的最终结果,所以这里是一个简单的演示应用程序,1px如果窗口向下滚动超过50像素,则设置元素的高度:http://jsfiddle.net/BinaryMuse/ Z4VqP /

  • 一个好的经验法则是,如果您可以直接计算和更改数据,请在控制器中执行 - 但如果您需要查询,操作或以其他方式访问DOM,您可能应该使用指令. (3认同)
  • @JaredTomaszewski没问题!(1)你必须在$ Angular自己的函数之外异步发生"$ apply"范围更改,以便脏跟踪系统获取更改.(2)如果用户在链接指令时已向下滚动; 看到这个例子:http://jsfiddle.net/BinaryMuse/V7GZ2/(3)是的,它会,但是这个指令不太可重用,因为它只适用于名为`scroll`的范围变量. (2认同)