代码
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 次第一次迭代的示例输出:
i
0
0%6
0
0-3
-3
Math.abs(-3)
3
i
1
1%6
1
1-3
-2
Math.abs(-2)
2
i
2
2%6
2
2-3
-1
Math.abs(-1)
1
i
3
3%6
3
3-3
0
Math.abs(0)
0
i
4
4%6
4
4-3
1
Math.abs(1)
1
i
5
5%6
5
5-3
2
Math.abs(2)
2
i
6
6%6
0
0-3
-3
Math.abs(-3)
3
i
7
7%6
1
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
需要乘以您的最大值并四舍五入(目标值)。