Я пытаюсь отключить полосу прокрутки html / body родительского элемента при использовании лайтбокса. Главное слово здесь - отключить . Я не хочу скрывать это с overflow: hidden;
.
Причиной этого является то, overflow: hidden
что сайт прыгает и занимает область, где была прокрутка.
Я хочу знать, возможно ли отключить полосу прокрутки, пока она еще отображается.
javascript
jquery
html
css
Dejan.S
источник
источник
Ответы:
Если страница под оверлеем может быть «зафиксирована» вверху, при открытии оверлея вы можете установить
вы все равно должны увидеть правую полосу прокрутки, но содержимое не прокручивается. Когда вы закрываете оверлей, просто возвращаете эти свойства
Я просто предложил этот способ только потому, что вам не нужно менять какое-либо событие прокрутки
Обновить
Вы также можете сделать небольшое улучшение: если вы получите
document.documentElement.scrollTop
свойство через javascript непосредственно перед открытием слоя, вы можете динамически назначить это значение какtop
свойство элемента body: при таком подходе страница будет стоять на своем месте, независимо от того, ' на вершине или если вы уже прокрутили.Css
JS
источник
$('body').css('top', -($('body').scrollTop()) + 'px').addClass('noscroll');
Четыре небольших дополнения к выбранному решению:
Полное решение, которое работает для большинства браузеров:
CSS
Отключить прокрутку
Включить прокрутку
Спасибо Фабрицио и Деяну за то, что они поставили меня на правильный путь, и Бродинго за решение с двойной полосой прокрутки.
источник
afterLoad()
иafterClose
обратных вызовов. Может быть полезно для других, ищущих этот вопрос.scrollTop
так что строка 2 кода «Отключить прокрутку» может быть выражена как$( window ).scrollTop()
.if (scrollTop < 0) { scrollTop = 0; }
. Вот полный код для отключения gist.github.com/jayd3e/2eefbbc571cd1668544b .С включенным jQuery:
отключить
включить
использование
источник
Я ОП
С помощью ответа от fcalderan я смог сформировать решение. Я оставляю свое решение здесь, поскольку оно дает ясность в том, как его использовать, и добавляет очень важную деталь,
width: 100%;
Я добавляю этот класс
это сработало для меня, и я использовал Fancyapp.
источник
Это сработало очень хорошо для меня ....
просто оберните эти две строки кода тем, что решит, когда вы собираетесь заблокировать прокрутку.
например
источник
Вы не можете отключить событие прокрутки, но вы можете отключить связанные действия, которые приводят к прокрутке, такие как колесико мыши и перемещение пальцем:
источник
Вы можете скрыть полосу прокрутки тела
overflow: hidden
и одновременно установить поле, чтобы контент не перепрыгивал:А затем вы можете добавить отключенную полосу прокрутки на страницу, чтобы заполнить пробел:
Я сделал именно это для моей собственной реализации лайтбокса. Кажется, до сих пор работает хорошо.
источник
Это решение, с которым мы пошли. Просто сохраните позицию прокрутки при открытии оверлея, прокрутите назад до сохраненной позиции каждый раз, когда пользователь попытался прокрутить страницу, и отключите прослушиватель, когда оверлей закрыт.
Это немного нервно в IE, но работает как шарм в Firefox / Chrome.
источник
z-index
на.overlay-shown
быть больше , чем фиксированный заголовок. (У меня есть этот код, запущенный в производство на сайте с фиксированным заголовком, и он отлично работает.)body
тега. Я экспериментировал с вашим кодом вчера, и у меня есть фиксированный заголовок в верхней части моей страницы. Если я обработаю прокрутку с помощьюbody
тега, полоса прокрутки будет находиться под фиксированным заголовком.$("body")
мы используем$(window)
. И вместоz-index: -1
наложения, чтобы скрыть его, вы можете использоватьvisibility: hidden
или подобное. См. Jsfiddle.net/8p2gfeha для быстрого теста, чтобы увидеть, работает ли он. Фиксированный заголовок больше не отображается в верхней части полосы прокрутки. В конце концов я постараюсь включить эти изменения в ответ.У меня была похожая проблема: левое меню, которое, когда оно появляется, предотвращает прокрутку. Как только высота была установлена на 100vh, полоса прокрутки исчезла, и содержимое дернулось вправо.
Поэтому, если вы не против оставить полосу прокрутки включенной (но установить окно на полную высоту, чтобы оно нигде не прокручивалось), тогда другой возможностью является установка крошечного нижнего поля, при котором полосы прокрутки будут отображаться:
источник
overflow:hidden
мешает ли маржа иметь какой-либо эффект?Вы можете сохранить переполнение: скрытое, но управлять позицией прокрутки вручную:
перед показом следите за фактическим положением прокрутки:
он должен работать
источник
Грубым, но рабочим способом будет принудительная прокрутка вверх, таким образом, эффективно отключая прокрутку:
Когда вы открываете лайтбокс, поднимите флаг и, закрыв его, опустите флаг.
Живой тестовый кейс .
источник
Мне нравится придерживаться метода "overflow: hidden" и просто добавить padding-right, который равен ширине полосы прокрутки.
Получить функцию ширины полосы прокрутки, по lostsource .
При отображении наложения добавьте класс «noscroll» в html и добавьте padding-right для body:
При сокрытии удалите класс и отступы:
Стиль Noscroll таков:
Обратите внимание, что если у вас есть какие-либо элементы с position: fixed, вам также необходимо добавить отступы к этим элементам.
источник
<div id="lightbox">
находится внутри<body>
элемента, поэтому при прокрутке лайтбокса вы также прокручиваете тело. Решение состоит в том, чтобы не расширять<body>
элемент более чем на 100%, размещать длинное содержимое внутри другогоdiv
элемента и добавлять полосу прокрутки, если необходимо, к этомуdiv
элементу с помощьюoverflow: auto
.Теперь прокрутка над лайтбоксом (и над ним
body
) не имеет никакого эффекта, потому что тело не превышает 100% высоты экрана.источник
Все системы на основе javascript для модальных / лайтбоксов используют переполнение при отображении модальных / лайтбоксов, тегов html или body.
Когда лайтбокс отображается, js вызывает переполнение, скрытое в теге html или body. Когда лайтбокс скрыт, некоторые удаляют скрытый, другие нажимают на авто переполнение в тегах html или body.
Разработчики, работающие на Mac, не видят проблемы с полосой прокрутки.
Просто замените скрытое на unset, чтобы контент не проскальзывал под модальностью удаления полосы прокрутки.
Лайтбокс открыть / показать:
Лайтбокс закрыть / скрыть:
источник
Если страница под оверлеем может быть «зафиксирована» вверху, при открытии оверлея вы можете установить
предоставить этот класс для прокручиваемого тела, вы все равно должны увидеть правую полосу прокрутки, но содержимое не прокручивается.
Чтобы сохранить положение страницы, сделайте это в jquery
Когда вы закрываете оверлей, просто возвращаете эти свойства
Я просто предложил этот способ только потому, что вам не нужно менять какое-либо событие прокрутки
источник
CSS
JS
Теперь все, что вам нужно сделать, это вызвать функции
источник
Другое решение, позволяющее избавиться от скачка содержимого на фиксированном модальном уровне при удалении прокрутки тела, состоит в нормализации ширины страницы:
Затем вы можете играть с фиксированной позицией или переполнением: скрыто за телом, когда модал открыт. Но это скроет горизонтальные полосы прокрутки - обычно они не нужны на адаптивном веб-сайте.
источник
Вы можете сделать это с помощью Javascript:
А затем отключите его, когда ваш лайтбокс закрыт.
Но если ваш лайтбокс содержит полосу прокрутки, вы не сможете прокручивать ее, пока она открыта. Это потому что
window
содержит какbody
и#lightbox
. Поэтому вы должны использовать архитектуру, подобную следующей:А затем применить
onscroll
событие только на#global
.источник