以前このブログでメモっておいたjQueryプラグインのQuickFlip 2と、タブ切り替えをセットにしたチュートリアルがありました。
http://webdeveloperplus.com/jquery/create-flipping-content-tabs-using-jquery/チュートリアルページ

http://jonraasch.com/blog/quickflip-2-jquery-pluginQuickFlip 2のダウンロードページ

で、チュートリアルページにあるソースをコピーペースト。

html

<div id="flip-tabs">
 <ul id="flip-navigation">
 <li><a href="javascript:void(0)" id="tab-0">Recent</a></li>
 <li><a href="javascript:void(0)" id="tab-1">Popular</a></li>
 <li><a href="javascript:void(0)" id="tab-2">Comments</a></li>
 </ul>
 <div id="flip-container">
 <div>
 PutPut Content for first tab
 </div>
 <div>
 Put Content for second tab here
 </div>
 <div>
 Put Content for third tab here
 </div>
 </div>
 </div>

css

@charset "utf-8";
#flip-tabs{
width:300px;
margin:20px auto; position:relative;
}

#flip-navigation{
margin:0 0 10px; padding:0;
list-style:none;
}

#flip-navigation li{
display:inline;
}

#flip-navigation li a{
text-decoration:none; padding:10px;
margin-right:0px;
background:#f9f9f9;
color:#333; outline:none;
font-family:Arial; font-size:12px; text-transform:uppercase;
}

#flip-navigation li a:hover{
background:#999;
color:#f0f0f0;
}

#flip-navigation li.selected a{
background:#999;
color:#f0f0f0;
}

#flip-container{
width:300px;
font-family:Arial; font-size:13px;
}

#flip-container div{
background:#f00;
}

JS

$(function(){
//    initialize quickflip
 $('#flip-container').quickFlip();

 $('#flip-navigation li a').each(function(){
 $(this).click(function(){
 $('#flip-navigation li').each(function(){
 $(this).removeClass('selected');
 });
 $(this).parent().addClass('selected');
//            extract index of tab from id of the navigation item
 var flipid=$(this).attr('id').substr(4);
//            Flip to that content tab
 $('#flip-container').quickFlipper({ }, flipid, 1);
 return false;
 });
 });

cssの赤字の部分のwidthで、見出しのタブの文字のwidthと合わせよう。今回は、300px。

で、上記のファイルを全部読みこむと、一応は表示されました。

ただ、htmlのid flip-containerの中の文字数。(様は、タブで切り替わる、本文の文字数)によって、若干思わぬ弊害が起こった。

20090916_03

ちょっと解りずらい画像だけど…タブの下にあるコンテンツにかぶってしまった。

で、いろいろ原因を探っていると、このプラグインは、htmlにstyle属性を付けてくれるんだけど、その付加されたstyle属性をちょっと変えると、

20090916_02

こんな感じに、一つ下のコンテンツに重ならずに表示できた。

対応の仕方ですが、

まず、firebugで、ブラウザに表示した後のhtmlを見てみると、

<div id="flip-container" style="position: relative;">

<div style="margin: 0px; padding: 0px;
position: absolute; top: 0px;
 left: 0px; width: 300px; height: 140px;">
タブの中の本文
</div>

<div style="display: none;">
</div>
<div style="display: none;">
</div>
<div style="display: none;">

こんな感じになっている。(「タブの中の本文」の所は、複数ある)

問題なのは、青文字のposition:absoluteの部分。同じdivのstyleに、height: 140pxと書いてあるけど、absoluteしてしまっているので、下のコンテンツにかぶってしまう。

で、緑文字で書いてある、一つ上の要素(親要素)である、<div id=”flip-container”>のstyle属性を、

style="position: relative;"

から、

style="position: relative; height: 140px"

としたら、下のコンテンツにかぶらず表示出来ました。

このプラグインは、テキストの量によって、自動でheightを計算して、style属性を付加する感じになっているらしく(多分ね…)、htmlに直接heightをstyle属性で書く事も出来ると思うけど、出来れば動的に処理したい。

そこで考えたのが、このコード、

var cont_style=$("#flip-container").attr("style");//その1
var div_attr=$("#flip-container div").attr("style");//その2
var div_attr_arr = div_attr.split("height");//その3
var style_tuika = cont_style + " height " + div_attr_arr[1];//その4
$("#flip-container").attr("style",style_tuika);//その5

いや、めっちゃ素人がばればれのコードな気がするが…まあ、とりあえず動くので良しとしよう。

その1:まずは、変数cont_styleにdiv#flip-containerの、style属性の値を格納。この時点では、「position: relative;」が格納されているはず。

その2:次は、変数div_attrに、div#flip-container divの、style属性の値を格納。「margin: 0px; padding: 0px; position: absolute; top: 0px; left: 0px; width: 322px; height: 140px;」が格納されているはず。

その3:今取得したdiv_attrを、文字列「height」で切って、配列div_attr_arrに格納。

格納されたのは、「margin: 0px; padding: 0px; position: absolute; top: 0px; left: 0px; width: 322px;」と、「: 140px;」のはず。

その4:後は、変数cont_styleと、配列div_attr_arrを使って、新たなスタイル属性を作って、変数style_tuikaに格納。「position: relative; height: 140px;」こうなっているはず。

その5:それを、div#flip-containerのstyle属性に新たに書けば完成。

………………

ホントは、もっとスマートなやり方がありそうだけど、っていうか絶対あるけど、取り換えずこのやり方で、解決できました。

<追記>

このやり方だと、ie6でバグが出ました…修正版あり。