And*_*hiu 61
本机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;
}
Run Code Online (Sandbox Code Playgroud)
...允许您使用自定义按钮,可以链接到执行旋转器(箭头)将(.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;
}Run Code Online (Sandbox Code Playgroud)
<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>Run Code Online (Sandbox Code Playgroud)
注意:为了更改输入的值,需要找到它.为了提供灵活性,在上面的示例中,我将按钮分组并<input>在公共父级下使用该父级来查找<input>(选择不依赖于它们在DOM中的接近度或特定顺序).上面的方法会将任何 input[type=number] 兄弟更改为按钮.如果这不方便,可以使用任何其他方法从按钮中查找输入:
.querySelector('#some-id'):<button onclick="this.parentNode.querySelector('#some-id').stepUp()"></button>
Run Code Online (Sandbox Code Playgroud)
.querySelector('.some-class'):<button onclick="this.parentNode.querySelector('.some-class').stepUp()"></button>
Run Code Online (Sandbox Code Playgroud)
另请注意,以上示例仅在内部搜索.parentNode,而不是在整个内部搜索document,这也是可能的:
即:onclick="document.getElementById('#some-id').stepUp()"
previousElementSibling| nextElementSibling)<button onclick="this.previousElementSibling.stepUp()"></button>
Run Code Online (Sandbox Code Playgroud)
<button onclick="$(this).prev()[0].stepUp()"></button>
Run Code Online (Sandbox Code Playgroud)
使用jQuery时的一个重要注意事项是,stepUp()和stepDown()方法放在DOM元素上,而不是放在jQuery包装器上.DOM元素位于包装器的0属性中jQuery.
注意上preventDefault().单击<button>内部a <form> 将触发表单提交.因此,如果按上述方式使用,onclick则应包含内部表格preventDefault();.例:
<button onclick="$(this).prev()[0].stepUp();preventDefault()"></button>
Run Code Online (Sandbox Code Playgroud)
但是,如果使用<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();
});
}
Run Code Online (Sandbox Code Playgroud)
...或者,使用jQuery:
$('form').on('click', 'button:not([type="submit"])', function(e){
e.preventDefault();
})
Run Code Online (Sandbox Code Playgroud)
Bla*_*ack 14
这是另一个版本,基于 @tao 的答案,使用 font-awesome:
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:after {
display: inline-block;
position: absolute;
font-family: "Font Awesome 5 Free";
font-weight: 900;
content: '\f077';
transform: translate(-50%, -50%) rotate(180deg);
}
.number-input button.plus:after {
transform: translate(-50%, -50%) rotate(0deg);
}
.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;
}Run Code Online (Sandbox Code Playgroud)
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.2/css/all.min.css" integrity="sha512-HK5fgLBL+xu6dm/Ii3z4xhlSUyZgTT9tuc/hSrtw6uzJOvgRr2a9jyxxT1ely+B+xFAmJKVSTbpM/CuL7qxO8w==" crossorigin="anonymous" />
<div class="number-input">
<button onclick="this.parentNode.querySelector('input[type=number]').stepDown()" class="minus"></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>Run Code Online (Sandbox Code Playgroud)
可以使用我最近发现的以下脚本以这种方式对数字输入进行样式化:
演示。
这个脚本是一个超轻量级(1.49kb 未压缩、0.71kb 压缩、0.35kb gzip 压缩)、可用且可靠的数量输入,它取代了浏览器中数字输入内置的可怕的、繁琐的小输入按钮。它是使用 ES6 模块编写的,因此需要为旧浏览器进行转译。
作者的存储库在这里。希望这可以帮助 ;)
编辑: 或者,如果您想要使用向上/向下箭头按钮而不是加号/减号按钮,还有另一个基于 jQuery 的解决方案。
$(document).ready(function () {
jQuery('<div class="quantity-nav"><button class="quantity-button quantity-up"></button><button class="quantity-button quantity-down"></button></div>').insertAfter('.quantity input');
jQuery('.quantity').each(function () {
var spinner = jQuery(this),
input = spinner.find('input[type="number"]'),
btnUp = spinner.find('.quantity-up'),
btnDown = spinner.find('.quantity-down'),
min = input.attr('min'),
max = input.attr('max');
btnUp.click(function () {
var oldValue = parseFloat(input.val());
if (oldValue >= max) {
var newVal = oldValue;
} else {
var newVal = oldValue + 1;
}
spinner.find("input").val(newVal);
spinner.find("input").trigger("change");
});
btnDown.click(function () {
var oldValue = parseFloat(input.val());
if (oldValue <= min) {
var newVal = oldValue;
} else {
var newVal = oldValue - 1;
}
spinner.find("input").val(newVal);
spinner.find("input").trigger("change");
});
});
});Run Code Online (Sandbox Code Playgroud)
body {
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
min-width: 100vw;
background: #34495E;
font-size: 1rem;
}
.quantity {
position: relative;
}
input[type=number]::-webkit-inner-spin-button,
input[type=number]::-webkit-outer-spin-button {
-webkit-appearance: none;
margin: 0;
}
input[type=number] {
-moz-appearance: textfield;
}
.quantity input {
width: 45px;
height: 42px;
line-height: 1.65;
float: left;
display: block;
padding: 0;
margin: 0;
padding-left: 20px;
border: none;
box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.08);
font-size: 1rem;
border-radius: 4px;
}
.quantity input:focus {
outline: 0;
}
.quantity-nav {
float: left;
position: relative;
height: 42px;
}
.quantity-button {
position: relative;
cursor: pointer;
border: none;
border-left: 1px solid rgba(0, 0, 0, 0.08);
width: 21px;
text-align: center;
color: #333;
font-size: 13px;
font-family: "FontAwesome" !important;
line-height: 1.5;
padding: 0;
background: #FAFAFA;
-webkit-transform: translateX(-100%);
transform: translateX(-100%);
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
-o-user-select: none;
user-select: none;
}
.quantity-button:active {
background: #EAEAEA;
}
.quantity-button.quantity-up {
position: absolute;
height: 50%;
top: 0;
border-bottom: 1px solid rgba(0, 0, 0, 0.08);
font-family: "FontAwesome";
border-radius: 0 4px 0 0;
line-height: 1.6
}
.quantity-button.quantity-down {
position: absolute;
bottom: 0;
height: 50%;
font-family: "FontAwesome";
border-radius: 0 0 4px 0;
}Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="quantity">
<input type="number" min="1" max="9" step="1" value="1">
</div>Run Code Online (Sandbox Code Playgroud)