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

Can I hide the HTML5 number input’s spin box?

提问人:Alan 提问时间:9/25/2010 最后编辑:isherwoodAlan 更新时间:9/15/2023 访问量:864306

问:

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

<input id="test" type="number">

HTML CSS 输入 编号

评论

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

答:

4赞 Gaurav 10/8/2010 #1

不是你要求的,但我这样做是因为 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";
}

它可能会给你一个想法,帮助解决你的需求。

1462赞 antonj 11/29/2010 #2

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

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

input[type=number] {
    -moz-appearance:textfield; /* Firefox */
}
<input type="number" step="0.01" />

您可以随时使用检查器(webkit,可能是Firefox的Firebug)来查找您感兴趣的元素的匹配CSS属性,查找伪元素。下图显示了输入元素 type=“number” 的结果:

Inspector for input type=number (Chrome)

评论

41赞 philfreo 9/12/2012
Chrome似乎不再有问题,所以你可以作为选择器内的唯一东西使用display: none;
12赞 mgol 2/5/2013
不幸的是,这不是跨浏览器的,所以如果你必须隐藏这些箭头,我建议不要使用。例如,目前它们仍将显示在 Opera 中,当它们实现此输入类型时,它们将开始显示在 Firefox、IE 等中。type=number
3赞 Shivam Jha 8/13/2021
只需使用 '<input inputmode=“numeric” ... /> 它现在得到了广泛的支持
3赞 RoboticRenaissance 9/28/2021
我不会称之为“广泛支持”......
2赞 Eugene Karataev 9/30/2021
@Johansrk因为字母“e”可以是有效数字的一部分,即 1e3 === 1000。
139赞 team_steve 2/3/2011 #3

根据 Apple 的移动 Safari 用户体验编码指南,您可以使用以下命令在 iPhone 浏览器中显示数字键盘:

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

A 也会起作用。pattern\d*

评论

21赞 Rory O'Kane 8/16/2013
这目前在所有浏览器中对 Android 没有任何作用。在 Android 4.2 上的浏览器 4.2.2、Chrome 28 和 Firefox 23 的此测试页面上进行了测试。这些浏览器仅显示带有此标记的标准文本键盘。
2赞 Andy 7/5/2022
上面的评论已经过时了,根据caniuse的说法,现在最流行的Android浏览器都支持它。另外,即使它还没有做任何事情,它也是符合标准的,应该添加,因为浏览器在不断发展
0赞 Dan Marshall 9/30/2022
您还将失去 min 和 max 提供的数字验证。
47赞 MERT DOĞAN 3/8/2013 #4

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

评论

22赞 Pepijn 6/18/2013
此解决方案目前不会像 Do 那样在任何浏览器中进行任何验证。type=number
7赞 Rory O'Kane 8/16/2013
电话键盘不如数字键盘好,但比文本键盘好得多。电话键盘具有数字键盘中省略的不相关的字母和符号。(在此页面上的 Android 4.2 上进行了测试。
17赞 gion_13 9/3/2013
电话键盘中没有“.”:-<
9赞 Vasil Popov 4/27/2015
这不是一个解决方案,按照 HTML5 标准,它是愚蠢的。input[tel] 用于电话号码,input[number] 用于通用号码,包括浮点号码。所以这根本不是一个解决方案。
488赞 swehren 3/21/2014 #5

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

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

input::-webkit-outer-spin-button,
input::-webkit-inner-spin-button {
    -webkit-appearance: none;
}
<input id="test" type="number">

5赞 luckychii 7/3/2014 #6

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

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 制定解决方案。

432赞 Josh Crozier 1/14/2015 #7

简短的回答:

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

更长的答案:

要添加到现有答案...

火狐浏览器:

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

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

在某些情况下,您可能希望微调器最初处于隐藏状态,然后显示在悬停/焦点上。(这是目前 Chrome 中的默认行为)。如果是这样,您可以使用以下命令:

input[type="number"] {
    -moz-appearance: textfield;
}
input[type="number"]:hover,
input[type="number"]:focus {
    -moz-appearance: number-input;
}
<input type="number"/>


铬:

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

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

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

目前,在撰写本文时,以下是“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;
}

评论

22赞 RozzA 8/5/2016
我更喜欢这个答案,因为它包含相关的Firefox信息,在开发某些东西时,需要考虑这些信息。忽略其他浏览器引擎的仅限 Webkit 的答案还有很多不足之处
0赞 isherwood 9/15/2023
很难在所有编辑中遵循“当前”和“截至撰写时”。也许可以修改以参考浏览器版本或添加实际日期。
12赞 Xiao Hanyu 12/30/2015 #8

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

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

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

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

<input type="number">
  <div id="text-field-container" pseudo="-webkit-textfield-decoration-container">
    <div id="editing-view-port">
      <div id="inner-editor"></div>
    </div>
    <div pseudo="-webkit-inner-spin-button" id="spin"></div>
  </div>
</input>

shadow DOM of input[type="number"

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

4赞 Harley 9/26/2016 #9

当您不想要微调器时,也许将带有 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';

它对我的目的很有效

3赞 sonny_boy 11/19/2016 #10

在 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”。 由于选择器错误,规则集被忽略。

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

1赞 Prince Sharma 2/17/2017 #11

input[type=number]::-webkit-inner-spin-button, 
input[type=number]::-webkit-outer-spin-button {
     -webkit-appearance: none;
<input id="test" type="number">

5赞 Swap-IOS-Android 9/22/2017 #12

这是更好的答案,我想建议将鼠标悬停在鼠标上,而不将鼠标悬停在上面

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; }
20赞 Sanjib Debnath 8/8/2018 #13

仅添加此 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;
}
3赞 Vic 12/31/2019 #14

我需要这个来工作

/* 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

3赞 Sabbir Hossen Chowdhury 3/30/2020 #15

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

评论

2赞 vsync 9/22/2021
其他人几年前也写过同样的东西,那你为什么选择添加这个?
96赞 youjin 6/4/2020 #16

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

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

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

评论

18赞 Luke 9/6/2020
technology.blog.gov.uk/2020/02/24/......解释了为什么 UK gov 从 type=“number” 切换到此解决方案。
21赞 vsync 9/22/2021
如果您有物理键盘,仍然可以键入任何字符
1赞 Peter VARGA 12/8/2021
@vsync OP 和 youjin 从未提到过这是不可能的。还有很多其他帖子在处理这个问题 - 例如 stackoverflow.com/questions/995183/......
-1赞 kozimjon yoqubov 11/3/2020 #17

这就像你的css代码一样:

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

评论

0赞 isherwood 9/15/2023
请不要重复现有的答案。
21赞 Pepijn Gieles 3/23/2021 #18

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

标准一致性问题

根据 type=number 的 HTML 规范

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

(强调是我的)

可用性问题

在 GOV.UK 团队进行的可用性研究中发现存在问题。该团队维护着世界上最知名的设计系统之一,并得出结论,这种输入类型:<input type=number>

替代解决方案

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

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

<label>Postal Code
<input type="text" inputmode="numeric" pattern="[0-9]*" size="5">
</label>

评论

5赞 vsync 9/22/2021
仍然可以输入非数字字符 - 这是不希望的。可用性并不总是重要的,因为允许只输入数字的限制效应,这是一个巨大的优势
1赞 Pepijn Gieles 12/5/2021
您可以输入非数字字符,但不能提交表单。我认为这是一个加分项,因为通过这种方式,您可以检测错误并给出正确的验证消息。如果有人输入错误,但只能输入数字,则根据规则,这些值可能是正确的,但从用户的角度来看则不是正确的。例如,如果有人输入 ,他们的意思是 。但是,如果无法输入,则无法检测到此错误。输入将是 ,这不是这个意思。1K1000K1
0赞 Andy 7/5/2022
我不明白你的论点,@vsync。在此类没有元素的 Web 应用程序中,无论如何都需要实现验证。适当的错误消息将比弄乱用户的输入更加用户友好。您在链接中得到了正确的证据。<form>
0赞 vsync 7/6/2022
@Andy - 我已经删除了评论。我想我评论了错误的答案,因为它不合适,所以我只是把它一起删除了。
0赞 TruMan1 10/15/2023
由于提供的模式,输入正确地禁止非数字字符。@vsync它确实允许是什么意思,也许浏览器支持现在更适合该属性?pattern
2赞 Black 4/12/2021 #19

对我来说,在 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在评论中指出这一点。

17赞 francis 8/7/2021 #20
/* 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;
}