縦型アコーディオンメニューの不具合について

このQ&Aのポイント
  • 縦型アコーディオンメニューを作成しましたが、一部の不具合が発生しています。
  • 一瞬だけマウスをメニュー項目に持っていくと、選択したメニューが開いたままになってしまいます。
  • この不具合は修正することができないのでしょうか?困っています。
回答を見る
  • ベストアンサー

アコーディオンメニューについて教えてください

http://hyper-text.org/archives/2006/12/slide_menu_javascript.shtml 上記のURLを参考に縦型アコーディオンメニューを作ったのですが、動きがおかしいのを見つけてしまって困っています。 一瞬だけマウスをメニュー項目にもっていって、「あっ違った。もう一個したのメニューの中身が見たかったんだ」と思い、すぐさま下のメニューにマウスをかざすと、最初に選んだメニューが開きっぱなしになっていることがあります。 これは、直らないものなのでしょうか? つまり、 menu #01を選んでからすぐにmenu #02にマウスをもってくる。 menu #01のメニューが開いたままになっている。 すごく困っています。 お願いいたします。

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

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

>hide()を使ったやり方ではメニューの開閉はスムーズになったのですが、 >今度はメニュー内の項目が選べませんでした。 メニューとサブメニューの両方から2度、showPopupが呼び出されているので、自分を閉じてはダメでしたね。(失礼しました) 自分は閉じないことにしてあげればOKですが、即座に閉じるためサブメニューから次のメニューに移るときに、カーソル位置が相対的に移動してしまう(表示が変化するので)という問題が残るかも知れません。 (↓の呼び出し側はhide(1);、 hide(2);、 hide(3)のようにしてください) var menu_1 = { timeout : null,showPopup : function(){ hide(1); clearTimeout(this.timeout); if($('menu_1').style.display == 'none'){ this.timeout = setTimeout(function(){ new Effect.BlindDown('menu_1', {duration:.3, fps:40}) },400);}}, hidePopup : function(){ if($('menu_1').style.display == 'none'){ clearTimeout(this.timeout); }else{this.timeout = setTimeout(function(){ new Effect.BlindUp('menu_1',{ duration:.3, fps:40})},350); }}} ~~~以下省略~~~~ function hide(n){ for (var i=1; i<=3; i++){ if (i!=n) { clearTimeout(eval('menu_' + i + '.timeout')); $('menu_' + i).style.display = 'none'; }}} 直接書くほうはご提示の内容で自分を閉じないようにはなっていますが、showPopupの中にいれないとうまくないでしょう。 中にいれれば、↑と同じものになります。 Effectの動作を途中でキャンセルする方法がわかれば簡単なんですが、なんせeffects.jsはまったく知りませんので… jQeryのeffectなどだと、途中でキャンセルできるみたいなんですけれどね。

masa_tokai
質問者

お礼

ありがとうございます。 できました。 おかげ様で開いたままの状態も解決され、逆に開かないという問題も解決しました。 同時に2つのメニューが開くこともなくなり、メニューを開くとき、メニューの項目が途中できれてメニュー内の項目が全部見れないという問題も解決でき、ソース自体もきれいになりました。 とても感謝いたします。 私は、5つのメニュー項目を使っているので、以下のようになりました。hideのfor文の繰り返しを教えた頂いた3から5に変更し、使用しました。 var menu_1 = { timeout : null,showPopup : function(){ hide(1); clearTimeout(this.timeout); if($('menu_1').style.display == 'none'){ this.timeout = setTimeout(function(){ new Effect.BlindDown('menu_1', {duration:.3, fps:40}) },400);}}, hidePopup : function(){ if($('menu_1').style.display == 'none'){ clearTimeout(this.timeout); }else{this.timeout = setTimeout(function(){ new Effect.BlindUp('menu_1',{ duration:.3, fps:40})},350); }}} ~~~以下省略~~~~ function hide(n){ for (var i=1; i<=5; i++){ if (i!=n) { clearTimeout(eval('menu_' + i + '.timeout')); $('menu_' + i).style.display = 'none'; }}} 何から何までありがとうございます。

その他の回答 (3)

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

#1、#2です。 >通常は、thisの中身はどうなっているのでしょうか? thisは特定のものを指してはいないので、使用される環境下で意味するものが変わってきます。 一般的にはこんな感じ(ぴったりのサイトが見つかりませんでした) http://www.fladdict.net/blog-jp/archives/2005/09/javascript_acti.php http://d.hatena.ne.jp/uokumura/20090505/1241471253 ちょっと特殊な条件下だと http://d.hatena.ne.jp/ynakajima/20090207/p1 http://hisasann.com/housetect/2008/02/javascriptthis.html >var test = this; >alert(test); >上記をアラートで出そうと思ったのですが、アラーとでは、 >object Object >と出てしまって、中身が分かりません。 どこに記載したのか不明なので、thisが何を意味しているのかわかりかねますが… 表示される内容から、一応、thisがobjectであることはわかりますよね? this.toSorce() では、toSorce()というfunctionが定義されていないので、未定義というエラーになっていると想像します。 (未定義のプロパティだとundefinedになります) 例えば、もとのコードで clearTimeout(this.timeout); となっているときの、thisは変数オブジェクト自身を指しています。 それなので、 this.timeout としたときは、その2行上で初期定義しているtimeoutを意味することになります。 3行下では、これに this.timeout = setTime(~~) としているので、 setTimeoutのIDとして利用していることがわかります。 試みにshowPopupの中で alert(this.timeout); としてみれば、最初はnull(=初期設定値)が、以後は数字(=ID)が表示されるはずですので、その意味するところを理解してください。 また、alert(this.showPopup); などとしてみると function()以下の自分自身の関数がそのまま返されることがわかると思います。 …というようなものなので、 >htmlをかまっていて、showPopup内の clearTimeout(this.timeout); >のthisが壊れてしまっています。 ということは起きてはいないと思うのですが…? ------------------------------------------------- いまさらではありますが、#1、#2の対処法は中身を全部理解した上での方法ではないので、あまりお勧めはいたしません。 というか、もともとの書き方(同じ内容のスクリプトを、メニューの個数分並べる方法)自体があまり勧められる方法とは言えないように思いますし、さらにHTMLソース側でもそれぞれのリンクタグに <a href="javascript:void(0);" onmouseout="menu_2.hidePopup()" onmouseover="menu_2.showPopup()">menu #02</a> みたいなのを書き連ねるのも洗練された方法とは思えません。 (ソースも見やすくなくなりますし) #2の後半にライブラリの利用方法も書いておきましたが、機能的に問題なければそのようなものを利用なさるのも一法かと思いますが…? HTMLでの設置方法(記述法)などを比較してみればわかると思いますが、メニューのHTMLを変更するときのことなどを考えてみれば、スクリプトも同時に修正しなければならないよりも、HTMLだけ修正すればそれですむ方がはるかに簡単ですよね。

masa_tokai
質問者

お礼

すいません。私の勘違いでおきたものでした。調べてみて解決いたしました。 そして、教えていただいた、 hide()を使ったやり方ではメニューの開閉はスムーズになったのですが、今度はメニュー内の項目が選べませんでした。(開いたらすぐに閉まる状態です。) hidePopup()を使わずに、直接記入するやり方では、メニュー1や2が開いたままになってしまいました。。 一応、#2の後半に記載してあるライブラリの利用方法も考えています。しかし、できる限りは現状のソースを使って行いたいと考えています。 平行して、教えていただいたライブラリーも構築していきます。以下、実際に使っているソースです。 hide()を使ったやり方 var menu_1 = { timeout : null,showPopup : function(){ //clearTimeout(this.timeout); hide(); if($('menu_1').style.display == 'none'){ this.timeout = setTimeout(function(){ new Effect.BlindDown('menu_1', {duration:.3, fps:40}) },400);}}, hidePopup : function(){ if($('menu_1').style.display == 'none'){ clearTimeout(this.timeout); }else{this.timeout = setTimeout(function(){ new Effect.BlindUp('menu_1',{ duration:.3, fps:40})},350); }}} ~~~以下省略~~~~ function hide(){ clearTimeout(menu_1.timeout); $('menu_1').style.display='none'; clearTimeout(menu_2.timeout); $('menu_2').style.display='none'; clearTimeout(menu_3.timeout); $('menu_3').style.display='none'; } 直接書くやり方 var menu_1={ timeout : null,showPopup:function(){ clearTimeout(this.timeout); if($('menu_1').style.display=='none'){ this.timeout=setTimeout(function(){ new Effect.BlindDown('menu_1',{ duration:.3,fps:40})},400); }}/*, hidePopup:function(){ if($('menu_1').style.display=='none'){ clearTimeout(this.timeout); }else{this.timeout=setTimeout(function(){ new Effect.BlindUp('menu_1',{duration:.3,fps:40 })},350); }}*/ clearTimeout(menu_2.timeout); $('menu_2').style.display ='none'; clearTimeout(menu_3.timeout); $('menu_3').style.display='none';} 何か分かりますでしょうか? よろしくお願いいたします。

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

#1です。 それぞれのメニューがそれぞれ別のコードで制御されているので、例の場合ですと合計3箇所に追加する必要があります。 それで改善できているかは、ご質問の事象がなかなか再現できないので、確認が難しいところですが。 再度実験してみたところ、きちんとメニューは閉じるのですが、開ききらないうちにhidePopup()を実行させてしまうと、どこかで制御変数が狂ってくるらしく、メニューの開く高さがおかしくなってしまう事象が起きることを発見しました。なので、このままではうまくないみたいです。失礼いたしました。 (「prototype」か「effects」の中を良くみてみないとわかりません) いっそのことhidePopup()を使わずに、直接で  clearTimeout(menu_2.timeout);  $('menu_2').style.display ='none'; にしてしまえば、どうやら大丈夫みたいです。 (ちゃんと調べればもうすこし要領の良い方法があると思いますが…) ↑これだと 2行×2(メニュー)×3(箇所)=12行 も追加しなければならなくてどうにも大仰になってしまいますね。 どうせなら、全部(1~3まで)を閉じるfunctionを作っておいて、各showPopupでそれを呼び出してあげるとか… function hide(){  clearTimeout(menu_1.timeout);  $('menu_1').style.display ='none';  clearTimeout(menu_2.timeout);  $('menu_2').style.display ='none';  clearTimeout(menu_3.timeout);  $('menu_3').style.display ='none'; } を用意しておいて、各showPopupの clearTimeout(this.timeout); の代わりに hide(); とすれば 一応、問題も起きずに動くようです。 (これだと作者の構成イメージをぶちこわしにしているので申し訳ないですが…) ----------------------------------------------------- >それと記載してあったサンプルライブラリの一番下 >これをマウスオーバーにしようとしたらどうしたらいいのでしょうか? 英語は苦手なのでちゃんと読んでませんが… 最初の方の「Examples」の5番目に「accordion with mouseover action」というのがあって、マウスオーバーの例と設置方法が示されています。 http://www.i-marco.nl/weblog/yui-accordion/apple/ その他の設定値(オプション)については、最初のページの「Invocation」の中の「options」で説明されているようですので、内容を確かめてみてください。

masa_tokai
質問者

お礼

ありがとうございます。 全部(1~3まで)を閉じるfunctionを作っておいて、各showPopupでそれを呼び出してあげる。 というやり方に変えました。 htmlをかまっていて、showPopup内の clearTimeout(this.timeout); のthisが壊れてしまっています。 var test = this; alert(test); 上記をアラートで出そうと思ったのですが、アラーとでは、 object Object と出てしまって、中身が分かりません。 何か確認する方法ってありますか? お願いいたします。

masa_tokai
質問者

補足

http://javascriptist.net/ref/Object.toSource.html 上記を参考に document.write(this.toSource()); としたのですが、やはりできません。 通常は、thisの中身はどうなっているのでしょうか?

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

なかなか再現しませんね。 スライドの動作を遅くしてみたりして試してもみましたが再現しません。 想像では、どこかでmouseoutのイベントがミスされているのだと思うのですが… ◇この手のライブラリはたくさん作られているので、他のものを利用するのも一つの方法ですね。 例えば http://www.dynamicdrive.com/dynamicindex17/ddaccordion.htm http://jquery.bassistance.de/accordion/demo/ http://sandbox.leigeber.com/javascript-accordion/index.html http://docs.jquery.com/UI/Accordion#event-changehttp://www.i-marco.nl/weblog/yui-accordion/#basic​ (サンプルがクリック動作になっていたりしますが、確か設定でマウスオーバーにできるはずです) ◇ご提示のものをそのまま修正するなら、 (「prototype」とか「effects」はよく知らないので、対処療法的になってしまいますが…) 表示する時(=showPopup)に念のため他のメニューを閉じるようにしておけば確実になるでしょう。 各メニュー毎にコピーされちゃってるので、煩雑ですが、例えば menu_1だったら、  menu_2.hidePopup(); menu_3.hidePopup(); みたいにしてあげれば、冗長になるけれど確実でしょう。 ついでに、HTMLソースからの呼び出しが引数付になっていますが、実際には利用されていないみたいなので、引数は省略してもいけるみたいですね。(というより、無いほうがソースが見やすい) でも、この方式だとメニューが増えたり変わったりすると、その度にスクリプトも増やしたり修正したりしなければならないので面倒ですね。 メニュー全体を対象とするように再構築してあげれば、使いやすくなりそうだけど…(↑に挙げた、たいていのライブラリはそのようになっています)

masa_tokai
質問者

お礼

早々のご返答ありがとうございます。 私も開く閉じるスピード遅くしたりしたのですがなかなか・・・。 解答欄に記載してある menu_2.hidePopup(); menu_3.hidePopup();を 以下のaccordion.js内の var menu_1 = { timeout : null, showPopup : function(){ //ここに記載した。 } //内に記載したのですが、他のメニューも開いてしまいます。 あっ!?「みたいにしてあげれば」 と記載してありましたね。 すいません。 具体的にはどういったソースを追記すればいいのでしょうか? それと記載してあったサンプルライブラリの一番下 http://www.i-marco.nl/weblog/yui-accordion/#basic​ これをマウスオーバーにしようとしたらどうしたらいいのでしょうか? なにぶん素人なので、お手数ですがよろしくお願いいたします。

masa_tokai
質問者

補足

できました。 根本的な解決ではありませんが、教えていただいた menu_2.hidePopup(); menu_3.hidePopup(); を menu_1のif文の中(以下参照) showPopup : function(){ clearTimeout(this.timeout); if($('menu_1').style.display == 'none'){ menu_2.hidePopup(); menu_3.hidePopup(); this.timeout = setTimeout(function(){new Effect.BlindDown('menu_1', {duration:.3, fps:40})},400); } に記載して、教えていただいた通りmenu_1が開いていたらmenu_2、menu_3は開かないようにする。 これでなんとか大丈夫そうです。 本当にありがとうございました。

関連するQ&A

  • 滑らかに開閉するメニューを作りたいのですが。

    自分で調べてみたのですが解決する事が出来ませんでしたので、どなたかお力を貸して下さい。 マウスのオン・オフで、隠れているメニューが閉じたり開いたりするものを作りたいのです。 http://hyper-text.org/archives/2006/12/slide_menu_javascript.shtml 上記のサンプルが非常に近いのですが、理想としては ・メニュー1 ・メニュー2 ・メニュー3 ・メニュー4 となっている場合、メニュー1にマウスを乗せると ・メニュー1  ・サブメニューA  ・サブメニューB  ・サブメニューC  ・サブメニューD と表示され、更にサブメニューAにマウスを乗せると ・メニュー1  ・サブメニューA   ・サブサブメニュー1   ・サブサブメニュー2   ・サブサブメニュー3 というような表示を滑らかな動きで閉じたり開いたりするように表示させたいのですが可能なのでしょうか? 参考サイト等ありましたら教えていただけると助かります。 以上宜しくお願いいたします。

  • タブのメニューに画像って・・・

    http://hyper-text.org/archives/2007/09/javascript_tab.shtml を参考にjavascriptでタブメニューを作りました。 上手く表示できたのですが、メニュー部分を画像にと、応用しようとしたのですが、うまく出来ません。 何が出来ないかというと、メニューをクリックしたらそのボタンを違う(カレント用の)画像が表示されるようにしたいのですが。。。 やり方や参考サイトなど、情報が有りましたら教えてください!! よろしくお願いします!!!

  • javascriptを使ったタブでタブにリンク

    http://hyper-text.org/archives/2007/09/javascript_tab.shtml を元にページを作っているのですが、タブにリンクを貼らなければならなくなりました。 javascriptは初心者レベルです。 やり方などありましたら教えてください! よろしくお願いします!!

  • マウスオーバーでゆっくり出る縦型アコーディオンメニューの作り方を教えてください。 

    マウスオーバーで、ゆっくり開くアコーディオンメニューを作成したいと考え色々、調べたのですがなかなかしっくりくるものがなくて困っています。 そこで、以下のサイトのドロップダウンメニューを改良してアコーディオンとして使えたらいいなと考え、自分なりにかまってみたのですが、上手くいきません。 参考サイト:http://www.leigeber.com/2008/04/sliding-javascript-dropdown-menu/ どなたか助言をよろしくお願いいたします。

  • javascriptの多用によるページエラーの回避について質問致します

    javascriptの多用によるページエラーの回避について質問致します。 私は趣味の傍ら、とあるホームページを運営しているのですが、そのページの中で、ページのトップに戻る時、滑らかにスムースに戻る動きを実現するために、「jquery」の「jquery-1.4.2.min.js」と「jquery.page-scroller-306.js」を使用しています。この時点では、エラーなく動作していたのですが、新たに、サイドメニューの箇所で「アコーディオンのように滑らかに開閉するメニュー」を導入しようと、http://hyper-text.org/archives/2006/12/slide_menu_javascript.shtml のページにある例を参考にして、3つのjsファイル(slidemenu.js)、(prototype.js)、(effects.js)を追加し、なんとか動作確認に成功しましたが、今度はページをトップにスムースに戻る動きができなくなってしまい、左下に「実行しましたが、ページでエラーが発生しました」とエラーが出てしまいます。そのエラーの詳細は「'undefined'は Nullまたはオブジェクトではありません」 「jquery-1.4.2.min.js コード0 」「文字26」というような感じです。つまり片方動作すれば、片方動作せずの状態です。 このエラーを解消する方法はございますでしょうか?アドバイスよろしくお願い致します。

  • アコーディオン自動開閉メニューjavascript

    タイトルの通りjavascriptでアコーディオンを作りたいのでご質問です。 マウスオーバー時にメニューを設定した秒数の間スムーズに自動開閉する記述が知りたいので ご教唆お願いします。

  • アコーディオンメニュー 開いたまま動かない

    アコーディオンメニューを設置したく検索をかけサンプルを入手、手直ししながら設置を試みるのですが、サンプルからして「JavaScriptの記述後 bodyが表示されない」、「親メニューはOKだがサブメニューが開かない」などなど、もう手詰まり状態です。 二日かかって下記 URLまでたどり着き正常な位置にきれいに並ぶのですが、私の作っているページ内ではメニューが開いたままの状態です。 http://d.hatena.ne.jp/takahashijunko/20120202/1328189955 「DOCTYPE宣言」、「@charset "UTF-8」の違いなどで私のページ(以下に記述)で使うことは無理なのでしょうか、それとも私はまったく勘違いをしているのでしょうか? アコーディオンメニューを使える道があるならばご教授ください。 --------------------------------- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>○○○○○</title> <meta name="description" content="○,○,○,○,"> <meta name="keywords" content="○,○,○,○,,"> <meta http-equiv="Content-Style-Type" content="text/css"> <link rel="stylesheet" href="style.css" type="text/css"> <link rel="stylesheet" href="style2.css" type="text/css"> <script type="text/javascript" src="js/jquery-1.6.min.js"></script> ・・・・URL先コピペの為省略・・・・ </script> </head> XP Chrom - IE8 - Firefox3.6 にて検証 よろしくお願いします。

    • ベストアンサー
    • HTML
  • JavaScript 折りたたみ式のメニュー

    こんにちは。 Javascriptのメニューなのですが おおまかなイメージとしては↓のサイトのような感じですhttp://www.pat.hi-ho.ne.jp/oka_tosho/tree17/tree17.htm ※スクロールについてくる動きは必要ないです ・縦方向にメニューの大項目があって ・マウスオーバーによって小項目が出てくる ・小項目は大項目の横にではなく、下に出る 上記のような動きをつけたいのですが 縦にメニューが展開されていくタイプだと クリックで動くものしか発見できず マウスオーバーで動くタイプは、大項目の 右側に小項目が出てきて、大項目自体は動かない ものしか発見できませんでした。 この動きが出来るのかどうかもわからないんですが サンプルサイトなどご存知の方がいらっしゃったら 教えていただきたいのですが。 それと、こうゆう動きをするメニューの名前は何になりますか? ネットでスクリプトのサンプルを探そうと思っんですが私が名前をよくわかっていなくてうまく検索できませんでした。 私の中では折りたたみ式のメニューと思っていたのですが、他の一般的な呼び名を教えていただけますか?

  • 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でアコーディオンメニュー

    jQueryのaccordionでメニューを作っています。 初期のページは大項目1~3がアコーディオンで開閉し、 開いた中にある小項目がリンクボタンになっています。 【HTML 1】 小項目1(index_01.html)では、大項目1が開いたままになり、 大項目2、3のみアコーディオンで開閉します。【HTML 2】 ここからがご教示頂きたいところで、 小項目2(index_02.html)を表示している時は 大項目2が開いたままで、大項目1、3をアコーディオンさせたいと考えております。 【HTML 3】 アコーディオンではさむ形になるので、新しいid「slider2」を作りましたが、 お互いが開いたままの状態になってしまうのが難点です。 解決案として、「slider」で大枠を囲み、アコーディオンに左右されないddを作るか、 「slider」と「slider2」を同期させてどちらか片方が開いている時は片方が閉じるように する・・・と考えています。 ★印の部分のfor文に手を加えるのではないかと思うのですが、 どうにもお手上げです・・・ お手すきの方、どうかお力添え下さい よろしくお願い致します。 //______jQuery______// var accordion=function(){ var tm=sp=10; function slider(n){this.nm=n; this.arr=[]} slider.prototype.init=function(t,c,k){ var a,h,s,l,i; a=document.getElementById(t); this.sl=k?k:''; h=a.getElementsByTagName('dt'); s=a.getElementsByTagName('dd'); this.l=h.length; ★for(i=0;i<this.l;i++){var d=h[i]; this.arr[i]=d; d.onmouseover=new Function(this.nm+'.pro(this)'); if(c==i){d.className=this.sl}} l=s.length; for(i=0;i<l;i++){var d=s[i]; d.mh=d.offsetHeight; if(c!=i){d.style.height=0; d.style.display='none'}} } slider.prototype.pro=function(d){ for(var i=0;i<this.l;i++){ var h=this.arr[i], s=h.nextSibling; s=s.nodeType!=1?s.nextSibling:s; clearInterval(s.tm); if(h==d&&s.style.display=='none'){s.style.display=''; su(s,1); h.className=this.sl} else if(s.style.display==''){su(s,-1); h.className=''} } } function su(c,f){c.tm=setInterval(function(){sl(c,f)},tm)} function sl(c,f){ var h=c.offsetHeight, m=c.mh, d=f==1?m-h:h; c.style.height=h+(Math.ceil(d/sp)*f)+'px'; c.style.opacity=h/m; c.style.filter='alpha(opacity='+h*100/m+')'; if(f==1&&h>=m){clearInterval(c.tm)}else if(f!=1&&h==1){c.style.display='none'; clearInterval(c.tm)} } return{slider:slider} }(); //______HTML 1______// <div id="accordion"> <dl class="accordion" id="slider"> <dt>▼大項目1</dt> <dd> <span class="bank_top"><a href="index_01.html">小項目1</a></span> </dd> <dt>▼大項目2</dt> <dd> <span><a href="index_02.html">小項目2</a></span> </dd> <dt>▼大項目3</dt> <dd> <span><a href="index_03.html">小項目3</a></span> </dd> </dl> </div> //______HTML 2______// <div id="accordion"> <dl class="accordion"> <dt>▼大項目1</dt> <dd> <span class="bank_top"><a href="index_01.html">小項目1</a></span> </dd> <dl class="accordion" id="slider"> <dt>▼大項目2</dt> <dd> <span><a href="index_02.html">小項目2</a></span> </dd> <dt>▼大項目3</dt> <dd> <span><a href="index_03.html">小項目3</a></span> </dd> </dl> </div> //______HTML 3______// <div id="accordion"> <dl class="accordion" id="slider"> <dt>▼大項目1</dt> <dd> <span class="bank_top"><a href="index_01.html">小項目1</a></span> </dd> </dl> <dl class="accordion"> <dt>▼大項目2</dt> <dd> <span><a href="index_02.html">小項目2</a></span> </dd> <dl class="accordion" id="slider2"> <dt>▼大項目3</dt> <dd> <span><a href="index_03.html">小項目3</a></span> </dd> </dl> </div> <script type="text/javascript"> var slider1=new accordion.slider("slider1"); slider1.init("slider"); var slider2=new accordion.slider("slider2"); slider2.init("slider2"); </script>

専門家に質問してみよう