我一直在为iPad的固定位置而苦苦挣扎。我知道iScroll,它似乎并不总是有效(即使在他们的演示中)。我也知道Sencha有一个修复程序,但是我无法Ctrl+ F该修复程序的源代码。
我希望有人可以解决。问题在于,当用户在iOS驱动的移动Safari上上下移动时,固定位置的元素不会更新。
我一直在为iPad的固定位置而苦苦挣扎。我知道iScroll,它似乎并不总是有效(即使在他们的演示中)。我也知道Sencha有一个修复程序,但是我无法Ctrl+ F该修复程序的源代码。
我希望有人可以解决。问题在于,当用户在iOS驱动的移动Safari上上下移动时,固定位置的元素不会更新。
Answers:
许多移动浏览器故意不支持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规范。
device-fixed
解决方案不属于我的答案。它可能有建议也可能没有优点,但链接的原因是对该问题的解释,而不是他的建议解决方案。无论如何,自从发布此答案以来,事情已经发生了很多变化(正如我所说的那样),并且许多新设备都提供了支持fixed
。不过,您仍然需要处理那些没有的旧设备。
固定位置无法像在计算机上那样在iOS上运行。
想象一下,在放大镜(视口)下面有一张纸(网页),如果移动放大镜和眼睛,您会看到页面的另一部分。这就是iOS的工作方式。
现在有一块透明的塑料片,上面有一个单词,无论如何它都保持静止(位置:固定元素)。因此,当您移动放大镜时,固定的元素似乎会移动。
或者,不移动放大镜,而是移动纸张(网页),使塑料和放大镜保持静止。在这种情况下,塑料板上的单词看起来会保持固定,而其余内容似乎会移动(因为实际上是这样)。这是传统的桌面浏览器。
因此,在iOS中,视口会移动,而在传统浏览器中,网页会移动。在这两种情况下,固定要素都保持现实。尽管在iOS上固定元素似乎在移动。
要解决这个问题的方法,是遵循最后几段在这篇文章中
(基本上完全禁用滚动,将内容放在单独的可滚动div中(请参见链接文章顶部的蓝色框),并将固定元素绝对放置)
“ position:fixed”现在可以在iOS5中按预期工作。
位置:固定可在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上使用相同的页面,则还需要设置顶部位置,否则由于某些原因会增加少量页边距。
user-scalable=0, minimum-scale=1.0, maximum-scale=1.0
功能会使许多用户无法访问该页面。在您的回答中添加有关此警告将很有用
现在苹果支持
overflow:hidden;
-webkit-overflow-scrolling:touch;
background-size: cover
和fixed
iPad上的问题
我在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。
fixed
,并添加了transform
,此问题已解决。
固定页脚(此处为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}
希望能帮助到你。
我最终使用了新的jQuery Mobile v1.1:http : //jquerymobile.com/blog/2012/04/13/announcing-jquery-mobile-1-1-0/
现在,我们进行了可靠的重写,可以在许多流行的平台上提供真正的固定工具栏,并且可以安全地退回到其他浏览器中的静态工具栏位置。
这种方法最酷的部分是,与基于JS的解决方案在所有平台上施加不自然的滚动物理效果不同,我们的滚动感觉是100%本机的,因为它是。这意味着滚动无处不在,并可与触摸,鼠标滚轮和键盘用户输入一起使用。另外,我们基于CSS的解决方案非常轻巧,不会影响兼容性或可访问性。
使用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>
尽管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;}
。
解决此问题的简单方法就是为您的元素键入transform属性。它将被修复。快乐编码:-)
.classname{
position: fixed;
transform: translate3d(0,0,0);
}
您也可以尝试他的方式,这也很好。
.classname{
position: -webkit-sticky;
}
这可能并不适用于所有情况,但是我发现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