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

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

新規登録して質問してみよう
ただいま回答率
85.48%
スクロール

スクロールとは、ディスプレイスクリーン上において連続的にコンテンツが滑っていくことを指します。

jQuery

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

Q&A

解決済

1回答

1283閲覧

【jQuery】画面領域に入ると背景画像を固定してスクロールさせる方法を教えていただけないでしょうか

退会済みユーザー

退会済みユーザー

総合スコア0

スクロール

スクロールとは、ディスプレイスクリーン上において連続的にコンテンツが滑っていくことを指します。

jQuery

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

0グッド

0クリップ

投稿2020/06/14 07:33

編集2020/06/14 10:49

前提・実現したいこと

閲覧ありがとうございます。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の領域内に入ったときにアラートが表示されました。
なので、スクロールの検知は問題なく動作していると思います

スクロール固定のコードに変えると、イベントの発火がスクロールを始めた瞬間になっているのかなと考えます。
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

自決しました。
下記のサイトを参考にして希望通りの挙動になりました。

初心者向け!コピペで簡単にレスポンシブに強いパララックスを実装する<parallax>

上記に少し手を加えたので私のコードも記載します。
【変更点】
処理内容部分(28行目、32行目)のcssをtransformからbackground-position-yに変更。

jQuery

1//変更前 2$this.css('transform', ''); 3 4var nowpos = $this.offset().top; 5if (nowpos < scroll_bottom) { 6 $this.css('transform', 'translate(0,' + (scroll_bottom - nowpos) / reg + 'px)');

jQuery

1//変更後 2$this.css('background-position-y', ''); 3 4var nowpos = $this.offset().top; 5if (nowpos < scroll_bottom) { 6 $this.css('background-position-y', (scroll_bottom - nowpos) / reg + -40 + 'px');

以下は処理全体のコードです。

jQuery

1//初期設定 2var $window = $(window), 3 wh = window.innerHeight, 4 nowScroll = $window.scrollTop(), 5 reg = -10;//調整値、負の数だとスクロール時に上に動き、正の数だと下に動く。絶対値が大きいほど動く量が小さくなる。 6 7$window.on('load resize', function () { 8 wh = window.innerHeight; 9 nowScroll = $window.scrollTop(); 10}); 11window.addEventListener('scroll', function () { 12 nowScroll = $window.scrollTop(); 13}, { passive: true }); 14 15//トリガー 16var $paraItem = $('.bg-full'); 17if ($paraItem.length) { 18 parallax(); 19 $window.on('load resize', parallax); 20 window.addEventListener('scroll', parallax); 21} 22 23//処理内容 24function parallax() { 25 $paraItem.each(function () { 26 var $this = $(this), 27 scroll_bottom = nowScroll + wh; 28 $this.css('background-position-y', ''); 29 30 var nowpos = $this.offset().top; 31 if (nowpos < scroll_bottom) { 32 $this.css('background-position-y', (scroll_bottom - nowpos) / reg + -40 + 'px'); 33 } 34 }); 35}

私のリサーチ不足でしたね...。
精進します。

投稿2020/06/16 12:31

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問