Я думаю, что Эндрю был на правильном пути в отношении установки высоты #wrapper
div.Как он отметил,
that.maxScrollY = that.wrapperH - that.scrollerH;
Обычно это будет работать.Но теперь, когда вы изменили #content
на position: fixed
, элемент-обертка больше не «оборачивает» ваш контент, поэтому that.wrapperH
имеет значение 0, вещи ломаются.
Отказ от ответственности: я не прошел весь сценарий, поэтому я могу ошибаться здесь
Если вручную установить высоту #wrapper
, скажем 500px
, она становится
that.maxScrollY = 500 - that.scrollerH;
Глупость в том, что когда контента много, а окно маленькое, значение that.scrollerH
относительно близко к 500, скажем 700px
.Разница между ними будет 200px
, поэтому вы можете прокручивать только 200 пикселей, создавая впечатление, что он заморожен.Это сводится к тому, как вы устанавливаете это значение maxScrollY
.
Решение (по крайней мере, для браузера Chrome):
Поскольку #wrapper
фактически не содержит содержимого, мы не можем использовать его в расчетах.Теперь у нас есть единственное, от чего мы можем надежно получить эти измерения, #content
.В данном конкретном случае кажется, что использование элемента содержимого scrollHeight
дает то, что мы хотим.Это, скорее всего, тот, который имеет ожидаемое поведение,
that.maxScrollY = that.scrollerH - that.scroller.scrollHeight;
scrollerH
- это offsetHeight
, что примерно соответствует высоте того, что вы видите в окне.scroller.scrollHeight
- высота, которая считается прокручиваемой.Когда содержание не превышает длину страницы, они примерно эквивалентны друг другу.Это означает, что нет прокрутки.Когда контента много, разница между этими двумя значениями - это количество прокрутки, которое вам нужно.
Еще есть небольшая ошибка, и похоже, что она уже есть.Когда у вас много контента, последние несколько элементов закрываются панелью при прокрутке вниз.Чтобы исправить это, вы можете установить смещение, например,
that.maxScrollY = that.scrollerH - that.scroller.scrollHeight - 75;
Произвольное число 75.Вероятно, будет лучше, если это будет высота самой полосы с 2 или 3 пикселями для небольшого отступа.Удачи!
Редактировать:
Я забыл упомянуть вчера вечером, но вот два примера страниц, которые я использовал при попытке отладить эту проблему.
Длинная страница
Короткая страница