そのため、次のようなマウスアウトで逆アニメーションを使用することができます。
.class{
transform: rotate(0deg);
}
.class:hover{
transform: rotate(360deg);
}
しかし、@ keyframesアニメーションを使用すると、動作させることができませんでした。例:
.class{
animation-name: out;
animation-duration:2s;
}
.class:hover{
animation-name: in;
animation-duration:5s;
animation-iteration-count:infinite;
}
@keyframe in{
to {transform: rotate(360deg);}
}
@keyframe out{
to {transform: rotate(0deg);}
}
反復とアニメーション自体が必要であることを知って、最適なソリューションは何ですか?
to
がある場合、from
を使用する必要があると思います。私は次のようなものを考えるでしょう:
@keyframe in {
from: transform: rotate(0deg);
to: transform: rotate(360deg);
}
@keyframe out {
from: transform: rotate(360deg);
to: transform: rotate(0deg);
}
もちろん、すでにチェックしているはずですが、CSS3はどこでも完全に実装されていないため、transform
プロパティのみを使用するのはおかしいと思います。たぶん、次の考慮事項でうまく機能するでしょう:
@-webkit-keyframes
を使用します。特定のバージョンは不要です@-webkit-keyframes
を使用します@keyframes
を使用します(v5-15は@-moz-keyframes
を使用しました)@-webkit-keyframes
バージョン15-22を使用します(v12のみが@-o-keyframes
を使用)@keyframes
を使用します編集:
私はそのフィドルを思いついた:
最小限のコードを使用します。それはあなたが期待していたものに近づいていますか?
CSSアニメーションのみを使用してこれを達成できるとは思わない。 CSSトランジションdo notがユースケースを満たしていると想定しています。たとえば、2つのアニメーションを連結し、複数のストップ、イテレーションを使用したり、その他の方法で追加のパワーアニメーション付与を活用したりするためです君は。
JavaScriptを使用して「over」クラスと「out」クラスをアタッチせずに、特にマウスアウトでCSSアニメーションをトリガーする方法は見つかりませんでした。 :hoverが終了すると、ベースCSS宣言を使用してアニメーションをトリガーできますが、同じアニメーションはページの読み込み時に実行されます。 「over」および「out」クラスを使用すると、定義をベース(ロード)宣言と2つのアニメーショントリガー宣言に分割できます。
このソリューションのCSSは次のとおりです。
.class {
/* base element declaration */
}
.class.out {
animation-name: out;
animation-duration:2s;
}
.class.over {
animation-name: in;
animation-duration:5s;
animation-iteration-count:infinite;
}
@keyframes in {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
@keyframes out {
from {
transform: rotate(360deg);
}
to {
transform: rotate(0deg);
}
}
JavaScript(jQuery構文)を使用して、クラスをイベントにバインドします。
$(".class").hover(
function () {
$(this).removeClass('out').addClass('over');
},
function () {
$(this).removeClass('over').addClass('out');
}
);
これよりもはるかに簡単:要素の同じプロパティを単純に移行します
.earth { width: 0.92%; transition: width 1s; }
.earth:hover { width: 50%; transition: width 1s; }
反転したアニメーションを作成することは、単純な問題に対するちょっとしたやり過ぎです。必要なのは
animation-direction: reverse
ただし、アニメーションの仕様が非常にダンプされているため、アニメーションを再起動する方法を追加するのを忘れたため、これは単独では機能しません。jsを使用して行う方法
let item = document.querySelector('.item')
// play normal
item.addEventListener('mouseover', () => {
item.classList.add('active')
})
// play in reverse
item.addEventListener('mouseout', () => {
item.style.opacity = 0 // avoid showing the init style while switching the 'active' class
item.classList.add('in-active')
item.classList.remove('active')
// force dom update
setTimeout(() => {
item.classList.add('active')
item.style.opacity = ''
}, 5)
item.addEventListener('animationend', onanimationend)
})
function onanimationend() {
item.classList.remove('active', 'in-active')
item.removeEventListener('animationend', onanimationend)
}
@keyframes spin {
0% {
transform: rotateY(0deg);
}
100% {
transform: rotateY(180deg);
}
}
div {
background: black;
padding: 1rem;
display: inline-block;
}
.item {
/* because span cant be animated */
display: block;
color: yellow;
font-size: 2rem;
}
.item.active {
animation: spin 1s forwards;
animation-timing-function: ease-in-out;
}
.item.in-active {
animation-direction: reverse;
}
<div>
<span class="item">ABC</span>
</div>
アニメーションを1つだけにして、逆にした方が良いでしょうか?
animation-direction: reverse
requestAnimationFrameを使用してアニメーションをリセットし、ブラウザが次のフレームでペイントするときにアニメーションを元に戻すことができます。
また、onmouseenterおよびonmouseoutイベントハンドラーを使用して、アニメーションの方向を逆にします。
イベントハンドラーでキューに入れられたrAFは、同じフレームで実行されます。 rAFのキューに入れられたrAFは、次のフレームで実行されます.
function fn(el, isEnter) {
el.className = "";
requestAnimationFrame(() => {
requestAnimationFrame(() => {
el.className = isEnter? "in": "out";
});
});
}
.in{
animation: k 1s forwards;
}
.out{
animation: k 1s forwards;
animation-direction: reverse;
}
@keyframes k
{
from {transform: rotate(0deg);}
to {transform: rotate(360deg);}
}
<div style="width:100px; height:100px; background-color:red"
onmouseenter="fn(this, true)"
onmouseleave="fn(this, false)"
></div>
これを試して:
@keyframe in {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
@keyframe out {
from {
transform: rotate(360deg);
}
to {
transform: rotate(0deg);
}
}
firefox 5以降、IE 10以降、Chrome、Safari 4以降、Opera 12以降でサポート