如何强制显示移动 Safari 底部导航栏以编程方式显示?

Posted

技术标签:

【中文标题】如何强制显示移动 Safari 底部导航栏以编程方式显示?【英文标题】:How might one force-show the mobile Safari bottom nav bar to show programmatically? 【发布时间】:2016-02-12 04:36:26 【问题描述】:

我的网页底部有一个用于 CTA(号召性用语)的固定按钮。在较新版本的 ios 上向下滚动页面,移动 Safari 会隐藏底部导航栏(带有后退、前进、共享、书签和新标签按钮)。如果您单击 CTA 按钮,而不是执行该操作,移动版 Safari 会显示底部导航栏。

作为一种解决方案,我一直希望强制显示底部导航栏。有没有办法做到这一点? Jack Threads 在移动设备上查看时,Thread Flip 的移动站点在查看单个项目时都能够做到这一点。

到目前为止,我无法对此进行逆向工程。有谁知道力秀是怎么完成的吗?

相关: Buttons aligned to bottom of page conflict with mobile Safari's menu bar 和 Prevent Mobile Safari from presenting toolbar when bottom of viewport is tapped

【问题讨论】:

【参考方案1】:

这个问题有更好的解决方案(我认为)。我在页面加载时检查 Windows 的 innerHeight。滚动时,如果高度至少增加 50 像素,我可以将按钮升高 25 像素。 25px 似乎是最佳选择,您需要触摸按钮的最底部以显示工具栏。这是一个现场演示和代码:https://visztpeter.me/demos/ios.html

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Fix tap for button at the bottom in iOS Safari when the toolbar is gone</title>
    <style type="text/css">
      div 
        margin:20px;
        height:2000px;
        background:gray
      

      button 
        position:fixed;
        bottom:0;
        left:0;
        right:0;
        height:48px;
        background:blue;
        border:none;
        transition: all ease 0.2s;
      
      
      .ios-toolbar-gone button 
        transform: translateY(-25px);
      
    </style>
  </head>
  <body>
    <div></div>
    <button></button>
    <script>
      var baseWindowHeight = Math.max(window.innerHeight);
      var classAdded = false;
      var documentBody = document.body;
      document.addEventListener('scroll', function(e)
        var newWindowHeight = Math.max(window.innerHeight);
        if(newWindowHeight-50 > baseWindowHeight) 
          if (! documentBody.classList.contains("ios-toolbar-gone")) 
            documentBody.classList.add("ios-toolbar-gone");
          
         else 
          if (documentBody.classList.contains("ios-toolbar-gone")) 
            documentBody.classList.remove("ios-toolbar-gone");
          
        
      );
    </script>
  </body>
</html>

【讨论】:

var documentBody = document.body; 行未使用 :-) 我看到这个解决方案的主要问题是事件监听器的必要性,这是我在纯 CSS 解决方案中避免的。这个解决方案确实有效(并且是我研究过的),但我的目标是获得最高效的解决方案。【参考方案2】:

我的回答是,不要尝试。

虽然 Jon Catmull 的回答在技术上确实会强制浏览器保留底部工具栏。在试验中,我在设置之后经历了巨大的性能下降。

这方面的一个例子是https://www.contiki.com/uk/en,工具栏永久显示,但 Chrome 和 Safari 之间的性能损失很明显。

在调查了其他网站之后,似乎全世界都刚刚接受了这种双击是必要的邪恶。

https://www.bbc.co.uk/news,浏览器底部出现突发新闻,如果ui最小化,第一次点击返回底部工具栏,第二次点击进入文章。

amazon、ebay 等工具栏根据浏览器默认设置最小化。对底部约 30 像素中的链接的任何点击都会启用工具栏。

虽然这里的其他答案中有技术解决方案,但我不认为双击与性能损失相比

【讨论】:

看起来 contiki 现在也放弃了这种方法,这很遗憾,因为它是一个非常有用的例子【参考方案3】:

我相信高度:100% 是要走的路。看起来这似乎让 Safari 认为它还不如显示栏,因为没有内容试图在它后面,然后你在 100% 高度元素中添加滚动。

我的问题有所不同,因为我的按钮处于固定位置模式,我不希望 Safari 底部导航一直显示,但是当我的移动过滤器导航打开时,它需要显示。

基本上应用下面的代码(例如在菜单打开类上)。然后将菜单定位为 position: fixed 和 height: 100%

html.menu-open 
    height: 100%;

    body 
        position: fixed;
        width: 100%;
        top: 0px;
        overflow: hidden;
    


.menu 
    position: fixed;
    height: 100%;
    width: 100%;
    overflow: auto;

此处的工作示例:

https://www.electronicsadvisor.com/products/51/washing-machines-tumble-dryers

    打开链接 向下滚动以隐藏 safari 底部导航 点击屏幕顶部附近的过滤器按钮

过滤器菜单将打开并强制打开 safari 导航。

示例截图:

在点击过滤器按钮之前:

然后当用js打开导航时,我应用上面的样式并强制打开导航

【讨论】:

这是我尝试过的唯一有效的解决方案。可能是因为不再使用-webkit-overflow-scrolling(作为大多数其他解决方案的一部分提出)。【参考方案4】:

我正在粘贴https://benfrain.com/the-ios-safari-menu-bar-is-hostile-to-web-apps-discuss/#comment-119538 中提到的解决方案,该解决方案涉及如何为https://app.ft.com 完成此操作:

诀窍是将 height: 100% 添加到 html、body 和任何地方 使用 100vh 的 CSS。不需要 js 浏览器检测,因为它 在 iOS Chrome、Safari 全屏或 android 上不会导致异常 浏览器。

【讨论】:

这就足够了:body position: fixed; overflow: hidden; 【参考方案5】:

我想我可能已经找到了答案。将您的内容设置为具有以下样式:

height: 100%(允许内容填充视口并超出 底部) overflow-y: scroll(允许您在视口下方滚动; 默认值可见) -webkit-overflow-scrolling: touch(平滑任何滚动行为)

似乎强制 Safari 中的 iOS 菜单始终出现。那样的话,按钮点击实际上会起作用,而不是打开 Safari 菜单。

不幸的是,您必须将此 CSS 与 javascript 浏览器检测配对,因为它会扰乱 iOS Chrome(也包括 webkit)上的滚动。仅使用 CSS 无法针对所有版本的 iOS Safari。

【讨论】:

非常有前途!不幸的是,这似乎使scrollTop 总是报告 0,而window.scrollTo(0,0) 不再起作用。任何解决方法? (我在 iOS 11.2 上注意到了这一点。) 很遗憾,我很久没有看这个问题了,但我肯定记得那个问题。你想使用哪个元素的 scrollTop?【参考方案6】:

我也有同样的问题。我们正在努力在我们的网站上实现底部导航,而 safari 给我们带来了问题,因为点击屏幕底部会打开 Safari 的底部导航,迫使用户点击两次。我们提出的最佳解决方案是在导航下方添加一个 44 像素的空间,这看起来非常糟糕。如果我可以强制 safari 的导航保持打开状态,这样它就可以填充那个空间,而不是一个基本上无用的空块。

【讨论】:

以上是关于如何强制显示移动 Safari 底部导航栏以编程方式显示?的主要内容,如果未能解决你的问题,请参考以下文章

当点击视口底部时,防止 Mobile Safari 显示工具栏

移动端底部导航栏固定——兼容IOS

Material UI:底部导航与 iOS 上的 Progressive Web App (PWA) Safari 对齐

如何显示所有页面导航栏按钮

到达页面底部时,粘性导航栏闪烁

从一个片段移动到另一个片段时如何自动选择底部导航?