Настройка стрелок приращения на входе типа Number с помощью CSS

У меня есть вход типа number, который отображается с помощью следующего кода:

<input class="quantity" id="id_form-0-quantity" min="0" name="form-0-quantity" value="1" type="number">

это выглядит так:

enter image description here

Я хотел бы превратить его в что-то вроде этого:

enter image description here

второй вид эмулируется с помощью двух отдельных кнопок.

Как я могу стиль стрелки, как описано?

1 ответов


родной input[type=number] элементы управления не стиль в состоянии кросс-браузер. Самый простой и безопасный способ достичь того, что вы хотите кросс-браузер/кросс-устройство, чтобы скрыть их с помощью:

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

...что позволяет вам использовать пользовательские кнопки, которые могут быть связаны для выполнения функций, которые будут выполнять прядильщики (стрелки) (.stepUp() и .stepDown()), при условии, что вы сохраните входные данные type="number".

для пример:

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

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

.number-input {
  border: 2px solid #ddd;
  display: inline-flex;
}

.number-input,
.number-input * {
  box-sizing: border-box;
}

.number-input button {
  outline:none;
  -webkit-appearance: none;
  background-color: transparent;
  border: none;
  align-items: center;
  justify-content: center;
  width: 3rem;
  height: 3rem;
  cursor: pointer;
  margin: 0;
  position: relative;
}

.number-input button:before,
.number-input button:after {
  display: inline-block;
  position: absolute;
  content: '';
  width: 1rem;
  height: 2px;
  background-color: #212121;
  transform: translate(-50%, -50%);
}
.number-input button.plus:after {
  transform: translate(-50%, -50%) rotate(90deg);
}

.number-input input[type=number] {
  font-family: sans-serif;
  max-width: 5rem;
  padding: .5rem;
  border: solid #ddd;
  border-width: 0 2px;
  font-size: 2rem;
  height: 3rem;
  font-weight: bold;
  text-align: center;
}
<div class="number-input">
  <button onclick="this.parentNode.querySelector('input[type=number]').stepDown()" ></button>
  <input class="quantity" min="0" name="quantity" value="1" type="number">
  <button onclick="this.parentNode.querySelector('input[type=number]').stepUp()" class="plus"></button>
</div>

Примечание: чтобы изменить значение входного сигнала, нужно его найти. Чтобы обеспечить гибкость, в приведенном выше примере я сгруппировал кнопки и <input> под общим родителем и использовал этого родителя, чтобы найти <input> (выбор не полагаться на их близость или конкретный порядок в DOM). Вышеуказанный метод будет input[type=number] родной брат пуговицы!--49-->. Если это не удобно, можно использовать любые другие методы для поиска ввода с кнопок:

  • by id: .querySelector('#some-id'):
<button onclick="this.parentNode.querySelector('#some-id').stepUp()"></button>
  • by className: .querySelector('.some-class'):
<button onclick="this.parentNode.querySelector('.some-class').stepUp()"></button>

также обратите внимание на приведенные выше примеры поиска только внутри .parentNode, а не во всем document, что также возможно:
я.е: onclick="document.getElementById('#some-id').stepUp()"

  • by близость (previousElementSibling | nextElementSibling)
<button onclick="this.previousElementSibling.stepUp()"></button>
  • любой другой способ определить и найти конкретный входной элемент в структуре DOM. Например, можно использовать сторонние библиотеки, такие как jQuery:
<button onclick="$(this).prev()[0].stepUp()"></button>

важным примечанием при использовании jQuery является то, что stepUp() и stepDown() методы размещаются на элементе DOM, а не на оболочке jQuery. дом элемент находится внутри 0 свойства jQuery фантик.


Примечание on preventDefault(). Щелчок <button> внутри <form> будет запуск отправки формы. Поэтому, если используется как указано выше, внутри формы,onclick также должен содержать preventDefault();. Пример:

<button onclick="$(this).prev()[0].stepUp();preventDefault()"></button>

однако, если использовать <a> теги вместо <button>s, это не обязательно. Кроме того, профилактика может быть установлена глобально для всех форм кнопки с небольшим фрагментом JavaScript:

var buttons = document.querySelectorAll('form button:not([type="submit"])');
for (i = 0; i < buttons.length; i++) {
  buttons[i].addEventListener('click', function(e) {
    e.preventDefault();
  });
}

... или, с помощью jQuery:

$('form').on('click', 'button:not([type="submit"])', function(e){
  e.preventDefault();
})