\r\n```\r\n\r\n\r\nしかし、一番上の目次自動生成JavaScriptを導入すると、jQueryでの高さのずれ調整が聞かなくなってしまいます。そのため、目次自動生成JavaScriptのコードに、ずれ調整コードを入れ込みたいと思っています。\r\n\r\n.scrollTo()を使用すれば、jQueryでいうところのanimate(scrollTop) の部分のような動作が実装できそうなのですが、その先の書き方が分かりません。\r\n\r\nどなたか、この2つのJavaScriptとjQueryを合体させる方法をアドバイスいただけないでしょうか。よろしくお願いします。","answerCount":3,"upvoteCount":0,"datePublished":"2019-10-16T14:13:51.889Z","dateModified":"2019-10-17T05:43:12.966Z","acceptedAnswer":{"@type":"Answer","text":"目次生成にはVanilla JavaScriptを使用せず、jQueryに統一したところ、もともとあった高さを揃えるjQueryも動くようになりました。その他、同じJavaScriptが何度も読み込まれていたり、使用しているjQueryのバージョンがちがかったりしたため、思う通りの動作が出来ないでいたようでした。\r\n\r\n```\r\n\r\n\r\n   // 目次生成用jQuery、クラス名などは未修正\r\n $(function(){\r\n var countId = 1\r\n $(\"h2, h3\").each(function(){\r\n var ttl = $(this).text();\r\n var lv = this.nodeName.toLowerCase();\r\n this.id = 'ttl-' + countId;\r\n countId ++;\r\n $(\"#index\").append('
'+ttl+'
');\r\n });\r\n });\r\n\r\n // ヘッダーの高さ分、リンク先の見出しの表示位置をずらす\r\n $(function(){\r\n $('a[href^=#]:not([class*=\"modal\"])').click(function() {\r\n var speed = 400;\r\n var href= $(this).attr(\"href\");\r\n var target = $(href == \"#\" || href == \"\" ? 'html' : href);\r\n var headerHeight = 300; //固定ヘッダーの高さ\r\n var position = target.offset().top - headerHeight; //ターゲットの座標からヘッダの高さ分引く\r\n $('body,html').animate({scrollTop:position}, speed, 'swing');\r\n return false;\r\n });\r\n });\r\n\r\n\r\n```","dateModified":"2019-10-18T12:17:27.811Z","datePublished":"2019-10-18T12:17:27.811Z","upvoteCount":0,"url":"https://teratail.com/questions/217649#reply-319999"},"suggestedAnswer":[{"@type":"Answer","text":"CSSに下記を追記しましょう\r\n\r\n```CSS\r\nhtml{\r\n scroll-behavior: smooth;\r\n}\r\n\r\n[id^=example] {\r\n margin-top: -100px;\r\n padding-top: 100px;\r\n}\r\n```\r\n\r\n1つ目は、スクロールの動作をスムーススクロールにしてくれます\r\n\r\n2つ目は裏技的な認識で覚えてればいいと思います。\r\n(高さは、ズレる分だけ入れましょう。)\r\n\r\n参考リンク\r\n[1つ目について](https://www.to-r.net/media/smooth_scrolling_2019/)\r\n[2つ目について](https://y-com.info/contents/?p=5641)\r\n\r\n※Chromeを使用している想定の回答になります。","dateModified":"2019-10-18T08:12:42.921Z","datePublished":"2019-10-18T08:12:42.921Z","upvoteCount":0,"url":"https://teratail.com/questions/217649#reply-319952","comment":[{"@type":"Comment","text":"ありがとうございます。IEを捨てることが出来なかったため、scroll-behaviorのみでの解決は見送ることになっていました。","datePublished":"2019-10-18T12:06:20.319Z","dateModified":"2019-10-18T12:06:20.319Z"}]},{"@type":"Answer","text":"8行目あたりの\r\nvar id= target- +(y+1).toString();\r\n「target-」となっていますがマイナスはゴミです\r\n\r\n> ヘッダーの高さ分ずれてしまう\r\n\r\nヘッダーとは何でしょう?\r\n\r\n> .scrollTo()を使用すれば\r\n\r\nスムーススクロールをしたいのでしょうか?","dateModified":"2019-10-17T00:42:13.609Z","datePublished":"2019-10-17T00:42:13.609Z","upvoteCount":0,"url":"https://teratail.com/questions/217649#reply-319547","comment":[{"@type":"Comment","text":"コメント頂きましてありがとうございます。\r\n\r\n言葉足らずですみません。\r\n今したいことは、\r\n・スムーススクロール\r\n・スクロール後にヘッダーの高さが小さくなるため、リンク先の位置が、小さくなったヘッダーの高さ分(140px分)上にずれる。アンカー先の見出しの表示位置を今より140px下にずらしたい\r\n\r\nという意味でした。\r\nDOMContentLoadedの他にもう一つクリックイベントを設定して、クリックした時にスムーススクロールさせ、表示位置を変更するスクリプトを書いたらいいのでしょうか…なかなか解決ができません。","datePublished":"2019-10-17T01:08:47.819Z","dateModified":"2019-10-17T01:08:47.819Z"},{"@type":"Comment","text":"HTMLで例示していいないヘッダ的ななにかがあるのですね?\r\n
もしくは
\r\n\r\nメニューをクリックした時にその高さが140へる?\r\nたとえば200pxが60pxになるとか?\r\nその処理がどうしたいかによってズレを修正する方法は\r\n変わってくると思います\r\n\r\nあと、回答で指摘したtarget-について質問文のソース\r\n修正しておいてください","datePublished":"2019-10-17T01:17:45.641Z","dateModified":"2019-10-17T01:18:58.692Z"},{"@type":"Comment","text":"target- の部分、修正しました。\r\nその他、ヘッダーのソースを追加しました。\r\nh2の1番目、h2の2番目などをクリックすると、上にずれます。\r\nそのずれを、ヘッダーにかぶらないようにしたいと思っています。","datePublished":"2019-10-17T05:39:56.041Z","dateModified":"2019-10-17T05:39:56.041Z"}]}],"breadcrumb":{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"https://teratail.com","name":"トップ"}},{"@type":"ListItem","position":2,"item":{"@id":"https://teratail.com/tags/JavaScript","name":"JavaScriptに関する質問"}},{"@type":"ListItem","position":3,"item":{"@id":"https://teratail.com/questions/217649","name":"アンカーリンクがずれるのを、JavaScript(非jQuery)で直したい"}}]}}}
質問するログイン新規登録

Q&A

解決済

3回答

2361閲覧

アンカーリンクがずれるのを、JavaScript(非jQuery)で直したい

vankick

総合スコア22

JavaScript

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

0グッド

2クリップ

投稿2019/10/16 14:13

編集2019/10/17 05:43

0

2

現在、文章中のh2、h3から自動で見出しを作り出すJavaScriptを書いています。

以前こちらのサイトでアドバイスで、下記のようにコーディングするといいと教えて頂きました。
下記のjavascriptで動作自体は完璧なのですが、実際のサイトに落とし込むと、アンカーリンクがヘッダーの高さ分ずれてしまうことが分かりました。

window.addEventListener('DOMContentLoaded', ()=>{ var menu=document.querySelector('#index'); var ul=document.createElement('ul'); menu.appendChild(ul); [].forEach.call(document.querySelectorAll('h2, h3'),(x,y)=>{ var url = 'example.html'; var target = url.slice(0, -5); var id= target +(y+1).toString(); x.setAttribute('id',id); var li=document.createElement('li'); ul.appendChild(li); var a=document.createElement('a'); a.setAttribute('href','#'+id); a.textContent=x.textContent; li.appendChild(a) switch(x.nodeName){ case "H2": /* h2特有の処理がないので空 */ break; case "H3": li.classList.add('toc-h3'); break; } }); });
<div id="header"> <ul> <li>menu1</li> <li>menu2</li> <li>menu3</li> </ul> </div> <div id="contents">contents <div id="index"> <p class="toc-title">目次</p> <!-- ここに目次が<ul><li></li></ul>の形で表示される --> </div> <div class="articleComponent"> <h2>H2の1個目</h2> </div> <div class="articleComponent"> <p class="articleText">テキスト</p> </div> <div class="articleComponent"> <h2>H2の2個目</h2> </div> <div class="articleComponent"> <p class="articleText">テキスト</p> </div> <div class="articleComponent"> <h2>H2の3個目</h2> </div> <div class="articleComponent"> <p class="articleText">テキスト</p> </div> <div class="articleComponent"> <h2>H2の4個目</h2> </div> <div class="articleComponent"> <p class="articleText">テキスト</p> </div> <div class="articleComponent"> <h2>H2の5個目</h2> </div> <div class="articleComponent"> <p class="articleText">テキスト</p> </div> <div class="articleComponent"> <h2>H2の6個目</h2> </div> <div class="articleComponent"> <p class="articleText">テキスト</p> </div> <div class="articleComponent"> <h2>H2の7個目</h2> </div> <div class="articleComponent"> <p class="articleText">テキスト</p> </div> <div class="articleComponent"> <h2>H2の8個目</h2> </div> <div class="articleComponent"> <p class="articleText">テキスト</p> </div> <div class="articleComponent"> <h3>H3の内容</h3> </div> <div class="articleComponent"> <p class="articleText">テキスト</p> </div> <div class="articleComponent"> <h3>H3の内容</h3> </div> <div class="articleComponent"> <p class="articleText">テキスト</p> </div> <div class="articleComponent"> <h2>H2の9個目</h2> </div> <div class="articleComponent"> <p class="articleText">テキスト</p> </div> </div>
#header { position: fixed; top: 0; left: 0; width: 100%; height: 100px; background: #333; color: #fff; z-index: 1; transition: all 0.3s ease; -webkit-transition: all 0.3s ease; -moz-transition: all 0.3s ease; -o-transition: all 0.3s ease; } #header.thin { width: 100%; height: 60px; } #header li { float: left; display: block; padding: 5px 20px; margin-top: 15px; -webkit-transition: all 0.3s ease; -moz-transition: all 0.3s ease; -o-transition: all 0.3s ease; } #header.thin li { margin-top: 0; } #contents { height: 800px; margin-top: 100px; } #footer { height: 80px; background: #666; color: #fff; }

現在(目次自動生成JavaScript導入前)は、jQueryで下記のように制御しています。

function() { var speed = 400; var href = $(this).attr("href"); var target = $(href == "#" || href == "" ? 'html' : href); var headerHeight = 140; //固定ヘッダーの高さ var position = target.offset().top - headerHeight; //ターゲットの座標からヘッダの高さ分引く $('body,html').animate({ scrollTop: position }, speed, 'swing'); return false; }

※上記のjQueryは本番で使用しているものです。
サンプルコードでは、下記のjQueryを使用しています。

<script>$(function() { var dist = 50; $(window).scroll(function() { if ($(window).scrollTop() > dist) { $('#header').addClass('thin'); } else { $('#header').removeClass('thin'); } }); });</script>

しかし、一番上の目次自動生成JavaScriptを導入すると、jQueryでの高さのずれ調整が聞かなくなってしまいます。そのため、目次自動生成JavaScriptのコードに、ずれ調整コードを入れ込みたいと思っています。

.scrollTo()を使用すれば、jQueryでいうところのanimate(scrollTop) の部分のような動作が実装できそうなのですが、その先の書き方が分かりません。

どなたか、この2つのJavaScriptとjQueryを合体させる方法をアドバイスいただけないでしょうか。よろしくお願いします。

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

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

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

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

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

guest

回答3

0

自己解決

目次生成にはVanilla JavaScriptを使用せず、jQueryに統一したところ、もともとあった高さを揃えるjQueryも動くようになりました。その他、同じJavaScriptが何度も読み込まれていたり、使用しているjQueryのバージョンがちがかったりしたため、思う通りの動作が出来ないでいたようでした。

<script src="https://code.jquery.com/jquery-1.11.3.min.js"></script>    // 目次生成用jQuery、クラス名などは未修正 $(function(){ var countId = 1 $("h2, h3").each(function(){ var ttl = $(this).text(); var lv = this.nodeName.toLowerCase(); this.id = 'ttl-' + countId; countId ++; $("#index").append('<dd class="lv_'+lv+'"><a href="#'+this.id+'">'+ttl+'</a></dd>'); }); }); // ヘッダーの高さ分、リンク先の見出しの表示位置をずらす $(function(){ $('a[href^=#]:not([class*="modal"])').click(function() { var speed = 400; var href= $(this).attr("href"); var target = $(href == "#" || href == "" ? 'html' : href); var headerHeight = 300; //固定ヘッダーの高さ var position = target.offset().top - headerHeight; //ターゲットの座標からヘッダの高さ分引く $('body,html').animate({scrollTop:position}, speed, 'swing'); return false; }); });

投稿2019/10/18 12:17

vankick

総合スコア22

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

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

0

CSSに下記を追記しましょう

CSS

1html{ 2 scroll-behavior: smooth; 3} 4 5[id^=example] { 6 margin-top: -100px; 7 padding-top: 100px; 8}

1つ目は、スクロールの動作をスムーススクロールにしてくれます

2つ目は裏技的な認識で覚えてればいいと思います。
(高さは、ズレる分だけ入れましょう。)

参考リンク
1つ目について
2つ目について

※Chromeを使用している想定の回答になります。

投稿2019/10/18 08:12

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

vankick

2019/10/18 12:06

ありがとうございます。IEを捨てることが出来なかったため、scroll-behaviorのみでの解決は見送ることになっていました。
guest

0

8行目あたりの
var id= target- +(y+1).toString();
「target-」となっていますがマイナスはゴミです

ヘッダーの高さ分ずれてしまう

ヘッダーとは何でしょう?

.scrollTo()を使用すれば

スムーススクロールをしたいのでしょうか?

投稿2019/10/17 00:42

yambejp

総合スコア118162

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

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

vankick

2019/10/17 01:08

コメント頂きましてありがとうございます。 言葉足らずですみません。 今したいことは、 ・スムーススクロール ・スクロール後にヘッダーの高さが小さくなるため、リンク先の位置が、小さくなったヘッダーの高さ分(140px分)上にずれる。アンカー先の見出しの表示位置を今より140px下にずらしたい という意味でした。 DOMContentLoadedの他にもう一つクリックイベントを設定して、クリックした時にスムーススクロールさせ、表示位置を変更するスクリプトを書いたらいいのでしょうか…なかなか解決ができません。
yambejp

2019/10/17 01:18 編集

HTMLで例示していいないヘッダ的ななにかがあるのですね? <header>もしくは<div id="header"> メニューをクリックした時にその高さが140へる? たとえば200pxが60pxになるとか? その処理がどうしたいかによってズレを修正する方法は 変わってくると思います あと、回答で指摘したtarget-について質問文のソース 修正しておいてください
vankick

2019/10/17 05:39

target- の部分、修正しました。 その他、ヘッダーのソースを追加しました。 h2の1番目、h2の2番目などをクリックすると、上にずれます。 そのずれを、ヘッダーにかぶらないようにしたいと思っています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.29%

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

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

質問する

関連した質問