4

我被困在一个点上。有 10 条直线(png 图像)。我想要的是在第一条线旋转 40 度后,第二条线应该开始旋转,然后是第三条,第四条,第五条等等! !!

代码:

<div class="hair" onclick="rotate()">
    <img src="single.png" id="1" width="10" height="40">
    <img src="single.png" id="2" width="10" height="40">
    <img src="single.png" id="3" width="10" height="40">
    <img src="single.png" id="4" width="10" height="40">
    <img src="single.png" id="5" width="10" height="40">
    <img src="single.png" id="6" width="10" height="40">
    <img src="single.png" id="7" width="10" height="40">
    <img src="single.png" id="8" width="10" height="40">
    <img src="single.png" id="9" width="10" height="40">
    <img src="single.png" id="10" width="10" height="40">
</div>

Javascript:

function rotate(){
    for(var i=1;i<11;i++)
    {
        setInterval(function(){
            document.getElementById(i).style.WebkitTransitionDuration="1s";
            document.getElementById(i).style.webkitTransform = 'rotate(40deg)';
        },100)
    }
}
4

4 回答 4

2

您遇到了大多数人在使用匿名函数时遇到的经典范围/闭包/引用问题。不久前我已经回答了这个问题,并提供了大量关于实际发生的事情的信息(忽略我答案的第一段,但答案的其余部分是适用的)。同时,您的问题的答案是:

for(var i=1;i<11;i++)
{
    setInterval((function(myI)
    {
        return function()
        {
            document.getElementById(myI).style.WebkitTransitionDuration='1s';
            document.getElementById(myI).style.webkitTransform = 'rotate(40deg)';
        };
    }(i)),100);
}

请注意,您正在设置间隔:只要浏览器窗口保持打开状态,就会每 100 毫秒调用一次回调。
您没有将间隔 id 存储在任何地方,因此我将使用setTimeout或创建一个(最好是非全局的)id 数组,以便您可以clearInterval(intervalID[x]);在需要时执行此操作。

于 2013-06-03T09:50:52.283 回答
1

有几个步骤可以解决您的问题:

HTML 中的 ID 不能以数字开头,因此请将它们重命名为“hair1”、“hai​​r2”等。

主要问题是由于 setInterval,到函数运行时,i将不会是i您所期望的。这是因为范围可变。您可以使用匿名函数解决此问题。

结合以上两者给出以下代码:

<div class="hair" onclick="rotate()">
  <img src="single.png" id="hair1" width="10" height="40">
  <img src="single.png" id="hair2" width="10" height="40">
  <!-- etc -->
</div>

// NOTE: This is not the final code listing, see below for a final answer. 
for (var i = i; i < 11; i++) {
  (function(local_i) {
    setInterval(function () {
      // use local_i instead of i inside this function for the results you expect
      document.getElementById('hair' + local_i).style.WebkitTransitionDuration='1s';
      document.getElementById('hair' + local_i).style.webkitTransform = 'rotate(40deg)';
    }, 100);
  })(i);
}

我还建议将样式放入样式表中,然后使用类应用它们:

.rotate
{
  -webkit-transform: rotate(40deg);
  -webkit-transition: -webkit-transform 1s;
}

最后,要让元素连续旋转而不是一起旋转,您需要将区间乘以 的值i。我认为您可能的意思是使用 setTimeout 而不是 setInterval (setInterval 将一遍又一遍地运行)。

function rotate(){
  for(var i=1;i<11;i++) {
    (function (local_i) {
      setTimeout(function(){
        document.getElementById('hair' + local_i).classList.add('rotate');
      }, 100 * local_i);
    })(i);
  }
}

我在这里整理了一个演示

于 2013-06-03T10:04:57.730 回答
0

I would do it like this on modern browsers, separating CSS and JS by using a class. This is my own example based on your requirements, using a common class box and modern tools and patterns:

Here's the HMTL, I'm using divs just because, but you can use images or any other element:

<div class="container">
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
</div>

Keep the CSS separate, you just need to match the transition speed with the delay:

.box {
  width: 100px;
  height: 100px;
  margin: 40px;
  background: grey;
  -webkit-transition: -webkit-transform .3s linear;
}

.box.rotate {
  -webkit-transform: rotate(45deg);
}

And the JS:

function rotate() {
  var elements = document.querySelectorAll('.box');
  [].forEach.call(elements, function(element, i) {
    setTimeout(function(){ element.classList.add('rotate'); },i*300);
  });
}

document.querySelector('.container')
        .addEventListener('click',rotate);

Here's little demo: http://jsbin.com/ofiral/1/edit

于 2013-06-03T10:03:07.550 回答
0

不是一个完美的解决方案,但你可以开始。

定义一个 css3 动画并使用 javascript 分配它。

@-webkit-keyframes rotation {
    from {
        -webkit-transform: rotate(0deg);
    }
    to {
        -webkit-transform: rotate(360deg);
    }
}
.hair {
    position:relative;
}
.hair div {
    width:40px;
    height:40px;
    border-bottom: 1px solid #000;
    position:absolute;
    -webkit-animation-duration:         1s; 
    -webkit-animation-iteration-count:  infinite;
    -webkit-animation-timing-function: linear;
}

.

function rotate() {
    for (var i = 1; i < 11; i++) {
        (function (x) {
            setInterval(function () {
                document.getElementById("d" + x).style.WebkitAnimationName = "rotation";
            }, 200 * i);
        })(i);
    }
}

rotate();

调整setInterval交易并animation-duration获得所需的结果。

webkit 演示:http: //jsfiddle.net/NQJJp/5/

于 2013-06-03T10:10:53.397 回答