A Bootstrap 4 / jQuery plugin to create input spinner elements for number input.
Screenshot with floating point example and german localization.
The Bootstrap 4 InputSpinner
- is mobile friendly and responsive,
- automatically changes the value when holding a button,
- has internationalized number formatting,
- allows setting a prefix or a suffix text in the input,
- handles
val()
like the native element, - dynamically handles changing attribute values like
disabled
orclass
, - dispatches
change
andinput
events on value change like the native element and - works without extra css, only bootstrap 4 is needed.
npm install bootstrap-input-spinner
Or just download the GitHub repository and include src/bootstrap-input-spinner.js
.
Create the element in HTML. The attributes are compatible to the native input[type="number"]
element.
<input type="number" value="50" min="0" max="100" step="10"/>
It is a jQuery plugin.
So, enable the InputSpinner for all inputs with type='number'
with the following script.
<script src="./src/bootstrap-input-spinner.js"></script>
<script>
$("input[type='number']").inputSpinner();
</script>
Thats it. No extra css needed, just Bootstrap 4 and jQuery.
<input type="number" value="4.5" min="0" max="9" step="0.1" data-decimals="2" data-suffix="°C"/>
Use these attributes to configure the behaviour
value
// starting value on element creationmin
// minimum value when steppingmax
// maximum value when steppingstep
// step sizeinputmode
// the "inputmode" of the input, defaults to "decimal" (shows decimal keyboard on touch devices)data-decimals
// shown decimal placesdata-digit-grouping
// "false" to disable grouping (thousands separator), default is "true"data-prefix
// show a prefix text in the input elementdata-suffix
// show a suffix text in the input element
The InputSpinner also handles the standard input attributes required
, disabled
, readonly
and placeholder
.
Use JavaScript to create the instance as a jQuery plugin. You may provide additional configuration in an object as a config parameter.
$(element).inputSpinner(config);
The default configuration is
var props = {
decrementButton: "<strong>−</strong>", // button text
incrementButton: "<strong>+</strong>", // ..
groupClass: "", // css class of the resulting input-group
buttonsClass: "btn-outline-secondary",
buttonsWidth: "2.5rem",
textAlign: "center", // alignment of the entered number
autoDelay: 500, // ms threshold before auto value change
autoInterval: 50, // speed of auto value change
buttonsOnly: false, // set this `true` to disable the possibility to enter or paste the number via keyboard
keyboardStepping: true, // set this to `false` to disallow the use of the up and down arrow keys to step
locale: navigator.language, // the locale, per default detected automatically from the browser
template: // the template of the input
'<div class="input-group ${groupClass}">' +
'<div class="input-group-prepend"><button style="min-width: ${buttonsWidth}" class="btn btn-decrement ${buttonsClass} btn-minus" type="button">${decrementButton}</button></div>' +
'<input type="text" inputmode="decimal" style="text-align: ${textAlign}" class="form-control form-control-text-input"/>' +
'<div class="input-group-append"><button style="min-width: ${buttonsWidth}" class="btn btn-increment ${buttonsClass} btn-plus" type="button">${incrementButton}</button></div>' +
'</div>'
}
HTML of the texts inside the buttons.
Additional css class for the input-group
, results in
<div class="input-group ${groupClass}">
The css class of the buttons. Use it to style
the increment and decrement buttons as described here.
Maybe buttonsClass: btn-primary
or btn-success
or whatever type of buttons you want.
The width of the increment and decrement buttons.
The text alignment inside the <input>
The delay in ms after which the input automatically changes the value, when holding the increment or decrement button.
Speed of the value change when holding the button in ms. A lower value makes it faster.
In buttonsOnly
mode (set true
) no direct text input is allowed, the text-input
gets the attribute readonly
. But the plus and minus buttons still allow to change the value.
In keyboardStepping
mode (set true
) allows the use of the up/down arrow keys to increase/decrease the number by the step.
Used to format the number in the UI. Detected automatically from the users browser, can be set to "de", "en",… or "de_DE", "en_GB",….
To change or read the value just use the jQuery val()
function
on the input, like this
var currentValue = $(element).val() // read
$(element).val(newValue) // write
Hint: Reading the value in vanilla JS with
element.value
will also work, but to set the value you have to useelement.setValue(newValue)
or$(element).val(newValue)
The attributes
min
, max
, step
, decimals
, placeholder
, required
, disabled
, readonly
and class
are handled dynamically. The class
attribute value is dynamically copied to the input element.
If the original elements class is set to form-control-sm
of form-control-lg
the class of the resulting input-group is
dynamically set to input-group-sm
or input-group-lg
.
The InputSpinner handles input
and change
events like the native element.
element.addEventListener("change", function(event) {
newValue = this.value
})
$(element).on("change", function (event) {
newValue = $(this).val()
})
Methods are passed as string values instead of the options object.
Removes the InputSpinner and shows the original input element.
$(element).inputSpinner("destroy")
I don't provide a minified version because I think it should be up to the using programmer to create minified versions, with all the used script sources concatenated to one file.
But, if you want it, it is easy to create your minified version with uglify: https://www.npmjs.com/package/uglify-js
Just install uglify
npm install uglify-js -g
and then in the src-folder
uglifyjs bootstrap-input-spinner.js --compress --mangle > bootstrap-input-spinner.min.js
Violà! :)
The spinner works in all modern browsers and in the Internet Explorer. Not tested with IE < 11.
For older browsers (IE 9 or so), that doesn't support Intl
, when you get an error message like
"Intl is not defined" (See issue #34),
just use a shim or polyfill like Intl.js, and it works.
If you like this component, you may want to check out our other Bootstrap and HTML extensions bootstrap-show-modal, bootstrap-detect-breakpoint, auto-resize-textarea and external-links-blank.