Чи можу я приховати відкручувальний рядок введення номера HTML5?


984

Чи є у веб-переглядачах послідовний спосіб приховати нові спінові вікна, які деякі браузери (наприклад, Chrome) надають для введення HTML номера типу? Я шукаю метод CSS або JavaScript, щоб запобігти появі стрілок вгору / вниз.

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

2
Чи можете ви розмістити приклад використовуваного коду? Скріншот був би також чудовим, тому ми знаємо, що ви дивитесь. Я дивлюся на <input type="number" min="4" max="8" />Chrome і бачу типове поле для введення зі стрілками вгору та вниз збоку.
calvinf

77
Ви бачите саме те, що я бачу. Я намагаюся зберегти розмітку type = number, щоб мобільні браузери відображали відповідну клавіатуру, а також запобігання появі стрілок вгору та вниз у браузерах комп'ютерів.
Алан

3
Якщо ви використовуєте цифрові входи, не забудьте використовувати то , що грає добре з сучасної прошивкою, Android і настільних браузерів: <input type="number" pattern="[0-9]*" inputmode="numeric">. Більше інформації: stackoverflow.com/a/31619311/806956
Аарон Грей

1
Я пропоную зробити написання розмітки у відповідності з <input type="text" placeholder="number (digits only)" pattern="[0-9]+" class="validate number-validation" ... > використанням jQuery Validati або подібного для обробки валідації. Я не перевіряв цей підхід, тому це коментар, а не відповідь.
Agi Hammerthief

Відповіді:


1141

Цей CSS ефективно приховує спін-кнопку для веб-браузерів (протестували її в 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, можливо, Firebug для Firefox) для пошуку відповідних властивостей CSS для цікавлять вас елементів, шукайте псевдоелементи. Це зображення показує результати для вхідного елемента type = "number":

Інспектор для типу вводу = число (Chrome)


23
Схоже, у Chrome більше немає проблем, тому ви можете просто використовувати display: none;як єдине, що знаходиться всередині селектора
philfreo

9
На жаль, це не перехресний браузер, тому я б радив не використовувати, type=numberякщо вам доведеться приховувати ці стрілки. Наприклад, вони все ще відображатимуться в Opera, і вони почнуть відображатися в Firefox, IE тощо, коли реалізують цей тип введення.
мгol

Мені потрібно використовувати max=та min=атрибути для <input>таких альтернативних рішень, як type="text"недійсний HTML5. Люди також згадують Оперу, включаючи цих спінерів. Чи є рішення для Opera схоже на Safari / Chrome?
unode

2
Для запису Chrome також має input::-webkit-clear-buttonкнопку X
aldo.roman.nurena

2
Станом на 2019 рік, це не працювало для мене у Firefox. Це рішення працює для мене: stackoverflow.com/questions/45396280 / ...
lwitzel

431

На даний момент Firefox 29 додає підтримку числових елементів, тому ось фрагмент для приховування спінерів у веб-браузерах та браузерах на базі 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">


Це плюс "margin: 0" з відповіді antonj - це те, що я використав
Asfand Qazi

Я використовував його без запасу, і здається нормальним (травень 2020 року).
croraf

359

Коротка відповідь:

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:

У поточних версіях Firefox значенням -moz-appearanceвластивості для цих елементів є (за замовчуванням агент користувача) значення number-input. Змінення цього значення textfieldефективно видаляє спінер.

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:

У поточних версіях Chrome вже вказано значення -webkit-appearanceвластивості (агент агент) для цих елементів textfield. Щоб видалити спінер, значення -webkit-appearanceвластивості потрібно змінити noneна ::-webkit-outer-spin-button/ ::-webkit-inner-spin-buttonpseudo-класи (це -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" />

Варто зазначити, що margin: 0використовується для видалення поля в старих версіях Chrome.

Наразі, що стосується написання цього запису, тут використовується стиль користувацьких агентів за замовчуванням у псевдокласі "внутрішня кнопка":

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
мені подобається ця відповідь краще, тому що вона містить відповідну інформацію про Firefox, яку, розробляючи щось, потрібно враховувати. Відповіді лише на веб-кайтах, які ігнорують інші двигуни браузера, залишають бажати кращого
RozzA

додати! важливе значення для рішення firefox. ПОПЕРЕДЖУЙТЕ ЦЕ ===> input [type = "number"] {-moz-izgled: textfield! важливо; }
sajad saderi

126

Відповідно до посібника з кодування досвіду користувачів Apple для мобільного Safari , ви можете використовувати наступне для відображення цифрової клавіатури в браузері iPhone:

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

patternЗ \d*також буде працювати.


5
Незважаючи на вищезазначене, перевірене рішення працює дуже добре для даної проблеми, я вирішив перейти до цього рішення тут. Однією з причин є те, що, наприклад, браузер Opera також показує стрілки, які ви також повинні запобігти. По-друге, я спостерігав більші проблеми в Chrome 17. Там, з одного боку, атрибут 'maxlen' вже не працює; ви можете ввести стільки символів, скільки вам там подобається. З іншого боку, числа, що перевищують певну довжину, просто округляються. Використання цього рішення для "просто відкриття цифрової панелі на пристрої iOS" для мене здається більш безпечним.
січня

Я також пішов з цим рішенням, оскільки у мене був деякий JS, який формував номер у полі введення, коли я вводив текст, і це не працювало з полем числа. Тож ця спрацювала як шарм.
Токімон

19
Наразі це не робить нічого на Android у всіх браузерах. Тестовано на цій тестовій сторінці в браузері 4.2.2, Chrome 28 та Firefox 23 на Android 4.2. Ці браузери просто показують стандартну текстову клавіатуру з цією розміткою.
Rory O'Kane

3
Ось приємне рішення як для Android, так і для iOS: stackoverflow.com/a/31619311/806956
Aaron Gray

1
@AaronGray повернемося до квадратного: це рішення має спінери для робочого столу.
StrangeWill

39

Спробуйте використовувати input type="tel"замість цього. Він вискакує клавіатуру з цифрами, і на ній не відображаються спинові поля. Він не вимагає JavaScript або CSS або плагінів або чогось іншого.


17
Наразі це рішення не здійснює перевірки в будь-яких браузерах, як type=numberце робиться.
Pepijn

5
Клавіатура телефону не така хороша, як цифрова клавіатура , хоча це набагато краще, ніж текстова клавіатура . Клавіатура телефону має нерелевантні літери та символи, пропущені з цифрової клавіатури. (Тестовано на цій сторінці на Android 4.2.)
Rory O'Kane

16
немає "". на клавіатурі tel: - <
gion_13

1
@ RoryO'Kane Цифрова клавіатура має дуже великий недолік, оскільки вона забороняє будь-який вхід, який не є строго числом.
Jochem Kuijpers

4
Це не рішення, а за стандартами HTML5 його дурно. вхід [tel] - для телефонних номерів, вхід [number] - для загальних чисел, включаючи плаваючу крапку. Тож це зовсім не рішення.
Василь Попов

17

Додайте цей 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;
}

згідно з канюзою input[type=number]{ -webkit-appearance }має бути достатньо для хромування, але, звичайно, потрібно також змінити псевдоелементи. будь-яка ідея, чому ??
oldboy

8

Я зіткнувся з цією проблемою із a input[type="datetime-local"] , яка схожа на цю проблему.

І я знайшов спосіб подолати подібні проблеми.

По-перше, ви повинні ввімкнути тіньову функцію хрому за допомогою "DevTools -> Налаштування -> Загальне -> Елементи -> Показати тінь агента користувача DOM"

Тоді ви можете побачити всі затінені елементи DOM , наприклад, для <input type="number">, повний елемент із затіненим DOM є:

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

тінь DOM введення [type = "число"

Згідно з цією інформацією, ви можете скласти деякі CSS, щоб приховати небажані елементи, як сказав @Josh.


3

Не те, про що ви просили, але я роблю це через помилку фокусування в 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";
}

Це може дати вам ідею допомогти у тому, що вам потрібно.


Це не зовсім те, про що я говорив, але через нинішню відсутність стандартизації HTML5 це найкраще представлене рішення. Надання іншого веб-сайту для мобільних пристроїв, ніж для робочого столу (незалежно від того, як він реалізований), здається єдиним способом досягти цього в даний час. Однак мені довелося створити копію елемента і змінити значення 'type' перед тим, як додати його до DOM. Оскільки IE не дозволяє змінювати тип входу, як тільки елемент був доданий до dom.
Алан

3

Це краща відповідь, яку я хотів би запропонувати на курсор миші та без миші

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

що робить margin: 0? також spin-buttonпсевдоелементи, здається, не запускаються hoverв нових браузерах?
oldboy

2

Щоб зробити цю роботу в Safari, я виявив, що додавання! Важливо для налаштування веб-кайтів змушує приховати віджимаючи кнопку.

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.


2

На Firefox для Ubuntu, просто за допомогою

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

зробив трюк для мене.

Додавання

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

Приведе мене до

Невідомий псевдоклас або псевдоелемент '-webkit-external-spin-button'. Рулесет ігнорується через поганий вибір.

кожен раз, коли я намагався. Те саме для внутрішньої кнопки віджиму.


1
-webkit-*призначений для Chrome, -moz-*призначений для mozilla firefox. Ось чому це не спрацювало для вас.
Густавв Гіль

2

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


6
Цю відповідь уже давали кілька разів. Це допомагає прочитати наявні відповіді перед наданням нової, якщо нова є дублікатом.
Дан Даскалеску

1

Можливо, змініть введення числа за допомогою 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';

це добре працювало для моїх цілей


1

У веб-браузерах WebKit і Blink & Browser Of All Kind Of Browser використовуються такі CSS:

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

Які браузери працюватимуть за умови використання webkit? Коли ви відповідаєте на дев'ятирічне запитання з чотирнадцятьма існуючими відповідями, важливо додати пояснення, як і чому працює ваша відповідь, і зазначити, який новий аспект питання відповідає.
Джейсон Аллер

0

Мені це було потрібно для роботи

/* 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була для мене ключовою.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.