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

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

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

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

jQuery

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

Q&A

解決済

2回答

141閲覧

メインビジュアルだけresizeのイベントを指定したい

slw

総合スコア2

JavaScript

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

jQuery

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

0グッド

1クリップ

投稿2024/11/22 04:31

実現したいこと

メインビジュアルが表示されている間、ウィンドウ幅を変えたらページトップに移動したいです。

発生している問題・分からないこと

メインビジュアル以外の場所でもページトップに戻ってしまいます。
何かいい方法はないでしょうか。

該当のソースコード

html

1<div class="mainvisual">メインビジュアル</div> 2<div class="contA">コンテンツ</div> 3: 4: 5

jquery

1$(function () { 2 $(window).on("scroll", function () { 3 const contATop = $(".contA").offset().top; 4 const scrollTop = $(window).scrollTop(); 5 6 if (scrollTop >= contATop) {//contAが表示されたら 7 $(".mainvisual").css("display", "none"); 8 window.addEventListener("resize", () => { 9 window.scrollTo(100, 0); 10 }); 11 } else { 12 $(".mainvisual").css("display", "flex"); 13 window.addEventListener("resize", () => { 14 window.scrollTo(0, 0); 15 }); 16 } 17 }); 18});

css

1.mainvisual{height:400vh;}

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

GoogleやchatGTPなどで色々聞いてみたのですが、思うような結果が得られず、
.contA以降でもウィンドウ幅を変えるとページトップに戻ってしまいます。

補足

メインビジュアルはgsapで動かしているため高さを400vhにしていますが、実際は100vhのエリアだけスクロールしています。
念の為、.contAがページトップに来たらdisplay:noneで非表示にしています。

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

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

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

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

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

yambejp

2024/11/22 05:11

>メインビジュアルが表示されている間 命題があいまいです →メインビジュアルがちょっとでも表示されている →メインビジュアルがn%以上表示されている →メインビジュアルがすべて表示されている で指定方法が変わってきます
slw

2024/11/23 02:45

説明不足すみません。 確かに...わかりやすいご指摘ありがとうございます! 次回より気をつけます。
guest

回答2

0

ベストアンサー

> メインビジュアル以外の場所でもページトップに戻ってしまいます。

それは イベントをそこで登録しても別ルートをあとで通ったとしても解除されないからです。

その為、まずはこう書き換えます

js

1$(function () { 2 window.addEventListener("resize", () => { 3 window.scrollTo(100, 0); 4 }); 5 $(window).on("scroll", function () { 6 const contATop = $(".contA").offset().top; 7 const scrollTop = $(window).scrollTop(); 8 9 if (scrollTop >= contATop) { 10 //contAが表示されたら 11 $(".mainvisual").css("display", "none"); 12 } else { 13 $(".mainvisual").css("display", "flex"); 14 } 15 }); 16});

ただ、これでは動作は変わりません。 その為、フラグとなる変数を用意してそれによりリサイズイベントを有効/無効を切り替え また、メインビジュアルが非表示/表示を切り替えた際に 真偽値を切り替える様にします。

js

1$(function () { 2 /** メインビジュアルが非表示であるフラグ */ 3 let isMainVisualHidden = false; 4 window.addEventListener("resize", () => { 5 if (isMainVisualHidden) return; 6 window.scrollTo(100, 0); 7 }); 8 $(window).on("scroll", function () { 9 const contATop = $(".contA").offset().top; 10 const scrollTop = $(window).scrollTop(); 11 if (scrollTop >= contATop) { 12 //contAが表示されたら 13 $(".mainvisual").css("display", "none"); 14 isMainVisualHidden = true; 15 } else { 16 $(".mainvisual").css("display", "flex"); 17 isMainVisualHidden = false; 18 } 19 }); 20});

これで想定された動作になると思われます。

参考

投稿2024/11/22 05:29

編集2024/11/22 05:32
juner

総合スコア483

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

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

slw

2024/11/23 02:56

できました! メインビジュアルの非表示をフラグにするというのはなるほどです! 説明不足のなか、的確なご指示ありがとうございました。 codePenで実装できたのでURL記載いたします。 ▼codePen https://codepen.io/lvuyemud-the-looper/pen/ZEggRpx
juner

2024/11/23 12:52

なにそれ素敵な実装! 解決おめでとうございます!
guest

0

IntersectionObserverで交差情報を取得してください
例えばこんな感じ

javascript

1<style> 2.dummy{ 3 height:60%; 4} 5.dummy:nth-child(odd){ 6 background-Color:yellow; 7} 8.mainvisual{ 9 height:30%; 10 background-Color:lime; 11} 12</style> 13<script> 14const crossing=()=>{ 15 const observer = new IntersectionObserver(changes=>{ 16 for (let change of changes) { 17 if(change.intersectionRatio >0){ 18 window.scrollTo(0,0); 19 } 20 } 21 }); 22 observer.observe(document.querySelector('.mainvisual')); 23} 24window.addEventListener('resize',crossing); 25</script> 26<div class="dummy">dummy</div> 27<div class="dummy">dummy</div> 28<div class="mainvisual">メインビジュアル</div> 29<div class="dummy">dummy</div> 30<div class="dummy">dummy</div>

投稿2024/11/22 05:12

yambejp

総合スコア116629

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

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

slw

2024/11/23 02:54

説明不足のなか、ソースまで書いてくださりありがとうございます。 解決しましたので、codePenのURL記載いたします。 ありがとうございました! ▼codePen https://codepen.io/lvuyemud-the-looper/pen/ZEggRpx
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問