左のメニューを開いたり閉じたり。
左側のメニューが、長すぎだったので、ちょっといじってみた。ただし、Firefoxで使えることしか確認してない。IEでは、駄目。IE使わないから問題なし。*1
閉じるようにしたのは、最新タイトルと、カテゴリーと、RSSモジュール使ってるはてな告知。はてな告知は、さらに概要を飛び出すようにしてみた。
ソースはこんな感じ。
HTML
<div id="menu-section" class="smenu"> <a class="open" href="#">▽</a> <a class="close" href="#">△</a> <hatena template="hatena-module" name="section"> </div> <div id="menu-sectioncategory" class="smenu"> <a class="open" href="#">▽</a> <a class="close" href="#">△</a> <hatena template="hatena-module" name="sectioncategory"> </div> <div id="menu-rssnews" class="smenu"> <a class="open" href="#">▽</a> <a class="close" href="#">△</a> <hatena name="rss" template="hatena-module hatena-news" desclength="1000" dateformat="%c/%e %H:%i" url="http://r.hatena.ne.jp/kou21058/%E3%81%AF%E3%81%A6%E3%81%AA%E5%91%8A%E7%9F%A5/rss"> </div>
/* 閉じたり開いたりするメニュー。*/ div.smenu { position : relative; /* 「▽」と「△」のため。 */ } div.smenu a.open, div.smenu a.close { /* 「▽」と「△」。 */ text-decoration : none; /* 効いてない? */ position : absolute; top : 15px; left : 15px; display : block; } div.smenu a.open, /* 最初の「▽」 */ div.smenu a.open:focus + a { /* 「▽」を選択した時の「△」。 */ z-index : 1; /* 出す。 */ } div.smenu a.close, /* 最初の「△」 */ div.smenu a.open:focus { /* 「▽」を選択。 */ z-index : -1; /* 隠す。 */ } div.smenu div.hatena-moduletitle + div.hatena-modulebody { /* 最初は本体非表示。 */ display : none; } div.smenu:hover div.hatena-moduletitle /* メニューに乗っかってる。 */ + div.hatena-modulebody, div.smenu a.open:focus + a + div.hatena-module div.hatena-moduletitle /* openが選択されてる。 */ + div.hatena-modulebody { /* 本体表示。 */ display : block; } div#menu-rssnews div.hatena-moduletitle { text-indent : 1em; /* 「▽」のためにずらす。 */ } div#menu-rssnews dt + dd { /* タイトルに乗っかってない時は、概要非表示。 */ display : none; } div#menu-rssnews dt:hover + dd { /* rssで、タイトルに乗っかった時に概要を開く。 */ display : block; width : 500px; z-index : 5; background-color : #fff; color : #000; border : solid #000 1px; padding : 5px; } div#menu-rssnews dl.hatena-rss dt a { /* rssの日付とリンクの行を分ける。 */ display : block; }
▽をクリックすると、枠の外にマウスが行っても、開いたまま。
正確には、クリックじゃなくて、選択する。押して、他に動かして、放す感じ。でもクリックで大丈夫っぽい。
実は、△は必要ない。▽の選択を解除するだけ。ほかのリンクをクリックしても、リンク以外をクリックしても、解除される。
はてな告知の飛び出すやつ。
タイトルのリンクの上に乗せると、タイトルのタイトル*2が飛び出すけど、Firefoxだと全部は表示しないようで。これ、表示できるんだっけか。:afterとか、contentとかか。*3
ちょっとした解説。
div.smenu { position : relative; /* 「▽」と「△」のため。 */ } div.smenu a.open, div.smenu a.close { /* 「▽」と「△」。 */ text-decoration : none; /* 効いてない? */ position : absolute; top : 15px; left : 15px; display : block; }
これで、二つの三角を同じ場所に表示してる。text-decoration:none;で下線を消してるはずなんだけど、表示されてる。なんでだろ。
div.smenu a.open, /* 最初の「▽」 */ div.smenu a.open:focus + a { /* 「▽」を選択した時の「△」。 */ z-index : 1; /* 出す。 */ } div.smenu a.close, /* 最初の「△」 */ div.smenu a.open:focus { /* 「▽」を選択。 */ z-index : -1; /* 隠す。 */ }
▽がa.open、△がa.close。
html的には、
<div class="smenu"> <a class="open" href="#">▽</a> <a class="close" href="#">△</a> <div class="hatena-module"> <div class="hatena-moduletitle"><a>…</a></div> <div class="hatena-modulebody">
になってる。
smenu は、Small MENUか何かの略。最初ポップアップメニューとか書こうと思ったんだけど、これはポップアップメニューとは違うよなぁ。
で、"div.smenu a.open:focus + a"は、"+ a"で次の要素を表してるわけですね。次、というか、兄弟。すぐ後の弟だけらしい。*4
":focus"は選択されてる要素。疑似クラスと言うらしい。*5
'href="#"'としてるのは、href抜きでやったらうまくいかなかったから。
z-indexは、重なってる順番をいじる。0が普通の状態で、値が大きいと、上、というか、手前側。それで、"z-index:-1;"で隠れるわけですな。"display:none"と違って存在はしてる。*6
div.smenu div.hatena-moduletitle + div.hatena-modulebody { /* 最初は本体非表示。 */ display : none; }
で、本体の非表示。
わざわざ"+"を使ってるのは、IEよけですな。IEは"+"に対応してないので、非表示にならなくて、はっぴー、と。*7
で、
div.smenu:hover div.hatena-moduletitle /* メニューに乗っかってる。 */ + div.hatena-modulebody, div.smenu a.open:focus + a + div.hatena-module div.hatena-moduletitle /* openが選択されてる。 */ + div.hatena-modulebody { /* 本体表示。 */ display : block; }
が、表示する部分。
"div.smenu:hover"で、マウスが乗っかってるのを表してる、と。":focus"と同じく疑似クラスってやつですな。*8
単に、"div.hatena-modulebody"ではなく、"div.hatena-moduletitle + div.hatena-modulebody"としてるのは、たぶん上の方の"+"つきのが優先しちゃうんだと思うんだけど、うまくいかなかったから。
"+"使いまくりだなぁ。
( ( div.smenu:hover div.hatena-moduletitle ), ( div.smenu a.open:focus + a + div.hatena-module div.hatena-moduletitle ) ) + div.hatena-modulebody
とかやりたいんだけど、できるのかなぁ。*9
まぁ、そんな感じ。
*2:ややこし。
*3:使ったことないなぁ。
*4:△は後で追加したのだけど、それまで"a.open + div.hatena-module"としてたのが、そのままじゃだめになった。"+"を"+ a +"にする必要がある。
*5:説明発見。ってか、ここいいなぁ。http://www6.plala.or.jp/go_west/nextcss/ref/slctr/ps_clas.htm#active_p
*6:最初、△を"display:none"でやってたら、タブで移動してたら抜け出せなくなってしまった。
*7:"+"は隣接セレクタというのか。http://www6.plala.or.jp/go_west/nextcss/ref/slctr/slctr.htm#adjacent
*8:おっと、「擬似」って書いてた。
*9:ためしてない。