You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何禁用移动端只读输入框滚动?已设overflow-x:hidden仍可滚动

解决readonly输入框移动端滚动问题

问题核心:overflow-x: hidden 对原生input元素的文本滚动无效,因为移动端长按触发的是浏览器内置的文本选择滚动行为,和容器的overflow属性无关。以下是几种可行的解决方法:

方案1:禁止文本选择(简单直接,适合无需复制内容的场景)

通过CSS禁止用户选中输入框内的文本,从根源上避免长按触发滚动:

input {
  user-select: none;
  -webkit-user-select: none; /* 兼容移动端webkit内核浏览器 */
}

对应你的React代码修改:

<div style={{ width: "200px" }}>
  <input
    readOnly
    style={{
      userSelect: "none",
      WebkitUserSelect: "none"
    }}
    value=" TEST TTESTEST TEST TEST TEST TEST"
  />
</div>

方案2:用div模拟readonly输入框(保留复制功能,更灵活)

如果需要允许用户复制内容,可将input替换为设置了contenteditable="false"的div,模拟输入框样式,同时避免原生input的滚动行为:

<div style={{ width: "200px" }}>
  <div
    style={{
      padding: "2px 4px",
      border: "1px solid #ccc",
      width: "100%",
      overflowX: "hidden",
      whiteSpace: "nowrap"
    }}
    contentEditable={false}
  >
    TEST TTESTEST TEST TEST TEST TEST
  </div>
</div>

方案3:通过JS阻止触摸滚动(精细控制,适合需要保留文本选择的场景)

如果必须使用原生input且需要保留文本选择,可通过监听touchmove事件阻止滚动:

import { useRef, useEffect } from 'react';

function App() {
  const inputRef = useRef(null);

  useEffect(() => {
    const handleTouchMove = (e) => {
      e.preventDefault();
    };
    const input = inputRef.current;
    input.addEventListener('touchmove', handleTouchMove);
    return () => {
      input.removeEventListener('touchmove', handleTouchMove);
    };
  }, []);

  return (
    <div style={{ width: "200px" }}>
      <input
        ref={inputRef}
        readOnly
        value=" TEST TTESTEST TEST TEST TEST TEST"
      />
    </div>
  );
}

内容的提问来源于stack exchange,提问作者Ugurcan Ucar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 11:46:15