具有讽刺意味的是,Android 设备似乎没有这个问题。另外,当引用 body 标记时,完全可以使用 {position:absolute;},而且没有任何问题。
我发现了这个怪现象的根本原因: 滚动事件在与 HTML 或 BODY 标记结合使用时不能很好地发挥作用。有时它不喜欢触发事件,或者您必须等到滚动摇摆事件完成后才能接收事件。具体来说,视口在这个事件结束时被重新绘制,并且固定的元素可以在视口中的其他地方被重新定位。
这就是我要做的: (避免使用 viewport,坚持使用 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>
从本质上说,这将导致主体的大小视窗和不可滚动。嵌套在里面的可滚动 DIV 将像正常的主体一样滚动(减去摆动效果,所以滚动在触摸端停止)固定的 DIV 保持固定,没有干扰。
顺便说一句,固定 DIV 上的高 z-index值对于保持可滚动 DIV 显示在其后面很重要。我通常添加窗口大小和滚动事件也为跨浏览器和替代屏幕分辨率兼容性。
import {Platform } from '@ionic/angular';
constructor(public platform: Platform) {
// This next bit is so that the CSS is shown correctly for each platform
platform.ready().then(() => {
if (this.platform.is('android')) {
console.log("running on Android device!");
this.css_iOS = false;
}
if (this.platform.is('ios')) {
console.log("running on iOS device!");
this.css_iOS = true;
}
if (this.platform.is('ipad')) {
console.log("running on iOS device!");
this.css_iOS = true;
}
});
}
css_iOS: boolean = false;