ディスプレイを使用して、これを期待どおりに自然に機能させることができますが、Javascriptを使用するか、他の人が別のタグの中にあるタグを使用した凝ったトリックを提案しているように、ブラウザーを調整する必要があります。内部タグは CSS と寸法をさらに複雑にするため、気にしません。そのため、Javascript ソリューションは次のとおりです。
https://jsfiddle.net/b9chris/hweyecu4/17/
次のようなボックスから始めます。
<div id="box" class="hidden">Lorem</div>
隠し箱です。
div.hidden {
display: none;
}
#box {
transition: opacity 1s;
}
関連する Q/A にあるトリックを使用し、offsetHeight をチェックしてブラウザを即座にスロットルします。
https://stackoverflow.com/a/16575811/176877
まず、上記のトリックを形式化したライブラリ:
$.fn.noTrnsn = function () {
return this.each(function (i, tag) {
tag.style.transition = 'none';
});
};
$.fn.resumeTrnsn = function () {
return this.each(function (i, tag) {
tag.offsetHeight;
tag.style.transition = null;
});
};
次に、これを使用してボックスを表示し、フェード インします。
$('#button').on('click', function() {
var tag = $('#box');
if (tag.hasClass('hidden'))
tag.noTrnsn().removeClass('hidden')
.css({ opacity: 0 })
.resumeTrnsn().css({ opacity: 1 });
else
tag.css({ opacity: 0 });
});
これにより、ボックスがフェードインおよびフェードアウトします。そのため、.noTrnsn()
トランジションをオフにしてから、hidden
クラスを削除すると、display
からnone
デフォルトの に切り替わりますblock
。次に、不透明度を 0 に設定して、フェードインの準備をします。ステージを設定したので、トランジションをオンに戻し.resumeTrnsn()
ます。最後に、不透明度を 1 に設定してトランジションを開始します。
ライブラリがなければ、表示への変更と不透明度への変更の両方が望ましくない結果をもたらしたでしょう。ライブラリ呼び出しを単純に削除した場合、トランジションはまったく得られません。
上記は、フェードアウト アニメーションの最後に表示を再度 none に設定しないことに注意してください。ただし、より洗練されたものにすることはできます。フェードインして0から高さが伸びるものでやってみましょう。
はで!
https://jsfiddle.net/b9chris/hweyecu4/22/
#box {
transition: height 1s, opacity 1s;
}
現在、高さと不透明度の両方を移行しています。高さを設定していないことに注意してください。つまり、デフォルトですauto
。通常、これはトランジションできません。auto からピクセル値 (0 など) に移動するとトランジションは発生しません。これをライブラリともう 1 つのライブラリ メソッドで回避します。
$.fn.wait = function (time, fn) {
if (time)
this.delay(time);
if (!fn)
return this;
var _this = this;
return this.queue(function (n) {
fn.call(_this);
n();
});
};
これは、jQuery 3.x で現在除外されているアニメーション フレームワークを必要とせずに、jQuery の既存の fx/アニメーション キューに参加できる便利なメソッドです。jQuery がどのように機能するかを説明するつもりはありませんが、.queue()
jQuery.stop()
が提供する配管は、アニメーションが互いに干渉するのを防ぐのに役立ちます。
スライド ダウン効果をアニメーション化しましょう。
$('#button').on('click', function() {
var tag = $('#box');
if (tag.hasClass('hidden')) {
// Open it
// Measure it
tag.stop().noTrnsn().removeClass('hidden').css({
opacity: 0, height: 'auto'
});
var h = tag.height();
tag.css({ height: 0 }).resumeTrnsn()
// Animate it
.css({ opacity: 1, height: h })
.wait(1000, function() {
tag.css({ height: 'auto' });
});
} else {
// Close it
// Measure it
var h = tag.noTrnsn().height();
tag.stop().css({ height: h })
.resumeTrnsn()
// Animate it
.css({ opacity: 0, height: 0 })
.wait(1000, function() {
tag.addClass('hidden');
});
}
});
このコードは、#box
そのクラスをチェックすることによって、現在非表示になっているかどうかをチェックすることから始まります。しかし、スライドアウト/フェード アニメーションの最後にクラスをwait()
追加することで、ライブラリ呼び出しを使用してさらに多くのことを実現します。これは、実際に非表示になっている場合に見つかると予想されるものです。上記の単純な例では実行できませんでした。hidden
これにより、要素の表示/非表示を繰り返し有効にすることもできます。これは、前の例のバグでした。隠しクラスが復元されなかったためです。
また、CSS とクラスの変更が呼び出されて、一般的にアニメーションのステージを設定することも確認できます。これには、 を呼び出す前に、ユーザーに表示せず.noTrnsn()
に の最終的な高さを測定し、その完全な設定からアニメーション化するなどの測定が含まれます。目標の CSS 値にステージングします。#box
.resumeTrnsn()
古い回答
https://jsfiddle.net/b9chris/hweyecu4/1/
クリックで遷移させることができます:
function toggleTransition() {
var el = $("div.box1");
if (el.length) {
el[0].className = "box";
el.stop().css({maxWidth: 10000}).animate({maxWidth: 10001}, 2000, function() {
el[0].className = "box hidden";
});
} else {
el = $("div.box");
el[0].className = "box";
el.stop().css({maxWidth: 10001}).animate({maxWidth: 10000}, 50, function() {
el[0].className = "box box1";
});
}
return el;
}
someTag.click(toggleTransition);
CSSはあなたが推測するものです:
.hidden {
display: none;
}
.box {
width: 100px;
height: 100px;
background-color: blue;
color: yellow;
font-size: 18px;
left: 20px;
top: 20px;
position: absolute;
-webkit-transform-origin: 0 50%;
transform-origin: 0 50%;
-webkit-transform: scale(.2);
transform: scale(.2);
-webkit-transition: transform 2s;
transition: transform 2s;
}
.box1{
-webkit-transform: scale(1);
transform: scale(1);
}
重要なのは、表示プロパティを調整することです。非表示のクラスを削除してから 50 ミリ秒待ってから、追加されたクラスを介してトランジションを開始することで、アニメーションなしで画面にブリップするだけでなく、表示され、必要に応じて展開されます。非表示を適用する前にアニメーションが終了するまで待つことを除いて、同様のことが逆に起こります。
注:ここでは、競合状態.animate(maxWidth)
を避けるために乱用しています。あなたや他の誰かがコードに気づいていないときに、隠れたバグをすぐに持ち込んでしまいます。で簡単に殺せます。私はこれを使用して、標準の fx キューに 50 ミリ秒または 2000 ミリ秒の遅延を設定しています。これにより、他のコーダーがこれに基づいて簡単に見つけたり解決したりできます。setTimeout
setTimeout
.animate()
.stop()