iOS Chrome / Safari – 在模态内对焦input时不需要的滚动
testingSafari和Chrome – 结果相同,所以我认为这是iOS的问题。
只有在模态内有input时才会发生这种情况,我点击该input。 在同一时刻,该input获得焦点和本地iOS键盘变得可见。
同一时刻模态下的页面会自动滚动到其高度的50%。 这种行为是完全不需要的,我不知道如何防止这种默认的iOS“function”。
演示:
更新 :修复提交: limonte / sweetalert2 /提交/ 4a2d36b
我们在工作中遇到了类似的问题,而我却在(优秀的)演示页面上偶然发现了这个问题。
正如你所提到的,偏移量总是页面高度的〜50%,而不pipe你的初始偏移量在哪里。
在过去,当我观察到iOS版本有类似的“跳跃”(尽pipe跳跃less得多),我通常通过应用position: fixed
(或relative
)到body
来解决这个问题( 这允许overflow: hidden
正常工作 )。
但是,如果用户已经向下滚动,则会将用户跳回到页面顶部,从而产生无人看pipe的结果。
所以,如果你打算用一些JavaScript
来解决这个问题,那么下面是我一起修正的一些问题:
// Tapping into swal events onOpen: function () { var offset = document.body.scrollTop; document.body.style.top = (offset * -1) + 'px'; document.body.classList.add('modal--opened'); }, onClose: function () { var offset = parseInt(document.body.style.top, 10); document.body.classList.remove('modal--opened'); document.body.scrollTop = (offset * -1); }
什么CSS看起来像:
.modal--opened { position: fixed; left: 0; right: 0; }
下面是演示页面的一个分支,以说明: https : //jpattishall.github.io/sweetalert2/ios-bug.html
而对于那些正在寻找一个更一般的修复的人,你可以在打开/closures模式时做如下的事情:
function toggleModal() { var offset; if (document.body.classList.contains('modal--opened')) { offset = parseInt(document.body.style.top, 10); document.body.classList.remove('modal--opened'); document.body.scrollTop = (offset * -1); } else { offset = document.body.scrollTop; document.body.style.top = (offset * -1) + 'px'; document.body.classList.add('modal--opened'); } }
编辑:有一点需要注意的是,我们没有盲目地将修补程序应用于所有设备/平台,只是iOS Safari。 我注意到你的另一个问题,你不是一个溢出的粉丝:隐藏由于滚动条出现/消失的页面移动(我完全同意)。 我build议只将JS应用于iOS设备。
在iOS上,由setTimeout和setInterval引起的滚动事件有问题(定位模式导致滚动?)。 我用下面的代码find了一个解决scheme。
Function.prototype.bind = function(parent) { var f = this; var args = []; for (var a = 1; a < arguments.length; a++) { args[args.length] = arguments[a]; } var temp = function() { return f.apply(parent, args); } return(temp); } setTimeout(function() { // your animation stuff here }.bind(this), 100);
我可以想到的一件事是可能将快速点击库添加到您的代码。 一些iOS和Android的超时问题,如300ms
延迟,由快速点击处理。 这是值得一试的