将CSS Sticky插件转换为Angular Directive

时间:2014-11-03 16:08:03

标签: angularjs angularjs-directive

我正在尝试将此Sticky CSS插件与Angular Directive一起使用。我尝试将这段代码包装成一个指令,但没有运气让它运转起来。

以下是没有Angular的插件的CodePen - http://codepen.io/chrissp26/pen/gBrdo

这就是我到目前为止所做的。

非常感谢任何帮助或指导。

app.directive('sticky', function() {

return function stickyTitles(stickies) {

this.load = function() {

          stickies.each(function(){

                var thisSticky = jQuery(this).wrap('<div class="followWrap" />');
                    thisSticky.parent().height(thisSticky.outerHeight());

                jQuery.data(thisSticky[0], 'pos', thisSticky.offset().top);

          });
    }

    this.scroll = function() {

          stickies.each(function(i){                

                var thisSticky = jQuery(this),
                      nextSticky = stickies.eq(i+1),
                      prevSticky = stickies.eq(i-1),
                      pos = jQuery.data(thisSticky[0], 'pos');

                if (pos <= jQuery(window).scrollTop()) {

                      thisSticky.addClass("fixed");

                      if (nextSticky.length > 0 && thisSticky.offset().top >= jQuery.data(nextSticky[0], 'pos') - thisSticky.outerHeight()) {

                            thisSticky.addClass("absolute").css("top", jQuery.data(nextSticky[0], 'pos') - thisSticky.outerHeight());

                      }

                } else {

                      thisSticky.removeClass("fixed");

                      if (prevSticky.length > 0 && jQuery(window).scrollTop() <= jQuery.data(thisSticky[0], 'pos')  - prevSticky.outerHeight()) {

                            prevSticky.removeClass("absolute").removeAttr("style");

                      }

                }
            });         
    }
}

return function(){

    var newStickies = new stickyTitles(jQuery(".followMeBar"));

    newStickies.load();

    jQuery(window).on("scroll", function() {

          newStickies.scroll();

    });
};

});

1 个答案:

答案 0 :(得分:0)

试试这个:

 <sticky>
  <div class="followMeBar">a</div>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <div class="followMeBar">b</div>
 </sticky>

指令:

app.directive('sticky', function() {

  var stickyTitles = function (stickies) {

    this.load = function() {

      stickies.each(function() {

        var thisSticky = jQuery(this).wrap('<div class="followWrap" />');
        thisSticky.parent().height(thisSticky.outerHeight());

        jQuery.data(thisSticky[0], 'pos', thisSticky.offset().top);

      });
    }

    this.scroll = function() {

      stickies.each(function(i) {

        var thisSticky = jQuery(this),
          nextSticky = stickies.eq(i + 1),
          prevSticky = stickies.eq(i - 1),
          pos = jQuery.data(thisSticky[0], 'pos');

        if (pos <= jQuery(window).scrollTop()) {

          thisSticky.addClass("fixed");

          if (nextSticky.length > 0 && thisSticky.offset().top >= jQuery.data(nextSticky[0], 'pos') - thisSticky.outerHeight()) {

            thisSticky.addClass("absolute").css("top", jQuery.data(nextSticky[0], 'pos') - thisSticky.outerHeight());

          }

        } else {

          thisSticky.removeClass("fixed");

          if (prevSticky.length > 0 && jQuery(window).scrollTop() <= jQuery.data(thisSticky[0], 'pos') - prevSticky.outerHeight()) {

            prevSticky.removeClass("absolute").removeAttr("style");

          }

        }
      });
    }
  }

  return {
    restrict: 'E',
    link: function(scope, element, attrs) {
      var newStickies = new stickyTitles($(element).find(".followMeBar"));

      newStickies.load();

      jQuery(window).on("scroll", function() {

        newStickies.scroll();

      });
    }
  };

http://plnkr.co/edit/13w5e7n0ReWoaO8513K5?p=preview