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

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

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

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

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

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

Q&A

解決済

2回答

1631閲覧

メニューバーの項目を押すと特定の位置までスクロールする

hiiro46

総合スコア21

スクロール

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

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

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

0グッド

0クリップ

投稿2021/06/12 09:25

編集2021/06/12 09:51

メニューバーの項目を押すことで特定の場所へスクロールする動作を実装しようとしています。

下記がJavascriptとHTMLです。

//指定場所まで移動 const menu = document.querySelectorAll(".menu"); const header = document.querySelector("header").getBoundingClientRect().top; const about = document.getElementById("about_position").getBoundingClientRect().top; const courses = document.getElementById("courses_position").getBoundingClientRect().top; const support = document.getElementById("support_position").getBoundingClientRect().top; const voices = document.getElementById("voices_position").getBoundingClientRect().top; const faq = document.getElementById("faq_position").getBoundingClientRect().top; for (let i = 0; i < menu.length; i++) { menu[i].addEventListener("click", () => { if(menu[i].classList.contains("position1")){ window.scrollTo({ top:about - 50, behavior:"smooth" }); } if(menu[i].classList.contains("position2")){ window.scrollTo({ top:courses - 100, behavior:"smooth" }); } if(menu[i].classList.contains("position3")){ window.scrollTo({ top:support - 100, behavior:"smooth" }); } if(menu[i].classList.contains("position4")){ window.scrollTo({ top:voices + 200, behavior:"smooth" }); } if(menu[i].classList.contains("position5")){ window.scrollTo({ top:faq + 150, behavior:"smooth" }) } }) }
<li class="menu position1"><p>about</p></li> <li class="menu position2"><p>COURSES</p></li> <li class="menu position3"><p>SUPPORT</p></li> <li class="menu position4"><p>VOICES</p></li> <li class="menu position5"><p>FAQ</p></li>

該当するclassを押すことでscrollToが動作してscrollをすることができます。

しかし問題はページの途中で再読み込みした場合です。

getBoundingClientRect().top;で取得しているためスクロール値が一番上の状態のときの位置を取得します。

例えば、const about = document.getElementById("about_position").getBoundingClientRect().top;なら780です。

しかし途中で再読み込みすると780の値は当然変わります。

その場合メニューバーの項目を押すと対象要素へのスクロールがズレます。

実現したいこと

・一番上ではない場所(中断や下段)から再読み込みしてもズレることなく対象へスクロールしたい


画像でも一度ご覧ください。

スクロール値が一番上のためメニューバーを押しても正常に動作する。
しかし2枚の場所で再読み込みしてメニューバーを押しても正常に動作しない。

他の場所で途中から再読み込みしても正常に動作しません。

拙い説明で申し訳ありませんがよろしくお願いします。

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

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

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

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

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

TatamiSteak

2021/06/12 09:39

pタグにhref属性は指定できません。pタグの中にaタグを入れ子にする形で記述しましょう。 あと、jQueryが使えるならもっと少ない行数で実現可能ですが、そのあたりの制約等ありますか?
hiiro46

2021/06/12 09:52

修正依頼ありがとうございます! 現在はJavascriptを学習のためJavascriptでの実現を希望です。 よろしくお願いします。
guest

回答2

0

itagagakiさんに回答を頂き実装できました。
ありがとうございました!!

//指定場所まで移動 let menu = document.querySelectorAll(".menu"); let about = document.getElementById("about_position"); let courses = document.getElementById("courses_position"); let support = document.getElementById("support_position"); let voices = document.getElementById("voices_position"); let faq = document.getElementById("faq_position"); for (let i = 0; i < menu.length; i++) { menu[i].addEventListener("click", () => { if(menu[i].classList.contains("position1")){ about.scrollIntoView({behavior:"smooth"}) } if(menu[i].classList.contains("position2")){ courses.scrollIntoView({behavior:"smooth"}) } if(menu[i].classList.contains("position3")){ support.scrollIntoView({behavior:"smooth"}); } if(menu[i].classList.contains("position4")){ voices.scrollIntoView({behavior:"smooth",block:"center"}); } if(menu[i].classList.contains("position5")){ faq.scrollIntoView({behavior:"smooth"}) } }) }

投稿2021/06/12 11:26

hiiro46

総合スコア21

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

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

0

ベストアンサー

scrollIntoViewを使えばいいのでは。

Element.scrollIntoView() - Web API | MDN

たとえば

JavaScript

1const voice = document.getElementById("voices_position"); 2voice.scrollIntoView();

投稿2021/06/12 09:52

itagagaki

総合スコア8402

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

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

hiiro46

2021/06/12 11:25

itagagakiさん、回答ありがとうございました! 解決できました。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問