通过考虑共享剩余 % 的每个范围的值,在 4 个范围输入之间共享 100%
Share 100% between 4 range inputs by taking into account the value of each range for sharing the remaining %
我有 4 个输入,我试图根据它们之前的值来分享它们的权益值。
我想要实现的是,例如,如果我有一个字段为 50%,另一个字段为 25%,其余字段将为 12.5%
如果我有两个 29.75% 的字段和一个 39.5% 的字段,最后一个将是 1%
如果我有一个 75% 的字段和一个 20% 的字段,其他字段将为 2.5%
等等。
以下是我迄今为止尝试失败的方法:
let ranges = [a,b,c,d];
let old_value = 1;
for(let rang of ranges)
{
rang.onfocus=(e)=>{
old_value=parseInt(e.target.value);
}
rang.onchange=(e)=>{
console.log(old_value);
let sortedRanges = ranges.filter(el=>el.name!=e.target.name);
for(let cur of sortedRanges)
cur.value-= (parseInt(e.target.value) - old_value)/4;
old_value = e.target.value;
}
}
<input name="a" id="a" type="range" value="25" min="1" max="100"/>
<input name="b" id="b" type="range" value="25" min="1" max="100"/>
<input name="c" id="c" type="range" value="25" min="1" max="100"/>
<input name="d" id="d" type="range" value="25" min="1" max="100"/>
我也尝试研究比例,例如,如果我有一个字段,以前是 25,现在是 40,表示比例因子为 1.6,但还没有弄清楚这有什么用.
此外,简单得多的简单方法是将剩余百分比除以 3 并不能将其削减,就好像另一个字段作为不同的值一样,剩余的三个字段之间没有规则的比率。
建议。
const ranges = [a,b,c,d];
ranges.forEach(rangeElement => {
rangeElement.addEventListener('change', ({target: { value } }) => {
rangeElement.setAttribute('value', (+value).toFixed(2));
const rangeIndex = ranges.indexOf(rangeElement)
const previousRanges = ranges.slice(0, rangeIndex);
const nextRanges = ranges.slice(rangeIndex + 1);
const sumOfPrevious = +value + previousRanges.reduce((acc, {value}) => acc + +value, 0)
const valueOfRest = ((100 - sumOfPrevious) / nextRanges.length).toFixed(2)
nextRanges.forEach(range => range.setAttribute('value', valueOfRest));
})
})
input::after {
content: attr(value);
}
<input name="a" id="a" type="range" value="25" min="1" max="100"/>
<input name="b" id="b" type="range" value="25" min="1" max="100"/>
<input name="c" id="c" type="range" value="25" min="1" max="100"/>
<input name="d" id="d" type="range" value="25" min="1" max="100"/>
我有 4 个输入,我试图根据它们之前的值来分享它们的权益值。
我想要实现的是,例如,如果我有一个字段为 50%,另一个字段为 25%,其余字段将为 12.5% 如果我有两个 29.75% 的字段和一个 39.5% 的字段,最后一个将是 1% 如果我有一个 75% 的字段和一个 20% 的字段,其他字段将为 2.5% 等等。
以下是我迄今为止尝试失败的方法:
let ranges = [a,b,c,d];
let old_value = 1;
for(let rang of ranges)
{
rang.onfocus=(e)=>{
old_value=parseInt(e.target.value);
}
rang.onchange=(e)=>{
console.log(old_value);
let sortedRanges = ranges.filter(el=>el.name!=e.target.name);
for(let cur of sortedRanges)
cur.value-= (parseInt(e.target.value) - old_value)/4;
old_value = e.target.value;
}
}
<input name="a" id="a" type="range" value="25" min="1" max="100"/>
<input name="b" id="b" type="range" value="25" min="1" max="100"/>
<input name="c" id="c" type="range" value="25" min="1" max="100"/>
<input name="d" id="d" type="range" value="25" min="1" max="100"/>
我也尝试研究比例,例如,如果我有一个字段,以前是 25,现在是 40,表示比例因子为 1.6,但还没有弄清楚这有什么用.
此外,简单得多的简单方法是将剩余百分比除以 3 并不能将其削减,就好像另一个字段作为不同的值一样,剩余的三个字段之间没有规则的比率。
建议。
const ranges = [a,b,c,d];
ranges.forEach(rangeElement => {
rangeElement.addEventListener('change', ({target: { value } }) => {
rangeElement.setAttribute('value', (+value).toFixed(2));
const rangeIndex = ranges.indexOf(rangeElement)
const previousRanges = ranges.slice(0, rangeIndex);
const nextRanges = ranges.slice(rangeIndex + 1);
const sumOfPrevious = +value + previousRanges.reduce((acc, {value}) => acc + +value, 0)
const valueOfRest = ((100 - sumOfPrevious) / nextRanges.length).toFixed(2)
nextRanges.forEach(range => range.setAttribute('value', valueOfRest));
})
})
input::after {
content: attr(value);
}
<input name="a" id="a" type="range" value="25" min="1" max="100"/>
<input name="b" id="b" type="range" value="25" min="1" max="100"/>
<input name="c" id="c" type="range" value="25" min="1" max="100"/>
<input name="d" id="d" type="range" value="25" min="1" max="100"/>