CSS 动画类似于 Mac OS X 10.8 无效密码"shake"?



在Mac OS X 10.8的"password"屏幕上,如果你输入了一个无效的密码,它会来回"摇"(也就是左右摇)。我正在尝试使用CSS动画实现HTML密码输入字段的类似效果。

我创建了一个"摇密码"jsfiddle,似乎模仿了这种行为。然而,这似乎并不完全正确。我不确定显式关键帧和linear定时函数是正确的方法。这是我在CSS动画的第一次尝试,我正在寻找正确的方法来实现这一点的反馈。

<div class="box">
    <input type="password" id="demo-password" placeholder="password" autofocus />
</div>
JavaScript

$('#demo-password').on('keyup', function (e) {
    var $input = $(this);
    var val = $.trim($input.val());
    $input.removeClass("invalid");
    if (e.which !== 13 || !val) {
        return;
    }
    if (val != "password") {
        $input.select();   
        $input.addClass("invalid");
    }
});
CSS

#demo-password.invalid {
    outline-color: red;
    /* also need animation and -moz-animation */
    -webkit-animation: shake .6s linear;
}
/* also need keyframes and -moz-keyframes */
 @-webkit-keyframes shake {
    0% {
        left:-10px;
    }
    16% {
        left:9px;
    }
    33% {
        left:-6px;
    }
    50% {
        left:5px;
    }
    66% {
        left:-2px;
    }
    83% {
        left:1px;
    }
    100% {
        left: 0px;
    }
}

编辑

我确实找到了animation. css,它有一个震动动画。我在下面包含了(没有浏览器前缀的)CSS。而不是设置left,而是设置transform: translateX(),这可能有更好的机会进行硬件加速。

.animated {
    animation-duration: 1s;
    animation-fill-mode: both;
}
@keyframes shake {
    0%, 100% {transform: translateX(0);}
    10%, 30%, 50%, 70%, 90% {transform: translateX(-10px);}
    20%, 40%, 60%, 80% {transform: translateX(10px);}
}
.shake {
    animation-name: shake;
}

我用iPad相机记录了Mac的密码屏幕。它看起来像是在每个方向上摇了3次,前两次是完整的距离,最后一次是较小的距离。

#demo-password.invalid {
    outline-color: red;
    /* also need animation and -moz-animation */
    -webkit-animation: shake .5s linear;
}
/* also need keyframes and -moz-keyframes */
 @-webkit-keyframes shake {
    8%, 41% {
        -webkit-transform: translateX(-10px);
    }
    25%, 58% {
        -webkit-transform: translateX(10px);
    }
    75% {
        -webkit-transform: translateX(-5px);
    }
    92% {
        -webkit-transform: translateX(5px);
    }
    0%, 100% {
        -webkit-transform: translateX(0);
    }
}

我也会给jRumble一个机会,它有一个非常大的震动集,它们可以组合在一起,使各种疯狂的事情发生。一些有趣的例子:

  • 基于百分比的抖动
  • 基于时间的震动

最新更新