diff options
Diffstat (limited to 'js/vendor/angular-ui/modules/directives/scrollfix/scrollfix.js')
-rw-r--r-- | js/vendor/angular-ui/modules/directives/scrollfix/scrollfix.js | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/js/vendor/angular-ui/modules/directives/scrollfix/scrollfix.js b/js/vendor/angular-ui/modules/directives/scrollfix/scrollfix.js new file mode 100644 index 000000000..f613838d9 --- /dev/null +++ b/js/vendor/angular-ui/modules/directives/scrollfix/scrollfix.js @@ -0,0 +1,39 @@ +/*global angular, $, document*/ +/** + * Adds a 'ui-scrollfix' class to the element when the page scrolls past it's position. + * @param [offset] {int} optional Y-offset to override the detected offset. + * Takes 300 (absolute) or -300 or +300 (relative to detected) + */ +angular.module('ui.directives').directive('uiScrollfix', ['$window', function ($window) { + 'use strict'; + return { + link: function (scope, elm, attrs) { + var top = elm.offset().top; + if (!attrs.uiScrollfix) { + attrs.uiScrollfix = top; + } else { + // chartAt is generally faster than indexOf: http://jsperf.com/indexof-vs-chartat + if (attrs.uiScrollfix.charAt(0) === '-') { + attrs.uiScrollfix = top - attrs.uiScrollfix.substr(1); + } else if (attrs.uiScrollfix.charAt(0) === '+') { + attrs.uiScrollfix = top + parseFloat(attrs.uiScrollfix.substr(1)); + } + } + angular.element($window).on('scroll.ui-scrollfix', function () { + // if pageYOffset is defined use it, otherwise use other crap for IE + var offset; + if (angular.isDefined($window.pageYOffset)) { + offset = $window.pageYOffset; + } else { + var iebody = (document.compatMode && document.compatMode !== "BackCompat") ? document.documentElement : document.body; + offset = iebody.scrollTop; + } + if (!elm.hasClass('ui-scrollfix') && offset > attrs.uiScrollfix) { + elm.addClass('ui-scrollfix'); + } else if (elm.hasClass('ui-scrollfix') && offset < attrs.uiScrollfix) { + elm.removeClass('ui-scrollfix'); + } + }); + } + }; +}]); |