【问题标题】:iOS Chrome/Safari - Unwanted scrolling when focusing an input inside the modaliOS Chrome/Safari - 在模式内聚焦输入时不需要的滚动
【发布时间】:2017-01-30 06:42:28
【问题描述】:

在 Safari 和 Chrome 中测试 - 结果相同,所以我认为这是 iOS 问题。

仅当模态框内有输入并且我点击该输入时才会发生这种情况。同时,该输入获得焦点,原生 iOS 键盘变得可见。

模态下方的页面在同一时刻自动滚动到其高度的 50%。这种行为是完全不受欢迎的,我不知道如何阻止这个默认的 iOS“功能”。

演示:


更新:修复提交:limonte/sweetalert2/commit/4a2d36b

【问题讨论】:

  • 你的 javascript 中有 setTimeout 或 setInterval 函数吗?
  • 是的,输入自动对焦功能works with setTimeout() 因为动画
  • 这在 iOS Safari 中只发生过一次,之后就再也没有发生过。但在 chrome 中,它每次都在发生。
  • 这个 gif 到底是怎么回事?
  • 感谢@Yvan,我更新了问题。

标签: javascript html ios css vertical-scrolling


【解决方案1】:

要检查的其他内容是输入字段的字体大小是否高于将触发输入缩放的最小值。我在这里从记忆中工作,但我遇到了类似的问题。将输入字体大小设置为 16px(同样来自内存)或更大可以防止 iOS Safari 尝试缩放输入字段并因此弄乱页面滚动。

【讨论】:

    【解决方案2】:

    我们在工作中遇到了类似的问题,我在您(出色的)演示页面上偶然发现了这个问题。

    正如您所提到的,偏移量始终是页面高度的 ~50%,无论您的初始偏移量在哪里都会发生这种情况。

    在过去,当我观察到与早期 iOS 版本类似的“跳跃”(尽管没有那么剧烈的跳跃)时,我通常通过将position: fixed(或relative)应用于body 来解决这个问题(this allows overflow: hidden to properly work)。

    但是,如果用户向下滚动,这会导致用户自动返回页面顶部。

    所以,如果您愿意通过一些 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

    对于那些正在寻找更通用修复的人,您可以在打开/关闭模式时执行以下操作:

    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 设备上。

    【讨论】:

    • 哇!您的演示正在运行!终于解决了!你是我这一天的英雄 :) 让我尝试以一种很好的方式将此解决方案实施到 sweetalert2 中。现在投票,我会在测试后接受你的答案。谢谢!
    • 多么可怕的错误!这是一个很棒的解决方案。我尝试将固定添加到正文,但正如您所说,它确实将页面滚动到顶部。透明模态背景看起来很奇怪。但负顶有效!有谁知道这个错误是否也出现在安卓设备上?
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      在 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);
      

      【讨论】:

      猜你喜欢
      • 2016-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-29
      • 1970-01-01
      • 2020-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多