Javascript
1 var resizeTimer = null, 2 $a = $('#section_a'), 3 $b = $('#section_b'), 4 $c = $('#section_c'), 5 aTop, a_contentTop, bTop, b_contentTop, cTop, c_contentTop; 6 console.log(a_contentTop); 7 $('#next_a').on('click', function() { 8 $('body,html').animate({ 9 scrollTop: aTop 10 }, 800, autoscroll_a); 11 }); 12 13 $('#next_b').on('click', function() { 14 $('body,html').animate({ 15 scrollTop: bTop 16 }, 800, autoscroll_b); 17 }); 18 19 $('#next_c').on('click', function() { 20 $('body,html').animate({ 21 scrollTop: cTop 22 }, 800, autoscroll_c); 23 }); 24 25 $('#top').on('click', function() { 26 $('body,html').animate({ 27 scrollTop: 0 28 }, 800); 29 }); 30 31 function autoscroll_a() { 32 setTimeout(function() { 33 $('body,html').animate({ 34 scrollTop: a_contentTop 35 }, 300); 36 }, 800) 37 console.log(a_contentTop); 38 } 39 40 function autoscroll_b() { 41 setTimeout(function() { 42 $('body,html').animate({ 43 scrollTop: b_contentTop 44 }, 300); 45 }, 800) 46 } 47 48 function autoscroll_c() { 49 setTimeout(function() { 50 $('body,html').animate({ 51 scrollTop: c_contentTop 52 }, 300); 53 }, 800) 54 } 55 56 //位置取得 57 var delay = 0 58 $(window).on('load resize', function() { 59 clearTimeout(resizeTimer); 60 resizeTimer = setTimeout(function() { 61 62 var hSize = $(this).outerHeight(); 63 $('.first_btn,.title,.content').height(hSize); 64 aTop = $a.offset().top; 65 a_contentTop = $a.find('.content').offset().top; 66 bTop = $b.offset().top; 67 b_contentTop = $b.find('.content').offset().top; 68 cTop = $c.offset().top; 69 c_contentTop = $c.find('.content').offset().top; 70 console.log(a_contentTop); 71 72 }, delay); 73 delay = 200; 74 }); 75コード
先日からこのサイトで何度か質問させて頂いているのですが、
追加でアニメーションを加えたく、offset().top;の値を取得したかったのですが、スコープの範囲を理解できないようです。
上記のコードの中の4箇所にそれぞれ console.log(a_contentTop); を入れてみて変数のスコープ範囲を調べてみたのですが、
いまいちピンときませんでした。
※入れた個所を1~4で分け、それぞれに **「←ここ」**で印を付けています。
1
1var resizeTimer = null, 2 $a = $('#section_a'), 3 $b = $('#section_b'), 4 $c = $('#section_c'), 5 aTop, a_contentTop, bTop, b_contentTop, cTop, c_contentTop; 6 console.log(a_contentTop); ←ここ 7コード
2
1$('#next_a').on('click', function() { 2 $('body,html').animate({ 3 scrollTop: aTop 4 }, 800, autoscroll_a); 5 console.log(a_contentTop); ←ここ 6 }); 7コード
3
1function autoscroll_a() { 2 setTimeout(function() { 3 $('body,html').animate({ 4 scrollTop: a_contentTop 5 }, 300); 6 }, 800) 7 console.log(a_contentTop); ←ここ 8 } 9コード
4
1var delay = 0 2 $(window).on('load resize', function() { 3 clearTimeout(resizeTimer); 4 resizeTimer = setTimeout(function() { 5 6 var hSize = $(this).outerHeight(); 7 $('.first_btn,.title,.content').height(hSize); 8 aTop = $a.offset().top; 9 a_contentTop = $a.find('.content').offset().top; 10 bTop = $b.offset().top; 11 b_contentTop = $b.find('.content').offset().top; 12 cTop = $c.offset().top; 13 c_contentTop = $c.find('.content').offset().top; 14 console.log(a_contentTop); ←ここ 15 16 }, delay); 17 delay = 200; 18 }); 19コード
まずは4からです。
ここでは関数内で、変数 a_contentTop に $a.find('.content').offset().top; という値を代入しているので
その関数内で変数を呼び出せているという事は何となく理解できます。
次に1です。
ここが理解できていないのですが
4で値を代入した変数を1で呼び出しているのですが、
1でconsole.log(a_contentTop);をしても値がundefinedになります。
つまり値が未定義の状態だという事です。
なのにもっと分からないのが、2と3ではclickイベント発火時に **console.log(a_contentTop); **が呼び出せています。
自分でも参考書を読んだり、サイトで検索しているのですが
今回のコードの参考となる情報は見つかりませんでした。
もっと理解を深めていきたいので、ここを勉強した方が良いなどの情報がありましたら
教えて頂けるとありがたいです。
宜しくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/09/23 06:51