Как сделать заполнитель полосы прокрутки - PullRequest
6 голосов
/ 06 июля 2011

Моя проблема в том, что вертикальная полоса прокрутки в браузере, которая удаляется, например, overflow:hidden;, заставит страницу перейти, когда она появится позже. Я использую jQuery, чтобы удалить опцию прокрутки у посетителя, в то время как сценарий работает и прокручивает страницу до определенной точки, а затем, чтобы она снова появилась снова:

www.nebulafilm.dk / index.html? Содержание

Могу ли я сделать заполнитель для полосы прокрутки, когда ее нет, поэтому она не будет прыгать назад?

Или можно «отключить» его и сделать его «серым»?

Я не могу найти какие-либо решения с помощью поиска. Я нашел что-то подобное здесь: stackoverflow.com , где полоса прокрутки всегда есть. Но разница в том, что полоса прокрутки должна оставаться отключенной, даже если страница длиннее окна. Он должен быть снова «включен» только через другой скрипт, которым я управляю.

Возможно ли это каким-либо образом?

Спасибо.


Обновление:

Время обновления статуса.

У меня были некоторые проблемы с фоновым изображением звездного облака, которое было установлено на теге body.
Когда сценарий jQuery (из ответа cwolves) добавил отступ к тегу html и, следовательно, должен сдвинуть все элементы на странице влево, фоновое изображение по-прежнему не работает правильно.

Ну, я обнаружил, что элемент body не реагирует как любой элемент div. Это не просто «блок» внутри тега html, как любой другой элемент блока. Он имеет свое поведение и, очевидно, не может быть обманут таким же образом. Поэтому фоновое изображение было невозможно прикоснуться, пока он был на body.
Но мне потребовалось некоторое время, чтобы понять ...

Конечное решение этой проблемы настолько глупо просто, что я чуть не заплакал, когда узнал, думая о бесконечных (я мог бы немного преувеличить) часах расследования body.
Я просто завернул все в <div id="body"> и дал вместо этого фоновое изображение. Внезапно все стало на свои места.

От:

<body>
...
</body>

И

body {background-image: url(...);}

Кому:

<body>
<div id="body">
...
</div>
</body>

И

#body {background-image: url(...);}

И немного мудрее о body.

Больше не надо "прыгать". Вкусные.

Эффект теперь полностью запущен, и вы почти не заметите изменений с помощью полосы прокрутки и каждой детали. Сценарий Кволва идеален и делает точный расчет:

function getScrollBarWidth(){
    var div = $('<div><div>' + new Array(100).join('content<br />') + '</div></div>'),
       div2 = div.find('div'),
       body = $(document.body);

    div.css({ overflow : 'hidden', width: 100, height: 100, position : 'absolute', left : -1000, top : -1000 });
    body.append(div);

    var width1 = div2.width();
    div.css({ overflow : 'auto' });
    var width2 = div2.width();

    div.remove();

    return width1 - width2;
}

* * * * * * * * * * * * * * * * * * * * * * * * * getScrollBarWidth() * * * * * * * * * * * * * * * * * 1066

    var sWidth = getScrollBarWidth();

    $("body").css({'overflow': 'hidden'});
    $("html").css({'padding-right': sWidth});

    $('html, body').delay(1000).animate({

        scrollTop: $(hash).offset().top - 170

    }, 2000, 'swing', function(){

        $("body").css({'overflow': 'auto'});
        $("html").css({'padding-right': 0});

    });

Большое спасибо. Это было приятно.

Ответы [ 5 ]

5 голосов
/ 12 июля 2011

Как насчет этого:

  • Определить ширину полосы прокрутки в текущем браузере
  • Установить для div содержимого значение padding-right: scrollbar-width
  • Скрыть прокрутку на родительском элементе

и после анимации:

  • Удалить отступ справа от содержимого
  • показать прокрутку для родителя

Я сделалдемо: http://jsfiddle.net/cwolves/ezLfU/1/

1 голос
/ 13 июля 2011

Вы можете использовать http://jscrollpane.kelvinluck.com/, чтобы дать вам некоторый контроль над полосой прокрутки и работать с ней.

1 голос
/ 12 июля 2011

Как насчет сделать ваш контент на несколько пикселей меньше ширины контейнера и переключить атрибут overflow-y?

Полосы прокрутки могут иметь разную ширину в разных браузерах / ОС.Если вы не собираетесь рассчитывать ширину полосы прокрутки, лучше всего ее использовать достаточно широко, чтобы она работала во всех браузерах.

Пример

1 голос
/ 12 июля 2011

Я только что посмотрел на ваш сайт и подумал об альтернативном подходе. Если вы скрываете полосу прокрутки с переполнением: скрытым, вы также можете переопределить прокрутку.

Прикрепите события к странице вверх / вниз страницы / home / end / стрелка вверх / стрелка вниз, колесо мыши вверх / колесо мыши вниз, а затем выполните

$(window).scrollTop($(window).scrollTop() + 15)

Приведенный выше код явно плох и является лишь примером, но, возможно, вы захотите попробовать.

0 голосов
/ 06 июля 2011

Отображение отключенной полосы прокрутки так же просто, как настройка переполнения: прокрутка;

Только по вертикали будет overflow-y:scroll

...