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

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

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

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

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

1回答

4013閲覧

cssのscroll-snapとjsのscrollイベントが競合して実行できません。

Ryoma0305

総合スコア8

JavaScript

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

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2021/01/24 12:59

前提・実現したいこと

cssのscroll-snapでフルページスクロールのページを作成しつつ、スクロール連動で要素をフェードインさせたいです。

html

1<main class="fullpage"> 2 <div class="section section01"></div> 3<div class="section section02"></div> 4</main>

css

1.fullpage { 2 overflow: scroll; 3 scroll-snap-type: y mandatory; 4 scroll-snap-stop: always; 5 height: 100vh; 6} 7.section { 8 scroll-snap-align: start; 9 height: 100%; 10 }

JavaScript

1$(document).scroll(function () { 2 let scrollTop = $(window).scrollTop(); // スクロール上部の位置 3 let areaTop = $(".section02").offset().top; // 対象エリアの上部の位置 4 let areaBottom = areaTop + $(".section02").innerHeight(); // 対象エリアの下部の位置 5 6 if (scrollTop > areaTop && scrollTop < areaBottom) { 7 console.log('section2-in') 8 $(".section02").addClass("js-show"); // スクロールが対象エリアに入った場合 9 } 10 });

cssのscroll-snapを使うとjsのスクロールイベントでスクロール連動のイベントが作動しません。
尚、当初フルページスクロール用にfulopage.jjsを使っており、次のページ(.section02)にスクロールでイベント実行はfullpage.jsの標準オプションのonleaveで可能なのですが、
今回はページ(.section02)の途中に到達した時に実行したいのでそのオプションも使えません。
それならcssのscroll-snapでなら可能かと思い試しましたがやはりスクロールでイベントが実行できません。
ここ何日間もこの問題に悩ませれています。もし解決策もしくはスクロールイベントを使わずにスクロール連動のフェードインをする方法をご存知でしたら教えてください。よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

.fullpage の高さを画面の高さ(height: 100vh;)に設定していたら、$(document).scroll は発生しません。(他に要素があれば別ですが)

overflow: scroll;.fullpage内でスクロールするようにしているので、発生するのは、$(".fullpage").scroll です。

とりあえず、下記でどうなりますか。

js

1$(".fullpage").scroll(function () { 2 let scrollTop = $(".fullpage").scrollTop(); // スクロール上部の位置 3 let areaTop = $(".section02").offset().top; // 対象エリアの上部の位置 4 let areaBottom = areaTop + $(".section02").innerHeight(); // 対象エリアの下部の位置 5 6 if (scrollTop > areaTop && scrollTop < areaBottom) { 7 console.log('section2-in') 8 $(".section02").addClass("js-show"); // スクロールが対象エリアに入った場合 9 } 10 });

投稿2021/01/24 14:28

編集2021/01/24 14:32
hatena19

総合スコア33699

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

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

Ryoma0305

2021/01/24 17:57

なるほど。スクロールイベントは実行できるようになりました。ありがとうございます。 ただ、これはまた別の問題だと思うのですがスクロールの挙動が変で、.section02の下までスクロールしし終えると.section02のトップまで勝手に戻ってしまいます。これはマークアップの問題でしょうか? html <main class="fullpage"> <div id="section01></div> <div id="section02"> <div class="u-pc-only"> </div> //pc時のみ表示 <div class="u-sp-only”> //sp時のみ表示 <div class="p-home__content"> <div class="p-home__content-inner"> <div></div> <p></p> <div></div> <div id="section03"></div> </div> </div> <div class=“l-footer”></div> </div> </div> </main> css .fullpage { overflow: scroll; scroll-snap-type: y mandatory; scroll-snap-stop: always; height: 100vh; } .section { scroll-snap-align: start; } .section01 { position: relative; height: 100%; } .section02 { scroll-margin-bottom: 300px; }
Ryoma0305

2021/01/24 17:59 編集

インデントが消えてしまって見づらくてすみません。
hatena19

2021/01/25 00:17

提示のHTMLの開始タグと閉じタグの対応がおかしいようにみえます。 今回の質問とはまた別の問題だと思いますので、新規に質問しなおした方がいいと思います。 その時は、上記の点を確認したうえで、動作を期待して、どのような動作になってしまうのか、を具体的に説明してください。また、現象を他人も再現できるコードを提示したください。(HTML, CSS, JSコード)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問