Js/css: отключить полосу прокрутки, но сохранить положение прокрутки
Я использую диалоговое окно JQuery, чтобы открыть всплывающее окно сверху страницы.
Когда я открываю диалоговое окно, я хочу, чтобы общая прокрутка страницы была отключена.
Для этого я делаю:
$('body').css({overflow:'hidden'});
когда откроется диалог, и:
$('body').css({overflow:'auto'});
когда диалог закрывается.
Это работает, но когда панель прокрутки удаляется, содержимое в спине перемещается вправо, и результат не является приятным.
Я попробовал другой метод, создав класс css "noscroll", как таковой:
body.noscroll
{
position: fixed;
overflow-y: scroll;
width: 100%;
}
то вместо предыдущего js-кода я добавляю и удаляю этот класс в тело в диалоговом открытии/закрытии.
Теперь это работает для полосы прокрутки, а содержимое в спине не перемещается вправо, но с помощью этого метода содержимое в обратном направлении возвращается в начало.
Таким образом, в основном метод1 перемещает содержимое вправо, а метод2 возвращает содержимое назад.
Кто-нибудь знает решение для этого? нет прокрутки для содержимого в обратном направлении, когда открывается диалоговое окно, и нет движения при отключении прокрутки...?
Ответы
Ответ 1
Я сделал довольно простой пример моего решения.
http://jsfiddle.net/6eyJm/1/
Ваше всплывающее окно должно быть в поле
<div id="shadow">
<div id="popup">
<a id='close' href="#">Close</a>
</div>
Затем поместите эти CSS в корень div
#shadow{
display: none;
position: fixed;
top:0;
bottom: 0;
width: 100%;
height:100%;
background-color: rgba(0,0,0,0.6);
}
Фиксированная позиция действительно важна, так как вы не хотите видеть белую рамку, она будет иметь полную ширину окна, а не тело.
Тогда есть небольшой трюк JS
$('#open').click(function(e){
e.preventDefault()
$('body').width($('body').width());
$('body').css('overflow', 'hidden');
$('#shadow').css('display', 'block');
})
$('#close').click(function(e){
e.preventDefault()
$('body, #shadow').removeAttr('style')
})
Цель состоит в том, чтобы снять ширину тела перед удалением полосы прокрутки. Ваш контент не будет перемещаться.
Надеюсь, что это поможет!
Извините за мой английский, а не за мой родной язык.
Ответ 2
Вспоминая смещение, вы должны держать всплывающее окно в ожидании,
JSfiddle
HTML
<div id="popupholder">
<button id="close">Close me</button>
</div>
asd <br />asd <br />asd <br />asd <br />asd <br />
<button class="open">Popup</button>
<br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd<br />
<button class="open">Popup</button>
<br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />
<button class="open">Popup</button>
<br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd<br />
<button class="open">Popup</button>
<br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />asd <br />
CSS
html, body {
margin: 0px;
}
#popupholder {
width: 100%;
height: 100%;
position: absolute;
display: box;
display: -webkit-box;
display: -moz-box;
background-color: rgba(0,0,0,0.75);
display: none;
}
#close {
display: block;
height: 20px;
margin: 75px auto 0px auto;
}
JavaScript
$(document).ready(function() {
$('.open').click(function() {
// Block scrolling
$('body').css('overflow', 'hidden');
// Show popup
var offset = window.pageYOffset;
//console.log(offset);
$('#popupholder').css({
'display': 'block',
'top': offset + 'px'
});
});
$('#close').click(function() {
// Enable scrolling
$('body').css('overflow', 'auto');
// Hide popup
$('#popupholder').css('display', 'none');
});
});
По соображениям безопасности вы можете добавить очень высокий z-index
к вашему #popupholder
, но это не имеет особого отношения к вопросу.
Ответ 3
вы можете рассчитать разницу между шириной тела до и после скрытия переполнения и применить его как дополнение к тексту тела
var bodyStartW = $("body").width();
$("body").css("overflow-y" , "hidden");
var bodyEndW = $("body").width();
var bodyMarginL = bodyEndW - bodyStartW;
$("body").css("padding-right" , bodyMarginL);
В Safari у вас был тот же трюк для тега "html", а margin-right вместо padding-right