代码
let i = 0;
setInterval(() => {
console.log(Math.abs(i++%6 - 3))
}, 1000);
解构
i++→i每次滴答都会无限增加
%6→ 最大 vvalue 的两倍的模(除法剩余 ex. 10 % 6 = 4)
- 3→ 删除范围(因此数字将始终介于 3 和 -3 之间,否则将介于 0 和 6 之间)
Math.abs()→ 删除 - (确保数字从 0 移动到 3 并返回)
可视化的步骤
我++
∞ .
.
.
/
/
/
/
0
我++%6
6
/ / / .
/ / / .
/ / / .
/ / / /
/ / / /
0
我++%6-3
3
\ /\ /\
\ / \ / \
0 \ / \ / .
\ / \ / .
\/ \/ .
-3
数学.abs(i++%6-3)
3
\ /\ /.
\ / \ / .
\/ \/ .
0
8 次第一次迭代的示例输出:
i0
0%60
0-3-3
Math.abs(-3)3
i1
1%61
1-3-2
Math.abs(-2)2
i2
2%62
2-3-1
Math.abs(-1)1
i3
3%63
3-30
Math.abs(0)0
i4
4%64
4-31
Math.abs(1)1
i5
5%65
5-32
Math.abs(2)2
i6
6%60
0-3-3
Math.abs(-3)3
i7
7%61
1-3-2
Math.abs(-2)2
实现示例
const max = 10
let i = max;
const $body = document.querySelector('body');
setInterval(() => {
const val = Math.abs(i++%(max * 2) - max);
const $el = document.createElement('i');
$el.style = `--i: ${i}; --val: ${val}`;
$body.appendChild($el);
window.scrollTo(window.innerWidth, 0);
console.log(val);
}, 200);
i {
--i: 0;
--val: 0;
--size: 10px;
position: absolute;
background: black;
width: var(--size);
height: var(--size);
top: var(--size);
left: calc(-10 * var(--size));
transform: translate(
calc(var(--i) * var(--size)),
calc(var(--val) * var(--size))
)
}
替代方法
Math.acos(Math.cos(i * Math.PI)) / Math.PI;
或者
Math.abs(i - Math.floor(i) - .5);
i之间float在哪里0- Infinity。结果也是float需要乘以您的最大值并四舍五入(目标值)。