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

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

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

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

Q&A

解決済

2回答

3865閲覧

jsで高さを取得する際にタイムラグが出てしまう。

takane

総合スコア63

JavaScript

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

0グッド

0クリップ

投稿2018/06/12 02:16

先ほど質問を出したのですが、記載内容が悪いというご指摘をいただいたので、立て直します。

http://www.noevir.co.jp/figureskate/

こちらのサイトのNEWS部分ですが、jsで、ボタンを押すとぱかぱかと開く仕組みを作っています。

spモードにすると分かるのですが、一番最初に高さを計算する際に少しタイムラグがでてしまい、一旦100%の高さを表示してからリサイズされるという現象が起きています。

外をかこむ枠の高さをtr3つ分にしたいためにこのようになっています。spモードだとテーブルの高さがデバイスごとに変わるので、jsでtrの高さを計算して、枠の高さとして設定しています。

タイムラグをなくし、最初からtr3つ分の高さにすることはできますでしょうか?

window.onloadでは遅いかと思ったのでaddEventListenerのDOMContentLoadedも試したのですがうまくいきませんでした。

html

1<div class="column ac_wrapper" id="newstop"> 2 <h2 class="txt-tit">NEWS</h2> 3 <div class="col_news ac" id="ac"> 4 <table class="news-ta ac_table"> 5 <tbody> 6 <tr> 7 <th>2018.5.7</th> 8 <td style="line-height:1.3"><a href="topics.htm#massage_201805">樋口選手からメッセージが届きました。</a></td> 9 </tr> 10 <tr> 11 <th>2018.4.20</th> 12 <td style="line-height:1.3"><a href="topics.htm#baseball">メットライフドームでの始球式を終えられた樋口選手から写真が届きました。</a></td> 13 </tr> 14 <tr> 15 <th>2018.4.17</th> 16 <td style="line-height:1.3">4月20日(金)に行われる埼玉西武ライオンズ対千葉ロッテマリーンズ戦(メットライフドーム)の始球式に登場します。</td> 17 </tr> 18 <tr> 19 <th>2018.3.24</th> 20 <td style="line-height:1.3">世界フィギュアスケート選手権大会2018で2位となりました。</td> 21 </tr> 22 <tr> 23 <th>2018.2.24</th> 24 <td style="line-height:1.3">チャレンジカップ2018で優勝いたしました。</td> 25 </tr> 26 <tr> 27 <th>2017.12.23</th> 28 <td style="line-height:1.3">第86回全日本フィギュアスケート選手権大会で4位となりました。</td> 29 </tr> 30 <tr> 31 <th>2017.12.9</th> 32 <td style="line-height:1.3">ISUグランプリファイナル 国際フィギュアスケート競技大会 愛知・名古屋2017で6位となりました。</td> 33 </tr> 34 <tr> 35 <th>2017.11.4</th> 36 <td style="line-height:1.3">ISUグランプリ アウディカップオブチャイナで2位となりました。</td> 37 </tr> 38 <tr> 39 <th>2017.10.21</th> 40 <td style="line-height:1.3">ISUグランプリ ロステレコムカップで3位となりました。</td> 41 </tr> 42 <tr> 43 <th>2017.9.17</th> 44 <td style="line-height:1.3">ロンバルディアトロフィーで2位となりました。</td> 45 </tr> 46 47 </tbody> 48 </table> 49 <div class="switch_ac"> 50 <div class="css_button parent" id="ac_open"> 51 <p class="open">さらに表示する</p> 52 <p class="close">閉じる</p> 53 </div> 54 </div> 55 56 </div> 57 58</div> 59

js

1(function () { 2 //関数の中身・・・ 3 4/*アコーディオンstart*/ 5 6 const ac_table = document.getElementsByClassName('ac_table'); 7 8 var acparent = document.getElementsByClassName('ac'); 9 var button = document.getElementsByClassName('css_button'); 10 var acopen = document.getElementsByClassName('open'); 11 var acclose = document.getElementsByClassName('close'); 12 var ac_wrapper = document.getElementsByClassName('ac_wrapper'); 13 14 var sw = false; 15 16 17 18 for(var i=0;i<acparent.length;i++){ 19 var chageClassOpen = acopen[i]; 20 var chageClassClose = acclose[i]; 21 var thisAcparent = acparent[i]; 22 var thisTable = ac_table[i]; 23 var bar = ac_table[i]; 24 var thisButton = button[i]; 25 var newstop = document.getElementById('newstop'); 26 var thisAcWrapper = ac_wrapper[i]; 27 28 //console.log( "テーブルの高さ" + thisTable.offsetHeight); 29 30 thisAcparent.classList.add('smooth'); 31 32 thisButton.addEventListener("click", function(){ 33 if(sw==true){ 34 sw = false; 35 tableSize(); 36 chageClassOpen.className = 'on open'; 37 chageClassClose.className = 'off close'; 38 thisAcparent.classList.remove('ac_opensesame'); 39 move201806(); 40 }else if(sw==false){ 41 const contentHeight = bar.getBoundingClientRect().height; 42 thisAcparent.style.height = contentHeight+70+'px'; 43 sw = true; 44 chageClassOpen.className = 'off open'; 45 chageClassClose.className = 'on close'; 46 thisAcparent.classList.add('ac_opensesame'); 47 }; 48 49 }, false); 50 51 /*スクロールした高さの取得*/ 52 var windowTop = document.documentElement.scrollTop || document.body.scrollTop; 53 window.onload = function () { 54 window.onscroll = function(){ 55 getTheScrollPosition( this ); 56 }; 57 function getTheScrollPosition( $event ) { 58 var scrollTop = document.documentElement.scrollTop || document.body.scrollTop; 59 windowTop = scrollTop ; 60 //console.log(windowTop); 61 } 62 } 63 /*スクロールした高さの取得*/ 64 65 /*ボックスまでのスクロール量*/ 66 var box = thisAcWrapper.offsetTop; 67 //console.log("ボックスのページ上の位置は"+box); 68 /*ボックスまでのスクロール量*/ 69 70 71 function move201806(){ 72 73 var i = 10; 74 75 var howMuchScroll = false; 76 if(windowTop-box > 0){ 77 howMuchScroll = (windowTop-box)/10; 78 howMuchScroll += 0.5; 79 }else if(windowTop-box < 0){ 80 howMuchScroll = 0; 81 } 82 //console.log(howMuchScroll); 83 84 var int = setInterval(function() { 85 window.scrollBy(0,-howMuchScroll); 86 i += 20; 87 if (i >= 200) clearInterval(int); 88 }, 20); 89 }; 90 91 function tableSize(){ 92 var tableHeight = thisTable.getElementsByTagName('tbody')[0].childNodes[1].clientHeight + thisTable.getElementsByTagName('tbody')[0].childNodes[3].clientHeight + thisTable.getElementsByTagName('tbody')[0].childNodes[5].clientHeight + 71; 93 thisAcparent.style.height = tableHeight + 'px'; 94 }; 95 function wholeTableSize(){ 96 var openHeight = thisTable.clientHeight + 71; 97 //console.log("テーブルの高さと71を足すと"+openHeight); 98 thisAcparent.style.height = openHeight + 'px'; 99 } 100 101 //window.onload= tableSize(); 102 window.addEventListener('DOMContentLoaded', function() { 103 tableSize(); 104 }); 105 106 107 //リサイズした時にする動作 108 window.onresize = window_load; 109 function window_load() { 110 if (sw == false) { 111 tableSize(); 112 //console.log(thisAcparent.style.height); 113 } else if (sw == true) { 114 wholeTableSize(); 115 } 116 //ボックスの位置を取り直す 117 box = thisAcWrapper.offsetTop; 118 //console.log("ボックスのページ上の位置は"+box); 119 }//リサイズした時にする動作 120 121 122 123 124 125 };/*for end*/ 126 127 128/*アコーディオンend*/ 129 130 131 132 133 134}());

css

1@charset "utf-8"; 2 3 4#ac{ 5 height:215px; 6 overflow:hidden; 7 position:relative; 8 } 9.ac_opensesame{ 10 height:auto; 11 overflow:hidden; 12 position:relative; 13 transition:3s all ease 0s; 14 } 15.switch_ac{ 16 position: absolute; 17 width: 100%; 18 bottom: 0; 19 height: 46px; 20 padding: 15px 0 0 0; 21 background-color: #FFFFFF; 22 } 23.css_button:hover{ 24 cursor:pointer; 25 opacity:0.7; 26 } 27.switch_ac p{ 28 color:#F44EAC; 29 font-size:0.8rem; 30 } 31.css_button{ 32 border:#f5509d 1px solid; 33 border-radius:30px; 34 width:180px; 35 margin-left:auto; 36 margin-right:auto; 37 height:44px; 38 } 39.open{ 40 margin-top:10px; 41 } 42 43.open:after{ 44 content: ""; 45 position: absolute; 46 display:block; 47 bottom: 6px; 48 left:0; 49 right:0; 50 margin:auto; 51 width:0px; 52 height:0px; 53 border-top: 10px #f5509d solid; 54 border-left: 7px solid transparent; 55 border-right: 7px solid transparent; 56 } 57 58.close{ 59 margin-top:10px; 60 display:none; 61 } 62 63.close:after{ 64 content: ""; 65 position: absolute; 66 display:block; 67 bottom: 6px; 68 left:0; 69 right:0; 70 margin:auto; 71 width:0px; 72 height:0px; 73 border-bottom: 10px #f5509d solid; 74 border-left: 7px solid transparent; 75 border-right: 7px solid transparent; 76 } 77 78 79.close a:link{ 80 text-decoration: none; 81 color: #f5509d; 82 } 83.close a:visited{ 84 text-decoration: none; 85 color: #f5509d; 86 } 87.close a::active{ 88 text-decoration: none; 89 color: #f5509d; 90 } 91 92.close a{ 93 display:block; 94 width:182px; 95 height:46px; 96 } 97 98.subtit_01{ 99 height:50px; 100 text-align:center; 101 } 102 103.hr_subtit{ 104 border:0; 105 border-bottom:medium double #999; 106 display:block; 107 } 108 109.pro{ 110 position:absolute; 111 bottom:10px; 112 right:7px; 113 } 114 115 116.button_result{ 117 text-align:right; 118 margin-top:0; 119 } 120.result table.res-ta{ 121 margin-bottom:15px; 122 } 123.css_button p{ 124 line-height:0.8rem; 125 font-family:"ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro", "メイリオ", Meiryo, Osaka, "MS Pゴシック", "MS PGothic", sans-serif; 126 font-size:0.8rem; 127 margin-left:auto; 128 margin-right:auto; 129 text-align:center; 130 width: 182px; 131 height: 46px; 132 margin-top: 0; 133 padding-top: 0; 134 line-height: 30px; 135 } 136 137.column .plans{ 138 margin-top:0px; 139 } 140 141.top-cont1 .top-cont-L h2,.top-cont1 .top-cont-R h2{ 142 margin-top:0; 143 } 144 145.top-cont1 .top-cont-L .btn-05{ 146 text-align:right; 147 } 148 149@media only screen and (max-width: 767px) { 150 #ac { 151 height: inherit; 152 overflow: hidden; 153 position: relative; 154} 155.css_button:hover{ 156 cursor:pointer; 157 opacity:1.0; 158 } 159.column { 160 margin-top: 35px; 161} 162.pro { 163 position:relative; 164 padding-top: 0; 165 margin-top: 10px; 166 margin-right: 10px; 167 bottom:inherit; 168 right:inherit; 169} 170.top-cont1 .top-cont-R .pro{ 171 margin-right:0; 172 } 173.mg{ 174 margin-top:20px; 175 width:86%; 176 margin-left:auto; 177 margin-right:auto; 178 } 179.top-cont-R .p-th-bg{ 180 padding:7%; 181 width:86% 182 } 183 184 .top-cont-R .p-th-bg .mt10.parent{ 185 padding:10px 4% 10px 4%!important; 186 box-sizing:border-box; 187 } 188 189.button_result a{ 190 margin-right:5px; 191 } 192 193.top-cont2.column{ 194 padding-bottom:0; 195 } 196 197.top-cont-R{ 198 margin-top:35px; 199 } 200.top-cont1.column{ 201 margin-top:30px; 202 } 203 }
body.post{ opacity:0; } .parent{ position:relative; } .news-ta td{ text-align:left; } .column{ margin-top:30px; } /*--アコーディオンの開閉start--*/ .on{ display:block!important; } .off{ display:none!important; } .smooth{ transition: 1s all ease 0s!important; } /*--アコーディオンの開閉end--*/

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

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

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

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

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

guest

回答2

0

ベストアンサー

ブラウザ上でのロードが終わらなければ、サイズに依存する「実際の高さ」は計れないですし、
今の状態で一瞬表示されるのを、jsだけでどうにかするのは無理かなぁと思いました。

最初に高さが分かる必要があるのは、先頭のから3つ分のtrまでだと思うので、
cssでもちょっと制御しておいたらいいのではないかと。

例えば。

初期でニュースのテーブルに、trの4つ目以降を非表示にするクラスを付けて置く。
↓ クラス名は適当です
table.limit_row3 tr:nth-child(n+4){ display: none; }

で、load直後のdivの高さを3つ分に設定する処理が終わったら、クラス.limit_row3 を外す。

は、どうでしょう。

これでうまくいくならば、
HTMLはクラスを1つ書き足す、cssとjsは1行書き足すくらいで済むので、
修正も楽かなと思います。

実際に高さを設定しているjsの処理は詳しく見ておりません & 上記提案は試していません
ので、うまくいかない場合は、ご容赦ください^^;

投稿2018/06/12 03:13

mix-peach

総合スコア1910

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

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

miyabi_takatsuk

2018/06/12 03:18 編集

これ、ベストですね。 うまくいけば、見えなくても、JS上では全ニュースの高さ先に取得できるかもですし。 僕自身、参考にさせていただきます。
takane

2018/06/12 03:50

そうですね、タイムラグはしかたない現象だったのですね・・・。 いつも思うのですが、みなさんは柔軟に対応策を考えてらっしゃるなと思います。 発想力のあるなしがサイトデザインに現れるのですね・・・。 cssで操作をできれば、一番美しいと思います。更新時に試してみます。 有り難うございます。
guest

0

これは、ロードのタイミングで、一瞬全ニュースが表示は、
いたしかたない気がします・・・・。
ので、発想を変えてみてはいかがでしょう。

上位三つは、一つのブロック
それより下位のニュースは、別ブロックに格納しておき、(display: none;にしたdivとか)
ロード完了次第、下位のニュースを、上位三つの親ブロックにjsで移動、
下位ニュースを格納していた、display: none;要素をJSで削除
そのあと、クリックイベント等を追加。
こうすれば、
HTML表示直後は、三つしか無いので、全部が表示されることは絶対ありません。

サンプルソースコードは、すみません、少々込み入った内容になるかと思いますので、
ご自身で実装してみてください・・・。
(ここまでネイティブで書ける方なら、わりと余裕で実装できるかと思います)

投稿2018/06/12 02:35

編集2018/06/12 02:39
miyabi_takatsuk

総合スコア9528

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

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

takane

2018/06/12 03:49

そうですね、タイムラグはしかたない現象だったのですね・・・。 いつも思うのですが、みなさんは柔軟に対応策を考えてらっしゃるなと思います。 発想力のあるなしがサイトデザインに現れるのですね・・・。 テーブルを2つに分けるやりかたを次の更新で試みてみます。 有り難うございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問