前提・実現したいこと
閲覧ありがとうございます。jQueryにてわからないことがあるので質問します。
よろしくお願いいたします。
■前提
- 背景画像の高さは400px
- 背景画像を指定する要素の高さは200px
■実現したいこと
スクロール量を検知し、画面領域が下記htmlの.bg-1
と.bg-2
に入ると
ぞれぞれの背景画像を固定してスクロールを行う。
※背景の固定...以下のページのようなスクロールしても背景画像が固定されているパララックス効果のことです。
https://takafumimegumi.com/demo/background-attachment/index.html
【動作の順番】
0. .bg-1
が画面内に入ると.bg-1
の背景画像のみが固定(.bg-2
はまだ固定されない)
0. .bg-2
が画面内に入ると.bg-2
の背景画像のみが固定
発生している問題・エラーメッセージ
現在のコードでは画面の一番上からスクロールを検知し、
それに伴い.bg-1
と.bg-2
の背景画像が同時にスクロールを始めます。
PCのようなスクロール量が小さいデバイスでは問題ありませんが、
スマホだとスクロール量が多くなり画像の幅を超えてしまいます。
該当のソースコード
html
1<div class="content"> 2 コンテンツ 3</div> 4 5<div class="bg-1"> 6 <h2>テキスト</h2> 7</div> 8 9<div class="content"> 10 コンテンツ 11</div> 12 13<div class="bg-2"> 14 <h2>テキスト</h2> 15</div> 16 17<div class="content"> 18 コンテンツ 19</div>
css
1.content { 2 height: 1000px; 3 background: #a7a7a7; 4} 5 6.bg-1 { 7 height: 200px; 8 background: url("../img/bg-1.jpg") no-repeat center center/cover; 9} 10 11.bg-2 { 12 height: 200px; 13 background: url("../img/bg-2.jpg") no-repeat center center/cover; 14}
jQuery
1$(function () { 2 3 $(window).scroll(function () { 4 5 var elem1 = $('.bg-1'); 6 7 elem1.each(function () { 8 9 var elemOffset = $(this).offset().top; 10 var scrollPos = $(window).scrollTop(); 11 var wh = $(window).height(); 12 13 if (scrollPos > elemOffset - wh) { 14 var scrollPosi = 0; 15 $(window).scroll(function () { 16 scrollPosi = $(document).scrollTop(); 17 $('.bg-1').stop(true, true).animate({ 18 'background-position-y': -scrollPosi / 10 + 'px' 19 }, 100); 20 }); 21 } 22 }); 23 24 var elem2 = $('.bg-2'); 25 elem2.each(function () { 26 27 var elemOffset = $(this).offset().top; 28 var scrollPos = $(window).scrollTop(); 29 var wh = $(window).height(); 30 31 if (scrollPos > elemOffset - wh) { 32 var scrollPosi = 0; 33 $(window).scroll(function () { 34 scrollPosi = $(document).scrollTop(); 35 $('.bg-2').stop(true, true).animate({ 36 'background-position-y': -scrollPosi / 10 + 'px' 37 }, 100); 38 }); 39 } 40 }); 41 }); 42 43});
試したこと
スクロールを固定するコードの代わりに、alert()メソッド
を入れると、
.bg-1
と.bg-2
の領域内に入ったときにアラートが表示されました。
なので、スクロールの検知は問題なく動作していると思います
スクロール固定のコードに変えると、イベントの発火がスクロールを始めた瞬間になっているのかなと考えます。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。