页面 noscroll 在粘性页脚布局中保持 scrollTop 位置
Page noscroll keeping scrollTop position in sticky footer layout
我受不了这样的脑残:
当显示高大的弹出窗口时,隐藏页面滚动是一种常见的方法。但是当您将 overflow: hidden
设置为 html 和 body 元素时,内容会自动 returns 到它的顶部(scrollTop:0)。保持 scrollTop 位置并在弹出窗口消失时重置它是没有问题的。但是如果你使用透明遮罩,用户会看到从当前滚动位置到顶部的不必要的跳转。如何逃避这个?
在当前的 Chrome 和 Firefox 中,我只能将 overflow: hidden
设置为 html 元素来达到我想要的效果,但它不适用于移动设备。
也许有人可以提出一个好的跨浏览器解决方案。
我认为这不应该发生。我会查看弹出代码,看看它是否是将页面发送到顶部并使用 subpar css 定位弹出元素的罪魁祸首。
无论如何,这里的代码应该可以应对您遇到的行为。由于我无法重现该问题,因此我无法测试我提出的修复方法。我想你会发现你的弹出窗口会滚出视野。
function keepScroll(){
var x = $('body').scrollLeft() + $(document.documentElement).scrollLeft();
var y = $('body').scrollTop() + $(document.documentElement).scrollTop();
$('html').css({
'overflow':'hidden'
});
$('body').css({
'overflow':'hidden'
});
$(window).scrollTop(y).scrollLeft(x);
}
恶心的页脚布局 html 和正文高度等于“100%”。当您设置 overflow:hidden
时,它会裁剪所有内容并 returns 它到顶部位置。
为避免这种情况,如果存在滚动,则应将 html 和正文高度设置为 'auto'(您应检查它以保持粘性页脚行为)
function keepScroll(){
var scrollHeight = $('body')[0].scrollHeight > $('html')[0].scrollHeight ? $('body')[0].scrollHeight : $('html')[0].scrollHeight,
keepCSS = scrollHeight > $(window).height() ? {'overflow':'hidden','height':'auto'} : {'overflow':'hidden'};
$('html, body').css(keepCSS);
}
查看 fiddle,了解现场演示
编辑 1
此解决方案仍然无法在移动设备上运行(溢出:隐藏不会禁用 iPad 上的滚动,正文的位置 'fixed' 修复将内容扔到顶部),所以问题是开放的
编辑 2
查找修复程序,适用于手机。也许它不是那么干净,但是可以用。
var scrollKeeper = (function() {
var scrollHeight = $('body')[0].scrollHeight > $('html')[0].scrollHeight ? $('body')[0].scrollHeight : $('html')[0].scrollHeight,
keepCSS = scrollHeight > $(window).height() ? {'overflow':'hidden','height':'auto'} : {'overflow':'hidden'},
scrollTop = 0;
return {
keep : function() {
scrollTop = $(window).scrollTop();
$('body').css({'position': 'fixed', 'width':'100%', 'top': -scrollTop + 'px'});
$('html, body').css(keepCSS);
},
release : function() {
$('html, body').removeAttr('style').scrollTop(scrollTop);
}
}
})();
提示:当然在实际开发中你应该使用css 类来避免removeAttr(style)等。
在 iPhone 和 Ipad (iOS 8+) 上测试。
fiddle http://jsfiddle.net/m1eav032/5/
我受不了这样的脑残:
当显示高大的弹出窗口时,隐藏页面滚动是一种常见的方法。但是当您将 overflow: hidden
设置为 html 和 body 元素时,内容会自动 returns 到它的顶部(scrollTop:0)。保持 scrollTop 位置并在弹出窗口消失时重置它是没有问题的。但是如果你使用透明遮罩,用户会看到从当前滚动位置到顶部的不必要的跳转。如何逃避这个?
在当前的 Chrome 和 Firefox 中,我只能将 overflow: hidden
设置为 html 元素来达到我想要的效果,但它不适用于移动设备。
也许有人可以提出一个好的跨浏览器解决方案。
我认为这不应该发生。我会查看弹出代码,看看它是否是将页面发送到顶部并使用 subpar css 定位弹出元素的罪魁祸首。
无论如何,这里的代码应该可以应对您遇到的行为。由于我无法重现该问题,因此我无法测试我提出的修复方法。我想你会发现你的弹出窗口会滚出视野。
function keepScroll(){
var x = $('body').scrollLeft() + $(document.documentElement).scrollLeft();
var y = $('body').scrollTop() + $(document.documentElement).scrollTop();
$('html').css({
'overflow':'hidden'
});
$('body').css({
'overflow':'hidden'
});
$(window).scrollTop(y).scrollLeft(x);
}
恶心的页脚布局 html 和正文高度等于“100%”。当您设置 overflow:hidden
时,它会裁剪所有内容并 returns 它到顶部位置。
为避免这种情况,如果存在滚动,则应将 html 和正文高度设置为 'auto'(您应检查它以保持粘性页脚行为)
function keepScroll(){
var scrollHeight = $('body')[0].scrollHeight > $('html')[0].scrollHeight ? $('body')[0].scrollHeight : $('html')[0].scrollHeight,
keepCSS = scrollHeight > $(window).height() ? {'overflow':'hidden','height':'auto'} : {'overflow':'hidden'};
$('html, body').css(keepCSS);
}
查看 fiddle,了解现场演示
编辑 1 此解决方案仍然无法在移动设备上运行(溢出:隐藏不会禁用 iPad 上的滚动,正文的位置 'fixed' 修复将内容扔到顶部),所以问题是开放的
编辑 2 查找修复程序,适用于手机。也许它不是那么干净,但是可以用。
var scrollKeeper = (function() {
var scrollHeight = $('body')[0].scrollHeight > $('html')[0].scrollHeight ? $('body')[0].scrollHeight : $('html')[0].scrollHeight,
keepCSS = scrollHeight > $(window).height() ? {'overflow':'hidden','height':'auto'} : {'overflow':'hidden'},
scrollTop = 0;
return {
keep : function() {
scrollTop = $(window).scrollTop();
$('body').css({'position': 'fixed', 'width':'100%', 'top': -scrollTop + 'px'});
$('html, body').css(keepCSS);
},
release : function() {
$('html, body').removeAttr('style').scrollTop(scrollTop);
}
}
})();
提示:当然在实际开发中你应该使用css 类来避免removeAttr(style)等。 在 iPhone 和 Ipad (iOS 8+) 上测试。 fiddle http://jsfiddle.net/m1eav032/5/