2014-01-20 3 views
0

Позвольте мне объяснить ситуацию:в режиме реального времени обновления абсолютного позиционируется ДИВ при прокрутке

Существует относительное расположен sidebar. После прокрутки вверху main-content эта боковая панель меняет на абсолютный и затем обновляется в реальном времени до верхнего положения в окне (scrollTop окна).

Проблема в том, что она очень медленная и прерывистая (в Firefox), потому что она обновляется все время. Как я могу обновить позицию «в режиме реального времени» без нагрузки?

В настоящее время это выглядит следующим образом:

var headerOffset = $('#main-content').offset().top; 
$(document).on('scroll', function() { 
    if(($(document).scrollTop() + 15) > $('#main-content').offset().top){ 
    $('#sidebar').addClass('fixed'); 
    $('#sidebar').css('top', ($(document).scrollTop() - headerOffset) + 15); 
    } else { 
    $('#sidebar').removeClass('fixed'); 
    } 
}); 

Заранее спасибо :)

+0

Можете ли вы разместить html/css, пожалуйста? –

+0

Совет: измените if (($ (document) .scrollTop() + 15)> $ ('# main-content'). Offset(). Top) до if (($ (document) .scrollTop() + 15) > headerOffset). Таким образом, ваш код не должен пересчитывать смещение вашего элемента основного контента каждый раз, когда вы прокручиваете. Для получения дополнительной информации, пожалуйста, напишите свой html/css или jsfiddle, как спросил Кирилл. – Jop

+0

Ах да, пересчет не требуется при прокрутке. Спасибо! Вот сценарий с примером: http://jsfiddle.net/u3GpS/ – Gideon

ответ

0

Если вы хотите сделать все Javascript-hassle, потому что у вас есть непредсказуемые заголовки и не знаете точное положение основного содержимого, которое было достаточно, чтобы установить ccs в фиксированное состояние и просто вычислить позицию при запуске.

var headerOffset = $('#main-content').offset().top; 
$('#sidebar').css('top', headerOffset); 

как здесь: http://jsfiddle.net/4amdr/

Вот единственный способ, я могу себе представить, почему вы не хотите использовать неподвижную верхнюю часть и оставить JS вне.

+0

Я не могу использовать исправление, потому что боковая панель находится в гибком контейнере. Вот скрипка, чтобы объяснить проблему лучше: http://jsfiddle.net/4amdr/1/ Контейнер имеет ширину и расположен по центру. Боковая панель должна оставаться на правой стороне контейнера. – Gideon

+0

Извините за мой последний ответ, слишком поспал :-) Хорошо, я завернул боковую панель в держатель div с 25% -ной шириной и просто подстроил ширину до ширины держателя при событии изменения размера, которое не должно происходить слишком часто. Посмотрите, если это то, что вы хотели: http://jsfiddle.net/WsMDj/ – mainguy

+0

Обратите внимание, что кулак две строки сценария больше не нужны: http://jsfiddle.net/WsMDj/3/ – mainguy

0

вы должны использовать наклеить из Twitter Bootstrap: Bootstrap's affix

+0

Я знаю, что Bootstrap affix, но я пытаюсь решить его, не используя его. Спасибо! :) – Gideon

0

Что об этом:

=>http://jsfiddle.net/8XVXj/1/ или полный пример: http://jsfiddle.net/8XVXj/2/

var headerOffset = $('#main-content').offset().top; 
$(document).on('scroll', function(){ 
if(($(document).scrollTop() + 15) > $('#main-content').offset().top){ 
    if($('#sidebar').hasClass('fixed') === false) { 
    $('#sidebar').addClass('fixed'); 
    $('#sidebar').css('top', ($(document).scrollTop() - headerOffset) + 15); 
    } 
} else { 
    $('#sidebar').removeClass('fixed'); 
} 
}); 

Я добавляю только один раз фиксированное положение.

+0

Просто для удовольствия я добавляю CSStransform :) http://jsfiddle.net/8XVXj/1/ –

+0

Существует полный полезный пример с вашим кодом: http://jsfiddle.net/8XVXj/2/ –

+0

Задержка теперь ушло, но у меня все еще есть чувство, что это можно сделать лучше. Есть 2 утверждения, чтобы проверить, не следует ли смотреть прокрутку, и что это кажется ненужным. Спасибо за ваше решение, и я проверю, работает ли он правильно. – Gideon

Смежные вопросы