Frage Anpassen von Inkrementpfeilen bei Eingabe der Typnummer mit CSS


Ich habe eine Eingabe der Typennummer, die mit dem folgenden Code gerendert wird:

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

Es sieht aus wie das:

enter image description here

Ich würde es gerne so machen:

enter image description here

Die zweite Ansicht wird mit zwei separaten Tasten emuliert.

Wie könnte ich die Pfeile wie beschrieben stylen?


8
2017-07-30 04:11


Ursprung


Antworten:


Der Einheimische input[type=number] Steuerelemente sind nicht style-fähigen Cross-Browser. Der einfachste und sicherste Weg, um das zu erreichen, was Sie browserübergreifend / geräteübergreifend erreichen möchten, ist das Ausblenden mit:

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

... mit dem Sie Ihre eigenen Tasten verwenden können, die verknüpft werden könnten, um die Funktionen auszuführen, die die Spinner (Pfeile) (.stepUp() und .stepDown()), vorausgesetzt, Sie behalten die Eingaben bei type="number".

Beispielsweise:

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>


Hinweis: Um den Wert des Inputs zu ändern, muss man ihn finden. Um Flexibilität zu bieten, habe ich im obigen Beispiel Schaltflächen gruppiert <input> unter einem gemeinsamen Elternteil und verwendet dieses Elternteil, um das zu finden <input> (Wahl, sich nicht auf ihre Nähe oder bestimmte Reihenfolge in DOM zu verlassen). Die obige Methode wird sich ändern  input[type=number]  Geschwister zu den Tasten. Wenn das nicht bequem ist, könnte man auch andere Methoden verwenden, um die Eingabe von den Schaltflächen zu finden:

  • durch Ich würde: .querySelector('#some-id'):
<button onclick="this.parentNode.querySelector('#some-id').stepUp()"></button>
  • durch Klassenname: .querySelector('.some-class'):
<button onclick="this.parentNode.querySelector('.some-class').stepUp()"></button>

Beachten Sie auch, dass die oben genannten Beispiele nur innerhalb der .parentNodenicht im Ganzen document, was auch möglich ist:
d.h. onclick="document.getElementById('#some-id').stepUp()"

  • durch Nähe (previousElementSibling | nextElementSibling)
<button onclick="this.previousElementSibling.stepUp()"></button>
  • eine andere Möglichkeit, ein bestimmtes Eingabeelement in einer DOM-Struktur zu bestimmen und zu finden. Zum Beispiel könnte man Bibliotheken von Drittanbietern wie jQuery verwenden:
<button onclick="$(this).prev()[0].stepUp()"></button>

Ein wichtiger Hinweis bei der Verwendung von jQuery ist, dass der stepUp() und stepDown() Methoden werden auf dem DOM-Element und nicht auf dem jQuery-Wrapper platziert. Das DOM-Element befindet sich in der 0 Eigentum der jQuery Verpackung.


Hinweis auf preventDefault(). Klicken auf a <button> in einem <form>  werden Auslöser für die Formularübergabe Daher, wenn wie oben verwendet, Formen, die onclick sollte auch enthalten preventDefault();. Beispiel:

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

Wie auch immer, wenn man es benutzen würde <a> Tags statt <button>s, das ist nicht notwendig. Außerdem kann die Vorbeugung global für alle Formularschaltflächen mit einem kleinen JavaScript-Snippet festgelegt werden:

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

... oder mit jQuery:

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

23
2017-07-30 04:26