サポート » 使い方全般 » タブの切り替えカスタマイズについて

  • 解決済 osat99

    (@osat99)


    https://irohacross.net/2015/02/jquery_tab.html
    こちらのサイトを参考に、同コードを記入し、jsを読み込ましてるのですが、
    別ページから指定のタブを開いてのアクセスは出来るのですが、同ページ(フッターメニューからになります)から、指定のタブを開いて、その箇所へアクセスが出来ません。

    直接WORDPRESSとは関係ないかもしれませんが、ご教授いただけると助かります。

    よろしくお願いいたします。

9件の返信を表示中 - 1 - 9件目 (全9件中)
  • こんにちは

    タブを選択する処理はロード時のみ実行されるので、リロードが発生しないので、タブが選択されないのだと思います。クリック時にも処理をするといいかと思います。

    $('〇〇〇').on('click', 'a', function() {
    	var tabname = ($(this).attr('href').match(/#(tab\d+$)/) || [])[1];
    	if (!tabname) {
    		tabname = "tab1";
    	}
    
    	(省略)
    })
    トピック投稿者 osat99

    (@osat99)

    いつも、ありがとうございます!
    ちょうどリロードかな?と思っていたところでした。

    //ダイレクトリンク
    $(function() {
    //location.hashで#以下を取得 変数hashに格納
    var hash = location.hash;
    //hashの中に#tab~が存在するか調べる。
    hash = (hash.match(/^#tab\d+$/) || [])[0];

    //hashに要素が存在する場合、hashで取得した文字列(#tab2,#tab3等)から#より後を取得(tab2,tab3)
        if($(hash).length){
    var tabname = hash.slice(1) ;
    } else{
        // 要素が存在しなければtabnameにtab1を代入する
        var tabname = “tab1”;}
    //コンテンツを一度すべて非表示にし、
    $(‘.content_area’).css(‘display’,’none’);

    //一度タブについているクラスselectを消し、
    $(‘.tab_area li’).removeClass(‘select’);

    var tabno = $(‘ul.tab_area li#’ + tabname).index();

    //クリックされたタブと同じ順番のコンテンツを表示します。
    $(‘.content_area’).eq(tabno).fadeIn();

    //クリックされたタブのみにクラスselectをつけます。
    $(‘ul.tab_area li’).eq(tabno).addClass(‘select’)
    });

    上記リンク先のコードの具体的にどこへ挟み込めばよろしいでしょうか?
    あと〇〇〇の箇所へ入る文字列がわからないのですが。

    お手数おかけし、申し訳ございません。

    どこへ挟み込めばよろしいでしょうか?

    どこでもいいですよ。たとえば、最後の }); の直前とか・・・。

    あと〇〇〇の箇所へ入る文字列がわからないのですが。

    対象のリンクを絞るためのセレクターです。下記のようにするのもいいかもです。

    $('a').on('click', function() {
    	var tabname = ($(this).attr('href').match(/#(tab\d+$)/) || [])[1];
    	if (!tabname) {
    		return;
    	}
    
    	(省略)
    })
    トピック投稿者 osat99

    (@osat99)

    //ダイレクトリンク
    $(function() {
    //location.hashで#以下を取得 変数hashに格納
    var hash = location.hash;
    //hashの中に#tab~が存在するか調べる。
    hash = (hash.match(/^#tab\d+$/) || [])[0];

    //hashに要素が存在する場合、hashで取得した文字列(#tab2,#tab3等)から#より後を取得(tab2,tab3)
        if($(hash).length){
    var tabname = hash.slice(1) ;
    } else{
        // 要素が存在しなければtabnameにtab1を代入する
        var tabname = “tab1”;}
    //コンテンツを一度すべて非表示にし、
    $(‘.content_area’).css(‘display’,’none’);

    //一度タブについているクラスselectを消し、
    $(‘.tab_area li’).removeClass(‘select’);

    var tabno = $(‘ul.tab_area li#’ + tabname).index();

    //クリックされたタブと同じ順番のコンテンツを表示します。
    $(‘.content_area’).eq(tabno).fadeIn();

    //クリックされたタブのみにクラスselectをつけます。
    $(‘ul.tab_area li’).eq(tabno).addClass(‘select’)

    $(‘a’).on(‘click’, function() {
    var tabname = ($(this).attr(‘href’).match(/#(tab\d+$)/) || [])[1];
    if (!tabname) {
    return;
    }

    });

    こういう感じで足してみたのですが、別ページからのタブ選択が効かなくなりました。
    同ページからのタブ選択も変化なしですね。
    同ページからはリロードでうまくいくはずなのですが。

    サンプルコードの (省略) 部分は、タブを選択するコード(「//コンテンツを一度すべて非表示にし」以降のコード)を記述してください。
    また、最後の }) が抜けています。

    ※ このフォーラムでコードを貼り付ける場合は、コードを選択し [code] ボタンをクリック(逆クォートで囲む)してください。
    https://wpdocs.osdn.jp/フォーラムへようこそ#.E3.82.B3.E3.83.BC.E3.83.89.E3.81.AE.E6.8A.95.E7.A8.BF

    ロード時のコードと冗長しますが、下記のような感じです。処理を関数化するといいかと思います。

    $('a').on('click', function() {
    	var tabname = ($(this).attr('href').match(/#(tab\d+$)/) || [])[1];
    	if (!tabname) {
    		return;
    	}
    
    	//コンテンツを一度すべて非表示にし、
    	$('.content_area').css('display','none');
    
    	//一度タブについているクラスselectを消し、
    	$('.tab_area li').removeClass('select');
    
    	var tabno = $('ul.tab_area li#' + tabname).index();
    
    	//クリックされたタブと同じ順番のコンテンツを表示します。
    	$('.content_area').eq(tabno).fadeIn();
    
    	//クリックされたタブのみにクラスselectをつけます。
    	$('ul.tab_area li').eq(tabno).addClass('select');
    })
    トピック投稿者 osat99

    (@osat99)

    //ダイレクトリンク
    $(function() {
    	//location.hashで#以下を取得 変数hashに格納
    		var hash = location.hash;	
    		//hashの中に#tab~が存在するか調べる。
    		hash = (hash.match(/^#tab\d+$/) || [])[0];
    	   
    		 //hashに要素が存在する場合、hashで取得した文字列(#tab2,#tab3等)から#より後を取得(tab2,tab3)	
    	    if($(hash).length){
    		var tabname = hash.slice(1) ;
    		} else{
    	    // 要素が存在しなければtabnameにtab1を代入する
    	    var tabname = "tab1";}
    		//コンテンツを一度すべて非表示にし、
    		$('.content_area').css('display','none');
    
    		//一度タブについているクラスselectを消し、
    		$('.tab_area li').removeClass('select');
    
    		var tabno = $('ul.tab_area li#' + tabname).index();
    		
    		//クリックされたタブと同じ順番のコンテンツを表示します。
    		$('.content_area').eq(tabno).fadeIn();
    		
    		//クリックされたタブのみにクラスselectをつけます。
    		$('ul.tab_area li').eq(tabno).addClass('select')
    
    		$('a').on('click', function() {
    	var tabname = ($(this).attr('href').match(/#(tab\d+$)/) || [])[1];
    	if (!tabname) {
    		return;
    	}
    
    	//コンテンツを一度すべて非表示にし、
    		$('.content_area').css('display','none');
    
    		//一度タブについているクラスselectを消し、
    		$('.tab_area li').removeClass('select');
    
    		var tabno = $('ul.tab_area li#' + tabname).index();
    		
    		//クリックされたタブと同じ順番のコンテンツを表示します。
    		$('.content_area').eq(tabno).fadeIn();
    		
    		//クリックされたタブのみにクラスselectをつけます。
    		$('ul.tab_area li').eq(tabno).addClass('select')
    })
    	
    			});
    
    $(function() {
    	//クリックしたときのファンクションをまとめて指定
    	$('ul.tab_area li').click(function() {
    		//.index()を使いクリックされたタブが何番目かを調べ、
    //		indexという変数に代入します。
    		var index = $('ul.tab_area li').index(this);
    
    		//コンテンツを一度すべて非表示にし、
    		$('.content_area').css('display','none');
    
    		//クリックされたタブと同じ順番のコンテンツを表示します。
    		$('.content_area').eq(index).fadeIn();
    
    		//タブについているクラスselectを消し、
    		$('.tab_area li').removeClass('select');
    
    		//クリックされたタブのみにクラスselectをつけます。
    		$(this).addClass('select')
    	});
    });

    上記コードでうまく動作いたしました!ありがとうございます。
    このトピでのコード記載の際のルール、よく知らなかったもので、失礼いたしました。
    以後気をつけます。

    上記コードで動作は問題ないので、いいのですが、
    参考サイトの

    $(function() {
    	//クリックしたときのファンクションをまとめて指定
    	$('ul.tab_area li').click(function() {
    		//.index()を使いクリックされたタブが何番目かを調べ、
    //		indexという変数に代入します。
    		var index = $('ul.tab_area li').index(this);
    
    		//コンテンツを一度すべて非表示にし、
    		$('.content_area').css('display','none');
    
    		//クリックされたタブと同じ順番のコンテンツを表示します。
    		$('.content_area').eq(index).fadeIn();
    
    		//タブについているクラスselectを消し、
    		$('.tab_area li').removeClass('select');
    
    		//クリックされたタブのみにクラスselectをつけます。
    		$(this).addClass('select')
    	});
    });

    これも入れないとタブが切り替わらないので、入れないといけないのですよね?
    なんか二重に入れているような気がしまして。

    あと、ヘッダーを固定にしているもので、ページ内アンカーするとヘッダーで隠れてしまうので、
    下記コードで余白を持たせております。
    別ページからはうまくヘッダーの高さ分、ずれて表示してくれるのですが、同ページからですと、
    余白が入らないようです。これの対処は出来るものなのでしょうか??

    余白コード

    jQuery( window ).on( 'load', function() {
      id    = location.hash;
      speed = 0;
      headerHight = 200; // 固定ヘッダーの高さ
      if ( '' != id ) {
        pos = jQuery( id ).offset().top - headerHight;
        jQuery( 'html' ).animate({ scrollTop: pos }, speed );
      }
    });

    クリックイベント内に記述するといいかと思います。
    あとは、JavaScript について質問できる他のフォーラムなどで聞かれた方がいいかと思います。

    トピック投稿者 osat99

    (@osat99)

    はい。
    長々とお付き合い、ありがとうございました!

    余白の件は、他フォーラムで聞いてみます。

9件の返信を表示中 - 1 - 9件目 (全9件中)
  • トピック「タブの切り替えカスタマイズについて」には新たに返信することはできません。