iOS Chrome/Safari -在模态内聚焦输入时出现不必要的滚动

sqserrrh  于 2022-12-24  发布在  iOS
关注(0)|答案(5)|浏览(255)

在Safari和Chrome中测试-相同的结果,所以我认为这是iOS的问题.
只有当模态中有输入并且我点击该输入时,才会发生这种情况。与此同时,该输入获得焦点,并且原生iOS键盘变为可见。
modal下面的页面在同一时刻会自动滚动到其高度的50%。这种行为是完全不想要的,我完全不知道如何阻止这种默认的iOS "功能"。
演示:

2eafrhcq

2eafrhcq1#

我们在工作中也面临着类似的问题,我在你的(出色的)演示页面上偶然发现了这个问题。
正如您提到的,偏移量始终为页面高度的~50%,无论初始偏移量在哪里,都会发生这种情况。
过去,当我在早期的iOS版本中观察到类似的“跳跃”时(尽管跳跃没有那么剧烈),我通常会通过将position: fixed(或relative)应用于bodythis allows overflow: hidden to properly work)来解决这个问题。
然而,如果用户向下滚动,这会导致用户跳回到页面的顶部。
因此,如果您愿意用一些JavaScript来解决这个问题,下面是我提供的一个修补程序/hack:

// 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
对于那些正在寻找更通用的修复方法的人,您可以在打开/关闭模态时执行以下操作:

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。我注意到你的另一个问题,你不是一个球迷的溢出:隐藏是由于滚动条出现/消失时页面的移动(我完全同意)。我建议只将JS应用于iOS设备。

rks48beu

rks48beu2#

在iOS上,我遇到了由setTimeout和setInterval引起的滚动事件的问题(定位模态导致滚动?)。我找到了一个解决方案,使用以下代码。

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);
9jyewag0

9jyewag03#

我能想到的一件事是可能将Fast Click库添加到您的代码中。一些iOS和Android超时问题(如300ms延迟)由Fast Click处理。值得一试

g9icjywg

g9icjywg4#

还有一点需要检查的是,输入字段的字体大小超过了会触发缩放输入的最小值。我在这里是从内存工作的,但我遇到了类似的问题。将输入字体大小设置为16px(同样是从内存)或更大可以防止iOS Safari试图缩放输入字段,从而扰乱页面滚动。

2cmtqfgy

2cmtqfgy5#

已解决!!!!!请将这些代码添加到脚本中
https://gist.github.com/kiding/72721a0553fa93198ae2bb6eefaa3299

//reach out to that input field (When ever u r gonna click tofocus)
let inputField = document.getElementById("input_focused")

 /*
 * Method 1: Briefly change the opacity.
 * Element might "blink" on focus in some scenarios.
 */
inputField.addEventListener("focus", () => {
      methodOne.style.opacity = 0;
      setTimeout(() => methodOne.style.opacity = 1);
    });
<section id="modal">
    <input id="input_focused">
  </section>

相关问题