настройка положения контейнера с помощью прокрутки

#javascript

#javascript

Вопрос:

Я пытаюсь сделать так, чтобы набор элементов в контейнере div постоянно присутствовал в окне просмотра. Я попробовал несколько разных подходов, но, похоже, у них есть проблемы с перерисовкой.

Вопрос: Какие-либо серьезные оптимизации для повышения производительности и устранения выделяющихся визуальных побочных эффектов? Если нет, то какие-либо альтернативные подходы?

Первый подход:

     $(viewport).scroll(function ()
    {
        m_grid.css({ 'marginTop': viewport.scrollTop()   'px' });
    })
 

Это вызывает крошечные эффекты встряхивания, которые очевидны для пользователя.

Второй подход:

  • Поместите div ниже и выше содержимого, сжимайте и расширяйте их с помощью небольшой элементарной математики, чтобы заполнить неиспользуемое пространство прокручиваемого контейнера.

Проблема с этим подходом заключалась в том, что он вызывает мерцание по краям содержимого, скорее всего, из-за постоянного изменения размера.

Третий подход:

  • Поместите div, который имитирует поведение прокрутки непосредственно над тем местом, где должна была находиться исходная полоса прокрутки, а затем просто привяжите к нему события прокрутки, которые перенаправляют их в фактический контейнер.

Проблема с этим заключается в том, что, поскольку div, который фактически выполняет прокрутку, является поддельным, колесико мыши не будет использоваться, поскольку оно не будет иметь фокуса при наведении курсора на элементы в окне просмотра.

Есть мысли об улучшениях или альтернативных подходах? Это должно быть ориентировано на производительность.

Ответ №1:

Для этого вам не нужен JavaScript, вы можете сделать это с помощью CSS. Например:

 #viewport { 
    position: relative;
}

#m_grid {
    position: fixed;
    top: 0px;
}
 

У Дэвида Уолша есть демонстрационная страница position: fixed in action.

Комментарии:

1. Поддержка этого в IE7, FF, Chrome и Safari?

2. Это не будет работать как чисто css-решение, потому что мне нужно, чтобы мой контент находился внутри области просмотра. При фиксированном позиционировании мне нужно знать, где оно должно быть на экране, и я никогда не смогу гарантировать (о чем я, очевидно, не упоминал). Однако эта идея могла бы сработать, если бы я просто использовал javascript для позиционирования его после отображения окна просмотра, я думаю. Вернется к вам

3. Это работает просто отлично, за исключением того, что в Chrome и Firefox он не обнаруживает прокрутку колеса мыши