Posso nascondere la casella di selezione dell'input del numero HTML5?


984

Esiste un modo coerente tra i browser per nascondere le nuove caselle di selezione che alcuni browser (come Chrome) rendono per l'input HTML di tipo numero? Sto cercando un metodo CSS o JavaScript per impedire la visualizzazione delle frecce su / giù.

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

2
Puoi pubblicare un esempio del codice che stai utilizzando? Anche uno screenshot sarebbe fantastico, quindi sappiamo cosa stai guardando. Sto guardando <input type="number" min="4" max="8" />in Chrome e vedo un tipico campo di input con le frecce su e giù sul lato.
calvinf,

77
Stai vedendo esattamente quello che sto vedendo. Sto cercando di mantenere il markup type = number per garantire che i browser per dispositivi mobili visualizzino una tastiera appropriata e impediscano la visualizzazione delle frecce su e giù nei browser dei computer.
Alan,

3
Se stai usando gli ingressi numerici, assicurarsi di utilizzare qualcosa che suona bello con iOS moderni, Android e browser desktop: <input type="number" pattern="[0-9]*" inputmode="numeric">. Maggiori informazioni: stackoverflow.com/a/31619311/806956
Aaron Gray

1
Quello che suggerisco di fare è scrivere markup sulla falsariga <input type="text" placeholder="number (digits only)" pattern="[0-9]+" class="validate number-validation" ... > e usare jQuery Validati o simili per gestire la validazione. Non ho testato questo approccio, motivo per cui questo è un commento, piuttosto che una risposta.
Agi Hammerthief,

Risposte:


1141

Questo CSS nasconde efficacemente il pulsante di selezione per i browser webkit (l'ho testato in Chrome 7.0.517.44 e Safari Versione 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" />

Puoi sempre usare inspector (webkit, possibilmente Firebug per Firefox) per cercare proprietà CSS abbinate per gli elementi che ti interessano, cercare elementi pseudo. Questa immagine mostra i risultati per un elemento di input type = "number":

Ispettore per tipo di input = numero (Chrome)


23
Sembra che Chrome non abbia più un problema, quindi puoi semplicemente usarlo display: none;come unica cosa all'interno del selettore
philfreo,

9
Questo purtroppo non è cross-browser, quindi sconsiglio di utilizzare type=numberse devi nascondere queste frecce. Ad esempio, al momento sarebbero ancora visualizzati in Opera e inizieranno a essere visualizzati in Firefox, IE ecc. Quando implementano questo tipo di input.
mgol

Ho bisogno di usare gli attributi max=e min=su <input>soluzioni così alternative come type="text"HTML5 non valido. Le persone menzionano anche l'Opera, compresi questi filatori. Esiste una soluzione per Opera simile a Safari / Chrome?
unode

2
per la cronaca, Chrome ha anche input::-webkit-clear-buttonper il pulsante X
aldo.roman.nurena il

2
A partire dal 2019, questo non ha funzionato per me in Firefox. Questa soluzione ha funzionato per me: stackoverflow.com/questions/45396280/...
lwitzel

431

Firefox 29 attualmente aggiunge il supporto per gli elementi numerici, quindi ecco uno snippet per nascondere i filatori nei browser basati su webkit e 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">


Quello più il "margine: 0" dalla risposta di Antonio è quello che ho usato
Asfand Qazi

L'ho usato senza margine e sembra ok (maggio 2020).
croraf

359

Risposta breve:

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

Risposta più lunga:

Per aggiungere una risposta esistente ...

Firefox:

Nelle versioni correnti di Firefox, il valore predefinito (agente utente) della -moz-appearanceproprietà su questi elementi è number-input. Modificandolo sul valore si textfieldrimuove efficacemente il filatore.

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

In alcuni casi, potresti voler inizialmente nascondere lo spinner e poi apparire su hover / focus. (Questo è attualmente il comportamento predefinito in Chrome). In tal caso, è possibile utilizzare quanto segue:

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


Cromo:

Nelle versioni correnti di Chrome, il valore predefinito (agente utente) della -webkit-appearanceproprietà su questi elementi è già textfield. Per rimuovere lo spinner, il -webkit-appearancevalore della proprietà deve essere modificato nonenelle classi ::-webkit-outer-spin-button/ ::-webkit-inner-spin-buttonpseudo (è -webkit-appearance: inner-spin-buttondi default).

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

Vale la pena sottolineare che margin: 0viene utilizzato per rimuovere il margine in precedenza versioni di Chrome.

Attualmente, al momento della stesura di questo, ecco lo stile dell'agente utente predefinito sulla pseudo classe '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;
}

14
mi piace meglio questa risposta perché include informazioni rilevanti su Firefox, che, quando si sviluppa qualcosa, deve essere considerata. Le risposte solo webkit che ignorano gli altri motori del browser lasciano molto a desiderare
RozzA

aggiungi un! important alla soluzione firefox.LIKE QUESTO ===> input [type = "number"] {-moz-aspect: textfield! important; }
sajad saderi,

126

Secondo la guida alla codifica dell'esperienza utente di Apple per Safari mobile , puoi utilizzare quanto segue per visualizzare una tastiera numerica nel browser iPhone:

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

A patterndi \d*funzionerà anche.


5
Nonostante quanto sopra, la soluzione controllata funziona molto bene per il problema dato, ho deciso di passare a questa soluzione, qui. Uno dei motivi è che, ad esempio, il browser Opera mostra anche le frecce, che dovresti anche prevenire. In secondo luogo, ho osservato maggiori problemi in Chrome 17. Lì, da un lato, l'attributo 'maxlen' non sembra funzionare più; puoi inserire tutti i caratteri che vuoi lì. D'altra parte, i numeri che superano una certa lunghezza vengono semplicemente arrotondati. L'uso di questa soluzione per "solo l'apertura del tastierino numerico su un dispositivo iOS" sembra essere più sicuro per me.
Jan

Sono andato anche con queste soluzioni, poiché avevo un JS che formava il numero nel campo di input quando ho digitato e che non funzionava con un campo numerico. Quindi questo ha funzionato come un fascino.
Tokimon,

19
Questo attualmente non fa nulla su Android, in tutti i browser. Testato su questa pagina di prova in Browser 4.2.2, Chrome 28 e Firefox 23 su Android 4.2. Quei browser mostrano semplicemente la tastiera di testo standard con questo markup.
Rory O'Kane,

3
Ecco una bella soluzione sia per Android che per iOS: stackoverflow.com/a/31619311/806956
Aaron Gray

1
@Aaron Ritorna al punto di partenza: quella soluzione ha spinner per il desktop.
StrangeWill

39

Prova ad usare input type="tel"invece. Apre una tastiera con numeri e non mostra caselle di selezione. Non richiede JavaScript o CSS o plugin o altro.


17
Questa soluzione attualmente non esegue alcuna convalida in nessun browser come type=numberfa.
Pepijn,

5
La tastiera del telefono non è buona come la tastiera numerica , anche se è di gran lunga migliore della tastiera di testo . La tastiera del telefono ha lettere e simboli irrilevanti che sono omessi dalla tastiera numerica. (Testato con questa pagina su Android 4.2.)
Rory O'Kane,

16
Non c'è "." nella tastiera del telefono: - <
gion_13

1
@ RoryO'Kane La tastiera numerica ha uno svantaggio davvero grande che negherà qualsiasi input che non sia strettamente un numero.
Jochem Kuijpers,

4
Questa non è una soluzione, e per gli standard HTML5 è stupida. input [tel] è per i numeri di telefono, input [numero] è per i numeri generici, compresi quelli a virgola mobile. Quindi questa non è affatto una soluzione.
Vasil Popov,

17

Aggiungi questo CSS solo per rimuovere il filatore sull'input del numero

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

secondo caniuse input[type=number]{ -webkit-appearance }dovrebbe essere sufficiente per chrome, ma ovviamente è necessario modificare anche gli pseudo-elementi. qualche idea del perché ??
oldboy,

8

Ho riscontrato questo problema con a input[type="datetime-local"] , che è simile a questo problema.

E ho trovato il modo di superare questo tipo di problemi.

Innanzitutto, è necessario attivare la funzione di root-shadow di Chrome tramite "DevTools -> Impostazioni -> Generale -> Elementi -> Mostra DOM ombra utente agente"

Quindi puoi vedere tutti gli elementi DOM ombreggiati , ad esempio, poiché <input type="number">l'elemento completo con DOM ombreggiato è:

<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 dell'input [type = "number"

E secondo queste informazioni, puoi redigere alcuni CSS per nascondere elementi indesiderati, proprio come ha detto @Josh.


3

Non è quello che mi hai chiesto, ma lo faccio a causa di un bug di focus in WebKit con spinbox:

// 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";
}

Potrebbe darti un'idea per aiutarti con ciò di cui hai bisogno.


Questo non è esattamente ciò di cui stavo parlando, ma a causa dell'attuale mancanza di standardizzazione di HTML5 questa è la migliore soluzione presentata. Fornire un sito diverso per dispositivi mobili rispetto a desktop (non importa come sia implementato) sembra l'unico modo per farlo attualmente. Tuttavia, ho dovuto creare una copia dell'elemento e modificare il valore "type" prima di aggiungerlo al DOM. Poiché IE non consente di modificare il tipo di input una volta che l'elemento è stato aggiunto al dom.
Alan,

3

Questa è la risposta migliore che vorrei suggerire al passaggio del mouse e senza il passaggio del mouse

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

cosa margin: 0compie? inoltre, gli spin-buttonpseudo-elementi non sembrano essere innescati dai hoverbrowser più recenti?
oldboy,

2

Per far funzionare questo in Safari ho scoperto che aggiungere! Importante alla regolazione del webkit costringe a nascondere il pulsante di selezione.

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

Ho ancora problemi a elaborare una soluzione anche per Opera.


2

Su Firefox per Ubuntu, semplicemente usando

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

ha fatto il trucco per me.

Aggiunta

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

Mi porterebbe a

Pseudo-classe sconosciuta o pseudo-elemento '-webkit-outer-spin-button'. Set di regole ignorato a causa di un selettore errato.

ogni volta che ci ho provato. Lo stesso vale per il pulsante di selezione interno.


1
-webkit-*è per Chrome, -moz-*è per Mozilla Firefox. Ecco perché non ha funzionato per te.
Gusstavv Gil,

2

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


6
Questa risposta è già stata fornita più volte. Aiuta a leggere le risposte esistenti prima di fornirne una nuova, nel caso in cui quella nuova sia duplicata.
Dan Dascalescu,

1

Forse cambi il numero inserito con javascript in testo quando non vuoi uno spinner;

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

e impedisce all'utente di inserire il testo;

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

quindi fai in modo che javascript lo cambi di nuovo nel caso in cui desideri uno spinner;

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

ha funzionato bene per i miei scopi


1

Nei browser basati su WebKit e Blink e All Kind Of Browser usa il seguente CSS:

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

Su quali browser funzionerà, dato l'uso webkit? Quando rispondi a una domanda di nove anni con quattordici risposte esistenti, è importante aggiungere una spiegazione di come e perché la tua risposta funziona e di menzionare quale nuovo aspetto della domanda a cui risponde.
Jason Aller,

0

Ne avevo bisogno per funzionare

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

La linea extra di è appearance: nonestata la chiave per me.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.