javascriptでタブ機能を作成してみました。
なんとか動くところまでもっていくことができましたが、
恐らくとても非効率な書き方をしていると思います。
もしよろしければ、こうしたほうがいいよとか、自分だったらこうする的なご意見をいただきたく投稿させていただきました。
よろしくお願いいたします。
<!doctype html> <html> <head> <meta charset="UTF-8"> <title>タブ</title> </head> <body> <style> * { margin: 0; padding: 0; } body { padding: 100px; } .tabList { display: table; width: 500px; margin: 0 auto; } .tabList li { display: table-cell; border-top: 1px solid #ccc; border-bottom: 1px solid #ccc; border-left: 1px solid #ccc; } .tabList li:last-child { border-right: 1px solid #ccc; } .tabList li a { display: block; padding: 5px 0; text-align: center; text-decoration: none; transition: 0.2s; } .tabList li a:hover { background: #ccc; color: #fff; transition: 0.2s; } .tabContent { width: 500px; margin: 0 auto; margin-bottom: 50px; } .tabContent .tabPanel { padding: 10px; border-right: 1px solid #ccc; border-bottom: 1px solid #ccc; border-left: 1px solid #ccc; } .layout { display: grid; grid-template-columns: 50px 1fr 50px; background: #ccc; } </style> <ul class="tabList"> <li> <a href="#tab01">タブ01</a> </li> <li> <a href="#tab02">タブ02</a> </li> <li> <a href="#tab03">タブ03</a> </li> </ul> <div class="tabContent"> <div id="tab01" class="tabPanel"> <p>タブパネル01タブパネル01タブパネル01タブパネル01タブパネル01タブパネル01タブパネル01タブパネル01タブパネル01タブパネル01タブパネル01タブパネル01タブパネル01タブパネル01タブパネル01タブパネル01タブパネル01</p> </div> <div id="tab02" class="tabPanel"> <p>タブパネル02タブパネル02タブパネル02タブパネル02タブパネル02タブパネル02タブパネル02タブパネル02タブパネル02タブパネル02タブパネル02タブパネル02タブパネル02タブパネル02タブパネル02タブパネル02タブパネル02</p> </div> <div id="tab03" class="tabPanel"> <p>タブパネル03タブパネル03タブパネル03タブパネル03タブパネル03タブパネル03タブパネル03タブパネル03タブパネル03タブパネル03タブパネル03タブパネル03タブパネル03タブパネル03タブパネル03タブパネル03タブパネル03</p> </div> </div> <ul class="tabList"> <li> <a href="#tab04">タブ01</a> </li> <li> <a href="#tab05">タブ02</a> </li> <li> <a href="#tab06">タブ03</a> </li> </ul> <div class="tabContent"> <div id="tab04" class="tabPanel"> <p>タブパネル01タブパネル01タブパネル01タブパネル01タブパネル01タブパネル01タブパネル01タブパネル01タブパネル01タブパネル01タブパネル01タブパネル01タブパネル01タブパネル01タブパネル01タブパネル01タブパネル01</p> </div> <div id="tab05" class="tabPanel"> <p>タブパネル02タブパネル02タブパネル02タブパネル02タブパネル02タブパネル02タブパネル02タブパネル02タブパネル02タブパネル02タブパネル02タブパネル02タブパネル02タブパネル02タブパネル02タブパネル02タブパネル02</p> </div> <div id="tab06" class="tabPanel"> <p>タブパネル03タブパネル03タブパネル03タブパネル03タブパネル03タブパネル03タブパネル03タブパネル03タブパネル03タブパネル03タブパネル03タブパネル03タブパネル03タブパネル03タブパネル03タブパネル03タブパネル03</p> </div> </div> <script> window.addEventListener('DOMContentLoaded', function () { const tabContent = document.getElementsByClassName('tabContent'); const tabList = document.getElementsByClassName('tabList'); let ids = []; for (let i = 0; i < tabContent.length; i++) { var tabPanel = tabContent[i].getElementsByClassName('tabPanel'); for (let j = 0; j < tabPanel.length; j++) { tabPanel[j].style.display = "none"; //tabPanel全部非表示 tabPanel[0].style.display = "block"; //一番目のtabPanelだけ表示 } } for (let i = 0; i < tabList.length; i++) { const trg = tabList[i].getElementsByTagName('a'); for (let j = 0; j < trg.length; j++) { trg[j].addEventListener('click', function () { //tabList.getElementsByTagName('li').classList.remove("active"); this.parentElement.classList.add("active"); console.log(trg); const nextTabPanel = this.parentElement.parentElement.nextElementSibling.getElementsByClassName('tabPanel');//クリックした要素の親要素を取得 for (let k = 0; k < nextTabPanel.length; k++) { var href = this.getAttribute('href').replace('#', '');//クリックした要素のhref属性を取得して#を削除 nextTabPanel[k].style.display = 'none';//すべてのパネルを日商事にする const id = nextTabPanel[k].getAttribute('id'); //各idを取得 ids[k] = id; //配列に格納 } let num = ids.indexOf(href); nextTabPanel[num].style.display = 'block'; }); } } }); </script> </body> </html>
回答5件
あなたの回答
tips
プレビュー