前提・実現したいこと
作製したスムーススクロールが一部の条件下で動きません。
1.メニューがないページ
2.<a href="#"><div id="page_top"></div></a>
3.自動生成したメニューが参照しているh2.innerHTMLにhtmlタグが含まれている場合
1について、メニュー位置は画面サイズ次第で1~数行に変化するため、document.getElementById("menu").clientHeightを数字で代用することはできません。
1~3の条件でも同一のJavaScriptを適用したいのですが、どのようにすればいいでしょうか。それとも不可能でしょうか。
該当のソースコード
html
1<!DOCTYPE html> 2<html lang="ja"> 3 <head> 4 <meta charset="UTF-8"> 5 <link rel="stylesheet" href="style.css" type="text/css" /> 6 <title></title> 7 </head> 8 <body> 9 <div id="menu"><!-- 1の例(ここを消すと動かない) --> 10 </div> 11 12 <div class="topic" id="x01"> 13 <h2>01</h2> 14 <a href="#x02">02</a> 15 </div> 16 17 <div class="topic" id="x02"><!-- 3の例 --> 18 <h2><strong>02</strong></h2> 19 <a href="#">top</a> 20 </div> 21 22 <div class="topic" id="x03"> 23 <h2>03</h2> 24 <a href="#">top</a> 25 </div> 26 27 <a href="#"><div id="page_top"></div></a><!-- 2の例 --> 28 <script src="script.js"></script> 29</body> 30</html>
css
1@charset "utf-8"; 2#menu { 3 display: block; 4 margin: 0; 5 position:fixed; 6 top: 0; 7 width: 100%; 8 background: red; 9} 10 11div { 12 margin-top: 150px; 13} 14 15.topic{height:999px} 16 17#page_top { 18 display: block; 19 position:fixed; 20 bottom: 50px; 21 right: 50px; 22 background:red; 23 width: 50px; 24 height: 50px; 25 z-index: 999; 26}
js
1//スムーズスクロール 2document.addEventListener('click',e=>{ 3 if([...document.querySelectorAll('[href^="#"]')].includes(e.target)){ 4 const href=e.target.getAttribute("href"); 5 const top=(href=="#" || document.querySelector(href)==null)?0:(window.scrollY+document.querySelector(href).getBoundingClientRect().top-document.getElementById("menu").clientHeight); 6 e.preventDefault(); 7 window.scroll({ 8 top, 9 behavior: "smooth", 10 }); 11 } 12}); 13 14//メニュー生成 15document.addEventListener('DOMContentLoaded', function () { 16 const nav_toc_id = 'menu'; 17 const nav_headline = '.topic'; 18 const nav_contents = document.getElementById(nav_toc_id); 19 const nav_matches = document.querySelectorAll(nav_headline); 20 const ul = document.createElement('ul'); 21 nav_matches.forEach( function (value, i) { 22 if ( value.id === '' ) { // if tag has no id, add id 23 value.id = i; 24 } 25 const li = document.createElement('li'); 26 const a = document.createElement('a'); 27 a.innerHTML = value.querySelector('h2').innerHTML; 28 a.href = '#' + value.id; 29 li.appendChild(a); 30 ul.appendChild(li); 31 }); 32 nav_contents.appendChild(ul); 33}) 34
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/03 04:40
2021/03/03 04:48
2021/03/03 05:02
2021/03/03 05:43
2021/03/03 05:59
2021/03/03 06:20
2021/03/06 05:04