近頃はタブメニューもHTMLとCSSだけで再現する風潮になってきましたが、ちょっと気の利いたことをやろうとするとまだJSで対応する場面もあります。
そんなわけで、ページを読み込んだ時に、URLパラメーターによって初期表示されるタブメニューを変更する方法のメモ。
URLパラメータによって初期表示タブを切り替える
↓こういうやつ
jQueryで書いていく。
初期表示のために、必要な処理は以下。
- URLパラメーターを取得する
- URLパラメーターによって開くタブを設定
- アクセス時に、URLパラメーターと設定したパラメーター合致したら表示タブを変更する
今回はタブの切り替え自体もJSで済ませています。
やったこと
ソースを順番に書いていく。
HTML
headタグや関係ないところは省略してます。
<div class="tabs">
<!--メニュー部分-->
<div class="tabs__menu">
<div class="tabs__menu-item js-tab-switch is-active" data-tab="tab-1">tab1</div>
<div class="tabs__menu-item js-tab-switch" data-tab="tab-2">tab2</div>
<div class="tabs__menu-item js-tab-switch" data-tab="tab-3">tab3</div>
</div>
<!--//メニュー部分-->
<!--コンテンツ部分-->
<div class="tabs__contain">
<div class="tabs__body js-tab-cts is-active" data-tab="tab-1">
コンテンツ1
</div>
<div class="tabs__body js-tab-cts" data-tab="tab-2">
コンテンツ2
</div>
<div class="tabs__body js-tab-cts" data-tab="tab-3">
コンテンツ3
</div>
</div>
<!--//コンテンツ部分-->
</div>
3〜7行目がメニュー部分、10〜20行目がコンテンツ部分。
ポイント
- メニュー項目にはそれぞれ「js-tab-switch」クラスを設定
- コンテンツのボックスにはそれぞれ「js-tab-cts」クラスを設定
- デフォルトで開いておくメニュー、コンテンツに「is-active」クラスを設定
- メニュー項目とコンテンツの紐付けには「data-tab」属性で対応
CSS(SCSS)
.tabs {
&__menu {
display: flex;
justify-content: space-between;
border-bottom: 5px solid #bababa;
}
&__menu-item {
width: calc( 100% / 3 - 4px );
margin-bottom: -5px;
padding: 16px 20px;
font-size: 1.8rem;
font-weight: bold;
line-height: 1.5;
color: #fff;
border-top-left-radius: 10px;
background: #bababa;
cursor: pointer;
&.is-active {
background: #1088d4;
cursor: default;
}
}
&__body {
display: none;
background: #eff6fb;
padding: 60px 48px 80px;
&.is-active {
display: block;
}
}
}
主に見た目を整えているだけだけ。
ポイント
「tabs__menu-item」と「tabs__body」に「display: none;」を設定し、
「is-active」クラスもある時は「display: block」を設定。
表示非表示を切り替えられるようにしておく。
JavaScript(jQuery)
jQueryは読み込んだ状態にしておく(デモページはバージョン3.5.1)
1.パラメータの値を取得するfunctionを設定
function getParam(name, url) {
if (!url) url = window.location.href;
name = name.replace(/[\[\]]/g, "\\$&");
let regex = new RegExp("[?&]" + name + "(=([^]*)|&|#|$)"),
results = regex.exec(url);
if (!results) return null;
if (!results[2]) return '';
return decodeURIComponent(results[2].replace(/\+/g, " "));
}
一度取得したURLを変数に設定後、「name」引数に記述したURLパラメーターのイコール以降の文字列のみに置き換えるfunctionを設定。
2.URLパラメーターによって開くタブを設定
let pram = getParam('active-tab');
if (pram && $('[data-tab="' + pram + '"]').length) {
$('.js-tab-cts,.js-tab-switch').removeClass('is-active');
$('[data-tab="' + pram + '"]').addClass('is-active');
}
行目。現在URLのパラメーター「active-tab」の値を変数に設定。
2〜5行目。
もし現在URLにパラメーター「active-tab」があって、URLパラメーターに合致するdata-tabが存在したら、一度タブ関連の「is-active」クラスを取り除いて、合致したタブメニュー・タブコンテンツに「is-active」クラスを追加する。
3.通常のタブ切り替えもできるようにしておく
$('.js-tab-switch').on('click', function() {
let dataPram = $(this).data('tab');
$('.js-tab-cts,.js-tab-switch').removeClass('is-active');
$('[data-tab="' + dataPram + '"]').addClass('is-active');
});
最終的なJS
1〜3を合わせるとこんな感じになる
$(function() {
// パラメータ取得
function getParam(name, url) {
if (!url) url = window.location.href;
name = name.replace(/[\[\]]/g, "\\$&");
let regex = new RegExp("[?&]" + name + "(=([^]*)|&|#|$)"),
results = regex.exec(url);
if (!results) return null;
if (!results[2]) return '';
return decodeURIComponent(results[2].replace(/\+/g, " "));
}
// ページ読み込み時のタブ切り替え
let pram = getParam('active-tab');
if (pram && $('[data-tab="' + pram + '"]').length) {
$('.js-tab-cts,.js-tab-switch').removeClass('is-active');
$('[data-tab="' + pram + '"]').addClass('is-active');
}
// ロード後のタブ切り替え
$('.js-tab-switch').on('click', function() {
let dataPram = $(this).data('tab');
$('.js-tab-cts,.js-tab-switch').removeClass('is-active');
$('[data-tab="' + dataPram + '"]').addClass('is-active');
});
});
もっとスマートな記述があるかもですが、何かの参考になれば幸いです。では、よいJQueryライフを。