アコーディオンメニューのアンカーリンクでの開閉方法

このQ&Aのポイント
  • アンカーリンクを使用してアコーディオンメニューを開く方法について説明します。
  • 現在アコーディオンメニューの開閉に問題があり、アンカーリンクを使っても正しく動作しない状況です。
  • アンカーリンクとアコーディオンメニューの連携方法を教えていただけると助かります。
回答を見る
  • ベストアンサー

アコーディオンメニューをアンカーリンクで開く

アコーディオンメニューで困っています。 色々と調べているのですが、どうもうまく動きません。 ■やりたい事 アコーディオンメニューを使っていますが、同じページからのアンカーリンク、そして別ページからのアンカーリンクで飛んできた際に、隠れているアコーディオンを開いて表示した。 ■現状 ・アンカーリンク(A.html)-------------------- <a href="B.html#アンカー名">リンク</a> ・アコーディオン設置先(B.html)------------------ <div class="aaa" id="アンカー名"> <p class="title"> アコーディオンタイトル </p> <p class="bbb"> アコーディオンの内容表示 </p> </div> ・js--------------------------------------- $(document).ready(function(){ $(".bbb").hide(); $(".title").click(function(){ $(this).toggleClass("active").next().slideToggle("slow"); $(location.hash).next(".bbb").slideToggle("slow"); }); }); 現状はこのような状態なのですが、アンカーでの動作をしてくれません。 分かる方いらっしゃいましたら、是非教えてください

質問者が選んだベストアンサー

  • ベストアンサー
  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.1

ざっと見ただけですが・・・ > $(location.hash).next(".bbb").slideToggle("slow"); が、クリックイベントの処理定義の中に書かれていますが、これだとクリックする度にこの処理が走ります。また、クリックしないとこの処理は実行されません。(初期設定として実行されない) ご質問の内容からすれば、この処理は読込後1度だけ初期設定として実行されれば良いはずですので、クリック時のイベントハンドラからは外す必要があります。 次に、 > $(location.hash).next(".bbb") ですが、location.hashはidに相当する文字列になると想像しますが、対象としたいクラスbbbの要素はこの兄弟要素ではなく子要素になっているのではないでしょうか? それなので、nextではなくfindなどを用いて取得する必要があるでしょう。  $(child, parent)~~ の書式で取得しても同様の結果が得られると思います。 以上を修正したとして、 > $(location.hash).next(".bbb").slideToggle("slow"); 1回だけの処理なので、必ずしもToggleの必要はないでしょう。show(又はslideDown)などで良いと思われます。 また、クリック時の処理内容を見てみると、title要素にactiveのクラス設定/削除が行われていますが、最初の時にはこの処理はしなくても良いのでしょうか? (Toggleで設定されているので、以降のクリック時に期待とは違う結果になる可能性がありそうです) もし、必要な場合は処理を追加する必要がありますね。 同じことをする別の方法として、『該当するtitle部分をクリックしたことにする』という考え方もありそうです。  $(location.hash).find(".title").click(); のようにしておくことで、実際の処理は設定したイベントハンドラに渡すという仕組みにしておくのが簡単かも知れません。 (イベントの処理内容がいろいろとある場合は、この方が効率的な記述になるでしょう。)

johnsmile
質問者

お礼

fujillin様 とても丁寧に教えていただきまして、誠に有り難うございます。 早速試してみた所、見事に動きました!! 出来た瞬間に感動してしまいました。 本当にありがとうございます。 教えていただいた通りに、クリック時のイベントハンドラからはずし、 $(location.hash).find(".bbb").show(); に変更した所、出来ました。 本当に感謝いたします!!

関連するQ&A

  • アコーディンパネルの別ページからのリンクについて

    こんばんは。 jqueryを使ってアコーディオンパネルを実装したページを作成しました。 通常は全て閉じた状態ですが、 全てのページにパネル1~5へのリンクがあり、それをクリックすると該当のパネルが開いた状態で表示させるには、どんなスクリプトを追加するとよろしいのでしょうか? 以下コードです。 --html(各ページのリンクの部分) <ul> <li><a href="/service/#panel01">パネル1へ</a></li> <li><a href="/service/#panel02">パネル2へ</a></li> ・・・ </ul> --html(アコーディオンパネルの部分 /service/index.html ) <h5 class="trigger" id="panel01"><a href="#">パネル1のタイトル</a></h5> <div class="accblock"> <p>パネル1のコンテンツ</p> </div> <h5 class="trigger" id="panel02"><a href="#">パネル2のタイトル</a></h5> <div class="accblock"> <p>パネル2のコンテンツ</p> </div> (省略) ---js $(document).ready(function(){ $(".accblock").hide(); $("h5.trigger").click(function(){ $(this).toggleClass("active").next().slideToggle("slow"); }); }); location href か hash を使うのかなと思っているのですが うまく使いこなすことができませんでした。 アドバイスをいただけたら助かります。 どうぞよろしくお願いいたします。

  • アコーディオンで開かれたパネルの位置にスクロール

    アコーディオン作成でぶつかってしまったので質問させてください。 下記サイトを参考にスマホサイトにアコーディオンを作成しました。 http://pops-web.com/main/html/demo-007.html タブをクリックしたと同時に開かれているパネルの上部にスクロールさせたいのですが、 知識が貧しく苦戦しております。 理想は下記のURLのような動きにしたいと思っています。 http://lab.boy.jp/demo/accordion/index.html どなたかお分かりの方がおられましたらご教授頂けないでしょうか。 宜しくお願いいたします。 <h3 class="trigger">ここにタイトル</h3> <div class="content"> <div class="deta">ここに内容</div> </div> <h3 class="trigger">ここにタイトル</h3> <div class="content"> <div class="deta">ここに内容</div> </div> </div> //Accordion (function($){ $(function(){ //オブジェクトを保存 var accordionItem=$('#accordion'); //一旦全部消す accordionItem.find('.content').hide(); //active要素を指定して開く var no=0; accordionItem.find('.trigger').eq(no).addClass('active').next('.content').show(); //click-action accordionItem.find('.trigger').click(function () { //slide $(this).next('.content').slideToggle('slow') .siblings('div:visible').slideUp('slow'); //activeクラス切り替え $(this).toggleClass('active'); $(this).siblings('.trigger').not($(this)).removeClass('active'); }); //hover-toggle accordionItem.find('.trigger').hover(function () { //toggle hoveredクラス $(this).toggleClass('hovered'); return false; }); }); })(jQuery); 「//activeクラス切り替え」の下に以下の2行を追加したのですが、 下の方のタブになるとスクロール位置が正しい位置にスクロールされませんでした。。 var scposi = $(".trigger.active").offset().top; $('body,html').animate({ scrollTop: scposi });

  • 複数トリガーで動作するアコーディオンメニュー

    お世話になります。 シングルページでページ内リンクでコンテンツ移動するタイプのページ作成を現在やっているのですが、急に標題の内容の要望が急ぎ対応として来まして、困っております。 具体的に言うと、 通常アコーディオンメニューは、 隠してある部分の見出しなんかをトリガーにして、開閉して内容を表示・非表示させると思いますが、今回要望としてあるのは、 グローバルナビもそのトリガーにしたいということです。 グローバルナビをクリックすると、該当箇所に移動しつつ、普段見出しだけで内容が隠してあるものも展開されるということができればと思っております。 参考までにコードを記載しておきます。 js部分 //accordion $('#sub01 h4').click(function() { $(this).toggleClass("open").next("div").slideToggle(); }).next().hide(); // drop down $("#nav li.drop").hover(function() { $(this).children('ul').show(); }, function() { $(this).children('ul').hide(); }); }); <div id="nav"> <ul class="clear"> <li><a href="#menu1">メニュー1</a></li> <li class="drop"><a href="#menu2">メニュー2<span>▼</span></a> <!-- InstanceBeginEditable name="planList" --> <ul> <li><a href="#sub01">サブ1</a></li> <li><a href="#sub02">サブ2</a></li> </ul> <!-- InstanceEndEditable --> </li> <li><a href="#menu3">メニュー3</a></li> <li><a href="#menu4">メニュー4</a></li> </ul> </div> ------省略-------------- <div id="sub01" class="subcontent"> <h4><span>項目名</small></span></h4> <div class="sub01Inner clear"> 内容内容内容</div><!-- /planInner --> </div><!-- /planBox -->

  • クリックすると上に開くアコーディオン

    当方、設置とCSSによる表示のカスタマイズはできますが、プログラムの修正はできないためぜひ皆様のお知恵をお貸しください。よろしくお願いいたします。 現在、スマホ向けサイトをコーディング中なのですが、コンテンツをアコーディオンで作成したいと考えています。 タイトルをクリックすると中のコンテンツが見える仕組みは同じなのですが、クリックするとタイトルが下に下がり、その上にコンテンツを開くという動作をさせたい場合はどの部分をどのように修正すればよいのでしょうか? アドバイスどうぞよろしくお願いします。 【acordion.js】 $(function(){ $(".acordion").hide(); $("h3").click(function(){ $(this).next().slideToggle(); $(this).toggleClass("open"); }); $(".acordion .close").click(function(){ $(this).parent().slideToggle(); }); }); 【acordion.jsを読み込んだHTML】 <h3>コンテンツのタイトル</h3> <div class="acordion"> コンテンツの中身。この部分をタイトルの上に開きたいです。<br /> 文章量は固定ではないため、可変に対応できると嬉しいです。 <div class="close">close</div> </div>

  • アコーディオンメニューの開閉制御

    私webデザイナーをしています。 アコーディオンメニューで(開くのは1つのパネルのみ)ページ遷移してもアコーディオンの開いている部分が閉じないものを作りたいと思っています。 しかし、下記のコードでどうしても実装できません。 技術のある方、間違いを教えていただけないでしょうか? 【html】 <dl class="accordion_dl"> <dt>アコーディオンメニュー.1</dt> <dd>アコーディオンメニュー.1のテキスト表示</dd> <dt>アコーディオンメニュー.2</dt> <dd>アコーディオンメニュー.2のテキスト表示</dd> <dt>アコーディオンメニュー.3</dt> <dd>アコーディオンメニュー.3のテキスト表示</dd> <dt>アコーディオンメニュー.4</dt> <dd> <ul> <li>リスト挿入</li> <li>リスト挿入</li> <li>リスト挿入</li> <li>リスト挿入</li> </ul> </dd> </dl> 【JS】 jQueryとjquery.cookie.jsを読み込んでいます。 for (var i=0; i < $(".accordion_dl dt").length; i++) { if( $.cookie("accord" + i) == "open" ) { $(".accordion_dl dt").eq(i).next("dd").show(); } } $('.accordion_dl dt').click(function(){ $(this).toggleClass("open"); $(this).siblings("dt").removeClass("open"); $(this).next("dd").slideToggle(); $(this).next("dd").siblings("dd").slideUp(); n = $(".accordion_dl dt").index(this); if ($.cookie("accord" + n) == "open") { $.cookie("accord"+n,"close", {path:"/"}); } else { $.cookie("accord"+n,"open", {path:"/"}); } }); よろしくお願いいたします。

  • jQuery アコーディオンメニューについて

    jQuery アコーディオンメニューについていくつか質問させていただきます。 当方、はじめてjQueryを使っています。 以下のページを参考にアコーディオンメニューを作成しています。 http://triplexxx.jp/archives/150 <ul class="acc"> <li><a href="1" class="open">category1</a> <ul> <li><a href="#">menu 1-1</a></li> <li><a href="#">menu 1-2</a></li> <li><a href="#">menu 1-3</a> <ul class="fxmn">      <li><a href="#>menu1-3-1</a></li> <li><a href="#">menu1-3-2</a></li> <li><a href="#">menu1-3-3</a></li> </ul> </li>  </ul> </li> <li><a href="2" class="open">category2</a> <ul> <li><a href="#">menu 2-1</a></li> <li><a href="#">menu 2-2</a></li> <li><a href="#">menu 2-3</a></li> </ul> </li> <li><a href="3" class="open">category3</a> <ul> <li><a href="#">menu 3-1</a></li> <li><a href="#">menu 3-2</a></li> <li><a href="#">menu 3-3</a></li> <li><a href="#">menu 3-4</a></li> </ul> </li> </ul> var $j = jQuery; $j(function(){ $j(".acc").each(function(){ $j("a.open", this).each(function(index){ var $this = $j(this); if(index !=n) $this.next().hide(); $this.click(function(){ var params = {height:"toggle",opacity:"toggle"}; $j(this).next().animate(params).parent().siblings() .children("ul:visible").animate(params); return false; }); }); }); }); (1):具体的にあげますと、上記のmenu1-3をクリックしてmenu1-3-1、1-3-2、1-3-3のアコーディオン  を開き、   1-3-1をクリックしてリンク先に飛んだ際に、直前に開いていたアコーディオンをそのままの状態   にしておきたいというものです。 (↓こんな感じです) category1 ・ menu 1-1 ・ menu 1-2 ・ menu 1-3 ・・ menu1-3-1 ・・ menu1-3-2 ・・ menu1-3-3 category2 category3 教えて!gooの過去の質問を参考させていただきながら、 if(index !=n) $this.next().hide();   で、 n を指定することで、それぞれのサブメニューを開いた状態にすることには成功したのですが、その下の階層のメニューをどのように指定すればよいかがわかりません。 (2):また、リンク先のページに飛んだ時に、アコーディオン部分は動かないのが望ましいのですが、   可能でしょうか?   (タブのようにページが切り替わる感じが理想的ですが、ページ数が大変多いため難しいとおもっ  ています) (3):(1)、(2)はページごとにscriptを書き換えるのではなく、htmlをいじることで(li タグにclass指定をす   るなど)変更するのは可能でしょうか?   外部scriptが使えればと思っています。 複数の質問になりましたが、どうぞよろしくお願いいたします。

  • jQueryアコーディオンの検索について

    jQueryで作成した、アコーディオンの閉じている部分の検索について 色々と検索しましたが、解決できず悩んでいます。 jQueryでアコーディオンを作成しています。 【やりたいこと】 IEで cntrl+fでページ内検索した時 1、閉じている箇所の内容も検索する。 2、検索がヒットした場合アコーディオンを開く。 という動きをさせたい。 【知りたいこと】 IEで可能かどうか。 IEの検索で不可の場合 自作の検索フォームを作成すれば、 アコーディオンを開けるか?又その方法。 【疑問点】 IEで検索をすると 検索でヒットした場合文字色と背景色が変わりますが、 html上はその箇所が なんらか変化があったと認識されないのでしょうか? 最初は、検索が該当したら、javascriptとのイベント(onfocus?)でアコーディオンを開くというような動きができると考えましたが、 動きませんでした。 検索結果の含まれるタグを操作するという動きはできないのでしょうか。。。 もし何かご存じの方がいらっしゃいましたら、教えて頂けないでしょうか。 よろしくお願い致します。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>無題ドキュメント</title> <script type="text/javascript" src="jquery.min.js"></script> <script type="text/javascript"> $(document).ready(function(){ $('.accordion').click(function() { $(this).next().slideToggle(); }).next().hide(); }); </script> <style type="text/css"> .accordion_head {cursor:pointer;} </style> </head> <body> <div> <h3 class="accordion">アコーディオンのトリガー部分1</h3> <p>アコーディオンする部分1。</p> </div> <div> <h3 class="accordion">アコーディオンのトリガー部分2</h3> <p>アコーディオンする部分2。</p> </div> <div> <h3 class="accordion">アコーディオンのトリガー部分3</h3> <p>アコーディオンする部分3。</p> </div> </body> </html>

  • Jquery アコーディオンについて

    知恵袋、Web初心者です。 Jquery / アコーディオンについて質問です。 Jqueryを使って2段のアコーディオンメニューを実装しているのですが、 1つのアコーディオンを押すと他のアコーディオンが閉まる様設定したいです。 現在下記の様に記述しています。 ----------------------------------------- $(document).ready(function(){ $('.accordion').click(function() { $('.accordion').next().slideUp(); $(this).next().slideToggle(); }).next().hide(); }); ---------------------------------------- この記述ですと2段目のアコーディオンを押すと1段目も閉じてしまい、結果的に2段目も見えなくなってしまう、 という状況です。 2段目だけ機能させる事は可能でしょうか?? 質問が分かりにくかったら申し訳ありません。 初歩的な質問かも知れませんが、ご教授頂ければ幸いです。 よろしくお願い致します。

  • javascriptでのアコーディオンメニュー

    質問させていただきます。 宜しくお願い致します。 現在作成中のサイトで javascriptを使って、クリックするとコンテンツが開閉するものを使っています。 ソースがこちらです。 <script type="text/javascript"> $(function(){ $(".read_open_close").click(function(){ $(this).next().slideToggle(200); });}); </script> そしてHTMLのコードは下記になります。 <div class="read_open_close mgt-10" style="cursor:pointer; text-align:left"> <h3>ご注文方法</h3> </div> <div class="tuiki mgt-15" style="display: none;"> ○○○○○ </div> ご注文方法をクリックするとコンテンツが開く仕組みです。 こちらを別ページからリンクしたときに、ページ遷移したタイミングで コンテンツも一緒に開きたいのですが、 どのようにしたらよいでしょうか。。。 時間がなく十分に自分で調べることが出来ず、 申し訳ないのですが、 どなたかご教授いただければと助かります。 宜しくお願い致します。

  • JavaScriptを使ってアンカーリンクでテキストを変更したい。

    JavaScriptを使ってアンカーリンクでテキストを変更したい。 JavaScriptを使ってアンカーリンクでテキストを変更したいのですがうまくいかず困っています。 A B C  <div class="A"> ○○○○○ ○○○○○ ← A群 ○○○○○ </div> Bのアンカーリンクを押したら A B C  <div class="B"> □□□□□ □□□□□ ← B群 □□□□□ </div> Cのアンカーリンクを押したら A B C  <div class="C"> △△△△△ △△△△△ ← C群 △△△△△ </div> というように同じページ内の同じ場所にcssのdisplay(none⇔block)で表示を入れ替えるようなスクリプトが書きたいのですがわかりません。 参考URLだけでもいいので宜しくお願いいたします。

専門家に質問してみよう