位置:修复在iPad和iPhone上不起作用


132

我一直在为iPad的固定位置而苦苦挣扎。我知道iScroll,它似乎并不总是有效(即使在他们的演示中)。我也知道Sencha有一个修复程序,但是我无法Ctrl+ F该修复程序的源代码。

我希望有人可以解决。问题在于,当用户在iOS驱动的移动Safari上上下移动时,固定位置的元素不会更新。


2
看起来jQuery Mobile 1.1解决了此问题:jquerymobile.com/blog/2012/04/13/announcing-jquery-mobile-1-1-0


几个SO问题的可能重复项。有关详细信息,请参见gist.github.com/avesus/…
Brian Haak

Answers:


66

许多移动浏览器故意不支持position:fixed;,因为固定元素可能会在小屏幕上挡住。

Quirksmode.org网站上有一篇很好的博客文章,解释了该问题:http : //www.quirksmode.org/blog/archives/2010/12/the_fifth_posit.html

另请参阅此页面以获取兼容性图表,该图表显示了哪些移动浏览器支持position:fixed;http : //www.quirksmode.org/m/css.html

(但请注意,移动浏览器的世界发展非常迅速,因此此类表可能不会长期保持最新状态!)

更新:据报道,iOS 5和Android 4均已定位:已修复支持。

我今天在苹果商店中亲自测试了iOS 5,可以确认它在固定位置下是否可以正常工作。但是,围绕固定元素进行放大和平移存在一些问题。

我发现此兼容性表比quirksmode更为最新,并且更有用:http : //caniuse.com/#search=fixed

它具有有关Android,Opera(迷你和移动)和iOS的最新信息。


position:device-fixed将是多余的。position:fixed应该符合W3C规范。
Talvi Watia 2012年

@TalviWatia- device-fixed解决方案不属于我的答案。它可能有建议也可能没有优点,但链接的原因是对该问题的解释,而不是他的建议解决方案。无论如何,自从发布此答案以来,事情已经发生了很多变化(正如我所说的那样),并且许多新设备都提供了支持fixed。不过,您仍然需要处理那些没有的旧设备。
Spudley 2012年

54
所以我很好奇,您对当前问题的解决方案到底是什么?您提供的链接虽然可能会有所帮助,但并不能解决当前的问题。不必烦恼,但人们倾向于赞成在SO上实际上不是答案的答案。
Talvi Watia 2012年

1
@TalviWatia:在我写答案时,还没有一个很好的解决方案。我提供的链接是我所知道的最好的讨论,它可以解释为什么事情是这样的,如果没有解决方案,那将是我所能提供的。在此期间情况发生了变化,因此链接中的讨论不再相关,并且现在有了解决方案,但是当时就是这样。
Spudley 2012年

实际上,position:fixed适用于比例尺1,但是当用户缩放ipad时,它将不能正常工作。位置:设备固定存在吗?Safari ios是否有效的CSS属性?
ccsakuweb

37

固定位置无法像在计算机上那样在iOS上运行。

想象一下,在放大镜(视口)下面有一张纸(网页),如果移动放大镜和眼睛,您会看到页面的另一部分。这就是iOS的工作方式。

现在有一块透明的塑料片,上面有一个单词,无论如何它都保持静止(位置:固定元素)。因此,当您移动放大镜时,固定的元素似乎会移动。

或者,不移动放大镜,而是移动纸张(网页),使塑料和放大镜保持静止。在这种情况下,塑料板上的单词看起来会保持固定,而其余内容似乎会移动(因为实际上是这样)。这是传统的桌面浏览器。

因此,在iOS中,视口会移动,而在传统浏览器中,网页会移动。在这两种情况下,固定要素都保持现实。尽管在iOS上固定元素似乎在移动。


要解决这个问题的方法,是遵循最后几段在这篇文章中

(基本上完全禁用滚动,将内容放在单独的可滚动div中(请参见链接文章顶部的蓝色框),并将固定元素绝对放置)


“ position:fixed”现在可以在iOS5中按预期工作。


位置会发生一些奇怪的事情:放大IOS时已修复。见stackoverflow.com/questions/52085998/...
彼得·霍林沃思

23

位置:固定可在android / iphone上进行垂直滚动。但是您需要确保您的元标记已完全设置。例如

<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0">

另外,如果您打算在android pre 4.0上使用相同的页面,则还需要设置顶部位置,否则由于某些原因会增加少量页边距。


这实际上为我工作。之前,position:fixed在隐藏的输入元素上(请参阅纯css屏幕外导航)导致浏览器在iphone ios 8.3上崩溃,但在平板电脑上不崩溃。之后工作正常。
史蒂芬·史密斯

在Square支架上水平放置的iPad iOS 10.3上不起作用。权威作者说,这种方法适用于“电话”。
SushiGuy

2
禁用用户缩放user-scalable=0, minimum-scale=1.0, maximum-scale=1.0功能会使许多用户无法访问该页面。在您的回答中添加有关此警告将很有用
neiya

22

现在苹果支持

overflow:hidden;
-webkit-overflow-scrolling:touch;

这正是我后,解决了我background-size: coverfixediPad上的问题
andyb

此功能适用于iOS 7中的Mobile Safari。注意:尚未升级到此版本的用户将无法使用。
尼尔·门罗

然后,必须有一些其他变量在起作用。我已经在iOS 6上进行了测试,但无法正常运行,然后在iOS 7上进行了测试。
尼尔·门罗

@NeilMonroe嗯。我确定我已经在没有问题的iOS 6上做到了,但是也许我使用了另一个变量。不记得
维吾尔族Özpınar

这确实很有帮助,但似乎overflow必须将其设置为scroll

19

我在Safari(iOS 10.3.3)上遇到了此问题-在触发touchend事件之前,浏览器没有重新绘制。固定元素未出现或被切除。

对我来说,诀窍是添加转换:translate3d(0,0,0); 到我的固定位置元素。

.fixed-position-on-mobile {
  position: fixed;
  transform: translate3d(0,0,0);
}

编辑 -我现在知道为什么转换可以解决问题:硬件加速。添加3D变换会触发GPU加速,以实现平稳过渡。有关硬件加速的更多信息,请参见本文:http : //blog.teamtreehouse.com/increase-your-sites-performance-with-hardware-accelerated-css


这实际上解决了我的滚动问题,当使用时,它在iOS设备上反弹fixed,并添加了transform,此问题已解决。
vonUbisch

17

固定页脚(此处为jQuery):

if (navigator.platform == 'iPad' || navigator.platform == 'iPhone' || navigator.platform == 'iPod' || navigator.platform == 'Linux armv6l') 
{
    window.ontouchstart = function () 
    {
        $("#fixedDiv").css("display", "none");
    }

    window.onscroll = function() 
    { 
        var iPadPosition = window.innerHeight + window.pageYOffset-45; // 45 is the height of the Footer
         $("#fixedDiv").css("position", "absolute");
         $("#fixedDiv").css("top", iPadPosition);
         $("#fixedDiv").css("display", "block");
    }
}

// in the CSS file should stand:
#fixedDiv {position: fixed; bottom: 0; height: 45px;  whatever else}

希望能帮助到你。


7

避免在同一框上使用transform:---和position:fixed。如果有任何变换,元素将保持在position:static。


6

我最终使用了新的jQuery Mobile v1.1:http : //jquerymobile.com/blog/2012/04/13/announcing-jquery-mobile-1-1-0/

现在,我们进行了可靠的重写,可以在许多流行的平台上提供真正的固定工具栏,并且可以安全地退回到其他浏览器中的静态工具栏位置。

这种方法最酷的部分是,与基于JS的解决方案在所有平台上施加不自然的滚动物理效果不同,我们的滚动感觉是100%本机的,因为它。这意味着滚动无处不在,并可与触摸,鼠标滚轮和键盘用户输入一起使用。另外,我们基于CSS的解决方案非常轻巧,不会影响兼容性或可访问性。


这种方法也非常优雅(但绝对是一种解决方法),该方法允许在iOS上使用固定对象而不使用jQuery或JavaScript(仅使用CSS)。这是普遍适用的。如果您希望“浮动” position:fixed元素出现在滚动页面的前面,则只需要为其赋予较高的z-index值即可。
2014年

这绝对不能回答问题。
Gustavo Siqueira 2014年

1

使用jQuery我能够提出这个。它不能平滑滚动,但是可以解决问题。您可以向下滚动,固定div会在顶部弹出。

CSS

<style type="text/css">
    .btn_cardDetailsPg {height:5px !important;margin-top:-20px;}
    html, body {overflow-x:hidden;overflow-y:auto;}
    #lockDiv {
  background-color: #fff;
  color: #000;
  float:left;
  -moz-box-shadow: 0px 4px 2px 2px #ccc;-webkit-box-shadow: 0px 4px 2px 2px #ccc;box-shadow:0px 4px 2px 2px #ccc;
  }
#lockDiv.stick {
  position: fixed;
  top: 0;
  z-index: 10000;
  margin-left:0px;
  }
</style>

HTML

<div id="lockSticky"></div>
<div id="lockDiv">fooo</div>

的问题

<script type="text/javascript">
    function sticky_relocate() {
        var window_top = $(window).scrollTop();
        var div_top = $('#lockSticky').offset().top;
        if (window_top > div_top)
            $('#lockDiv').addClass('stick')
        else
            $('#lockDiv').removeClass('stick');
    }
    $(function() {
        $(window).scroll(sticky_relocate);
        sticky_relocate();
    });
</script>

最后,我们要确定ipod在横向或纵向模式下是否可以触摸显示

<script type="text/javascript">
    if (navigator.userAgent.match(/like Mac OS X/i)) {
        window.onscroll = function() {

        if (window.innerWidth > window.innerHeight) {
            //alert("landscape [ ]");
            document.getElementById('lockDiv').style.top =
            (window.pageYOffset + window.innerHeight - 268) + 'px';
        }

        if (window.innerHeight > window.innerWidth) {
            //alert("portrait ||");
            document.getElementById('lockDiv').style.top =
            (window.pageYOffset + window.innerHeight - 418) + 'px';
        }
        };
    }
</script>

1

尽管CSS属性{position:fixed;}似乎(主要)在较新的iOS设备上起作用,但有时可能会导致设备怪异并回退,{position:relative;}而没有任何原因或原因。通常,清除缓存将有所帮助,直到发生某些情况并且再次出现怪癖。

具体来说,从Apple本身为iPad准备您的Web内容

iPad上的Safari和iPhone上的Safari没有可调整大小的窗口。在iPhone和iPad上的Safari中,窗口大小设置为屏幕大小(减去Safari用户界面控件),并且用户无法更改。要在网页上四处移动,用户在双击或捏合以放大或缩小时,或者通过触摸并拖动以平移页面时,可以更改视口的缩放级别和位置。当用户更改视口的缩放级别和位置时,他们正在固定大小的可见内容区域(即窗口)内进行操作。这意味着将其位置“固定”到视口的网页元素可以最终显示在屏幕外的可见内容区域之外。

具有讽刺意味的是,Android设备似乎没有此问题。同样,完全有可能{position:absolute;}在参考body标签时使用并且没有任何问题。

我发现了这个怪癖的根本原因。与HTML或BODY标记一起使用时,滚动事件不能很好地发挥作用。有时它不喜欢触发该事件,或者您必须等到滚动摆动事件结束才能接收该事件。具体来说,在此事件结束时将重新绘制视口,并且可以将固定元素重新放置在视口中的其他位置。

所以这就是我要做的:(避免使用视口,并坚持使用DOM!

<html>
  <style>
    .fixed{
      position:fixed;
      /*you can set your other static attributes here too*/
      /*like height and width, margin, etc.*/
      }
    .scrollableDiv{
      position:relative;
      overflow-y:scroll;
      /*all children will scroll within this like the body normally would.*/
      } 
    .viewportSizedBody{
      position:relative;
      overflow:hidden;
      /*this will prevent the body page itself from scrolling.*/
      } 
  </style>
  <body class="viewportSizedBody">
    <div id="myFixedContainer" class="fixed">
       This part is fixed.
    </div>
    <div id="myScrollableBody" class="scrollableDiv">
       This part is scrollable.
    </div>
  </body>
  <script type="text/javascript" src="{your path to jquery}/jquery-1.7.2.min.js"></script>
  <script>
    var theViewportHeight=$(window).height();
    $('.viewportSizedBody').css('height',theViewportHeight);
    $('#myScrollableBody').css('height',theViewportHeight);
  </script>
</html>

本质上,这将导致BODY成为视口的大小并且不可滚动。嵌套在内部的可滚动DIV会像通常的BODY一样滚动(减去摆动效果,因此滚动不会在触摸端停止。)固定的DIV保持固定而不会产生干扰。

附带说明一下,z-index固定DIV 的高值对于保持可滚动DIV似乎在它后面很重要。我通常会添加窗口大小调整和滚动事件,以实现跨浏览器和备用屏幕分辨率的兼容性。

如果所有其他方法均失败,则上面的代码也将在固定DIV和滚动DIV设置为的情况下工作{position:absolute;}


1

解决此问题的简单方法就是为您的元素键入transform属性。它将被修复。快乐编码:-)

.classname{
  position: fixed;
  transform: translate3d(0,0,0);
}

您也可以尝试他的方式,这也很好。

.classname{
      position: -webkit-sticky;
    }

0

这可能并不适用于所有情况,但是我发现position: sticky(与相同position: fixed)仅在滚动容器不是主体而是在其他容器中时才可在旧版iPhone上使用。

伪html示例:

body                         <- scrollbar
   relative div
       sticky div

粘性div将在桌面浏览器上保持粘性,但在某些设备上经过以下测试:Chromium:开发工具:设备兼容:iPhone 6/7/8,而对于Android 4 Firefox,则不会。

但是,有效的是

body
    div overflow=auto       <- scrollbar
        relative div
            sticky div

0

就我而言,这是因为固定元素是通过动画显示的。如该链接所述

在Safari 9.1中,在动画元素中放置position:fixed-element可能会导致position:fixed-element不出现。


-2

这是我的解决方案...

的CSS

#bgimg_top {
    background: url(images/bg.jpg) no-repeat 50% 0%; 
    position: fixed; 
    top:0; 
    left: 0; 
    right:0 ; 
    bottom:0;
}

的HTML

<body>
<div id="bgimg_top"></div>
....
</body>

解释是为div固定的位置将使div始终保持在背景中,然后我们使用(left,right,top,bottom ) 同时。

请确保您不使用宽度和高度,因为这会覆盖顶部,左侧,右侧,底部选项。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.