[解決済み】addClass/removeClassをjQueryでアニメーション化する。
質問
jQueryとjQuery-uiを使用していて、様々なオブジェクトの様々な属性をアニメーション化したいのですが、どうすればよいですか?
ここでは問題を説明するために、ユーザーがマウスを乗せると青から赤に変わる1つのdivに単純化しました。
を使用すると、必要な動作を得ることができます。
animate()
しかし、そうすると、アニメーションを行うスタイルがアニメーション・コードに含まれていなければならず、スタイル・シートとは別に存在することになります。(参照
例1
)
別の方法として
addClass()
と
removeClass()
で得られるような正確な動作を再現できていません。
animate()
. (参照
例2
)
例1
では、次のコードを見てみましょう。
animate()
:
$('#someDiv')
.mouseover(function(){
$(this).stop().animate( {backgroundColor:'blue'}, {duration:500});
})
.mouseout(function(){
$(this).stop().animate( {backgroundColor:'red'}, {duration:500});
});
は、私が探しているすべての動作を表示します。
- 赤と青の間で滑らかにアニメーションする。
- ユーザーがマウスを素早く div の内外に移動させても、アニメーションの「オーバーキュー」が発生しないようにしました。
- アニメーションの再生中にユーザーがマウスを移動させた場合、現在の「途中」状態と新しい「ゴール」状態の間で正しくイージングされます。
しかし、スタイルの変更は
animate()
そこでスタイルの値を変更しなければならず、自分のスタイルシートを指してもらうわけにはいかない。このように、スタイルが定義される場所が「断片化」していることが、私を悩ませているのです。
例2
以下は、私の現在の最善の試みです。
addClass()
と
removeClass
(アニメーションを動作させるには、jQuery-uiが必要なことに注意してください)。
//assume classes 'red' and 'blue' are defined
$('#someDiv')
.addClass('blue')
.mouseover(function(){
$(this).stop(true,false).removeAttr('style').addClass('red', {duration:500});
})
.mouseout(function(){
$(this).stop(true,false).removeAttr('style').removeClass('red', {duration:500});
});
これは、私が最初に要求した性質1.と2.の両方を示していますが、3.はうまくいきません。
その理由はわかりました。
アニメーションの場合
addClass()
と
removeClass()
jQuery は要素に一時的なスタイルを追加し、提供されたクラスの値に達するまで適切な値をインクリメントし、そのときだけ実際にクラスの追加/削除を行います。
そうしないと、アニメーションを途中で止めたときに style 属性が残ってしまい、クラスの値を永久に上書きしてしまうからです。タグの style 属性はクラスのスタイルよりも重要度が高いためです。
しかし、アニメーションが途中で終わってしまうと、まだ新しいクラスが追加されていないため、この解決策では、アニメーションが完了する前にユーザーがマウスを動かすと、色が前の色にジャンプしてしまいます。
理想を言えば、このようなことができるようになりたいのです。
$('#someDiv')
.mouseover(function(){
$(this).stop().animate( getClassContent('blue'), {duration:500});
})
.mouseout(function(){
$(this).stop().animate( getClassContent('red'), {duration:500});
});
ここで
getClassContent
は、提供されたクラスの内容を返すだけです。重要なのは、この方法ではスタイル定義をあちこちに置いておく必要がなく、スタイルシートのクラスで管理できることだ。
どうやって解決するの?
IEを気にしないのであれば、CSSのトランジションでアニメーションを提供し、jQueryでクラスを変更すればよいのではないでしょうか。実例です。 http://jsfiddle.net/tw16/JfK6N/
#someDiv{
-webkit-transition: all 0.5s ease;
-moz-transition: all 0.5s ease;
-o-transition: all 0.5s ease;
transition: all 0.5s ease;
}
関連
-
[解決済み】Reactのeslintエラーはpropsの検証で見つからない
-
[解決済み】DOMException: サポートされているソースが見つからなかったため、読み込みに失敗しました。
-
[解決済み] jQueryで要素が非表示になっているかどうかを確認するには?
-
[解決済み] jQueryでチェックボックスに "checked "を設定する
-
[解決済み] jQueryの「exists」関数はありますか?
-
[解決済み] jQueryでページを更新するにはどうすればよいですか?
-
[解決済み] jQueryで要素にスクロールする
-
[解決済み] jQueryで入力を無効化/有効化する?
-
[解決済み] .css()関数で追加したスタイルを削除するにはどうしたらいいですか?
-
[解決済み】jQueryでチェックボックスがチェックされているかどうかを確認するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】React Js: Uncaught (in promise) SyntaxError: 位置 0 の JSON で予期しないトークン < が発生しました。
-
[解決済み】Angular JS Uncaught Error。[インジェクター:モジュラー]。
-
[解決済み】最大呼び出しスタックサイズ超過エラーとその修正方法とは?
-
[解決済み】Google Conversionsが動作しない - スクリプトが読み込まれない
-
[解決済み] [Solved] Uncaught TypeError: nullのプロパティ 'appendChild' を読み取ることができない。
-
[解決済み】Javascript - ERR_CONTENT_LENGTH_MISMATCH
-
[解決済み】JavaScript ランタイムエラー:'$'が未定義です。
-
[解決済み】JavaScriptで相対URLへのリダイレクトを行う
-
[解決済み】PhantomJS 2.1.1を使用してReactJSアプリケーションをレンダリングできない理由とは?
-
[解決済み] Uncaught (in promise) TypeError: フェッチに失敗してCorsエラー