【问题标题】:How to stop mobile safari from setting fixed positions to absolute on input focus?如何阻止移动 Safari 将固定位置设置为绝对输入焦点?
【发布时间】:2016-08-17 02:22:25
【问题描述】:

免责声明 - 我知道在 safari 中存在关于固定元素的问题,并且不支持固定元素,但现在支持等等。但是我找不到解决这个确切问题的问题。

鉴于最简单的固定侧边栏,例如:

.sidebar {
    position: fixed;
    top: 10px;
    right: 10px;
}

而且页面比较长,有输入元素。

当一个输入元素被聚焦时,任何固定元素都变得绝对 - 我理解为什么,safari 试图整理视口 - 这很好,但并不总是合适的。我要求我为用户选择最佳体验(我自然最了解)。

所以问题..

即使输入元素被聚焦,有没有办法让固定元素保持固定?

我尝试在滚动上手动做一些$(window).on('scroll', 魔术和定位元素,但它在 ipad 上非常紧张。

【问题讨论】:

  • 如果您想提供您的特定场景的 MCV 示例,我们可以尝试。这是一个已知问题,到目前为止,几乎最好的解决方案是自行将该元素切换到绝对位置,并使用 JavaScript 将其设置为 Safari 不会破坏它的位置:它也可能适用于如果我们在页面顶部的一个字段中隐藏溢出,但我发现第二种方式太hacky了。
  • 今晚我将尝试整理一个小场景。我同意已知问题位 - 我担心最终可能很简单,需要时手动干预和绝对定位
  • 几个 SO 问题可能重复。详情请见gist.github.com/avesus/…

标签: css safari mobile-safari


【解决方案1】:

Safari has supported position: fixed 至少从 9.2 版本开始,但是如果您遇到困难的问题,您可以通过将文档元素和正文全屏然后使用绝对定位来完全创建固定位置效果。然后滚动发生在一些主要的容器元素而不是正文中。使用此方法,您的“固定”元素可以存在于标记中的任何位置。

jsfiddle here

html,
body,
.mainContainer {
  height: 100%;
  width: 100%;
  overflow: hidden;
  margin: 0;
}

.mainContainer {
  overflow: auto;
}

.fixed {
  position: absolute;
  bottom: 20px;
  left: 20px;
}

【讨论】:

  • 问题指定“输入焦点”,但您的示例没有提供可以激活虚拟键盘的文本输入控件。在用户点击文本输入控件之前,一切都会看起来很完美。
【解决方案2】:

为了达到您想要的效果,您需要更改布局方法。除了使用 position:fixed 定位侧边栏,您需要在 position:relative 容器中使用 position:absolute ,该容器设置为该 position:relative 容器中视口的高度,您需要另一个使用 overflow-y:scroll 的 div 和 - webkit-overflow-scrolling : 触摸

警告:如果可能,我通常会避免在平板电脑和移动设备上使用固定位置,尽管有浏览器支持,但根据我的经验,它会很笨拙,而且 JavaScript 解决方案还有很多不足之处,我的第一反应是向设计师挑战这种模式。如果在有输入元素时给我的设计包含位置固定元素,我更有可能寻求设计解决方案而不是开发解决方案,因为您描述的重点问题难以规避并保持高质量的用户体验.

标记

<div class="outer">
   <div class="sidebar">
    <ul>
       <li>Dummy list nav or something</li>

     </ul>
  </div>
  <div class="container">
       <input type="text" />
  <!-- I added 10000 inputs here as a demo -->
 </div>
</div>

CSS

html,body{
-webkit-overflow-scrolling : touch !important;
overflow: auto !important;
height: 100% !important;
}
.outer {
  position: relative;
  overflow: hidden;

/* I'm using Viewport Units here for ease, but I would more likely check the height of the viewport with javascript as it has better support*/
  height: 100vh;
}
.sidebar {
    position: absolute;
    top: 10px;
    right: 10px;
  /*added bg colour for demo */

  background: blue;
}
.container {
  height: 100vh;
  overflow-y: scroll;
  -webkit-overflow-scrolling: touch
}
input {
  display: block;
}

这是一个 CodePen 供您在模拟器中打开(演示视图): https://codepen.io/NeilWkz/full/WxqqXj/

这是代码的编辑器视图: https://codepen.io/NeilWkz/pen/WxqqXj

【讨论】:

  • 嗨,Brian,感谢您的评论,核心机制似乎在 Mobile Safari 中仍然有效(我刚刚更改了笔链接以显示到编辑器视图。您遇到的问题是演示?
  • 视口高度通常需要在虚拟键盘出现、旋转、地址栏出现/消失后进行更新。只有在激活焦点之前处理调整大小和焦点事件以及将输入控件位置移动到屏幕底部,才能使 iOS 上的 WebKit 的行为方式与 Google Chrome 在 Android 上的行为方式相同。可怕的 Safari。
  • 我不确定我是否遵循你的观点,Brian,外部高度是用视口单位设置的,不需要更新。在我的演示中,我没有看到您描述的移动 safari 问题。
  • 您的“DUMMY LIST NAV OR SOMETHING”始终位于随机垂直偏移处,具体取决于所点击的输入控件,因此导航不会像固定位置那样运行。在 Android 的 Chrome 上,甚至不会发生这种丑陋的事情——蓝色的东西总是保持相同的垂直偏移。问题被表述为“有没有办法让固定元素保持固定”。而且您的示例并没有保持不变。
  • 请查看gist.github.com/avesus/957889b4941239490c6c441adbe32398了解如何解决问题的详细信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多