表单上的文本输入可用于提交数字。 常见的用途是电子商务网站上的“数量”输入。 从用户的角度来看,更改数量值需要按 Tab 键或单击输入,删除其当前内容,然后输入新值。 预期行为,没有人会因为你这样做而责怪你,但这些数字输入可以更友好一些。 通过使用 JavaScript(是的,jQuery),让我们就来做吧。
干净的 HTML
这是表单标记。 没有添加额外的内容,只是干净的 HTML。 没有 JavaScript,此表单将完美运行,并且没有多余的内容。
<form method="post" action="">
<div>
<label for="name">French Hens</label>
<input type="text" name="french-hens" id="french-hens" value="3">
</div>
<div>
<label for="name">Turtle Doves</label>
<input type="text" name="turtle-doves" id="turtle-doves" value="2">
</div>
<div>
<label for="name">Partridges</label>
<input type="text" name="partridge" id="partridge" value="1">
</div>
<input type="submit" value="Submit" id="submit">
</form>
CSS...
...并不十分有趣。 也许有几点需要注意。 所有内容都向左浮动,DIV 具有隐藏溢出以清除浮动。 标签是块显示和文本对齐右以获得网格效果。 这里或那里进行了像素调整以使事物对齐。 我没有花太多时间在这个问题上,因此您可能会看到一些跨浏览器差异。
制作一些按钮
使用 Photoshop 制作几个按钮。 也许可以使用精灵图吧? 我将在下载中包含 PSD,以防您想使用这些按钮。

追加增量按钮
我们需要将这些按钮追加到每个输入框。 您会在标记中注意到每个标签/输入框对都包装在一个 DIV 中。 这是个好习惯,这样标签输入框就会在自己的行上换行(更具可读性),以防 CSS 被关闭。 这也是某些 DOCTYPE 进行验证所必需的。 而且,它是我们可以用来追加这些按钮的理想小钩子。
$(function() {
$("form div").append('<div class="inc button">+</div><div class="dec button">-</div>');
});
每个按钮有两个类,一个通用的“按钮”类,它将包含 90% 的样式,以及我们将用来绑定点击事件的类。 另一个唯一的类用于调整背景位置并使用精灵图。
让它们生效
“白话”
- 缓存选择器
- 保存输入框的“旧”值(点击时的值)
- 如果点击了“加号”按钮…
- …将值增加 1
- 否则,如果点击了“减号”按钮…
- …将值减少 1
- 将新值放入输入框
$(".button").on("click", function() {
var $button = $(this);
var oldValue = $button.parent().find("input").val();
if ($button.text() == "+") {
var newVal = parseFloat(oldValue) + 1;
} else {
// Don't allow decrementing below zero
if (oldValue > 0) {
var newVal = parseFloat(oldValue) - 1;
} else {
newVal = 0;
}
}
$button.parent().find("input").val(newVal);
});
上面的代码完成了我们所描述的所有操作,并带有一些额外的逻辑。 在它减少值之前,它会确保该数字至少为 1 或更高。 这将防止该值变为负数(至少通过使用这些按钮是如此)。 这对于“数量”类型的输入框来说是不言而喻的,但如果您的使用场景不需要此功能,只需删除该“if”包装。
还有一些关于 AJAX 保存的注释行。 如果您的应用程序是动态的,您可能希望在按下按钮后自动保存该值,使其感觉更像桌面应用程序。
如果您要这样做,您可以使用类似这样的代码(也许)
var id = $button.attr("id");
$.ajax({
type: "POST",
url: "dosomething.php?id=" + id + "&newvalue=" + newVal,
success: function() {
$button.parent().find("input").val(newVal);
}
});
您可能需要移除点击函数的最后一行,该行更新了该值,并将该代码留在上面的“成功”子函数中。 这样,只有在 AJAX 保存成功时,该数字才会在视觉上更新。
查看
MooTools
和往常一样,David Walsh 提供了 移植到 MooTools 的版本。
您可以尝试添加一项功能,即用户按住鼠标按钮时,会继续增加总计。
谢谢 Chris!
很棒的教程。 但是,我不赞成“比打字更容易”的说法; 至少并不总是如此。 我认为输入任何大于 10 的数字(20、30……1000)都比使用按钮更容易。
敬礼/k
确实如此。 即使是 10 也太多了,我同意。 您需要根据应用程序来平衡这种技术。
例如,在库存应用程序中,需要在销售发生时减少库存。 平均每次销售 1-5 件商品。 每次都需要在脑海中进行计算并手动输入新数字会让人感觉很糟糕,更不用说更容易出错。 看看销售数量,然后点击相应的按钮,这样更容易多了。
不要忘记,用户*不必*使用这些按钮。 输入框仍然是一个完全正常运行的输入框!
很好的讲解,谢谢。 不过,我宁愿不要经常看到这个,就像 kongondo 所说,我更喜欢输入数字。
也许这对移动应用程序有用,以及在输入数字不是重点,而是“更多”和“更少”的比例的情况下,但为什么不直接在范围内点击(例如,使用星级评定)呢。
哦,这太棒了!
我不同意 David S. 的观点,您没有义务使用这些按钮,可以选择输入数字。
众所周知,用户不会阅读,他们只是“看”,我认为添加这种功能可以为用户提供更多关于他们应该在这里输入哪些数据的提示。
我再次访问了这个页面,就像时钟一样,Chris,您总是有一些我正在寻找或可能在我的当前设计中使用的东西。
非常感谢您所做的一切!
当有人输入全是字母的时候,使用 parseInt 转义。 否则,您会遇到 NaN 错误。
很棒的教程… 但最好教我们如何使用“鼠标滚轮”。
Chris 又一次做得很棒:)!
很棒的技术,正如 heldopslippers 所说,用户可以选择是输入数字还是想要一个非常大的值。
我认为,对这一点的补充是能够在悬停在输入框上时使用滚轮更改值。 以及按上箭头键和下箭头键。
对这一点的补充是检测鼠标按下(持续很长时间)并相应地增加。
对用户来说,一个小的反馈是做一个点击时图片变化(就像悬停状态的精灵图) (这应该不是什么大问题)。
可能是 Safari 的一个小 bug(或者是有意的,我不知道)。
当你点击 + 或 - 按钮时,它会高亮显示图片和一些背景……
我不确定最简单的解决方法是什么!
抱歉……我刚弄清楚是什么问题。如果点击太快,Safari 会将其视为双击,而不是向前,而是高亮显示图片。
有什么想法吗?
我认为在所有浏览器中,并且在我看来已经好很多的方法是,而不是在一个 div 中添加按钮,而是将它们创建为 input type="image"。
这样你就可以保留 Tab 键的功能(虽然在这种情况下,使用键盘的用户可以直接输入数字)。
嘿 Chris,别误会我的意思,我喜欢你放进去的迷你教程,但我认为你正在失去对“css-tricks”的关注;)
这个网站很久以前就不是只关于 CSS Tricks 了。新的口号更像是“所有与网页设计相关的事物”。
是时候将域名更改为 web-tricks.com 了?:-))
是的……你的教程和网站很棒……每天早上都是我浏览的第一站……我花了大约两个星期才看完你做的所有 screencasts……
Chris,干得好!
继续努力!
有趣。我会尝试一下。谢谢。
酷,谢谢 Chris。喜欢这个网站,太棒了!
继续努力。
jQuery UI 已经有了这个功能。它还支持在按住鼠标按钮时自动递增,以及可选的鼠标滚轮支持。
http://docs.jquery.com/UI/Spinner
不错。我认为对此的一个很好的补充是,让它可以在将鼠标悬停在其上时使用鼠标滚轮来更改值。
如果您可以限制输入框只接受数字,那就更好了。
刚刚意识到对圣诞节十二天的点头lol。
生活中就是这些小事。继续努力,Chris!
我把它做成了一个插件,但我想要发布到 plugins.jquery.com 网站上。我只是想确认一下这样做是否可以?我还想知道是否可以将你为按钮制作的图片用于插件,并在其中添加一些额外的功能?
谢谢
去做吧。
不错!谢谢,现在我会使用它。
非常方便,谢谢!
不错的文章。
顺便说一下,它不能低于 0,例如负数lolz吗?
我非常喜欢这个想法,加上 Baylor Rae 提到的功能,这将非常棒。
我想知道这是否可行……添加它,这样你就可以在点击时按住按钮,这将不断增加整数,然后加快数量?
哇!这看起来很棒,我们肯定会在下一个设计中使用它。太方便了!
干杯,
我是这个博客的忠实粉丝,再次感谢。
我不确定这对这篇特定文章是否有意义,但我刚刚完成了一些关于微调器小部件名称的研究。有机会时看看。如果其他用户正在研究实现此功能的最佳方法,他们可能会发现这些信息很有用……
“数字微调器”是这个小部件的最佳名称吗?
http://uxfindings.blogspot.com/2014/06/is-numeric-spinner-best-name-for-this.html
哇,Chris,我查看了演示,看到了我们应该使用 type="number" 的更新。为我节省了不少时间。谢谢!