私が提示しようとしていることがより簡単なのかどうかはわかりませんが、あなたの問題のいくつかに対処しているように見えます。
主な考えは、問題が複数の状態のために複雑であることを認め、ステートマシンを使用してそれを扱うことです。 これは、このような宣言的なアプローチが可能になります:
const TRANSITIONS = {
'small-inside' : {
'transitionend' : 'big-inside',
'mouseover' : 'small-inside',
'mouseout' : 'small-outside',
},
'small-outside' : {
'transitionend' : 'small-outside',
'mouseover' : 'small-inside',
'mouseout' : 'small-outside',
},
'big-inside' : {
'transitionend' : 'big-inside',
'mouseover' : 'big-inside',
'mouseout' : 'big-outside',
},
'big-outside' : {
'transitionend' : 'small-outside',
'mouseover' : 'big-inside',
'mouseout' : 'big-outside',
},
}
やイベントの非常にシンプルな取り扱い:
function step(e){
box.className = TRANSITIONS[box.className][e.type];
}
box.addEventListener('transitionend', step);
box.addEventListener('mouseover', step);
box.addEventListener('mouseout', step);
別の洞察力はあなたがCSS transition-delay:3s
プロパティを使用して遅延を指定することができるということです。
div.small-inside,
div.big-inside {
width: 300px;
}
div.small-outside,
div.big-outside {
width: 150px;
}
div.big-outside {
transition-delay:3s;
}
概念証明はここにあります:http://codepen.io/anon/pen/pNNMWM。
私の解決方法が気に入らないのは、初期状態がsmall-outside
であると仮定しているのに対し、ページが読み込まれると実際にはマウスポインタがdiv内に配置されている可能性が高いということです。 JSから状態遷移を手動でトリガーする機能について説明しました。私はあなたが2つの別個のブール変数を追跡している限り、これは可能であると信じています。 「jsが成長するように頼んでいますか?」それらを1つの状態に混在させることはできず、正確な「カウント」が必要です。あなたが見る通り、すでに2*2=4
州があります。私は{small,big}x{inside,outside}
を追跡しようとしています。これは、同様の方法で{small,big}x{inside,outside}x{js-open,js-close}
に拡張し、「開く」「閉じる」のような余分な「イベント」があります。
あなたが提供しているcodepenの問題は何ですか? – Alvaro
1)移行時間がcssにあり、jsがメンテナンスに悪い 2)ボックスが縮小しているときに素早く出入りすると、途中でトランジションが停止します。あなたは出て行く。 – apieceofbart
私はこれを別のcodepenで解決しましたが、醜いですし、setInterval:http:// codepenを使用しています。io/anon/pen/yVJoZX 誰かが良いアイデアを持っているなら私はそれを見たいと思っています – apieceofbart