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

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

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

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

jQuery

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

1回答

2088閲覧

JavaScriptで書かれているslideUp/slideDownのコードを理解したい

WebBeginner777

総合スコア1

JavaScript

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

jQuery

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2021/09/07 14:13

ソースコードを読み解きたい

jQueryのslideUp/slideDownを生のJavaScriptで書かれている記事があるのですが、一部理解できない箇所があったので、ベテランの方ご教授いただけないでしょうか。

該当記事↓
https://web-dev.tech/front-end/javascript/slide-methods-on-vanilla-javascript/#index_id6

slideUpのソースコード

JavaScript

1const slideUp = (el, duration = 300) => { 2 el.style.height = el.offsetHeight + "px"; 3 el.offsetHeight; ※これをこの位置で読み取る必要性 4 el.style.transitionProperty = "height, margin, padding"; 5 el.style.transitionDuration = duration + "ms"; 6 el.style.transitionTimingFunction = "ease"; 7 el.style.overflow = "hidden"; 8 el.style.height = 0; 9 el.style.paddingTop = 0; 10 el.style.paddingBottom = 0; 11 el.style.marginTop = 0; 12 el.style.marginBottom = 0; 13 setTimeout(() => { 14 el.style.display = "none"; 15 el.style.removeProperty("height"); 16 el.style.removeProperty("padding-top"); 17 el.style.removeProperty("padding-bottom"); 18 el.style.removeProperty("margin-top"); 19 el.style.removeProperty("margin-bottom"); 20 el.style.removeProperty("overflow"); 21 el.style.removeProperty("transition-duration"); 22 el.style.removeProperty("transition-property"); 23 el.style.removeProperty("transition-timing-function"); 24 }, duration); 25};

slideDownのソースコード

JavaScript

1const slideDown = (el, duration = 300) => { 2 el.style.removeProperty("display"); 3 let display = window.getComputedStyle(el).display; 4 if (display === "none") { 5 display = "block"; 6 } 7 el.style.display = display; 8 let height = el.offsetHeight; 9 el.style.height = 0; 10 el.style.paddingTop = 0; 11 el.style.paddingBottom = 0; 12 el.style.marginTop = 0; 13 el.style.marginBottom = 0; 14 el.offsetHeight; ※これをこの位置で読み取る必要性 15 el.style.transitionProperty = "height, margin, padding"; 16 el.style.transitionDuration = duration + "ms"; 17 el.style.transitionTimingFunction = "ease"; 18 el.style.overflow = "hidden"; 19 el.style.height = height + "px"; 20 el.style.removeProperty("padding-top"); 21 el.style.removeProperty("padding-bottom"); 22 el.style.removeProperty("margin-top"); 23 el.style.removeProperty("margin-bottom"); 24 setTimeout(() => { 25 el.style.removeProperty("height"); 26 el.style.removeProperty("overflow"); 27 el.style.removeProperty("transition-duration"); 28 el.style.removeProperty("transition-property"); 29 el.style.removeProperty("transition-timing-function"); 30 }, duration); 31};

el.offsetHeight;を上記の場所で記述する理由が理解できない

試しに、el.offsetHeight;を消したり記述位置を変えたりすると、アニメーションが滑らかではなくなります。
アニメーションがガタいて挙動が若干おかしくなるので、必要なコードというのは理解できるのですが、どのような役割を担っているのか不明なため知りたいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

このあたりの情報をどうぞ。

【要素の横幅が0の時、再計算させてちゃんとした値を入れる - A Day in the Life】
https://secon.dev/entry/2011/04/23-subtech/

【ReFlowの原因とマークアップの最適化 - LINE ENGINEERING】
https://engineering.linecorp.com/ja/blog/reflow-and-markup-optimization/

投稿2021/09/07 14:25

kei344

総合スコア69458

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

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

WebBeginner777

2021/09/08 01:21

Reflowの概念を知れたことで検索の幅が増えました。 私なりにも調べてみて理解まで一歩進むことができた気がします。 要するに今回のコードは、`offsetHeight;`でスタイルを参照することでReflowを発生させているということですかね。 スタイル変更時にReflowを強制的に発生させてないが故に、スタイル変更がスルーされた、あるいはスタイル変更がまとめて実行されているということで認識あっていますでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問