ChatGPT解决这个技术问题 Extra ChatGPT

我可以隐藏 HTML5 数字输入的旋转框吗?

跨浏览器是否有一致的方法来隐藏某些浏览器(例如 Chrome)为数字类型的 HTML 输入呈现的新旋转框?我正在寻找一种 CSS 或 JavaScript 方法来防止出现向上/向下箭头。

<input id="test" type="number">
您可以发布您正在使用的代码示例吗?屏幕截图也很棒,所以我们知道您在看什么。我在 Chrome 中查看 <input type="number" min="4" max="8" /> 并看到一个典型的输入字段,旁边有向上和向下箭头。
你看到的正是我所看到的。我试图保留 type=number 标记以确保移动浏览器显示适当的键盘,并防止向上和向下箭头出现在计算机浏览器中。
如果您使用数字输入,请务必使用适合现代 iOS、Android 和桌面浏览器的软件:<input type="number" pattern="[0-9]*" inputmode="numeric">。更多信息:stackoverflow.com/a/31619311/806956
我建议做的是按照 <input type="text" placeholder="number (digits only)" pattern="[0-9]+" class="validate number-validation" ... > 编写标记并使用 jQuery Validati 或类似的方法来处理验证。我还没有测试过这种方法,这就是为什么这是一个评论,而不是一个答案。
您可能误用了该输入类型,HTML 规范解释说它“不适合仅包含数字但严格来说不是数字的输入”。 html.spec.whatwg.org/multipage/…。还有其他属性可以控制触摸屏键盘,例如 inputmode

M
Mikael Dúi Bolinder

此 CSS 有效地隐藏了 webkit 浏览器的旋转按钮(已在 Chrome 7.0.517.44 和 Safari 版本 5.0.2 (6533.18.5) 中对其进行了测试):

输入::-webkit-outer-spin-button, input::-webkit-inner-spin-button { /* display: none; <- 悬停时 Chrome 崩溃 */ -webkit-appearance: none;边距:0; /* <-- 显然有些边距仍然存在,即使它被隐藏了 */ } input[type=number] { -moz-appearance:textfield; /* Firefox */ }

您始终可以使用检查器(webkit,可能是 Firefox 的 Firebug)为您感兴趣的元素查找匹配的 CSS 属性,查找 Pseudo 元素。此图显示了输入元素 type="number" 的结果:

https://i.stack.imgur.com/QATjk.png


看来 Chrome 已经没有问题了,所以你可以只使用 display: none; 作为选择器内的唯一内容
不幸的是,这不是跨浏览器,因此如果您必须隐藏这些箭头,我建议您不要使用 type=number。例如,目前它们仍会显示在 Opera 中,并且当它们实现此输入类型时,它们将开始显示在 Firefox、IE 等中。
只需使用 `<input inputmode="numeric" ... />它有 wide support now
我不会称之为“广泛支持”......
@Johansrk 因为字母“e”可以是有效数字的一部分,即 1e3 === 1000。
s
swehren

Firefox 29 当前增加了对数字元素的支持,所以这里有一个在基于 webkit 和 moz 的浏览器中隐藏微调器的片段:

输入[type='number'] { -moz-appearance:textfield; } 输入::-webkit-outer-spin-button, 输入::-webkit-inner-spin-button { -webkit-appearance: none; }


C
Community

简短的回答:

输入[type="number"]::-webkit-outer-spin-button, input[type="number"]::-webkit-inner-spin-button { -webkit-appearance: none;边距:0; } input[type="number"] { -moz-appearance: textfield; }

更长的答案:

要添加到现有答案...

火狐:

在当前版本的 Firefox 中,这些元素上 -moz-appearance property 的(用户代理)默认值为 number-input。将其更改为值 textfield 会有效地删除微调器。

input[type="number"] {
    -moz-appearance: textfield;
}

在某些情况下,您可能希望最初隐藏微调器,然后出现在悬停/焦点上。 (这是当前 Chrome 中的默认行为)。如果是这样,您可以使用以下内容:

输入[type="number"] { -moz-appearance: textfield; } input[type="number"]:hover, input[type="number"]:focus { -moz-appearance: number-input; }

铬合金:

在当前版本的 Chrome 中,这些元素上 -webkit-appearance property 的(用户代理)默认值已经是 textfield。为了移除微调器,需要将 ::-webkit-outer-spin-button/::-webkit-inner-spin-button 伪类上的 -webkit-appearance 属性值更改为 none(默认为 -webkit-appearance: inner-spin-button)。

输入[type="number"]::-webkit-outer-spin-button, input[type="number"]::-webkit-inner-spin-button { -webkit-appearance: none;边距:0; }

值得指出的是,margin: 0 用于删除 旧版 Chrome 中的边距。

目前,在撰写本文时,这是“inner-spin-button”伪类的默认用户代理样式:

input::-webkit-inner-spin-button {
    -webkit-appearance: inner-spin-button;
    display: inline-block;
    cursor: default;
    flex: 0 0 auto;
    align-self: stretch;
    -webkit-user-select: none;
    opacity: 0;
    pointer-events: none;
    -webkit-user-modify: read-only;
}

我更喜欢这个答案,因为它包含相关的 Firefox 信息,在开发某些东西时需要考虑这些信息。忽略其他浏览器引擎的仅 webkit 答案还有很多不足之处
R
Rory O'Kane

根据 Apple’s user experience coding guide for mobile Safari,您可以使用以下方法在 iPhone 浏览器中显示数字键盘:

<input type="text" pattern="[0-9]*" />

\d* 中的 pattern 也可以使用。


这目前在所有浏览器中的 Android 上没有任何作用。在 Android 4.2 上的浏览器 4.2.2、Chrome 28 和 Firefox 23 中的 this test page 上进行了测试。这些浏览器只显示带有此标记的标准文本键盘。
上述评论已过时,根据 caniuse 最流行的 Android 浏览器现在支持它。另外,即使它还没有做任何事情,它也是符合标准的,应该添加,因为浏览器不断发展
a
alexismorin

我找到了一个超级简单的解决方案

<input type="text" inputmode="numeric" />

大多数浏览器都支持此功能:

https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/inputmode

https://caniuse.com/input-inputmode


technology.blog.gov.uk/2020/02/24/… 解释了英国政府为何从 type="number" 改用此解决方案。
如果您有物理键盘,仍然可以输入任何字符
@vsync OP和youjin从未提到这是不可能的。还有很多其他帖子处理这个 - 例如stackoverflow.com/questions/995183/…
M
MERT DOĞAN

请尝试改用 input type="tel"。它会弹出一个带有数字的键盘,并且不显示旋转框。它不需要 JavaScript 或 CSS 或插件或其他任何东西。


此解决方案目前不会像 type=number 那样在任何浏览器中进行任何验证。
The telephone keyboard 不如 the number keyboard,但比 the text keyboard 好得多。电话键盘具有从数字键盘中省略的无关字母和符号。 (在 Android 4.2 上使用 this page 测试。)
没有“。”在电话键盘中:-<
这不是一个解决方案,根据 HTML5 标准,它是愚蠢的。 input[tel] 用于电话号码, input[number] 用于通用数字,包括浮点数。所以这根本不是一个解决方案。
S
Sanjib Debnath

仅添加此 css 以在输入数字时删除微调器

/* For Firefox */

input[type='number'] {
    -moz-appearance:textfield;
}



/* Webkit browsers like Safari and Chrome */

input[type=number]::-webkit-inner-spin-button,
input[type=number]::-webkit-outer-spin-button {
    -webkit-appearance: none;
    margin: 0;
}

A
Andy

如果您试图隐藏浏览器添加的控件,则应该暗示您在滥用该输入类型。

标准一致性问题

HTML spec on type=number

type=number 状态不适用于恰好只包含数字但严格来说不是数字的输入。例如,它不适用于信用卡号或美国邮政编码。

(重点是我的)

可用性问题

在 GOV.UK 团队执行 a usability study 期间,发现 <input type=number> 存在问题。该团队维护着世界上最著名的设计系统之一,并得出以下结论:这种输入类型:

使用 Dragon Naturally speak 时无法指定或选择 在 NVDA 的元素列表中显示为未标记 在 NVDA 的对象导航中显示为旋转按钮,其中有一个编辑字段和两个按钮 - 这些按钮没有标记,但会报告减少/增加值使用 nvda+tab 时作为未标记的编辑字段

替代解决方案

相反,他们建议使用 <input type="text" inputmode="numeric" pattern="[0-9]*"> 归结为@team_steve 和@youjin 的组合答案。这不仅隐藏了旋转框,还提高了元素的整体可用性。

不用说需要进行额外的验证,以及有用的错误文本。


仍然可以输入非数字字符 - 这是不希望的。可用性并不总是很重要,因为只允许输入数字的限制效果,这是一个巨大的优势
您可以输入非数字字符,但不能提交表单。我认为这是一个优点,因为这样你可以检测错误并给出正确的验证信息。如果有人打错了但只能输入数字,那么根据规则,这些值可能是正确的,但从用户的角度来看却不是。例如,如果有人输入 1K,他们的意思是 1000。但如果无法输入 K,则无法检测到此错误。输入将是 1,这不是本意。
我不明白你的论点,@vsync。在这种没有 <form> 元素的网络应用程序中,无论如何都需要实施验证。并且适当的错误消息将比弄乱用户的输入更加用户友好。您在链接中获得了正确的证据。
@Andy - 我已经删除了评论。我想我评论了错误的答案,因为它不适合,所以我把它一起删除了。
X
Xiao Hanyu

我遇到了与此问题类似的 input[type="datetime-local"] 问题。

我已经找到了克服这类问题的方法。

首先,您必须通过“DevTools -> Settings -> General -> Elements -> Show user agent shadow DOM”打开 chrome 的 shadow-root 功能

然后你可以看到所有shadowed DOM elements,例如,对于<input type="number">,带有shadowed DOM的完整元素是:

https://i.stack.imgur.com/wIu6b.png

根据这些信息,您可以起草一些 CSS 来隐藏不需要的元素,就像 @Josh 所说的那样。


f
francis
/* Chrome, Safari, Edge, Opera */
input::-webkit-outer-spin-button,
input::-webkit-inner-spin-button {
  -webkit-appearance: none;
  margin: 0;
}

/* Firefox */
input[type=number] {
  -moz-appearance: textfield;
}

Source


G
Gaurav

不是您要求的,但我这样做是因为 WebKit 中带有旋转框的焦点错误:

// temporary fix for focus bug with webkit input type=number ui
if (navigator.userAgent.indexOf("AppleWebKit") > -1 && navigator.userAgent.indexOf("Mobile") == -1)
{
    var els = document.querySelectorAll("input[type=number]");
    for (var el in els)
        el.type = "text";
}

它可能会给你一个想法来帮助你满足你的需要。


S
Swap-IOS-Android

这是更好的答案,我想建议鼠标悬停和没有鼠标悬停

input[type='number'] {
  appearance: textfield;
}
input[type='number']::-webkit-inner-spin-button,
input[type='number']::-webkit-outer-spin-button,
input[type='number']:hover::-webkit-inner-spin-button, 
input[type='number']:hover::-webkit-outer-spin-button {
-webkit-appearance: none; 
 margin: 0; }

S
Sabbir Hossen Chowdhury

在 WebKit 和基于 Blink 的浏览器和所有类型的浏览器中使用以下 CSS :

/* Disable Number Arrow */
input[type=number]::-webkit-inner-spin-button, 
input[type=number]::-webkit-outer-spin-button { 
  -webkit-appearance: none; 
  margin: 0; 
}

其他人几年前写过同样的东西,那你为什么还选择添加这个呢?
v
vsync

为了在 Safari 中进行这项工作,我发现将 !important 添加到 webkit 调整会强制隐藏旋转按钮。

input::-webkit-outer-spin-button,
input::-webkit-inner-spin-button {
    /* display: none; <- Crashes Chrome on hover */
    -webkit-appearance: none !important;
    margin: 0; /* <-- Apparently some margin are still there even though it's hidden */
}

我仍然无法为 Opera 制定解决方案。


H
Harley

当您不想要微调器时,也许可以将使用 javascript 的数字输入更改为文本输入;

document.getElementById('myinput').type = 'text';

并停止用户输入文本;

  document.getElementById('myinput').onkeydown = function(e) {
  if(!((e.keyCode > 95 && e.keyCode < 106)
    || (e.keyCode > 47 && e.keyCode < 58) 
    || e.keyCode == 8
    || e.keyCode == 9)) {
          return false;
      }
  }

然后让 javascript 将其更改回来,以防您确实需要微调器;

document.getElementById('myinput').type = 'number';

它对我的目的很有效


s
sonny_boy

在 Firefox for Ubuntu 上,只需使用

    input[type='number'] {
    -moz-appearance:textfield;
}

为我做了伎俩。

添加

input::-webkit-outer-spin-button,
input::-webkit-inner-spin-button {
    -webkit-appearance: none;
}

会引导我

未知的伪类或伪元素“-webkit-outer-spin-button”。由于选择器错误,规则集被忽略。

每次我尝试。内部旋转按钮也是如此。


V
Vic

我需要这个来工作

/* Chrome, Safari, Edge, Opera */
input[type=number]::-webkit-outer-spin-button,
input[type=number]::-webkit-inner-spin-button
  -webkit-appearance: none
  appearance: none
  margin: 0

/* Firefox */
input[type=number]
  -moz-appearance: textfield

appearance: none 的额外行对我来说很关键。


P
Prince Sharma

输入[type=number]::-webkit-inner-spin-button, input[type=number]::-webkit-outer-spin-button { -webkit-appearance: none;


B
Black

对我来说,chrome 上除了 display: none 之外什么都没有。

/* Chrome, Safari, Edge, Opera */
input::-webkit-outer-spin-button,
input::-webkit-inner-spin-button {
  -webkit-appearance: none;
  margin: 0;
  display: none;
}

/* Firefox */
input[type=number] {
  -moz-appearance: textfield;
}

感谢@philfreo 在评论中指出这一点。


k
kozimjon yoqubov

这就像你的 CSS 代码:

input[type="number"]::-webkit-outer-spin-button,
input[type="number"]::-webkit-inner-spin-button {
  -webkit-appearance: none;
  margin: 0;
}