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

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

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

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

754閲覧

JavaScript プロの方最善策を教えて下さい

aswa

総合スコア3

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/08/12 02:21

編集2021/08/12 02:35

appendChildとclassListのかみ合わせで悩んでいます

まず1番ですがこの記述だと動きません
2番だと動きます
1番が動かない理由はappedChildした瞬間にclassList.addを即時付けてもタイミング的な問題で動かないと読んでいます
appendChildが完了したらという判定ができれば一番いいのですがそのようなことはできますか?

そして3番と4番です
3番のremoveを動かし、完了したタイミングで4番を実行したい場合どうすればいいでしょうか
これもsetTimeoutしか思い浮かびません

詳しい方よろしくお願いいたします

<style> body,html{ width:100%; height:100%; } .m{ transform: translateX(100%); transition: 1s ; } .m.m_{ transform:translateX(0%); } </style> <script> window.onload=function(){ div=document.createElement("div"); div.style.width="150px"; div.style.height="50px"; div.style.position="absolute"; div.style.top="0%"; div.style.right="0%"; div.classList.add("m"); div.setAttribute("id","div"); div.style.background="red"; div.addEventListener("transitionend", function() { document.getElementById("div").classList.remove("m_");//3番 document.body.removeChild(document.getElementById("div"));//4番 }); document.body.appendChild(div); //document.getElementById("div").classList.add("m_");1番 setTimeout("document.getElementById(\"div\").classList.add(\"m_\")",1000);//2番 } </script>

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

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

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

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

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

guest

回答2

0

ベストアンサー

requestAnimationFrameで出来ると思います。「3番と4番」についてはクラスの有無を見ればよいです。

【CSS トランジションの使用 - CSS: カスケーディングスタイルシート | MDN】
https://developer.mozilla.org/ja/docs/Web/CSS/CSS_Transitions/Using_CSS_transitions#javascript_examples

次のような場合の直後にトランジションを使用する場合は注意してください。
.appendChild() を使用して DOM に要素を追加したとき
要素の display: none; プロパティを外したとき
この場合、初期の状態が発生せず、要素が常に最後の状態であるかのように扱われます。この制限を会計つする簡単な方法は、トランジションを行いたい CSS プロパティを変更する前に、数ミリ秒の window.setTimeout() を適用することです。

JavaScript

1setTimeout( _=> { 2 div.classList.add( "m_" ); 3}, 10 );

JavaScript

1requestAnimationFrame( _=> { 2 div.classList.add( "m_" ); 3} ); 4```**動くサンプル:**[https://jsfiddle.net/Ljedzsxa/](https://jsfiddle.net/Ljedzsxa/) 5 6--- 7 8ざっと検索した範囲では、こっちも面白いと思いました。 9 10【JavaScriptで操作するCSS TransitionとCSSOMの関係 | フロントエンドBlog | ミツエーリンクス】 11[https://www.mitsue.co.jp/knowledge/blog/frontend/201906/28_1120.html](https://www.mitsue.co.jp/knowledge/blog/frontend/201906/28_1120.html) 12> CSSOM View Moduleで定義されている仕様の中から、CSSOMに問い合わせが発生する手段を1つとるだけでTransitionを動作させることはできるようです。 13> しかしながら参照するだけではエンジンによる最適化でCSSOMへの問い合わせが発生しなくなる可能性もありますし、明確にそのような仕様になっているという一文を見つけることもできなかったことから、現状では実際の実装がそのようになっているからと言って、手放しにこの方法でTransitionを実現することはあまりお勧めできないと考えます。 14```JavaScript 15window.onload = _=> { 16 div = document.createElement( "div" ); 17 div.style.width = "150px"; 18 div.style.height = "50px"; 19 div.style.position = "absolute"; 20 div.style.top = "0%"; 21 div.style.right = "0%"; 22 div.classList.add( "m" ); 23 div.setAttribute( "id", "div" ); 24 div.style.background = "red"; 25 div.addEventListener( "transitionend", _=> { 26 if ( div.classList.contains( "m_" ) ) { 27 div.classList.remove( "m_" ); //3番 28 } else { 29 document.body.removeChild( div ); //4番 30 } 31 }); 32 document.body.appendChild(div); 33 div.offsetHeight; // eslint-disable-line 34 div.classList.add( "m_" ); 35} 36```**動くサンプル:**[https://jsfiddle.net/Ljedzsxa/1/](https://jsfiddle.net/Ljedzsxa/1/)

投稿2021/08/12 05:10

kei344

総合スコア69407

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

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

0

1番が動かない理由はappedChildした瞬間にclassList.addを即時付けてもタイミング的な問題で動かないと読んでいます

~~違います。~~アニメーションのタイミングの問題以前の問題として、その時点ではdivdocumentへ挿入していないので、document.getElementByIddocument経由で探しても見つからない状況です。

「appendChildが完了したらという判定」なんて高度なことを考える必要はなく、単にdocument.body.appendChild(div);を行ったあとで実行すればいいだけです。

投稿2021/08/12 02:31

編集2021/08/12 02:52
maisumakun

総合スコア145184

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

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

maisumakun

2021/08/12 02:32

> 3番のremoveを動かし、完了したタイミングで4番を実行したい場合どうすればいいでしょうか すでに行っているコードと同様に、transitionendを待つ、ではだめなのですか?
aswa

2021/08/12 02:34

ご指摘いただいたことをふまえ <style> body,html{ width:100%; height:100%; } .m{ transform: translateX(100%); transition: 1s ; } .m.m_{ transform:translateX(0%); } </style> <script> window.onload=function(){ div=document.createElement("div"); div.style.width="150px"; div.style.height="50px"; div.style.position="absolute"; div.style.top="0%"; div.style.right="0%"; div.classList.add("m"); div.setAttribute("id","div"); div.style.background="red"; div.addEventListener("transitionend", function() { document.getElementById("div").classList.remove("m_");//3番 document.body.removeChild(document.getElementById("div"));//4番 }); document.body.appendChild(div); document.getElementById("div").classList.add("m_"); } </script> このようにしましたが1番の問題は解決しませんでした
aswa

2021/08/12 02:35

>すでに行っているコードと同様に、transitionendを待つ、ではだめなのですか? どのように入れ子にしてイベントを発生させるのでしょうか?
maisumakun

2021/08/12 02:36 編集

書き換えたコードで、1番はどのような問題があるのですか?
aswa

2021/08/12 02:37 編集

>書き換えたコードで、1番はどのような問題があるのですか? document.getElementById("div").classList.add("m_"); これがアニメーションとして実現されていません
maisumakun

2021/08/12 02:39 編集

(コメント修正に伴い削除)
aswa

2021/08/12 02:39

環境はPC Firefox最新版です
aswa

2021/08/12 02:39

>それは解決していますよね? アニメーションとして実現されていませんので未解決になります
maisumakun

2021/08/12 02:40

requestAnimationFrameで描画を待ってからクラス変更を行ってみてはどうでしょうか?
aswa

2021/08/12 02:42

↑先ほど「解決してますよね?」と言ったこととガラリと変わってしまった為困惑してるのですが、、、 setTimeoutで間隔を開けないと無理でしたよね?
maisumakun

2021/08/12 02:46 編集

> 先ほど「解決してますよね?」と言ったこととガラリと変わってしまった為困惑してるのですが、、、 こちらも「setTimeout云々」と書いたところに付けたコメントが。その元コメントの変更に伴い全く無意味となってしまって困惑しています。 (「アニメーションとして実現されていませんので未解決になります」という判断基準が把握できていなくてのコメントでした)
aswa

2021/08/12 02:47

>違います。その時点ではdivはdocumentへ挿入していないので、document.getElementByIdとdocument経由で探しても見つからないからです。 単純なミスです。 ご指摘通りにやっても動かないものは動かない、という事ですがどこが困惑されてますか?
aswa

2021/08/12 02:48

私は教えていただいてる立場なので、生意気なことはいえませんが、 下記コードでm_のアニメーションが追加されてると言えますか? <style> body,html{ width:100%; height:100%; } .m{ transform: translateX(100%); transition: 1s ; } .m.m_{ transform:translateX(0%); } </style> <script> window.onload=function(){ div=document.createElement("div"); div.style.width="150px"; div.style.height="50px"; div.style.position="absolute"; div.style.top="0%"; div.style.right="0%"; div.classList.add("m"); div.setAttribute("id","div"); div.style.background="red"; div.addEventListener("transitionend", function() { document.getElementById("div").classList.remove("m_");//3番 document.body.removeChild(document.getElementById("div"));//4番 }); document.body.appendChild(div); document.getElementById("div").classList.add("m_"); //setTimeout("document.getElementById(\"div\").classList.add(\"m_\")",1000);//2番 } </script>
aswa

2021/08/12 02:50 編集

document.getElementById("div").classList.add("m_");のアニメーションがうまく追加されてないから div.addEventListener("transitionend", function() { document.getElementById("div").classList.remove("m_");//3番 document.body.removeChild(document.getElementById("div"));//4番 }); これも発生していないのが ご指摘いただいたコード変更に対する返答です
maisumakun

2021/08/12 02:50

> 下記コードでm_のアニメーションが追加されてると言えますか? その基準を把握せずにコメントしていたものでした、失礼いたしました。
aswa

2021/08/12 03:11 編集

m_は追加されていましたがアニメーションは動いてません div.addEventListener("transitionend", function() { document.getElementById("div").classList.remove("m_");//3番 document.body.removeChild(document.getElementById("div"));//4番 }); が発生していない、基準も何も動かしたらわかる事ではありませんか
maisumakun

2021/08/12 02:54 編集

> 基準も何も動かしたらわかる事ではありませんか もとの質問を見て、「そもそもエラーになってコードが止まってしまっている」という問題で詰まっているものだと判断しました。アニメーションのほうが主題だと判断できなかったのです。
aswa

2021/08/12 02:55

そうでしたか。わかりました。 私の記述不足もあり、申し訳ありません
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問