在三星安卓浏览器上启用真正的固定定位

Posted

技术标签:

【中文标题】在三星安卓浏览器上启用真正的固定定位【英文标题】:Enable real fixed positioning on Samsung Android browsers 【发布时间】:2012-07-06 18:34:14 【问题描述】:

android 浏览器从 2.2 开始支持固定定位,至少在某些情况下,例如关闭缩放时。我有一个没有 JS 的简单 html 文件,但我试过的三部三星手机上的固定定位是完全错误的。标题不是真正的固定定位,而是滚动出视图,然后在滚动完成后弹回原位。

对于我测试过的任何配置(2.2、2.3、2.3 x86、4.0.4),在 Android SDK 模拟器上都不会发生这种情况。在三星手机上的应用程序中使用 WebView 时也不会发生这种情况:在这些情况下,定位会按预期工作。

有没有办法让三星安卓“股票”浏览器使用真正的固定定位?

我已经测试过: 1. 三星 Galaxy 551,安卓 2.2 2. 三星 Galaxy S,安卓 2.3 3. 三星 Galaxy S II,Android 2.3

示例代码:

<html>
  <head>
    <meta name="viewport" content="initial-scale=1.0,maximum-scale=1.0,user-scalable=no,width=device-width,height=device-height"> 
    <style>
    h1  position: fixed; top: 0; left: 0; height: 32px; background-color: #CDCDCD; color: black; font-size: 32px; line-height: 32px; padding: 2px; width: 100%; margin: 0;
    p  margin-top: 36px; 
    </style>
  </head>
  <body>
    <h1>Header</h1>
    <p>Long text goes here</p>
  </body>
</html>

预期的行为是灰色标题填充屏幕顶部并保持不变,无论您滚动多少。在三星 Android 浏览器上,它似乎会滚动到视野之外,然后在滚动完成后弹回原位,就好像使用 javascript 模拟了固定定位一样,但事实并非如此。

编辑 从 cmets 和“答案”来看,似乎我不清楚我需要什么。我正在寻找一个元标记或 css 规则/hack 或 javascript 切换来关闭三星损坏的固定定位并打开 Android 浏览器的工作固定定位。我不是在寻找一种 Javascript 解决方案,它将损坏的固定定位添加到没有任何支持的浏览器中;三星固定定位已经做到了,只是看起来很愚蠢。

【问题讨论】:

你有关于“Android 浏览器,从 2.2 开始,支持固定定位”的参考吗? @Deefour SDK 中的 Android 模拟器证实了这一点,正如我在帖子中提到的那样。 caniuse 说 referenced article 说“一旦滚动完成,Android 2.2 会笨拙地将固定元素重新定位。”。只是寻找可以确认您在 SDK 中看到的内容是预期行为的东西,因为至少在 Galaxy 551(带有 2.2 的版本)中,您似乎遇到了上面引用的文章所描述的确切行为。 @Deefour 我已经在摩托罗拉 Atrix 4G 等其他 Android 2.2 设备上进行了测试,它可以正常工作。同样的三星手机上的Android提供的WebView组件也可以正常工作;大概它并没有像浏览器那样被修改。 我在使用 WebView 开发应用程序时遇到了同样的问题。对我来说,它无法在两台 HTC 设备和一台摩托罗拉上运行。所以我相信它可能不是三星特有的。您是否尝试过诸如 iScroll 之类的 Javascript 解决方案?可能已经看过这个,但另一个答案推荐modifying the viewport。 【参考方案1】:

也许您可以考虑另一种不需要固定定位的方法...

将滚动添加到段落元素而不是(默认)正文元素。然后,您可以将段落元素放置在标题下方。这将确保标题始终显示在页面顶部,同时允许您滚动浏览段落中的文本。

h1 
   height: 20px;


p 
  position: absolute;
  top: 20px;
  left: 0px;
  right: 0px;
  bottom: 0px;
  overflow-y: auto;

【讨论】:

这可能行得通。但是,我听说滚动文档的一部分而不是整个文档时滚动性能要慢得多。无论如何,我使用的是 jQuery Mobile,所以我在文档结构上没有太大的灵活性。【参考方案2】:

我认为 android 2.2 浏览器实现 javascript 的最佳方式。

您可以通过此链接找到更多信息。它是关于在所有移动浏览器中的固定定位。

http://bradfrostweb.com/blog/mobile/fixed-position/

【讨论】:

【参考方案3】:

在对 Brad Frost 的文章的评论中,Matthew Holloway 提出了一个与 Anita Foley 的回答类似的解决方案,但在不支持的地方使用了用于溢出的 polyfill:auto。在这里查看:

http://bradfrostweb.com/blog/mobile/fixed-position/

【讨论】:

【参考方案4】:

不是三星的安卓浏览器坏了,是安卓2.2支持坏了。 总的来说,您可能知道 position:fixed 在许多移动设备/系统中曾经并且在某些情况下仍然很糟糕。

要回答您的问题,没有“切换或元标记”会“打开 Android 浏览器的工作固定定位”。如果浏览器不支持某些东西,那么就没有“切换”来“切换”它。这不是一个功能。

否则,您可以使用模拟它的http://cubiq.org/iscroll-4。

(编辑:一些事实)

    根据http://caniuse.com/#search=position:fixedAndroid 2.2 和Android 2.3 有部分而不是完全支持位置:固定。 (部分支持似乎是错误的支持) Android 模拟器不会也永远不会与 Android 原生浏览器完全相同,例如,IETester 与 IE 原生浏览器不同(存在差异) 摩托罗拉 ATRIX 4G 没有 Android 2.2 但 Android 2.3 (http://www.motorola.com/us/consumers/MOTOROLA-ATRIX%E2%84%A2-4G/72112,en_US,pd.html?selectedTab=tab-2&cgid=mobile-phones#tab)

您建议 SAMSUNG 引入专有的 hack 或 mod,以破坏 Android 浏览器中固定位置的其他工作支持。无论上述 3 点如何,这似乎都不太可能。

答案实际上很简单:有部分(错误)支持,您唯一的解决方案是使用替换或“修复”漏洞的 javascript 库。

【讨论】:

错了。我让它在模拟器和摩托罗拉 Atrix 4G 上的 Stock Android 2.2 中工作。并在 Nexus S 和 Android 模拟器上使用 Android 2.3。它只在有三星修改的手机上失败。 我编辑了我的帖子以添加一些事实,只是为了让一些事情直截了当。 你可以否认Atrix 4G有2.3,但我拿在手上,明明是2.2。此外,Android 模拟器正在运行 Stock android 浏览器。它不是某种模拟器:它模拟包括处理器在内的整台机器。它是真正的硬件。 caniuse.com 是一个很好的文档来源,但实际的 Android 代码才是真正的文档。谷歌以工作形式发布它,但在每部三星手机(即运行 TouchWiz 的手机)上它都坏了。我不知道你为什么对我的实验结果争论不休。 顺便说一句,您不会相信三星通过自定义引入到 Android 2.2/2.3 中的错误数量。有很多缺陷和可用性问题,例如三星添加的键盘;当您切换到普通的 Android 键盘时,这些缺陷就会消失。在 Stock android 上不存在的三星修改浏览器中的缺陷。我有几个实际的设备,可以比较它们,很明显三星设备上存在一些普通 Android 上不存在的错误。我在 2.3 上都有 Galaxy S 和 Nexus S:硬件几乎相同,但三星的却充满了错误。 如果您确定问题的根源,我不明白您的问题的重点。你在期待什么?我猜没有什么能解决三星问题的魔法。

以上是关于在三星安卓浏览器上启用真正的固定定位的主要内容,如果未能解决你的问题,请参考以下文章

如何在安卓手机上使用Chrome插件

三星s7怎么退回安卓6.0

在电脑上运行安卓模拟器,如何实现网页内GPS定位?

安卓手机怎么设置定位?

安卓网络浏览器和虚拟键盘

如何使用电脑上的谷歌浏览器来调试安卓手机上的移动端页面