【问题标题】:Scrolling on ios device finger input tag在 ios 设备手指输入标签上滚动
【发布时间】:2017-10-16 16:16:31
【问题描述】:

我在一个带有一些输入字段的网站上有一个基本表单。 如果用户试图滚动页面,并通过将手指放在输入框内开始滚动,它不会让页面滚动。 如果他们用手指在正文的某处开始滚动,页面滚动得很好。

这家伙似乎遇到了同样的问题,但他说以前的开发人员有目的地实现了这个,我绝对没有这个问题。 Input field prevents page from scrolling on iphone

有什么想法吗?

【问题讨论】:

  • 我根本无法重现这个问题。我正在使用 iPad Air,并且有一个高度为 4000 像素的网页,顶部附近有一个输入。当我的手指敲击输入并进行滚动动作时,我可以滚动。唯一不是这样的情况是您将手指放在输入上(执行选择操作)。您有我们可以看到的演示以更好地解释问题吗?
  • 我们需要一个演示/代码
  • 我将很快提供一个演示。我的代码已经很简单了,但我将它精简为一个非常小的示例,但随后事情就开始起作用了。我需要弄清楚是什么让它不起作用。今天应该有东西。
  • 在下面查看我的答案以获取示例代码以及为我解决的问题。
  • @Captainlonate :请在下面查看我的回答。你能告诉我你的工作中是否有类似的代码吗?

标签: html ios css


【解决方案1】:
html { 
  overflow: scroll; 
  -webkit-overflow-scrolling: touch;
}

适用于 input 元素和 iframe 元素。 触摸事件解决方案解决了滚动问题,但禁用了这些元素上的焦点事件。

【讨论】:

    【解决方案2】:

    我的代码,简化后是这样的:

    html:

    <html>
        <head>
            <meta charset="utf-8" />
            <meta name="viewport" content="user-scalable=no, initial-scale=1, target-densitydpi=medium-dpi" />
            <title>Broken Input Scrolling</title>
            <link rel="stylesheet" href="jquery.mobile-1.4.5.min.css">
            <script src="jquery.js"></script>
            <script src="jquery.mobile-1.4.5.min.js"></script>
            <link rel="stylesheet" href="index.css">
        </head>
        <body>
    
        <div data-role="page" id="outerDiv">
            <div data-role="header">
                <h1>Broken Input Scrolling</h1>
            </div>
    
            <div data-role="content" id="contentDiv">
                <div id="tableDiv">
                    <table>
                        <tbody>
                            <tr>
                                <td name="nameTitle" id="nameTitle" class="input-row3"><span>Scenario Name</span></td>
                                <td><input type="email" name="name1" id="name1" placeholder="Scenario 1"/></td>
                                <td><input type="email" name="name2" id="name2" placeholder="Scenario 2"/></td>
                                <td><input type="email" name="name3" id="name3" placeholder="Scenario 3"/></td>
                                <td><input type="email" name="name4" id="name4" placeholder="Scenario 4"/></td>
                                <td><input type="email" name="name5" id="name5" placeholder="Scenario 5"/></td>
                                <td><input type="email" name="name6" id="name6" placeholder="Scenario 6"/></td>
                                <td><input type="email" name="name7" id="name7" placeholder="Scenario 7"/></td>
                                <td><input type="email" name="name8" id="name8" placeholder="Scenario 8"/></td>
                            </tr>
                        </tbody>
                    </table>
                </div>
            </div>
        </div>
    
        <script type="text/javascript" src="cordova.js"></script>
        <script type="text/javascript" src="index.js"></script>
        <script type="text/javascript">
           app.initialize();
        </script>
    
        </body>
    </html>
    

    css:

    table {
        width: 90em;
        table-layout:fixed;
    }
    td {
        height: 3em;
        width: 10em;
        border: 0.1em solid black;
    }
    #tableDiv {
        overflow-x: auto !important;
    }
    #tableDiv > * {
        -webkit-transform: translate3d(0,0,0);
    }
    

    事实证明,删除这块可以解决问题:

    #tableDiv > * {
        -webkit-transform: translate3d(0,0,0);
    }
    

    这是不必要的,但在尝试改进滚动时已在实际项目(更大)中添加。

    我不知道为什么这会导致 iOS 而不是 Android 出现问题。如果有人可以详细说明为什么会发生这种情况(并因此提供更好的答案),他们可以获得一些赏金。

    顺便说一句...如果使用足够大的屏幕而不需要滚动,您将需要添加更多行或更宽的行。

    【讨论】:

      【解决方案3】:

      解决此问题的方法可能是:

      function setTextareaPointerEvents(value) {
          var nodes = document.getElementsByTagName('textarea');
          for(var i = 0; i < nodes.length; i++) {
              nodes[i].style.pointerEvents = value;
          }
      }
      
      document.addEventListener('DOMContentLoaded', function() {
          setTextareaPointerEvents('none');
      });
      
      document.addEventListener('touchstart', function() {
          setTextareaPointerEvents('auto');
      });
      
      document.addEventListener('touchmove', function() {
          e.preventDefault();
          setTextareaPointerEvents('none');
      });
      
      document.addEventListener('touchend', function() {
          setTimeout(function() {
              setTextareaPointerEvents('none');
          }, 0);
      });
      

      这将使 Mobile Safari(目前尚未测试的其他)忽略用于滚动的文本区域,但允许像往常一样设置焦点等。

      【讨论】:

      • 查看我的答案(不完整的答案)以获取代码示例以及导致我的问题的原因(虽然我不知道为什么)。使用我的代码,在没有输入焦点且软键盘被隐藏的情况下,在输入之上启动 touchmove 将被忽略。但是,如果您在键盘启动后开始对输入进行触摸移动,那么一切都会奏效。使用您的代码,无论键盘是否启动,都将忽略在输入之上启动 touchmove。我实际上希望滚动在这两种情况下都可以工作,而不是在两种情况下都禁用它。
      • 您从 stackoverflow.com/questions/4178725/… 复制了此代码。您至少应该提供一个参考,说明您从哪里复制。此外,此代码被复制的地方特别说明它禁用滚动。在这里,我自己和@Captianlonate 想要滚动工作。
      【解决方案4】:

      您可以尝试下面的代码来防止 touchmove 上的输入

      $(document).on('touchmove','input',function(e){
            e.preventDefault();
      });
      

      【讨论】:

      • 我和 OP 都不想禁用 touchmove。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-17
      • 2017-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多