Phonegap 2.8中,固定位置(position: fixed)无法正常工作

4

经过16个小时的努力和祭拜各种神灵,我不得不遗憾地说,我快要崩溃了。

我正在为Android编写一个PhoneGap 2.8应用程序(未来将移植到iOS)。我使用的主要框架是jQuery(带有许多插件),Require,Underscore和Backbone。

在一个致命的早晨,我收到了一个任务,即我的应用程序的标题菜单必须“模仿”Facebook应用程序的标题菜单(跟随滚动)。

最初,我认为将“position:fixed”属性添加到标题div中足够简单-我从来没有更错了。事实证明,WebView中的position:fixed css属性无法正常工作,并且这个问题已经存在多年了。 这个问题已经在各种论坛和文章中进行了详细讨论,并提出了各种“解决方案”-但在我的情况下都不起作用。

我尝试在滚动时将标题的位置设置为固定,并在滚动完成后将其设置为绝对。理论上它可以工作,但是它很卡顿。 尝试过之后,我研究了一些可以帮助解决问题的插件或框架。 iScroll-强制指定html结构和严重缺乏文档使我放弃了它。 jQueryMobile-由于它是一个完整的框架,将其集成到我的项目中意味着改变很多东西。据我所知,它不会提供持久的标题菜单。

我听说过Bartender和GloveBox,但它们都没有文档,并且它们没有在不断发展(最后提交时间>一年)。

使用jsHybugger,当标题处于position:fixed时,我检查了它,我注意到覆盖div的蓝色框在检查器中被选中,停留在头部的点击区域。因此,如果我滚动,标题将随视口移动,但命中区域保持不变。这让我想知道,是否有一种方法可以强制WebView重新计算点击区域?

非常感谢任何帮助。


也许这个答案可以帮到你:http://stackoverflow.com/questions/14267527/uiwebview-and-css-fixed-position - mwfire
3个回答

4
所以,受到这个链接的启发,我制作了一个快速的fiddle,展示了如何在不使用position:fixed的情况下实现此功能。请注意,该fiddle与此处的代码不同,它只是说明了这应该如何工作。 HTML
<div class="page-wrapper">
    <div class="header"><h3>header</h3></div>
    <div class="content-wrapper">
        <div class="content">
          <!-- Your content goes here -->
        </div>
    </div>
</div>


CSS

body {
    height: 100%;
    padding: 0;
    margin: 0;
}

.page-wrapper {
    margin: 0;
    padding: 0;
    width: 100%;
    height: 100%;
    position: relative;
    overflow: hidden;
}

.header {
    position: absolute;
    top:0;
    left:0;
    right:0;
    padding: 3px 0;
    color: #FFF;
    background: #000;
    text-align: center;
}
.content-wrapper {
    position: absolute;
    padding:0;
    top: 65px;
    left: 0;
    right: 0;
    bottom:0;
    background: #CCC;
    overflow-y: scroll;
    -webkit-overflow-scrolling: touch;
}

.content {
    padding: 15px;
}

我已经尝试过了,但是我的安卓手机(Galaxy S2)上没有滚动条。overflow-y: scroll; 似乎有问题 :( - Erich Jagomägis
让我来解释一下,滚动条是存在的,但它会滚动整个页面而不仅仅是我的内容 div,因此我的页眉也会随之滚动消失。 - Erich Jagomägis
嗯,经过一些修改,它可以在Android模拟器Webview中工作。请查看http://www.mwfire.de/test/index.html和源代码。那个有效吗?无法放置一个fiddle,因为它在框架中不起作用... - mwfire
我得到了一个可行的解决方案 :D。我将我的内容包装在一个div(contentWrapper)中,并告诉内容包装器他的overflow:hidden。然后我将宽度设置给内容,它就像魔术般地工作了。嗯...几乎像魔术一样...我有一些内容显示了谷歌地图,在这些页面中滚动看起来有点偏差,仍在调查中。但非常感谢你提供的很好的想法 :P - Erich Jagomägis
太好了!这也是我在演示中所做的,因此我将更新答案,以便其他人也可以使用它。 - mwfire
仍然存在一个奇怪的问题。在某些页面上,我渲染了谷歌地图。在同一页面上,我渲染了一块包含在地图上表示的一些数据的文章块。当我滚动该页面时,我注意到一些元素与其他元素不同步滚动(发生了奇怪的抖动效果)...有人遇到过这样的问题吗? - Erich Jagomägis

1

这并不是PhoneGap的问题。实际上,Android版本低于4.0时,position: fixed无法正常工作。有一个快速的CSS解决方法:

<div class="header"> this is fixed positioned div<div>

Css:

.header{ position:fixed ; -webkit-backface-visibility: hidden;  top:0; left:0; width: 100px; height:30px; background: red; }

0

我在继承一个使用定位系统的项目后遇到了这个问题。现在大多数人可能都知道不要走这条路,但以防万一有人最终会在这里寻找解决方案...

使用flexbox布局可以实现上述目标。

这样,CSS代码如下:

.pageWrapper {
    margin: 0;
    padding: 0;
    width: 100%;
    height: 100%;
    overflow: hidden;
    padding-top: env(safe-area-inset-top);
    padding-bottom: env(safe-area-inset-bottom);
    display: flex;
    flex-direction: column;
}

.screen-content-wrapper {
    padding:0;
    flex: 1;
   overflow-y: scroll;
   -webkit-overflow-scrolling: touch;
}

我没有编辑我的内容CSS,所以只使用了上面的内容来实现我想要的效果。

希望有人会觉得这个有用。


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