這是一個古老的問題,但我最近偶然發現,當我的網站改寫爲AngularJS應用時。我還使用Bootstrap Affix插件(包括更新滾動中的活動類),並且無法找到一個與我正在尋找的工作非常相似的插件,因此我編寫了自己的指令。
看到它在行動:http://bobbograph.com/#/api
注:所提供的配置參數的值是頂偏。
中的JavaScript:
https://github.com/robertmesserle/Bobbograph/blob/v3/www/js/site.js#L102
app.directive('rmAffix', function ($window) {
var body = document.body,
win = document.defaultView,
docElem = document.documentElement,
isBoxModel = (function() {
var box = document.createElement('div'),
isBoxModel;
box.style.paddingLeft = box.style.width = "1px";
body.appendChild(box);
isBoxModel = box.offsetWidth == 2;
body.removeChild(box);
return isBoxModel;
})();
function getTop (element) {
var box = element.getBoundingClientRect(),
clientTop = docElem.clientTop || body.clientTop || 0,
scrollTop = win.pageYOffset || isBoxModel && docElem.scrollTop || body.scrollTop;
return box.top + scrollTop - clientTop;
}
return function ($scope, $element, $attrs) {
var offset = $scope.$eval($attrs.rmAffix),
elemTop = getTop($element[0]),
$links = $element.find('li'),
linkTops = [];
angular.forEach($links, function ($link) {
var $a = angular.element($link).find('a'),
href = $a.attr('href').substr(1),
target = document.getElementById(href),
elemTop = getTop(target);
linkTops.push(elemTop);
$a.on('click', function (event) {
window.scrollTo(0, elemTop - offset);
event.preventDefault();
});
});
angular.element($window).on('scroll', function (event) {
var top = window.pageYOffset,
index;
if (top > elemTop - offset) $element.addClass('affix');
else $element.removeClass('affix');
//-- remove selected class from all links
$links.removeClass('active');
//-- find the closest element
for (index = 1; index < linkTops.length; index++) {
if (linkTops[index] - 100 > top) break;
}
angular.element($links[index - 1]).addClass('active');
});
};
});
的HTML(玉)
https://github.com/robertmesserle/Bobbograph/blob/v3/www/api.jade#L288
ul.nav.nav-stacked.nav-pills(rm-affix=70)
li.active: a(href="#basic") Basic Usage
li: a(href="#options" ) Options
li: a(href="#data" ) Data
li: a(href="#padding" ) Padding
你有沒有考慮過使用https://github.com/angular-ui/bootstrap? – cvrebert
我實際上沒有...這個提議有什麼幫助?乾杯! – PGallagher
@cvrebert Angular UI Bootstrap似乎沒有Affix指令 – jsparks