防止移动浏览器中地址栏的隐藏

52

我目前正在开发一个横向布局的网站。所有元素都是用JavaScript设置了position:absolute。它们的大小是通过window.innerHeight计算出来的。我的问题是,尽管这些元素的高度不高于窗口的高度,但我仍然可以向下滚动(地址栏的高度)。这有两个问题。首先,它会触发窗口调整大小的事件,但此时我既不想也不需要。其次,它与某些内容框不兼容,这些框的内容应该在垂直方向上可滚动。有时我可以滚动框,但有时先会滚动整个页面(如前所述:地址栏的高度)。是否有任何解决方案可以防止所有设备上的地址栏自动隐藏机制。

预先感谢你的帮助!

这个链接中的内容不能滚动:http://maxeffenberger.de/test.html

这个链接中的内容可以水平滚动(看到隐藏内容很有意义),但垂直滚动直到地址栏被隐藏没有意义(因为没有额外的“垂直”内容需要更多的空间):http://maxeffenberger.de/test2.html


我可以向下滚动,这会触发窗口大小调整事件--听起来非常奇怪。您能否请澄清一下? - Halcyon
2
不是真正的滚动。我可以移动页面,直到地址栏被隐藏。这将触发窗口调整大小事件,因为在地址栏隐藏后有更多的垂直空间。 - Max Effenberger
我明白了,那为什么会有问题呢?我猜你要么有一个全屏的界面,即没有滚动条,要么有一个可滚动的界面。无论哪种情况,都有一种清晰的方法来处理事件。 - Halcyon
页面应该只能水平滚动。除了内容框内部分需要垂直滚动外,其他地方不应该有垂直滚动条。因此,我不希望地址栏隐藏 - 在这种情况下没有意义。 - Max Effenberger
不行。overflow-y:hidden; 没有效果。也许这只与Android/Chrome有关。无论如何,我可以垂直滚动地址栏的高度。 - Max Effenberger
显示剩余2条评论
11个回答

53

这是我实现它的方式:

html {
  background-color: red;
  overflow: hidden;
  width: 100%;
}

body {
  height: 100%;
  position: fixed;
  /* prevent overscroll bounce*/
  background-color: lightgreen;
  overflow-y: scroll;
  -webkit-overflow-scrolling: touch;
  /* iOS velocity scrolling */
}

1
完美,刚在安卓手机5.0.1上测试了Chrome 57版本。关键的CSS属性是:html { overflow: hidden } 和 body { height:100%; position:fixed; /* 防止过度滚动弹跳*/ overflow-y:scroll; -webkit-overflow-scrolling: touch; /* iOS速度滚动 */ } - Eggs
3
我建议的一件事是将其包装在媒体查询中,如下所示:@media (max-width: 767px) { html { overflow: hidden; } body { height:100%; position:fixed; /* 防止过度滚动反弹*/ overflow-y:scroll; -webkit-overflow-scrolling: touch; /* iOS速度滚动 */ } } - Eggs
1
这真的是一个糟糕的解决方案。我知道它能够工作,但不应该被使用。例如,尝试向下滚动页面,然后刷新页面。您会回到页面顶部,而通常您应该停留在相同的位置。 - user5147563
1
为什么在 body 上使用 'width:50%'? - Alexis_A
1
有时它能正常工作,但有时却不能,高度计算错误。底部有一点空间,直到地址栏显示出来。然后我尝试使用window.innerHeight,在我的设备上显示了两个不同的高度。有时它包括地址栏高度,有时不包括。完全无法计算正确的高度,让人感到非常沮丧。 - John Albert
显示剩余5条评论

16

使用此样式代码放在您的网页上,现在您的Chrome URL地址栏将不会被隐藏,它将停止滚动。

<style type="text/css">
  html, body {margin: 0; height: 100%; overflow: hidden}
</style>

1
这对我有效,并且必须完全按照上面的方式进行编写(例如,如果您删除HTML标记,则无法正常工作;如果您删除溢出属性,则URL栏不会滚动,但令人讨厌的下拉刷新行为仍将保留...使用 overflow:hidden 不仅可以将URL栏锁定在原位,还可以防止下拉刷新行为)。 这种样式非常适用于填充屏幕高度的“全屏” UI(对于高度,您必须像上面一样使用100%,使用100vh不起作用)。 - Eric Mutta
这在iOS 15上对我不起作用,底部栏仍会在我滑动时缩小。 - Curtis

6
我唯一有效的解决方法是这样的:
将您正文内容放入以下样式的包装容器中:

.wrapper {
    position: absolute;
    top: 0.5px;
    left: 0;
    right: 0;
    bottom: 0.5px;
    overflow-x: hidden; /* or any other value */
    overflow-y: auto; /* or any other value */
}


半像素偏移将不可见,但它们会防止浏览器将文档主体视为可滚动的,从而防止地址栏隐藏。

这个半像素解决方案与固定位置结合使用对我很有效,以下是我的包装器: .main { position: fixed; top: 0.5px; right: 0; bottom: 0.5px; left: 0; } - Yuri Gor

3

如果有人仍然遇到隐藏地址栏的问题,这是我解决方法:

 html, body {
    height: 100%;
 }

 body {
    position: fixed;
    margin: 0;
    padding: 0;
    border: 0;
    outline: 0;
    background: 0 0;
        -webkit-overflow-scrolling: touch;
    overflow-x: auto;
    overflow-y: scroll;
 }

 .background {
    position: fixed;
    background-image: url('...');
    background-repeat: no-repeat;
    background-size: cover;
    background-attachment: fixed;
    height: 100%;
    width: 100%;
    margin: 0;
    overflow: hidden;
 }

我尝试了很多类似的代码,但是安卓Chrome浏览器一直让我烦恼。只有这个代码对我有效。当你的导航栏在页面底部时,自动隐藏的状态栏会成为一个主要问题。


2

在iOS 15中,这对我很有用。尽管我的Web应用禁用了缩放,但顶部栏和底部栏始终是全尺寸。

<meta name='viewport' content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0, target-densityDpi=device-dpi, minimal-ui' />

这个最好与ScrollTrigger一起使用(尽管它隐藏了地址栏)。 - nTheta

1

我的问题是,我想避免特定元素的滚动效果。对于这个元素,我只需设置:

.disable-scroll {  
     overflow-y: hidden;  
     touch-action: pan-x; 
}

它可以在Chrome和小米默认浏览器上运行,但无法在Firefox上运行。


0
以下方法适用于我:
HTML
<body>
    <div> This is the container for all content. </div>
</body>

CSS

html, body {
    margin: 0;
    padding: 0;
    height: 100%;
    overflow: hidden;
    ⋮
}

body > div {
    position: absolute;
    left: 0;
    top: 0;
    
    box-sizing: border-box;
    
    width: 100%;
    height: CALC(100% + 1px);
    
    overflow-x: hidden;
    overflow-y: auto;

    ⋮
}

0

使用自定义滚动条的另一种方法:

::-webkit-scrollbar {
    width: 10px;
}
::-webkit-scrollbar-thumb {
    background-color: #d6dee1;
    border-radius: 20px;
    border: 3px solid transparent;
    background-clip: content-box;
}
::-webkit-scrollbar-thumb:hover {
    background-color: #bdbdbd;
}

html,
body {
    height: 100%;
    margin: 0;
}
html {
    overflow: hidden;
}
body {
    overflow-y: auto;
}

0

-1

使用 window.innerHeight 来设置您的网站边界

您可以将 htmlbody 或您的 wrapper 设置为

var height = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);    

请注意,它需要在每次调整大小时更新!

window.innerHeight允许您获取浏览器视图内部实际高度(没有浏览器栏)。 即使在栏隐藏(向下滑动)时,也可以得到内容的高度。

在我的情况下:
1. 通过CSS将body设置为100vh
不幸的是,vh忽略了浏览器栏,这会导致在移动设备上使用现代浏览器时遇到一些问题,因为当/在滚动时隐藏栏。 看看at

这也是我解决以上问题的方法。

2. 使用指定的函数通过JS计算精确高度。每次调整大小时更新!
=> 现在,网站的内容已限制在视图的内部部分。

在移动设备上:
Android 7.1.1/ Chrome 61.0 iOS 9.3.5/ Safari

=> 现在浏览器栏不再在滚动滑动事件中隐藏。

请注意:
仅当您不使用某些时,它才有效,这些库会让您认为自己正在水平滚动,但实际上是使用body.height


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接