2

我想从 3 倒数到 0,然后循环回 3。这是一种“滑块”实现。一切运行良好,直到到达clearIntervalfrom counterry。我错过了什么?

var counttx = 0, // counter
    counterrx = setInterval(timerrx, 1000), // countup - start
    counterry; // countdown after reach 3

function timerrx(){
    counttx = counttx+1;
    //console.log(counttx);
    if(counttx > 2){
        counterry = setInterval(timerry, 1000); 
        clearInterval(counterrx);
    }
}

function timerry(){
   counttx = counttx-1;
   //console.log(counttx);
   if(counttx < 2){
       setInterval(timerrx, 1000);
       clearInterval(counterry);
   }
}
4

3 回答 3

5

使用单个循环:

let counttx = 0, countup = true;
const counter = document.getElementById('counter');

function timerr()
{
  if (countup)
  {
    ++counttx;
    
    if (counttx >= 3)
      countup = false;
  }
  else
  {
    --counttx;
    
    if (counttx <= 0)
      countup = true;
  }
  
  counter.value = counttx;
}

setInterval(timerr, 1000);
<input type="number" id="counter" value="0" />

于 2013-09-06T21:18:20.590 回答
3

代码

let i = 0;
setInterval(() => {
  console.log(Math.abs(i++%6 - 3))
}, 1000);

解构

  1. i++i每次滴答都会无限增加
  2. %6→ 最大 vvalue 的两倍的模(除法剩余 ex. 10 % 6 = 4
  3. - 3→ 删除范围(因此数字将始终介于 3 和 -3 之间,否则将介于 0 和 6 之间)
  4. Math.abs()→ 删除 - (确保数字从 0 移动到 3 并返回)

可视化的步骤

我++

∞       .
       .
      .
     /
    /
   / 
  /
0

我++%6

6 
     /    /    /    .
    /    /    /    .
   /    /    /    .
  /    /    /    /
 /    /    /    /
0

我++%6-3

3 
  \        /\        /\
   \      /  \      /  \
0   \    /    \    /    .
     \  /      \  /      .
      \/        \/        .
-3

数学.abs(i++%6-3)

3 
  \    /\    /.
   \  /  \  /  .
    \/    \/    .
0

8 次第一次迭代的示例输出:

  1. i0

    1. 0%60
    2. 0-3-3
    3. Math.abs(-3)3
  2. i1

    1. 1%61
    2. 1-3-2
    3. Math.abs(-2)2
  3. i2

    1. 2%62
    2. 2-3-1
    3. Math.abs(-1)1
  4. i3

    1. 3%63
    2. 3-30
    3. Math.abs(0)0
  5. i4

    1. 4%64
    2. 4-31
    3. Math.abs(1)1
  6. i5

    1. 5%65
    2. 5-32
    3. Math.abs(2)2
  7. i6

    1. 6%60
    2. 0-3-3
    3. Math.abs(-3)3
  8. i7

    1. 7%61
    2. 1-3-2
    3. 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需要乘以您的最大值并四舍五入(目标值)。

于 2020-11-01T19:18:32.950 回答
0

基本逻辑可能如下所示,您可以在 javascript 中为间隔计时器调整它。

int counter=0;
int delta=1;
bool finished=false;
while(!finished)
{
   counter+=delta;
   if(counter==3)
   {
      delta=-1;
   }
   if(counter==0)
   {
      delta=1;
   }
   if(condition to end loop is met)
   {
      finished=true;
   }

}
于 2013-09-06T21:20:05.947 回答