用系统滚动条实现NumericUpDown的原理

简介:
我们知道在Windows控件里有一个叫NumericUpDown的控件,使用这个控件后可以用鼠标点击或键盘上下键来微调数字,当然也可以直接输入。这是一个使用方便同时又能限制输入格式的很有用的控件,可惜在Web中却没有提供这个控件,我们只能面对几个土土的INPUT的衍生控件。

    不过也有很多人制作了NumericUpDown这个控件替代品,但是由于Web上同样没有提供ScrollBar这个控件,那些替代品一个通病就是模拟的用来微调那两个button始终不太和谐,而且显示的效果受网页字体的影响很大。最常用的就是用图片了,那样字体一大就完全对不上了,不是看图片不完整,就是看半个数字,真的是很恼火。

    有没有办法借用系统的滚动条来实现NumericUpDown控件中的微调button呢?这个确实比较的难,我们最容易想到的就是使用INPUT type="text"和Select把它们弄成一行高,然后就会出现和Windows的NumericUpDown控件十分相像的微调button。那正好啊,可是问题是这两个控件的滚动条的出现是一个系统的行为,而不是HTML元素的行为(不是指的behavior哦),我们没有办法去读取和设置这滚动条的属性,就象使用Select,我们甚至都做出了外观很professional的NUD控件了,可是却完全没有办法使用脚本读取和设置我们想要的数值

    既然不能响应系统滚动条的任何事件,那么我们就该从别的地方想办法了。使用viewport窗口里的onScroll事件来触发执行,因为只要滚动条有移动,onScroll就会触发,等于间接的俘获了系统滚动条上的点击事件,又因为可以通过onScroll的增量的正负来确定是Up按钮被点击了,还是Down按钮被点击了。那么使用这个特性来实现NumericUpDown控件似乎理所当然了?可是不幸还是有一些问题。

    假如我们使用div元素来做一个NumericUpDown控件,
0 11 1
。这个按钮已经很professinal了,而且不会受字体大小的任何影响。那么问题是什么呢?问题是当我们使用鼠标点击时按钮后,onScroll事件会被触发n(1-4)次@_@。当然使用鼠标滚轮或键盘上下键,也会触发n次onScroll事件。这个n到底可不可以度量呢?幸好是可以的,原来它是受字体大小影响的,当字体时Smallest时,n=1;字体时Smaller时,n=2;字体时Medium、Larger和Largest时,n=3或4。

    那么就算我们要使用onScroll也不能这么去判断n值呀,而且3或4的取值还不一定呢。后来又发现这些onScroll触发时的时间都是一样的,至少使用getTime()获得的毫秒值是相同的。用这个timestamp来判断也有还有问题,怎么都是问题啊,嗯,还真的都是问题。就是怎么去计数这几个timestamp相同的onScroll的问题。这个问题解决了,那么Web上的NumericUpDown控件就将会非常的professinal了


本文转自博客园鸟食轩的博客,原文链接:http://www.cnblogs.com/birdshome/,如需转载请自行联系原博主。

目录
相关文章
Qml实用技巧:在可视元素之前半透明覆盖一个可视元素,阻止鼠标透(界面)传(防止点击到被遮挡的按钮)
Qml实用技巧:在可视元素之前半透明覆盖一个可视元素,阻止鼠标透(界面)传(防止点击到被遮挡的按钮)
Qml实用技巧:在可视元素之前半透明覆盖一个可视元素,阻止鼠标透(界面)传(防止点击到被遮挡的按钮)
|
2月前
|
前端开发 JavaScript
原生撸移动端顶部滚动菜单栏,实现可滚动控制滚动边界动态样式
本文介绍了如何使用原生HTML、CSS和JavaScript创建一个移动端可滚动的顶部菜单栏。文章提供了详细的HTML结构、CSS样式和JavaScript代码,实现了菜单项的横向滚动、边界控制和动态样式变化。同时,还展示了如何通过触摸事件监听来控制菜单项的滚动和激活状态。
55 2
原生撸移动端顶部滚动菜单栏,实现可滚动控制滚动边界动态样式
|
14天前
|
前端开发 UED
在响应式布局中,如何避免 overflow 属性法导致的滚动条显示问题?
【10月更文挑战第27天】可以在响应式布局中有效地避免因`overflow`属性法导致的滚动条显示问题,提高页面的布局美观度和用户体验,使页面在不同的设备和屏幕尺寸下都能够呈现出良好的视觉效果和交互性能。
|
3月前
|
前端开发 图形学
小功能⭐️3DCanvas交互方法、Unity自动调整文本框大小、改变文字大小和颜色
小功能⭐️3DCanvas交互方法、Unity自动调整文本框大小、改变文字大小和颜色
|
4月前
Element UI【详解】el-scrollbar 滚动条组件 —— 监听滚动条的滚动,跟随页面一起滚动,获取滚动距离,隐藏水平滚动条等
Element UI【详解】el-scrollbar 滚动条组件 —— 监听滚动条的滚动,跟随页面一起滚动,获取滚动距离,隐藏水平滚动条等
1153 0
|
6月前
|
小程序
微信小程序scroll-view横向滚动和纵向滚动实现(亲测管用)
微信小程序scroll-view横向滚动和纵向滚动实现(亲测管用)
|
6月前
简单讲述ondragstart、drag、ondragend、ondragenter、ondragover、ondrop、ondragleave七个与拖拽相关的监听事件,并运用实现拖拽过程放置样式变化
简单讲述ondragstart、drag、ondragend、ondragenter、ondragover、ondrop、ondragleave七个与拖拽相关的监听事件,并运用实现拖拽过程放置样式变化
|
iOS开发
iOS开发 - 渐变导航条升级版(判断滚动的方向和改变方向时的位置)
iOS开发 - 渐变导航条升级版(判断滚动的方向和改变方向时的位置)
136 0
iOS开发 - 渐变导航条升级版(判断滚动的方向和改变方向时的位置)
|
前端开发 JavaScript Serverless
移动端弹出阴影遮罩的几点问题和解决方法
在做移动端的立即购买页面时,点击底部固定栏立即购买按钮需要弹出一个阴影遮罩,在遮罩顶部有一个固定在底部的页面,所以总共是3层页面:最底层浏览页->阴影遮罩页->最上层的立即购买选择规格数量页;效果如下图:
227 0
移动端弹出阴影遮罩的几点问题和解决方法
|
小程序
小程序隐藏滚动条但还能继续滚动
小程序隐藏滚动条但还能继续滚动
155 0