关于如何计算input [type="range"]里面小球的位置

349 阅读1分钟

本来用input [type="range"]来做视频进度条,进度条下面有标识来做进度条跳转。

跳转的基本逻辑就是点击标识,视频跳到指定时间,然后进度条小球也跟着跳。

我天真的以为小球的位置是 (时间 / 总时间 * 进度条宽度)

做完了以后发现标识和input里面的小球并不是在一个位置上。

如下图

image.png

正文

如果你也想做一个进度条或者音量的控制器

那么可以看mdn 关于input [type="range"]的介绍,里面站着的,躺着的进度条都有例子。

- HTML: HyperText Markup Language | MDN (mozilla.org)

image.png

image.png

好了现在进入正题

现在先设置value的位置是totalLeft = percent * input width

但是小球的位置不代表input的value所在的位置,这个应该是我们大部分人都会搞错的东西。

5tZGA.jpg

观察上面这张图,发现小球的位置其实和value是有关系的

如果value在4的时候,那么小球的偏移位置是基于4的位置往后偏移offsetWidth = 4 / 10 * 小球的width

那么小球的位置是left = totalLeft - offsetWidth

但是

不对,看起来很像小球偏移了value的percent的大小

于是我在stackoverflow上搜索了一番

找到了这个公式

offset = (percent - 0.5) * 小球宽度

left = totalLeft - offset - 小球宽度一半

实际上公式后面的 - 小球一半宽度是我自己试验使出来的,原本的公式还是有偏移。

我也没搞清楚为什么这样,如果有小伙伴知道,欢迎评论区给我解释一下。

image.png

参考

css - Range input thumb gets offset over time - Stack Overflow

css - How to precisely find thumb position of input [type="range"]? - Stack Overflow