Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 01.12.2019, 10:44
Аватар для ozoro
Аспирант
Отправить личное сообщение для ozoro Посмотреть профиль Найти все сообщения от ozoro
 
Регистрация: 04.05.2019
Сообщений: 80

laimas,
рони,

Сообщение от ozoro Посмотреть сообщение
так заработало, не знаю почему до этого не сработало

Подскажите еще, как сделать чтобы контент элементы не сдвигались вправо когда пропадает скролл?
Подскажите, как динамически вычислять сдвиг контента, чтобы добавить в html для компенсации места, занимаемого скроллом?
$("html").css("overflow","hidden").css("padding-right","17px");


Ведь не у всех браузеров полоса прокрутки = 17px, особенно у мобильных.
Ответить с цитированием
  #12 (permalink)  
Старый 01.12.2019, 10:55
Аватар для ozoro
Аспирант
Отправить личное сообщение для ozoro Посмотреть профиль Найти все сообщения от ozoro
 
Регистрация: 04.05.2019
Сообщений: 80

Сообщение от laimas Посмотреть сообщение
[HTML run]<html>
Никак, это увеличивается размер клиентской области, за счет размера полосы прокрутки. Добавить телу отступ справа? Ну так будет пустая область.
А здесь по какой причине не остается у тела отступ справа при открытии окна?
https://getbootstrap.ru/docs/v4-alpha/components/modal/
Ответить с цитированием
  #13 (permalink)  
Старый 01.12.2019, 10:56
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Проще вернуться к восстановлению позиции без запрещения прокрутки, почему у вас не работает не понять, но все должно.

<!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>
Ответить с цитированием
  #14 (permalink)  
Старый 01.12.2019, 10:57
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от ozoro
А здесь по какой причине не остается у тела отступ справа при открытии окна?
По той, что есть полоса прокрутки.
Ответить с цитированием
  #15 (permalink)  
Старый 01.12.2019, 11:12
Аватар для ozoro
Аспирант
Отправить личное сообщение для ozoro Посмотреть профиль Найти все сообщения от ozoro
 
Регистрация: 04.05.2019
Сообщений: 80

Сообщение от laimas Посмотреть сообщение
Проще вернуться к восстановлению позиции без запрещения прокрутки, почему у вас не работает не понять, но все должно.

<!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>
Как это применить в моем случае?

Сообщение от laimas Посмотреть сообщение
По той, что есть полоса прокрутки.
При открытии маленьких окон полоса прокрутки скрывается, но контент не сдвигается и пустого места не образуется.
Ответить с цитированием
  #16 (permalink)  
Старый 01.12.2019, 11:29
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от ozoro
При открытии маленьких окон полоса прокрутки скрывается, но контент не сдвигается и пустого места не образуется.
Уверены? Откройте страницу в отладчике и смотрите body. При появлении окна скрывается прокрутка и добавляется отступ справа. Не видно пустого места потому, что на этой странице справа ничего нет, а была бы к примеру шапка страницы, было бы заметно, хотя конечно, если ее позиционировать иначе, перекрывая тело документа....
Ответить с цитированием
  #17 (permalink)  
Старый 01.12.2019, 11:30
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от ozoro
Как это применить в моем случае?
Это тоже самое, что вы и делали, которое почему то у вас не работает, а вот почему, сказать не могу.
Ответить с цитированием
  #18 (permalink)  
Старый 01.12.2019, 12:00
Аватар для ozoro
Аспирант
Отправить личное сообщение для ozoro Посмотреть профиль Найти все сообщения от ozoro
 
Регистрация: 04.05.2019
Сообщений: 80

Сообщение от laimas Посмотреть сообщение
Это тоже самое, что вы и делали, которое почему то у вас не работает, а вот почему, сказать не могу.
А как оно будет работать, если таким образом нельзя это определить, на сколько px вниз проскроллена страница. Только если проскролить вниз и нажать F5, тогда определяет.

Проверь сам:
var scl = $(window).scrollTop();
console.log(scl);


при самом скроле значение не меняются

Поэтому и просил функцию помочь применить...
Ответить с цитированием
  #19 (permalink)  
Старый 01.12.2019, 12:10
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от ozoro
при самом скроле значение не меняются
В примере:

$(this).data({top: $(window).scrollTop()}) запоминает позицию прокрутки на момент открытия модалки и сохраняет ее в самой модалке. Что пользователю охота, смотреть содержимое модалки или скролить страницу, это модалке боком.

После закрытия окна, это (window).scrollTop($(this).data('top')) получает сохраненную позицию и прокручивает страницу к ней.

А вам чего хочется - раскрыть модалку, крутить скролл, запоминая его, чтобы потом получить последнюю позицию? А смысл, она и так будет на ней. И вообще в чем тогда смысл окна модального?
Ответить с цитированием
  #20 (permalink)  
Старый 01.12.2019, 13:07
Аватар для ozoro
Аспирант
Отправить личное сообщение для ozoro Посмотреть профиль Найти все сообщения от ozoro
 
Регистрация: 04.05.2019
Сообщений: 80

Сообщение от laimas Посмотреть сообщение
В примере:

$(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();
});


Если бы как-то значение (результат выполнения) этой функции можно бы использовать за ее пределами, об этом я и просил по большому счету. То есть чтобы использовать результат выполнения функции в функциях открытия и закрытия модального окна.

Последний раз редактировалось ozoro, 01.12.2019 в 13:56.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите разобраться со скриптом Валерий1996 Общие вопросы Javascript 7 13.07.2015 21:41
Помогите пожалуйста изменить функцию AntonMs Общие вопросы Javascript 1 22.05.2015 23:37
Помогите оптимизировать скрипт смены изображений с анимацией Khmelevsky Элементы интерфейса 5 06.03.2010 19:02
Можно ли использовать функцию в качестве свойства свободно позиционируемого объекта Newgen Общие вопросы Javascript 0 24.07.2009 23:02
Корректно ли использовать подобную функцию в XST шаблоне artwalek Общие вопросы Javascript 1 03.03.2009 20:07