JavaScript闪烁眼睛动画

16

我正在学习JavaScript并尝试很多东西,但目前我的JS技能还非常有限。 我创建了一个小游戏,在游戏中有一个装着兔头的盒子,这些兔头会随机出现,用户需要尽可能快地点击它们。

所以我用一个间隔动画创建了兔子,每2秒钟兔子会闭上眼睛然后再睁开。 现在我感觉有点傻,但我无法让动画按照我想要的方式工作。现在兔子只是每2秒钟就闭上眼睛,再过2秒钟就再次睁开眼睛。然而,我希望它只是眨眼,也就是说眼睛应该只闭上一瞬间,然后再睁开,这样兔子就每2秒钟眨一次眼。 然后,我也希望它随机地有时只眨一次眼,有时眨两次眼。 不确定这是否非常简单,我只是因为编写代码和学习新东西而盯了几个小时,看起来我可能需要你的帮助。

这里是目前整个事情的fiddle。

您可以在fiddle中看到使用的完整代码。我不想在代码部分中发布整个网站,但我相信以下部分对我的动画非常有趣。

这是眨眼的js代码:

var eyeleft = document.getElementById("eyeleft");
var eyeright = document.getElementById("eyeright");

window.onload = setInterval(function() {
    eyeleft.className = (eyeleft.className != 'closedeyeleft' ? 'closedeyeleft' : 'eyeleft');
    eyeright.className = (eyeright.className != 'closedeyeright' ? 'closedeyeright' : 'eyeright');
    }, 2000);

接下来是HTML

<div id="shape" class="game-shapes">
    <div class="ears left"></div>
    <div class="ears right"></div>
    <div id="eyeleft" class="eyeleft"></div>
    <div id="eyeright" class="eyeright"></div>
    <div id="mouth">
        <div id="tooth"></div>
        <div id="tongue"></div>
    </div>
</div>

现在是CSS的时候了

.game-shapes {
  height: 80px;
  width: 80px;
  cursor: pointer;
  opacity: 0;
  position: relative;
  transition: opacity ease-in-out .2s;
}
.game-shapes div {
  position: absolute;
}
.eyeleft,
.eyeright {
  background: #000;
  border-radius: 50%;
  width: 20px;
  height: 20px;
  top: 30px;
}
.eyeleft {
  left: 4px;
}
.eyeright {
  right: 4px;
}
.eyeleft:before,
.eyeleft:after,
.eyeright:before,
.eyeright:after {
  content: '';
  background: #fff;
  width: 7px;
  height: 7px;
  top: 4px;
  left: 4px;
  border-radius: 50%;
  position: absolute;
  z-index: 5;
}
.eyeleft:after,
.eyeright:after {
  width: 4px;
  height: 4px;
  top: 10px;
  left: 10px;
}
.closedeyeleft,
.closedeyeright {
  background: transparent none repeat scroll 0 0;
  border-color: #000;
  border-radius: 5px;
  border-style: solid;
  border-width: 4px 4px 0;
  height: 4px;
  top: 35px;
  width: 12px;
}
.closedeyeleft {
  left: 3px;
}
.closedeyeright {
  right: 3px;
}
3个回答

14

感谢您提供了一个充满细节的问题!

这里提供一个可能的解决方案,既可以快速闪烁,又可以随机闪烁一秒钟。

//made blink a named function to improve readability a bit
var blink = function(isSecondBlink) {
  //got rid of the ternary expressions since we're always doing
  //open eyes -> close eyes -> delay -> open eyes

  //close both eyes
  eyeleft.className = "closedeyeleft";
  eyeright.className = "closedeyeright";

  //let's reopen those eyes after a brief delay to make a nice blink animation
  //as it happens, humans take ~250ms to blink, so let's use a number close to there
  setTimeout(function() {
      eyeleft.className = "eyeleft";
      eyeright.className = "eyeright";
  }, 200);

  if (isSecondBlink) { return; } //prevents us from blinking 3+ times

  //This provides a 40% chance of blinking twice, adjust as needed
  var blinkAgain = Math.random() <= 0.4;

  //if we need to blink again, go ahead and do it in 300ms
  if (blinkAgain) {
    setTimeout(function() { blink(true); }, 300);
  }
}

//go ahead and blink every 2 seconds
window.onload = setInterval(blink, 2000);

2
我喜欢随机的第二个闪烁 :) 如果有人想要检查,这里有一个fiddle https://jsfiddle.net/y390jcx8/4/ - Mx.
哎呀哈哈,我忘记把我的修改提交到 Fiddle 上了。谢谢 mx! - CollinD
1
非常感谢您的快速帮助。这个版本效果最好。 - Supapinzi

4

有很多方法可以做到这一点,以下是我的方法 - 在您的间隔中添加超时,使间隔完成完整的闪烁操作。

演示

var blink = function(){
  //close your eyes little bunny
  eyeleft.className = (eyeleft.className != 'closedeyeleft' ? 'closedeyeleft' : 'eyeleft');
  eyeright.className = (eyeright.className != 'closedeyeright' ? 'closedeyeright' : 'eyeright');
  setTimeout(function(){
    //open them again
    eyeleft.className = (eyeleft.className != 'closedeyeleft' ? 'closedeyeleft' : 'eyeleft');
    eyeright.className = (eyeright.className != 'closedeyeright' ? 'closedeyeright' : 'eyeright');
  }, 100);
};

setInterval(blink, 2000);

1

这是 jsfiddle 这是我会做的,这样它会非常随机但看起来还不错。

https://jsfiddle.net/y390jcx8/3/

    window.onload= startFunc();

function startFunc(){ 
    var timer = Math.round(Math.random() * 2000)
     setInterval(function(){
     timer = Math.round(Math.random() * 2000)


     setTimeout(function(){
      console.log(timer) 
                eyeleft.className = (eyeleft.className != 'closedeyeleft' ? 'closedeyeleft' : 'eyeleft');
              eyeright.className = (eyeright.className != 'closedeyeright' ? 'closedeyeright' : 'eyeright');
          setTimeout(function(){ 
            eyeleft.className = (eyeleft.className != 'closedeyeleft' ? 'closedeyeleft' : 'eyeleft');
            eyeright.className = (eyeright.className != 'closedeyeright' ? 'closedeyeright' : 'eyeright');
          }, 100);

     },timer)

     },1000)

    }

所以随机调用关闭,然后在100之后再打开它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接