【发布时间】:2021-03-17 08:40:19
【问题描述】:
总结
我需要一个范围从 1,000 到 10,000,000 的数字输入。由于范围大,它不能是线性的。因此,每次小数长度增加(例如从 1000 到 10000)时,步数也应该增加。
#--------------------#--------------------#--------------------#--------------------#
0 1000 5000 9000 10,000 56,498 100,000 500,000 1,000,000 10,000,000
尝试失败
我已经尝试创建一个从 1 到 5 的滑块范围(有 4 个步骤)并插入值,但我无法让它工作,所以当小数增加时,步骤同时增加。
我也试过这个解决方案:Logarithmic slider 它比线性行为要好,但开始(左)的步骤仍然太小,最后(范围滑块的右端)太大。
附加要求
此范围滑块还必须连接到输入字段。所以输入值也必须写回滑块(所以某种逆向计算输入 范围滑块)。
上面链接的对数滑块解决方案的调整版本:
function LogSlider(options) {
options = options || {};
this.minpos = options.minpos || 0;
this.maxpos = options.maxpos || 100;
this.minlval = Math.log(options.minval || 1);
this.maxlval = Math.log(options.maxval || 100000);
this.scale = (this.maxlval - this.minlval) / (this.maxpos - this.minpos);
}
LogSlider.prototype = {
// Calculate value from a slider position
value: function(position) {
return Math.exp((position - this.minpos) * this.scale + this.minlval);
},
// Calculate slider position from a value
position: function(value) {
return this.minpos + (Math.log(value) - this.minlval) / this.scale;
}
};
// Usage:
var logsl = new LogSlider({maxpos: 300, minval: 1000, maxval: 10000000});
$('#slider').on('change input', function() {
var val = logsl.value(+$(this).val());
// console.log(val);
var rounded = Math.round(val / 1000) * 1000;
var localized = rounded.toLocaleString('DE');
$('#value').val(localized);
});
$('#value').on('keyup', function() {
var val = +($(this).val().toString().replace(/[\D]/g,''));
//console.log(this.value, val);
var pos = logsl.position(val);
//console.log(pos);
$('#slider').val(pos);
});
$('#value').val("10000").trigger("keyup");
#slider {
width: 300px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
Input value or use slider:
<input id="value" />
<input id="slider" type="range" min="0" max="300" />
最小的步数是 1,000。在这里您可以看到,在 1,000 到 2,000 之间,大约有 20 px 的空间。但在非常高的数字上,步数高达 300,000 以上。所以不是最好的用户体验。如上图所示,您至少应该能够以 100,000 的步长输入。
【问题讨论】:
-
你想要多少步?
-
你的最小值和最大值的对数(以 10 为底)等于 3 和 7。我不明白你所说的“太小和太大”是什么意思。
-
太小,太大,4个步骤 - 我真的无法想象你到底尝试了什么。
-
@NinaScholz 理想情况下,滑块宽度以像素为单位
-
我更新了描述并添加了来自链接解决方案的自定义代码 sn-p 以更好地解释问题。希望它能澄清一些事情!
标签: javascript algorithm math range calculation