質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

2回答

1172閲覧

CSSで、上の要素がなくなったときに、下の要素を滑らかに上に移動させたい

nikuatsu

総合スコア177

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2021/12/25 15:07

編集2021/12/25 15:08

前提・実現したいこと

CSSでカクつく動作を直したです。

次のソースコードで、<li>b</li>をクリックしたら.fadeOut()する機能があります。

その際の<li>c</li>の移動を、現状のカクっではなく、スルっと上になめらかに移動したいのですが、どのように書けばよろしいでしょうか?

発生している問題

カクついてしまう

該当のソースコード

html

1<ul> 2 <li>a</li> 3 <li>b</li> 4 <li>c</li> 5</ul>

css

1li { 2 width: 200px; 3 height: 30px; 4 margin: 10px; 5 background: pink; 6}

jQuery

1$('li').click(function(){ 2 $(this).fadeOut(); 3});

試したこと

CSSでtransitionを追加するだけで解決できると考えましたが無理でした。

css

1li { 2 transition: 2s; / transition を追加 */ 3}

ならばアニメーションを作るのかと思い次を書きましたがうまくいかず、要素が被ってしまいました。(それに作ってから気づきましたが、liの高さが可変なのでtranslateY(-30px)では対応できなそうです。)

CSS

1li.surutto { 2 animation: surutto 2s both; /* surutto を追加 */ 3} 4 5/* アニメーションを作る */ 6@keyframes surutto { 7 0% { 8 transform: translateY(0px); 9 } 10 100% { 11 transform: translateY(-30px); 12 } 13}

jQuery

1$('li').click(function(){ 2 $(this).fadeOut(); 3 $(this).next('li').addClass('surutto'); // surotto を追加 4});

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nikuatsu

2021/12/26 03:40 編集

ありがとうございます。そんな感じです
guest

回答2

0

ベストアンサー

うちも昔jQuery使ってた時にぎこちなくて嫌だなと思っていたんですけど放置してました
今回良い機会なのでもう使う事もないと思いますがなめらかに出来ないか試してみることにしました。

どうしてガクンと消えるのかなと、よく観察してみたところ
そもそもの問題は
<li>heightmarginが消えた後も<li>自体が存在するため
通常行われるmarginの相殺が行われずに
<li>タグの上下margin分の高さ(想定の2倍ですね)が残ってしまい
その状態で.hide()display:none;すると急に空っぽの<li>がせき止めていた
marginの相殺が始まって片方のmarginが吸収されてしまうのがガクンとなる原因ぽいです(おそらくですけど)

なので、margin-top分だけネガティブマージンを指定してみました。
ついでにpaddingが付いた時の事を想定して上下だけ0にしてみました。

どうでしょうか?

上下のmarginが異なる場合にも対応させられたっぽいやつです。
改めてサンプルご覧ください。

jQuery

1function clearanceT(t, b, x, n, owner) { 2 if (owner.index() === 0) { 3 return `${t}px`; 4 } else { 5 return t > b ? `-${n}px` : `${n}px`; 6 } 7} 8function clearanceB(t, b, x, n, owner) { 9 if (owner.index() === 0) { 10 return `-${t}px`; 11 } 12 else{ 13 return t > b ? `${n}px` : `-${n}px`; 14 } 15} 16$("li").click(function () { 17 $(this).first().css({ background: "red !important" }); 18 // $(this).fadeOut(); 19 var mt = parseInt($(this).css("margin-top"), 10); 20 var mb = parseInt($(this).css("margin-bottom"), 10); 21 var mx = Math.max(mt, mb); 22 var mn = Math.min(mt, mb); 23 var owner = $(this); 24 $(this).animate( 25 { 26 height: 0, 27 opacity: 0, 28 marginTop: clearanceT(mt, mb, mx, mn, owner), 29 marginBottom: clearanceB(mt, mb, mx, mn, owner), 30 paddingTop: 0, 31 paddingBottom: 0 32 }, 33 "slow", 34 function () { 35 console.log(owner.css("marginTop"), owner.css("marginBottom")); 36 $(this).remove(); 37 } 38 ); 39}); 40 41

サンプル
https://codepen.io/recal/pen/PoJORdP

投稿2021/12/25 19:27

編集2021/12/25 21:31
recal

総合スコア1128

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

recal

2021/12/25 19:37

あ、これだと上下のmarginが異なる場合は駄目ですね。
recal

2021/12/25 21:31

アップデートしてみました。
nikuatsu

2021/12/26 03:42

これは思ってなかったレベルで理想的です。CSSで簡単に実装できるかと踏んでいたのですが、かなり大変なコードでしたね。お手数おかけしました。どうもありがとうございます。
guest

0

jQueryのfadeOutは徐々に透明(opacity:0)にしていき、最後にdisplay:noneにします。
display:noneになるとその要素は存在しないことになりますので、後の要素が上に移動します。
display:noneはオンオフしかないのでアニメーションは効きません。

opacity:0 と高さと上下マージンを0にするアニメーション(transition)をCSSで実装して、jQueryはクラスの追加のみにするといいでしょう。

css

1li { 2 width: 200px; 3 height: 30px; 4 margin: 10px 10px 0 10px; 5 background: pink; 6 transition: all 2s 1s, opacity 2s; 7} 8li.fadeout { 9 opacity: 0; 10 height: 0; 11 margin: 0 10px; 12}

js

1$('li').click(function(){ 2 $(this).addClass('fadeout'); 3});

CodePenサンプル

投稿2021/12/25 16:41

hatena19

総合スコア34075

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nikuatsu

2021/12/26 03:40

display:noneはオンオフしかないので…、なるほど納得いきました。ありがとうございます。かなり理想に近い動きになりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問