Я бы добавил состояние, которое гарантирует, что вы не проверяете, когда вам это не нужно. В противном случае каждый пиксель, попадающий в одну из ваших областей, очистится и установит активное состояние. Это дороже, чем делать простые проверки границ. Кроме того, сначала выполните сравнение состояний, поскольку оно, скорее всего, будет ложным.
function removeActive() {
$('#vtop ul li > a').removeClass('active');
}
var active = '';
$(window).scroll(function () {
var pos = $(window).scrollTop();
if (active != 'intro' && pos <= '521') {
removeActive();
active = 'intro';
$('#m-intro a').addClass('active');
} else if (active != 'nosales' && pos >= '1108' && pos <= '1626') {
removeActive();
active = 'nosales';
$('#m-nosales a').addClass('active');
} else if (active != 'crates' && pos >= '2220' && pos <= '2742') {
removeActive();
active = 'crates';
$('#m-crates a').addClass('active');
} else if (active != 'packages' && pos >= '3332' && pos <= '3860') {
removeActive();
active = 'packages';
$('#m-packages a').addClass('active');
} else if (active != 'signup' && pos >= '4444' && pos <= '4966') {
removeActive();
active = 'signup';
$('#m-signup a').addClass('active');
} else if (active != 'contact' && pos >= '5556') {
removeActive();
active = 'contact';
$('#m-contact a').addClass('active');
} else if (active != '') {
active = '';
}
$('#divd').text(pos);
});
Вы также можете упростить курс:
var active = '';
var prevActive = '';
$(window).scroll(function () {
var pos = $(window).scrollTop();
if (pos <= 521) {
active = 'intro';
} else if (pos <= 1107) {
active = '';
} else if (pos <= 1626) {
active = 'nosales';
} else if (pos <= 2219) {
active = '';
} else if (pos <= 2742) {
active = 'crates';
} else if (pos <= 3331) {
active = '';
} else if (pos <= 3860) {
active = 'packages';
} else if (pos <= 4443) {
active = '';
} else if (pos <= 4966) {
active = 'signup';
} else if (pos <= 5555) {
active = '';
} else {
active = 'contact';
}
if(active != prevActive) {
$('#vtop ul li > a').removeClass('active');
if(active != '') {
$('#m-'+active+' a').addClass('active');
}
prevActive = active;
}
$('#divd').text(pos);
});
Я взломал пример, который делает похожую вещь. Он не имеет такой же структуры HTML, но показывает поведение прокрутки:
http://jsfiddle.net/z7YHX/