gpt4 book ai didi

javascript - iOS - css/js - 覆盖滚动但防止 body 滚动

转载 作者:技术小花猫 更新时间:2023-10-29 12:23:12 25 4
gpt4 key购买 nike

我知道有几个与此类似的问题,但它们要么不适用于我的用例,要么已接受的答案存在不适合我的缺陷。所以……

我有一个包含元素列表的页面。单击列表中的一个元素将打开一个覆盖层,其中包含有关该元素的详细信息。我需要该覆盖层可滚动,但我不希望覆盖层下的其余页面滚动,以便一旦关闭覆盖层,您就处于相同位置(而且覆盖层略微透明,因此对用户来说很烦人查看下面滚动的页面,以及为什么我无法保存 scrollY 并在关闭时重置)。

现在我可以在除 iOS 以外的任何地方工作。这基本上就是我所拥有的:

<html>
<body>
<ul id="list">
<li>something 1</li>
<li>something 2</li>
<li>something 3</li>
<li>something 4</li>
<li>something 5</li>
</ul>
<div id="overlay"></div>
</body>
</html>

CSS:

body.hidden {
overflow: hidden;
}
#overlay {
opacity: 0;
top: -100vh;
}
#overlay.open {
opacity: 1;
overflow-y: scroll;
overflow-x: hidden;
top: 0;
}

然后在我的点击处理程序中,我切换 body 上的 hidden 类,#overlay 上的 open 类,并用我的内容填充 #overlay 元素。就像我说的,除了 iOS,这在任何地方都可以正常工作。

我在其他地方看到的解决方案说我需要在 body 和/或 html 标签。此解决方案的问题是您丢失了滚动位置,并且当您关闭叠加层时您又回到了页面顶部。其中一些列表可能会很长,所以这对我来说不是一个选择。

我无法使用 preventDefault 阻止完全滚动 body 或其他东西,因为我需要覆盖内容可滚动。

还有什么建议吗?

最佳答案

目前没有办法解决这个问题。从 iOS 9.3 开始,仍然没有很好的方法来防止 body 上的滚动。我目前在所有需要它的网站上实现的最佳方法是锁定 html 和 body 的高度和溢出。

html, body {
height: 100%;
overflow: hidden;
}

这是防止 iOS 在叠加层/模式后面的内容上滚动的最佳方法。

然后为了保持滚动位置,我将内容向上移动,看起来像是在保留滚动位置,然后当模态关闭时恢复正文的位置。

我用 jQuery 中的锁定和解锁功能来实现这一点

var $docEl = $('html, body'),
$wrap = $('.content'),
$.scrollTop;

$.lockBody = function() {
if(window.pageYOffset) {
scrollTop = window.pageYOffset;

$wrap.css({
top: - (scrollTop)
});
}

$docEl.css({
height: "100%",
overflow: "hidden"
});
}

$.unlockBody = function() {
$docEl.css({
height: "",
overflow: ""
});

$wrap.css({
top: ''
});

window.scrollTo(0, scrollTop);
window.setTimeout(function () {
scrollTop = null;
}, 0);
}

当您将所有这些拼凑在一起时,您会得到 http://codepen.io/jerrylow/pen/yJeyoG如果你想在你的手机上测试它,这就是结果:http://jerrylow.com/demo/ios-body-lock/

关于javascript - iOS - css/js - 覆盖滚动但防止 body 滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37713970/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com