Помогите использовать функцию onscroll
Есть кнопка открытия модального окна ближе к низу страницы.
При закрытии модального окна происходит скролл наверх страницы. Необходимо чтобы при закрытии модального окна не скролило наверх страницы, а контент оставался в текущем положении. Сделал вот так: var scl = $(window).scrollTop(); var scrtop = "-"+scl+"px"; //открытие модального окна $(document).on("shown.bs.modal", ".modal", function () { // Когда модальное окно открыто, фиксируем элемент body $("body").css("position","fixed").css("top", scrtop); }); // закрытие модального окна $(document).on("hidden.bs.modal", ".modal", function () { // Когда модальное окно скрыто... $("body").removeAttr("style").removeAttr("class"); $(window).scrollTop(scl); }); НО работает только если прокрутить до кнопки вниз и обновить страницу. Динамически определить скролл не хватает знаний. Конечно есть функция, которая динамически определяет скрол, но как ее прикрутить к вышеуказанному коду или как-то сделать по другому, ума не приложу. Вот эта функция: $(window).on("scroll", function() { $(window).scrollTop(); }); Заранее, благодарю! |
Вместо $("body").css("position","fixed").css("top", scrtop);
$("html").css("overflow","hidden"); и $("html").css("overflow","auto"); соответственно. А фиксировать окно. |
Цитата:
|
laimas,
Сделал как сказал //открытие модального окна $(document).on("shown.bs.modal", ".modal", function () { $("html").css("overflow","hidden"); }); // закрытие модального окна $(document).on("hidden.bs.modal", ".modal", function () { $("html").css("overflow","auto"); }); Но это не помогает, при открытии страница на месте, а при закрытии окна все равно скролится в самый верх. |
Кто скролится, окно? Если оно вызывается в любом месте страницы, то оно фиксируется либо к верхнему краю, либо по центру вертикали. А overflow hidden/auto, это запрет скролла документа, чтобы после закрытия окна была прежняя позиция.
|
Цитата:
|
Да какая разница как оно закрывается, кнопкой, щелчком вне его, ESC ...
|
Цитата:
|
Цитата:
Подскажите еще, как сделать чтобы контент элементы не сдвигались вправо когда пропадает скролл? |
<html> <head> <meta charset="utf-8"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script> <style> body { margin: 0; } .overlap { position: fixed; top: 0; width: 100%; height: 100%; background-color: #00000055; z-index: 100; } .modal { position: fixed; width: 400px; height: 200px; top: -200px; left: 50%; margin-left: -200px; background-color: #fff; border-radius: 0 0 10px 10px; } </style> <script type="text/javascript"> $(function() { for(var i=1; i < 80; ++i) $('body').append('<p>'+i+'</p>'); $('html').animate({ scrollTop: 1000 }, 500, function() { $("html").css("overflow","hidden"); $('<div class="overlap"><div class="modal"><button>Close</button></div></div>') .appendTo('body') .find('.modal') .animate({top: 0}, 500) .find('button').click(function() { $(this).parent().animate({top: -200}, 500, function() { $("html").css("overflow","auto"); $(this).parent().remove() }) }) }); }); </script> </head> <body> </body> </html> На месте же документ остается? Overflow для html потому, что среди плагинов sticky есть один (какой именно теперь не помню), который отказывается работать после разрешения прокрутки если overflow определять для body. Цитата:
|
laimas,
рони, Цитата:
$("html").css("overflow","hidden").css("padding-right","17px"); Ведь не у всех браузеров полоса прокрутки = 17px, особенно у мобильных. |
Цитата:
https://getbootstrap.ru/docs/v4-alpha/components/modal/ |
Проще вернуться к восстановлению позиции без запрещения прокрутки, почему у вас не работает не понять, но все должно.
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script> <style> body { margin: 0; } .overlap { position: fixed; top: 0; width: 100%; height: 100%; background-color: #00000055; z-index: 100; } .modal { position: fixed; width: 400px; height: 200px; top: -200px; left: 50%; margin-left: -200px; background-color: #fff; border-radius: 0 0 10px 10px; } </style> <script type="text/javascript"> $(function() { for(var i=1; i < 80; ++i) $('body').append('<p>'+i+'</p>'); $('html').animate({ scrollTop: 500 }, 500, function() { $('<div class="overlap"><div class="modal"><button>Close</button></div></div>') .appendTo('body') .find('.modal') .animate({top: 0}, 500, function() { $(this).data({top: $(window).scrollTop()}) //запомнить позицию прокрутки }) .find('button').click(function() { $(this).parent().animate({top: -200}, 500, function() { $(window).scrollTop($(this).data('top')) //восстановить позицию прокрутки $(this).parent().remove() }) }) }); }); </script> </head> <body> </body> </html> |
Цитата:
|
Цитата:
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
Проверь сам: var scl = $(window).scrollTop(); console.log(scl); при самом скроле значение не меняются Поэтому и просил функцию помочь применить... |
Цитата:
$(this).data({top: $(window).scrollTop()}) запоминает позицию прокрутки на момент открытия модалки и сохраняет ее в самой модалке. Что пользователю охота, смотреть содержимое модалки или скролить страницу, это модалке боком. После закрытия окна, это (window).scrollTop($(this).data('top')) получает сохраненную позицию и прокручивает страницу к ней. А вам чего хочется - раскрыть модалку, крутить скролл, запоминая его, чтобы потом получить последнюю позицию? А смысл, она и так будет на ней. И вообще в чем тогда смысл окна модального? |
Цитата:
Что-то не работает. Я заморочился из-за того, что у меня при открытии модального окна не удалялась полоса прокрутки, контент прокручивался. Решил сделать чтобы не прокручивался контент страницы, а блокировался в текущем положении, при этом чтобы не смещалось тело вправо. Нашел способ с помощью fixed. Но при этом при открытии модального окна страница стала прокручиваться в top: 0. Поэтому, решил определять значение скролла - на сколько страница прокручена вниз и добавлять его отрицательное значение в top:. Например, на 1200px вниз, то добавлять top:-1200px. var scl = $(window).scrollTop();//определяем значение скрола, например, определилось 1200 var scrtop = "-"+scl+"px";//добавляем - и px, получается -1200px //функция определения открытия модального окна $(document).on("shown.bs.modal", ".modal", function () { $("body").css("position","fixed").css("top", scrtop);// фиксируем body и делаем top:-1200px }); //функция определения закрытия модального окна $(document).on("hidden.bs.modal", ".modal", function () { $("body").removeAttr("style").removeAttr("class"); //удаляем атрибуты style и class $(window).scrollTop(scl);//остаемся на той позиции, которая была при открытии окна, то есть .scrollTop(1200) }); Но это работает только если проскролить вниз, после нажать F5 - обновить страницу. Тогда при закрытии модального окна позиция тела остается как при открытии окна. Вот эта функция определяет сразу при скроле значение $(window).on("scroll", function() { $(window).scrollTop(); }); Если бы как-то значение (результат выполнения) этой функции можно бы использовать за ее пределами, об этом я и просил по большому счету. То есть чтобы использовать результат выполнения функции в функциях открытия и закрытия модального окна. |
Цитата:
Open: получить текущую позицию $(window).scrollTop(), запомнить ее (это удобно делать в .data() объекта, которым и манипулируете) и только затем $("body").css("position","fixed"). Это .css("top", scrtop) зачем? Close: $("body").removeAttr("style") - сбросили стили, затем восстановили позицию $(window).scrollTop(объект_хранящий_ позицию.data('имя')). И не обязательно .removeAttr("style"), можно и $("body").css("position","static"); |
Цитата:
Если не трудно, исправь мой код, по твоему варианту, а то не пойму что куда нужно вставить. |
Цитата:
var scrtop = "-"+scl+"px"; //открытие модального окна $(document).on("shown.bs.modal", ".modal", function () { // Когда модальное окно открыто, фиксируем элемент body $(this).data({top: $(window).scrollTop()}); $("body").css("position", "fixed"); }); // закрытие модального окна $(document).on("hidden.bs.modal", ".modal", function () { // Когда модальное окно скрыто... $("body").css("position", "static"); $(window).scrollTop($(this).data('top')); }); |
laimas,
Так работает, но при открытии окна страница вначале скролится наверх, а при закрытии окна возвращается в то место где кнопка вызова (то есть откуда вызывалось окно, например, страница прокручена на 1200px вниз, там кнопка вызова, нажимаем и страница прокручивается вверх в шапку сайта, а при закрытии возвращается опять на 1200px вниз). Поэтому как-то надо еще и .css("top", scrtop) прикрутить, чтобы позиция не менялась. |
Вот так заработало как надо:
//открытие модального окна $(document).on("shown.bs.modal", ".modal", function () { // Когда модальное окно открыто, фиксируем элемент body $(this).data({top: $(window).scrollTop()}); var scl = "-"+$(window).scrollTop()+"px"; $("body").css("position", "fixed").css("top", scl); }); // закрытие модального окна $(document).on("hidden.bs.modal", ".modal", function () { // Когда модальное окно скрыто... $("body").css("position", "static"); $(window).scrollTop($(this).data('top')); }); Огромная благодарность за помощь! |
Цитата:
$("body").removeClass('name').css("position", "fixed"); Если при этом $(window).scrollTop() запоминает позицию уже с этой прокруткой, то попробуйте удалять этот класс в событии show.bs.modal |
Цитата:
|
В body добавляется класс modal-open и больше ничего.
Правила этого класса .modal-open { overflow: hidden; } Это ведь не может влиять на то, что при открытии скролится вверх? |
Цитата:
PS. А собственно да, вы же пытаетесь оставить при fixed ту позицию, которая была на момент прокрутки? Все верно, запомнить ее, и на это же значение с отрицательным знаком вверх. Это я запутал. ) |
Буду икать причину...
Еще раз благодарю за помощь. Еще вопрос, вот хочу тебе отзыв оставить в благодарность, да и некоторым помогающим ранее в других темах пытался, но постоянно получаю сообщение: ![]() Я тебе оставлял отзыв, но после уже многим оставил... это что, глюк (баг) какой-то? |
Цитата:
|
Цитата:
Что касаемо причины, то все верно, это я "на несколько фронтов в сети", и сам уже не помню о чем речь в каком посте, и тебя запутал. Fixed, нужно указать позицию, по умолчанию 0, поэтому и прокрутка. Ты же хочешь при открытии окна остаться на той же позиции, так что все верно $(window).scrollTop() - это запомнить, а -$(window).scrollTop(), это сместить до позиции. То есть вот так записать: $(document).on("shown.bs.modal", ".modal", function () { // Когда модальное окно открыто, фиксируем элемент body var top = $(window).scrollTop(); $(this).data({top: top}); $("body").css({position: "fixed", top: -top}); }); |
Цитата:
Еще раз благодарю! Сделал по последнему твоему варианту. |
Часовой пояс GMT +3, время: 19:42. |