<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>A Day in the Life</title>
    <link rel="alternate" type="text/html" href="http://www.nk0206.com/life/" />
    <link rel="self" type="application/atom+xml" href="http://www.nk0206.com/life/atom.xml" />
    <id>tag:www.nk0206.com,2012-04-18:/life//2</id>
    <updated>2012-05-12T16:52:02Z</updated>
    <subtitle>WEBの技術系情報(CSS/HTML/jQuery/MT)をメインに書いています。</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Pro 5.04</generator>

<entry>
    <title>jQueryタブプラグインで最初に表示されるタブを選択出来るようにする</title>
    <link rel="alternate" type="text/html" href="http://www.nk0206.com/life/2012/05/jquery-tab04.html" />
    <id>tag:www.nk0206.com,2012:/life//2.1941</id>

    <published>2012-05-12T16:48:50Z</published>
    <updated>2012-05-12T16:52:02Z</updated>

    <summary>jQueryタブプラグインの4回目の記事です。今回はn番目のタブが選択された状態を初期値として設定出来るように改修します。</summary>
    <author>
        <name>poundhound</name>
        
    </author>
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="jquery" label="jQuery" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.nk0206.com/life/">
        <![CDATA[<p>jQueryを使ったタブメニューの第4回目です。（しつこい）</p>
<p>前回はjQuery Cookie プラグインを使ってタブの表示状態を保持するように改修しました。<br />
今回は最初に表示されるタブを選択出来るように改修します。</p>
]]>
        <![CDATA[<p>今回のコードの完成形です。</p>
<p class="codeHeadline">jQuery Code</p>
<pre class="code" lang="js">
(function($) {
	$.fn.tabs = function(options) {
		var o = $.extend({
			targetID: '#tab',
			tabElement: '.tab-list li',
			boxElement: '.tab-box',
			defaultOpenTab: 0
		}, options);
	
		$(o.tabElement, o.targetID).each(function() {
			
			var selectedTab = $.cookie(o.targetID + 'selectedTab');
			if (selectedTab) {
				$(o.boxElement, o.targetID).not(':eq(' +selectedTab+')').hide();
				$(o.tabElement, o.targetID).eq(selectedTab).addClass('selected');				
			} else {
				$(o.boxElement, o.targetID).hide().eq(o.defaultOpenTab).show();
				$(o.tabElement, o.targetID).eq(o.defaultOpenTab).addClass('selected');
			}
			
			$(this).click(function(){
				var tabIndex = $(o.tabElement, o.targetID).index(this);
				$.cookie(o.targetID + 'selectedTab', tabIndex);
				$(o.tabElement, o.targetID).removeClass('selected');
				$(this).addClass('selected');
				$(o.boxElement, o.targetID).hide().eq(tabIndex).addClass('selected').fadeIn();
			});
			
		});
		return this;
	};
})(jQuery);
</pre>
<p>前回と違うのは7行目と17、18行目だけです。</p>
<p>何をやっているかと言うと7行目に最初に選択されているタブをオプションとして設定します。0が1番目、1が2番目になります。（初期値は0とします）</p>
<p>17行目は以前のコードでは『1番目の内容以外を非表示』としていたのを『n番目の内容以外を表示』に変更します。<br />
まずは全ての内容を.hide()で非表示にして、.eq(<span class="code">n番目</span>)を.show()で表示します。<br />
18行目は.eq(n番目)のタブ（liタグ）に.addClass()します。</p>
<p>これでn番目のタブが選択された状態を初期値として設定出来るようになります。</p>
<p>GithubデビューしたのでGithubにコードを置いておきました。宜しければご自由にお使いください。</p>
<p><a href="https://github.com/poundhound/jq.tab" class="oslink">github poundhound/jq.tab</a></p>]]>
    </content>
</entry>

<entry>
    <title>bodyに指定するfont-sizeやfamilyなど</title>
    <link rel="alternate" type="text/html" href="http://www.nk0206.com/life/2012/05/body-font-size-family.html" />
    <id>tag:www.nk0206.com,2012:/life//2.1940</id>

    <published>2012-05-07T16:48:41Z</published>
    <updated>2012-05-07T16:58:17Z</updated>

    <summary>bodyに記述するfont-size、font-familyの一例。</summary>
    <author>
        <name>poundhound</name>
        
    </author>
    
        <category term="CSS" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="css" label="CSS" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ie対策" label="IE対策" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.nk0206.com/life/">
        <![CDATA[ <p>以前エントリーした記事、<a href="http://www.nk0206.com/life/2009/06/ie8ie7ie6ffms-pmac-safariff.html">IE8とIE7はメイリオ、IE6/FFはMS Pゴシック、Mac Safari/FFはヒラギノ角ゴを表示</a>から早くも3年近く経っている事にびっくりしました。ブラウザに関する事情は大きく変わってIEの最新版は9で現役のIEは6〜9（IE6を排除するサイトもだいぶ増えましたが）加えてChromeのシェア上昇、Safariは5に、Firefoxに至っては12！でブラウザが乱立する状態になっています。<br />
これだけブラウザの進化が早いと出来る限りハックは使わず...と言うのが安全策だと思います。<br />
どうしても使う場合は極力シンプルに！と言う事で以前はセレクタハックを使っていたのですが、プロパティに記述するハックに切り替えてます。</p>
<p>※基本bodyに指定するフォント関連でのみ使用し、他の場所では極力ハックは使わないようにしています。決してハックを推奨する記事ではありません。</p>]]>
        <![CDATA[<p class="codeHeadline">CSS Code</p>
<pre class="code" lang="css">body {
	font-family: Verdana, Arial, Hiragino Kaku Gothic Pro, "ヒラギノ角ゴ W3", Osaka, "ＭＳ Ｐゴシック", sans-serif;
	font-size: 13px;
	font-family: Verdana, Arial, "メイリオ", Meiryo, "ＭＳ Ｐゴシック", sans-serif\9;
	font-size: 82%\9;
	_font-family: Verdana, Arial, "ＭＳ Ｐゴシック", sans-serif;
	_vertical-align: baseline;
	color: #333;
}
body:not(:target) {
	font-family: Verdana, Arial, "メイリオ", Meiryo, "ＭＳ Ｐゴシック", sans-serif\9;
	font-size: 82%\9;
}
</pre>
<p>\9ハックはIE8以下のブラウザにスタイルを適用するハックです。IE9はこのハックは適用されませんので<code>:not(:target) { color: #333\9; }</code>と記述する事によりIE9に適用されます。<br />
_ハックはIE6のみに適用されるハックです。</p>
<p>セレクタハックを使うより記述がシンプルだと思います。ちなみに僕はSassを使っているので、こんな形で記述しています。</p>
<pre class="code" lang="css">@mixin font-main {
	font: {
		family: Verdana, Arial, Hiragino Kaku Gothic Pro, "ヒラギノ角ゴ W3", Osaka, "ＭＳ Ｐゴシック", sans-serif;
		size: 13px;
	}
}
@mixin font-ie {
	font: {
		family: Verdana, Arial, "メイリオ", Meiryo, "ＭＳ Ｐゴシック", sans-serif\9;
		size: 82%\9;
	}
}
@mixin font-lte-ie6 {
	_font-family: Verdana, Arial, "ＭＳ Ｐゴシック", sans-serif;
	_vertical-align: baseline;
}

body {
	@include font-main;
	@include font-ie;
	@include font-lte-ie6;
	color: #333;
	
	&amp;:not(:target) {
		@include font-ie;
	}
}
</pre>
<p>これがコンパイルされると先述したCSSコードになります。</p>]]>
    </content>
</entry>

<entry>
    <title>指定した秒数ごとに画像がスライドするカルーセル</title>
    <link rel="alternate" type="text/html" href="http://www.nk0206.com/life/2012/03/jquery-carousel01.html" />
    <id>tag:www.nk0206.com,2012:/life//2.1939</id>

    <published>2012-03-27T16:38:54Z</published>
    <updated>2012-04-24T16:18:05Z</updated>

    <summary>jQueryカルーセルの作成方法を解説した記事です。</summary>
    <author>
        <name>poundhound</name>
        
    </author>
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="jquery" label="jQuery" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.nk0206.com/life/">
        <![CDATA[<p>jQueryを使ったカルーセルプラグインはたくさんあるのであまり困る事は無いと思いますが、試しに自分で作ってみたので2回に分けてカルーセルの作り方を記事にします。</p>
<p>1回目は指定した秒数ごとに画像がスライドする無限ループのカルーセルを作ります。2回目は無限ループに加え、ボタンを画像分用意し、クリックするとボタンに対応した画像が表示されると言ったものに改造して行きます。（余裕があれば3回の記事にし、プラグイン化しようと思います。）</p>
<p>プログラムの流れは下記のような流れに従って作ります。</p>
<ul class="basic1">
<li>画像の数や幅などの初期設定を行う。</li>
<li>画像が左にスライドするアニメーションを作る。</li>
<li>このアニメーションをメソッド化する。</li>
<li>指定した秒数でこのメソッドを実行させる。</li>
</ul>]]>
        <![CDATA[<p>まずデモで完成形をご覧ください。</p>
<p class="viewDemo"><a href="http://www.nk0206.com/demo/jquery/carousel01.html"><span>View Demo</span></a></p>

<p>それではコードを解説して行きます。</p>
<h2 class="level2">HTML</h2>
<p>HTMLは下記のようなソースコードになります。</p>
<p class="codeHeadline">HTML Code</p>
<pre class="code" lang="html">&lt;div id="carousel"&gt;
	&lt;div class="window"&gt;
		&lt;div class="images"&gt;
			&lt;ul&gt;
				&lt;li&gt;&lt;img src="img/img_c-photo01.jpg" width="360" height="270" alt="" /&gt;/li&gt;
				&lt;li&gt;&lt;img src="img/img_c-photo02.jpg" width="360" height="270" alt="" /&gt;&lt;/li&gt;
				&lt;li&gt;&lt;img src="img/img_c-photo03.jpg" width="360" height="270" alt="" /&gt;&lt;/li&gt;
				&lt;li&gt;&lt;img src="img/img_c-photo04.jpg" width="360" height="270" alt="" /&gt;&lt;/li&gt;
				&lt;li&gt;&lt;img src="img/img_c-photo05.jpg" width="360" height="270" alt="" /&gt;&lt;/li&gt;
				&lt;li&gt;&lt;img src="img/img_c-photo06.jpg" width="360" height="270" alt="" /&gt;&lt;/li&gt;
			&lt;/ul&gt;
		&lt;/div&gt;
	&lt;/div&gt;
&lt;/div&gt;
</pre>
<p><a href="http://www.nk0206.com/life/images/2012/fig_carousel04.png"><img alt="カルーセルの説明図04" src="http://www.nk0206.com/life/images/2012/fig_carousel04.png" width="580" height="130" class="mt-image-none" /></a></p>

<p>図にするとこんな感じです。div#carouselの中にdiv.windowがあります。div.windowの役目は画像を表示する領域の指定です。画像（img要素）はul liでマークアップし、div.imagesで包みます。このdiv.imagesを一定時間ごとに左へスライドさせます。</p>
<h2 class="level2">初期設定</h2>
<p>まずは初期設定です。ここでは使い回しそうな値を変数に入れておきます。</p>
<p class="codeHeadline">jQuery Code</p>
<pre class="code" lang="js">$(function() {
	var carousel = $('div.images');
	var carouselUl = carousel.children();
	var carouselLi = carouselUl.find('li');
	var imageWidth = carouselLi.find('img').width();
});
</pre>
<p>初期設定ではそれぞれの値を変数に入れておきます。</p>
<dl class="basic1">
<dt>var carousel</dt>
<dd>スライドさせる画像リストを梱包するdiv。（実際にスライドさせるdiv）</dd>
<dt>var carouselUl</dt>
<dd>画像リストul要素。</dd>
<dt>var carouselLi</dt>
<dd>画像リストli要素。</dd>
<dt>var imageWidth</dt>
<dd>画像（img要素）の幅。指定した秒ごとにこの幅分スライドする。<br />
</dd>
</dl>
<p><a href="http://www.nk0206.com/life/images/2012/fig_carousel05.png"><img alt="カルーセル説明図05" src="http://www.nk0206.com/life/images/2012/fig_carousel05.png" width="580" height="109" class="mt-image-none" /></a></p>
<p>今回作るカルーセルは画像を無限にスライドさせます。無限ループをすると言う事は、最後の画像が表示されたら画像リストを元の位置（座標0,0）に戻す必要があります。<br />
この際に画像リストが1組しかないと、最後の画像が左にスライドする事無く元の位置に戻るため、きれいなアニメーションになりません。<br />
この状態を回避するにはもう1組の画像リストを用意し、2組目の画像リストが表示された時にdiv.images（var carousel）を元の位置に戻してあげればいいわけです。</p>
<p><a href="http://www.nk0206.com/life/images/2012/fig_carousel06.png"><img alt="カルーセル説明図06" src="http://www.nk0206.com/life/images/2012/fig_carousel06.png" width="580" height="88" class="mt-image-none" /></a></p>
<p>要素を複製するには<strong>.clone()</strong>メソッドを利用します。そして複製した要素をdiv.imagesに追加します。要素を追加するには<strong>.appendTo()</strong>を利用します。</p>
<p>これでdiv.imagesには2つのul要素を内包しました。このdiv.imagesには幅をセットします。幅を指定するには<strong>.css('property', 'value')</strong>を利用します。<br />
幅の値は(画像の幅 × 画像の数) × 2で求めらるので次のようなコードになります。</p>
<p class="codeHeadline">jQuery Code</p>
<pre class="code" lang="js">carouselUl.clone().appendTo(carousel); //カルーセルする画像リストを複製して要素に追加
carousel.css('width', carouselLi.length * imageWidth * 2); //幅を設定
</pre>
<h2 class="level2">アニメーションの作成</h2>
<p>いよいよアニメーションの部分に入ります。画像の幅分左にスライドするアニメーションを作ります。アニメーションは下図のようにdiv.images（carousel）を指定した秒ごとにimgの幅分（imageWidth）スライドすると言うものです。</p>
<p>表示領域のdiv.windowにはCSSでposition: relative;を記述してます。この左端を起点にdiv.imagesをposition: absolute;で絶対配置し、jQueryのanimateメソッドでleftプロパティを操作します。</p>
<p><a href="http://www.nk0206.com/life/images/2012/fig_carousel07.png"><img alt="カルーセル説明図07" src="http://www.nk0206.com/life/images/2012/fig_carousel07.png" width="580" height="91" class="mt-image-none" /></a></p>
<p>animateメソッドは<strong>.animate(params, [duration], [easing], [callback])</strong>のような書式になります。paramsにはcssのプロパティを、durationにはアニメーションの動作時間をミリ秒で、または'slow'や'normal'、'fast'などのキーワードで、easingにはイージングを指定します（easingプラグインを入れてない場合は'liner'か'swing'のみ）。callbackにはアニメーションが終わった後に実行するメソッドを指定します（コールバック関数と言います）</p>
<p>まずは左に画像の幅分スライドするアニメーションを記述します。</p>
<p class="codeHeadline">jQuery Code</p>
<pre class="code" lang="js">carousel.animate({'left' : '-=' +(imageWidth)}, 'slow'});
</pre>
<p>これだけでは1回しかアニメーションは実行されません。常にアニメーションをさせるには<strong>setInterval()</strong>を利用します。<br />
setIntervalを利用すると指定した秒数ごとに実行するメソッドを呼び出す事が出来ます。setIntervalは次のような書式になります。
</p>
<p class="codeHeadline">jQuery Code</p>
<pre class="code" lang="js">setInterval(function() {
	Do something
},ミリ秒);
</pre>
<p>先ほど記述したアニメーションをメソッド化してDo somethingの所で指定した秒数ごとに呼び出すようにしましょう。</p>
<p class="codeHeadline">jQuery Code</p>
<pre class="code" lang="js">function carouselAnimate() {
	carousel.animate({'left' : '-=' +(imageWidth)}, 'slow'});
}

setInterval(function() {
	carouselAnimate();
},2000);
</pre>
<p>これで2000ミリ秒毎にcarouselAnimate()が呼び出されるので、2000ミリ秒毎にdiv.images（carousel）がimageWidth分左にスライドして行きます。</p>
<p>さて、ここまでのコードを1度まとめて見てみましょう。</p>
<p class="codeHeadline">jQuery Code</p>
<pre class="code" lang="js">$(function() {

	//初期設定
	var carousel = $('#images');
	var carouselUl = carousel.children();
	var carouselLi = carouselUl.find('li');
	var imageWidth = carouselLi.find('img').width();
	
	carouselUl.clone().appendTo(carousel); //カルーセルする画像リストを複製して要素に追加
	carousel.css('width', carouselLi.length * imageWidth * 2); //幅を設定
	
	//スライドアニメーション
	function carouselAnimate() {
		carousel.animate({'left' : '-=' +(imageWidth)}, 'slow'});
	}
	
	//指定した秒数ごとの処理
	setInterval(function() {
		carouselAnimate();
	},2000);
	
});
</pre>

<h2 class="level2">無限ループの動作を作る</h2>
<p>さて、このままではdiv.imagesは永遠に左にスライドし続けてしまいます。さきほどちょっと触れた無限ループの動作を作って行きます。</p>
<p> スライドアニメーションを無限ループにするためには複製した2組目の画像リストの1番目の画像が表示された後直後に、div.images（carousel）を元の位置（座標0,0）に戻してあげます。</p>
<p><a href="http://www.nk0206.com/life/images/2012/fig_carousel08.png"><img alt="カルーセル説明図08" src="http://www.nk0206.com/life/images/2012/fig_carousel08.png" width="580" height="138" class="mt-image-none" /></a></p>
<p>そのためには複製された2組目の画像の1枚目を特定する必要があります。そのためにはカウントアップする変数を用意して、表示領域に表示されている画像が何枚目かを特定します。仕組みは下記のようになります。</p>
<ol class="basic1">
<li>初期値0の変数countを用意。</li>
<li>アニメーションメソッド<span class="code">carouselAnimate</span>()が1回実行されるたびにcounterの値に1を足す。</li>
<li><strong>counterの値を画像の枚数（<span class="code">carouselLi</span>）で割って余りが0になれば複製した要素の1枚目になる。</strong></li>
<li>div.images（carousel）の座標を元の位置に戻す。</li>
<li>countを0に戻す。</li>
</ol>
<p>この動作を繰り返せば無限ループが実現出来ます。<br />
現在まで出来たコードに変数countを追加し、3の条件を判定するメソッドを追加します。そしてアニメーションメソッドのcarouselAnimate()の中で呼び出される.animate()のコールバック関数で条件判定のメソッドを実行します。</p>
<p class="codeHeadline">jQuery Code</p>
<pre class="code" lang="js">$(function() {
	var count = 0; //カウンター
	
	===== 中略 =====
	
	function carouselAnimate() {
		count ++; //アニメーションする度にカウンター変数を1ずつ加算して行く
		carousel.animate({'left' : '-=' +(imageWidth)}, 'slow',
			//コールバック関数で条件メソッドを呼び出す
			function(){
				positionInit();
		});
	}
	
	//現在の表示されている画像を判別するメソッド
	function positionInit() {
		if(!(count % imageLength)) { //カウンターの数を画像の数で割った余りがゼロなら
			carousel.css({'left': 0}); //div#imagesを左端に戻す
			count = 0; //カウンターを初期化
		}
	}
});
</pre>

<p>これで無限ループするカルーセルが出来上がりました。長くなりましたが完成したコードは下記のようになります。</p>
<p class="codeHeadline">jQuery Code</p>
<pre class="code" lang="js">$(function() {
	
	//初期設定
	var count = 0; //カウンター
	var carousel = $('#images'); //カルーセルする画像が梱包されているdiv
	var carouselUl = carousel.children();
	var carouselLi = carouselUl.find('li'); //カルーセルする画像リスト
	var imageWidth = carouselLi.find('img').width(); //画像の幅
	var imageLength = carouselLi.length; //画像の数
	
	carouselUl.clone().appendTo(carousel); //カルーセルする画像リストを複製して要素に追加
	carousel.css('width', carouselLi.length * imageWidth * 2); //カルーセルする画像リストの横幅を設定
	
	//アニメーション
	function carouselAnimate() {
		count ++; //アニメーションする度にカウンター変数を1ずつ加算して行く
		carousel.animate({
			'left' : '-=' +(imageWidth)
		}, 'slow',
			function(){
				positionInit()
			}
		);
	}
	
	//現在の表示されている画像を判別するメソッド
	function positionInit() {
		if(!(count % imageLength)) { //カウンターの数を画像の数で割った余りがゼロなら
			carousel.css({'left': 0});
			count = 0;
		}
	}
	
	setInterval(function() {
		carouselAnimate();
	},2000);
	
});
</pre>
<p>説明も長く、難しかったかもしれませんが、仕組みを知ると色々と応用が効いてくると思います。デモをダウンロード出来るようにしておきますので是非試して見てください。</p>
<p class="download"><a href="http://www.nk0206.com/download/calousel01.zip"><span>Download</span></a></p>]]>
    </content>
</entry>

<entry>
    <title>jQueryを使ってタブメニュープラグインを作る(Cookie Version)</title>
    <link rel="alternate" type="text/html" href="http://www.nk0206.com/life/2012/03/jquery-tab03.html" />
    <id>tag:www.nk0206.com,2012:/life//2.1938</id>

    <published>2012-03-24T16:12:47Z</published>
    <updated>2012-03-25T13:20:47Z</updated>

    <summary>jQueryを使ったタブメニューの解説。今回はjQuery Cookieを利用してタブの状態を保持するようにします。</summary>
    <author>
        <name>poundhound</name>
        
    </author>
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="jquery" label="jQuery" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.nk0206.com/life/">
        <![CDATA[<p>jQueryを使ったタブメニューの第3回目です。</p>
<p>前回はタブメニューを使い回したり、1ページ内で複数のタブに対応させるためにプラグイン化するという記事を書きました。今回はこのタブの状態をリロード時や、他のページから戻ってきた時にタブの状態を維持するように改造します。</p>
<p>タブの状態を維持するにはCookieを使いますが、jQueryにはCookieを簡単に使えるようにするjQuery Cookieと言うプラグインがありますので、これを利用してます。</p>
<p>前回までの記事をご覧になっていない場合は先にご覧になっていただければと思います。</p>
<ul class="basic1">
<li><a href="http://www.nk0206.com/life/2012/01/jquery-tab01.html">jQueryを使ってタブメニューを作る</a></li>
<li><a href="http://www.nk0206.com/life/2012/01/jquery-tab02.html">jQueryを使ってタブメニュープラグインを作る</a></li>
</ul>]]>
        <![CDATA[<p>今回のコードの完成形です。</p>
<p class="codeHeadline">jQuery Code</p>
<pre class="code" lang="js">(function($) {
	$.fn.tabs = function(options) {
		var o = $.extend({
			targetID: '#tab',
			tabElement: '.tab-list li',
			boxElement: '.tab-box'
		}, options);
	
		$(o.tabElement, o.targetID).each(function() {
			var selectedTab = $.cookie(o.targetID + 'selectedTab');
			if (selectedTab) {
				$(o.boxElement, o.targetID).not(':eq(' +selectedTab+')').hide();
				$(o.tabElement, o.targetID).eq(selectedTab).addClass('selected');				
			} else {
				$(o.boxElement, o.targetID).not(':first').hide();
				$(o.tabElement, o.targetID).eq(0).addClass('selected');
			}
			
			$(this).click(function(){
				var tabIndex = $(o.tabElement, o.targetID).index(this);
				$.cookie(o.targetID + 'selectedTab', tabIndex);
				$(o.tabElement, o.targetID).removeClass('selected');
				$(this).addClass('selected');
				$(o.boxElement, o.targetID).hide().eq(tabIndex).addClass('selected').fadeIn();
			});
			
		});
		return this;
	};
})(jQuery);
</pre>
<p>変更になっている箇所は10行目〜17行目と21行目です。あとは変わっていません。</p>
<p>jQueryでCookieを使うにはjQuery Cookieプラグインを読み込ませ、<code>$.cookie('cookieName', 'value')</code>でCookieをセット、<code>$.cookie('cookieName')</code>でCookieを取得します。<br />
まず21行目でクリックされたタブのindexをCookieの値として保存します。複数のタブで使用されることを考慮してCookieの名前を『タブの名前＋selectedTab』とします。</p>
<pre class="code" lang="js">$.cookie(o.targetID + 'selectedTab', tabIndex);
</pre>
<p>div#tabs1にタブを設定した場合で1番目のタブがクリックされれば#tabs1selectedTabと言う名前に0が入ります。2番目のタブがクリックされれば#tabs1selectedTabに1が入ります。<br />
この値をフックにして最初に表示される状態をif文で振り分けます。</p>
<pre class="code" lang="js">var selectedTab = $.cookie(o.targetID + 'selectedTab');
	if (selectedTab) {
		$(o.boxElement, o.targetID).not(':eq(' +selectedTab+')').hide();
		$(o.tabElement, o.targetID).eq(selectedTab).addClass('selected');				
	} else {
		$(o.boxElement, o.targetID).not(':first').hide();
		$(o.tabElement, o.targetID).eq(0).addClass('selected');
}
</pre>
<p>1行目でCookieの値を取得します。Cookieに値が入っていなければ1番目のタブが選択された状態にし、Cookieに値が入っていればその番号のタブにclass="selected"を付加し、その番号以外のdivを非表示にします。<br />
</p>
<p>以上ですが、注意しなければならないのがjQueryのバージョン。このプラグインを書いている時に使っていたjQueryのバージョンが1.2系でした。その際、eqフィルタにselectedTabの値を渡しても選択したタブ以降の全てのタブにaddClassしてしまうバグに遭遇しました。<br />
1.2系のjQueryを利用する場合は、eqフィルタを使わずにfilterを利用すれば問題ありません。</p>

<pre class="code" lang="js">$(o.tabElement, o.targetID).eq(selectedTab).addClass('selected');
//上記コードを下記コードに書き換える
$(o.tabElement, o.targetID).filter(':eq(' +selectedTab+')').addClass('selected');
</pre>
<p class="viewDemo"><a href="http://www.nk0206.com/demo/jquery/tab03.html"><span>View Demo</span></a></p>]]>
    </content>
</entry>

<entry>
    <title>HTML5のplaceholder的なjQueryプラグイン</title>
    <link rel="alternate" type="text/html" href="http://www.nk0206.com/life/2012/03/placeholder.html" />
    <id>tag:www.nk0206.com,2012:/life//2.1937</id>

    <published>2012-03-17T16:34:37Z</published>
    <updated>2012-03-24T15:03:17Z</updated>

    <summary>HTML5で追加されたplaceholder属性に似たものをIEに適用させるためのjQueryプラグインです。</summary>
    <author>
        <name>poundhound</name>
        
    </author>
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="jquery" label="jQuery" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.nk0206.com/life/">
        <![CDATA[<p>ずいぶんと昔に書いたプラグインですが、今更ながらブログの記事に書いてみます。</p>
<p>HTML5では追加になったplaceholder属性は、フォームに予めテキストを表示させてアクセシビリティを上げてくれる属性です。主要なブラウザは（FF3.6以下は除く）対応していますが、案の定IE6/7/8/9は対応していません。なのでIEにplaceholder的なものを適用させる為にjQueryを用いて再現すると言うものです。</p>
<p class="mb0">仕様</p>
<ul class="basic1 ">
<li>IE6/7/8/9に対応</li>
<li>HTML5のようにinputタグ、textareaタグにはplaceholder属性を用意</li>
</ul>]]>
        <![CDATA[<p class="codeHeadline">jQuery Code</p>
<pre class="code" lang="js">(function($) {
	$.fn.placeholder = function(options) {
		var o = $.extend({
			watermarkSelector: 'form#watermark',
			className: 'focused'
		}, options);
			
		$(o.watermarkSelector).each(function() {
			$(this).find('[placeholder]').each(function() {
				
				$(this).attr('placeholder');
				if($(this).val() == '') {
					$(this).val($(this).attr('placeholder'));
				}
				
				$(this).focus(function() {
					if($(this).val() == $(this).attr('placeholder')) {
						$(this).val('').addClass(o.className);	
					}
				});
					
				$(this).blur(function() {
					if($(this).val() == '') {
						$(this).val($(this).attr('placeholder')).removeClass(o.className);	
					}
				});
			});
		});
		return this;
	}

})(jQuery);
</pre>
<p>それでは順を追ってjQueryコードを書きながら解説して行きます。</p>
<p>3行目〜6行目はオプションです。対象となるセレクタは当然formですが、念のため（特定のIDが付いたformに適用させたいとか...無いか）オプションで変更出来るようにしておきます。<br />
classNameはフォーカスされたinput、textareaタグに付加されるクラス名を指定出来るようにしてあります。</p>
<pre class="code" lang="js">$(this).find('[placeholder]').each(function() {
	$(this).attr('placeholder');
});
</pre>
<p class="mb0">8行目で対象となるセレクタでplaceholder属性が付いている値を絞り込みます。IEはplaceholder属性を認識しないのでattr('placeholder')と書く事によってplaceholder属性を追加してやります。</p>
<pre class="code" lang="js">if($(this).val() == '') {
	$(this).val($(this).attr('placeholder'));
}
</pre>
<p>対象となるセレクタの中に値が入力されていなかったらplaceholder属性に指定した値を入れます。</p>
<pre class="code" lang="js">$(this).focus(function() {
	if($(this).val() == $(this).attr('placeholder')) {
		$(this).val('').addClass(o.className);	
	}
});
</pre>
<p>16行目からはフォーカスされた時のイベントです。input、textarea要素に表示されている値とplaceholder属性の値を比較して内容が同じだったらタグにclassNameをaddClass()を利用して付加し、値を空にします。</p>
<pre class="code" lang="js">$(this).blur(function() {
	if($(this).val() == '') {
		$(this).val($(this).attr('placeholder')).removeClass(o.className);	
	}
});
</pre>
<p>22行目からはフォーカスから外れた時のイベントです。何も入力されなかったら再度placeholder属性の値をセットしてclassNameをremoveClass()を利用して消します。</p>
<p>以上です。呼び出す時にIE6/7/8/9を判別するためにjQuery.supportを利用します。ここらへんに関しては<a href="http://w3g.jp/blog/tools/jquery_browser_sniffing" class="oslink">jQuery.supportでのブラウザ判別</a>に詳しく書かれていますので、是非参考にしてみてください。</p>
<pre class="code" lang="js">(function($) {
	if(!jQuery.support.noCloneEvent) {
		$.fn.placeholder();
	}
})(jQuery);
</pre>
<p>本当のplaceholder属性の挙動と若干違うのはご愛嬌。</p>
<p class="viewDemo"><a href="http://www.nk0206.com/demo/jquery/placeholder01.html"><span>View Demo</span></a></p>
<p class="download"><a href="http://www.nk0206.com/download/jquery.placeholder.zip"><span>Download</span></a></p>

<div class="edit">
<p>追記</p>
<p><a href="http://terkel.jp/archives/2010/07/html5-placeholder-fix-with-jquery/" class="oslink">@terkelのサイト</a>でplaceholder属性を持つブラウザか否かの判定が目からウロコでした。</p>
<blockquote>
<div>
<p>ブラウザが placeholder 属性をサポートしているかどうかを判定している点です。判定には実際にはドキュメントに現れないダミーの input 要素を作り、placeholder プロパティの有無を調べます。その結果、もしブラウザが placeholder をサポートしていればスクリプトは何もしません。以降のスクリプトはサポートしていないブラウザでのみ実行されます。</p>
</div>
</blockquote>
<!-- / .edit --></div>]]>
    </content>
</entry>

<entry>
    <title>jQueryを使ってタブメニュープラグインを作る</title>
    <link rel="alternate" type="text/html" href="http://www.nk0206.com/life/2012/01/jquery-tab02.html" />
    <id>tag:www.nk0206.com,2012:/life//2.1935</id>

    <published>2012-01-09T01:00:00Z</published>
    <updated>2012-01-09T00:38:35Z</updated>

    <summary>jQueryを使ってタブメニューを作る解説の第2回。今回は前回のコードを元にプラグイン化するまでを解説します。</summary>
    <author>
        <name>poundhound</name>
        
    </author>
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="jquery" label="jQuery" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.nk0206.com/life/">
        <![CDATA[<p>前回はjQueryを使ってタブメニューのインターフェイスを作成しましたが、汎用的に利用するにはプラグイン化すると便利です。プラグイン化するとプラグインを呼び出す際のオプションを設定出来るので、liやdivのクラス名を変更した際にも対応出来ます。</p>
<p>今回は前回のコードを参考にプラグイン化して行きます。</p> ]]>
        <![CDATA[<p>前回のjQueryコードは次のようなコードになります。</p>
<p class="codeHeadline">jQuery Code</p>
<pre class="code" lang="js">$(function(){
	var box = $('.tab-box');	   
	var tabList = $('.tab-list').find('li');
	box.not(':first').hide();
	tabList.eq(0).addClass('selected');
	tabList.click(function(){
		var tabIndex = tabList.index(this);
		tabList.removeClass('selected');
		$(this).addClass('selected');
		box.hide().eq(tabIndex).addClass('selected').fadeIn();
	});
});
</pre>
<p>今回のコードの完成形です。</p>
<p class="codeHeadline">jQuery Plugin Code</p>
<pre class="code" lang="js">(function($) {
	$.fn.tabs = function(options) {
		var o = $.extend({
			targetID: '#tab',
			tabElement: '.tab-list li',
			boxElement: '.tab-box'
		}, options);
	
		$(o.tabElement, o.targetID).each(function() {
			$(o.boxElement, o.targetID).not(':first').hide();
			$(o.tabElement, o.targetID).eq(0).addClass('selected');
			
			$(this).click(function() {
				var tabIndex = $(o.tabElement, o.targetID).index(this);
				$(o.tabElement, o.targetID).removeClass('selected');
				$(this).addClass('selected');
				$(o.boxElement, o.targetID).hide().eq(tabIndex).addClass('selected').fadeIn();
			});
		});
		return this;
	};
})(jQuery);
</pre>
<p>それでは解説して行きましょう。プラグイン化するにはjQueryオブジェクトに対して新しいメソッドとして定義する必要があります。メソッドを定義するには<strong>$.fn.メソッド名</strong>と書きます。</p>
<pre class="code" lang="js">(function($) {
	$.fn.tabs = function() {
		});
		return this;
	};
})(jQuery);
</pre>
<p>次にこのプラグインのオプションとする内容を考えます。<br />
今回は1ページで複数のタブを使う事を考慮して特定のIDを付加したdivに包まれたタブを1つのタブグループとして利用出来るようにします。例えば1個目のタブはdiv#tabs1、2個目のタブはdiv#tabs2のような使い方が出来るようにします。また、ulに指定するクラス名、表示・非表示するdivに指定するクラス名も指定出来るようにします。</p>
<p>箇条書きにすると次のようになります。</p>
<ul class="basic1">
<li>1ページ内で複数のタブとして利用出来るようにdiv#ID名をフックにする。</li>
<li>タブのulに付加するクラス名、表示・非表示するdivのクラス名を環境によって変更出来るように。</li>
</ul>
<p>このようなオプションを設定するには引数を設定してメソッド内で利用出来るようにします。</p>
<pre class="code" lang="js">(function($) {
	$.fn.tabs = function(options) {
		var o = $.extend({

		}, options);
	
		});
		return this;
	};
})(jQuery);
</pre>
<p>$.extend({...},options);で作成するメソッドにオプションが設定出来るようになります。オプションの内容は{...}に記述します。$.extendに関しては<a href="http://d.hatena.ne.jp/nitoyon/20110324/jQuery_extend_mania" class="oslink">てっく煮ブログ jQuery.extend マニアックス</a>に詳しい記事として掲載されていますので参考にしてみて下さい。<br />
</p>
<pre class="code" lang="js">(function($) {
	$.fn.tabs = function(options) {
		var o = $.extend({
			targetID: '#tab',
			tabElement: '.tab-list li',
			boxElement: '.tab-box'
		}, options);

		return this;
	};
})(jQuery);
</pre>
<p>設定するオプションはtargetIDでタブのIDを、tabElementでクリックするタブのulに付加するクラス名を、boxElementで表示・非表示するdivに付加するクラス名にします。それぞれに初期値を設定します。</p>
<p>これでこのメソッドを呼び出す時にオプションに設定した値を変更出来ます。呼び出す場合は次のように記述します。</p>
<pre class="code" lang="js">$(function() {
	$.fn.tabs({
		targetID: '#tabs1',
		tabElement: '.tabs li',
		boxelement: '.section'
	});
});
</pre>
<p>次のステップは振る舞いです。設定したtargetID(#tab)のtabElement(.tab-list li)がクリックされた時の振る舞いを記述して行きます。</p>
<pre class="code" lang="js">(function($) {
	$.fn.tabs = function(options) {
		var o = $.extend({
			targetID: '#tab',
			tabElement: '.tab-list li',
			boxElement: '.tab-box'
		}, options);
	
		$(o.tabElement, o.targetID).each(function() {

		});
		return this;
	};
})(jQuery);
</pre>
<p>設定したオプションはo.targetIDの様な形で呼び出す事が出来ます。o.targetIDのo.tabElementに合致した全ての要素に対してメソッドを実効させるには<strong>each()</strong>を使います。<br />
$(o.tabElement, o.targetID)と記述する事により、o.targetIDのコンテキストに含まれるo.tabElement（要は#tab .tab-list liと同様）に対してメソッドが実効されていきます。</p>
<p>each()内でまず最初にやることは前回と同様に画面が表示された時の初期設定を行います。前回のコードの『<span class="code">box.not(':first').hide();
tabList.eq(0).addClass('selected');</span>』の部分です。</p>
<pre class="code" lang="js">(function($) {
	$.fn.tabs = function(options) {
		var o = $.extend({
			targetID: '#tab',
			tabElement: '.tab-list li',
			boxElement: '.tab-box'
		}, options);
	
		$(o.tabElement, o.targetID).each(function() {
			$(o.boxElement, o.targetID).not(':first').hide();
			$(o.tabElement, o.targetID).eq(0).addClass('selected');
		});
		return this;
	};
})(jQuery);
</pre>
<p>boxが$(o.boxElement, o.targetID)、tabListが(o.tabElement, o.targetID)に変わっただけで前回と同じ記述です。<span class="mb0">タブがクリックされた時の挙動に進みま</span>しょう。基本的には前回の記述と変わりませんが、クリックされる要素を指定するには$(this)を使います。</p>
<pre class="code" lang="js">(function($) {
	$.fn.tabs = function(options) {
		var o = $.extend({
			targetID: '#tab',
			tabElement: '.tab-list li',
			boxElement: '.tab-box'
		}, options);
	
		$(o.tabElement, o.targetID).each(function() {
			$(o.boxElement, o.targetID).not(':first').hide();
			$(o.tabElement, o.targetID).eq(0).addClass('selected');
			
			$(this).click(function() {
				var tabIndex = $(o.tabElement, o.targetID).index(this);
				$(o.tabElement, o.targetID).removeClass('selected');
				$(this).addClass('selected');
				$(o.boxElement, o.targetID).hide().eq(tabIndex).addClass('selected').fadeIn();
			});
		});
		return this;
	};
})(jQuery);
</pre>
<p>ここで注意しておくのは$(this).click(function() {});のthisと.index(this)のthisは違うと言う事です。外側のthisはクリックされる前のo.tabElement, o.targetIDであり、内側のthisはクリックされたo.tabElement, o.targetIDです。ややっこしいですが、jQuery内ではthisが何を指すかと言う事がとても大事になります。</p>
<p>これでプラグインの完成です。外部ファイル(例：jquery.tabs.js)にこのコードを書き、HTML側のsrc属性で読み込みます。そして先ほど書いた呼び出すコードでこのメソッドを呼び出せば良いわけです。</p>
<p class="viewDemo"><a href="http://www.nk0206.com/demo/jquery/tab02.html"><span>View Demo</span></a></p>
<p>2回に渡って出来る限りわかりやすくを心がけて記事にしましたが、不十分な点、もっとこう書くべきだと言う事もあるかと思います。その点はご了承下さい。また、この2回のエントリーがきっかけでjQueryを少し勉強してみようと思っていただければ幸いです。</p>]]>
    </content>
</entry>

<entry>
    <title>jQueryを使ってタブメニューを作る</title>
    <link rel="alternate" type="text/html" href="http://www.nk0206.com/life/2012/01/jquery-tab01.html" />
    <id>tag:www.nk0206.com,2012:/life//2.1933</id>

    <published>2012-01-06T00:18:29Z</published>
    <updated>2012-01-08T03:46:57Z</updated>

    <summary>jQueryを使ったタブメニューの作成方法を簡単に解説しました。</summary>
    <author>
        <name>poundhound</name>
        
    </author>
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="jquery" label="jQuery" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.nk0206.com/life/">
        <![CDATA[<p class="photo"><a href="http://www.nk0206.com/life/2012/01/demo_tabs01.jpg"><img alt="demo_tabs01.jpg" src="http://www.nk0206.com/life/assets_c/2012/01/demo_tabs01-thumb-200x120-616.jpg" width="200" height="120" class="mt-image-none" style="" /></a></p>
<p>ウェブサイトで多くの要素を省スペースで表示するのに役立つタブメニューは汎用的に使えて実用的なUIです。このタブメニューのインターフェイスはjQueryを利用すると簡単に実装出来ます。</p>
<p>今回はタブメニューを実装するまでを解説していきます。また、1ページ内で複数のタブを実装するにはプラグインの形式にすると便利ですので、最終的にプラグインの形にするまで2回のエントリーに分けて解説しようと思います。</p>
]]>
        <![CDATA[<p>HTMLはタブをul li、クリックされたタブに対応する内容を表示する要素をdivでマークアップします。HTMLコード、jQueryコードはそれぞれ次のようになります。</p>
<p class="codeHeadline">HTML Code</p>
<pre class="code" lang="html">&lt;div class="tab"&gt;
	&lt;ul class="tab-list pkg"&gt;
		&lt;li&gt;&lt;a href="javascript:;"&gt;tabA&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="javascript:;"&gt;tabB&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="javascript:;"&gt;tabC&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;
	&lt;div class="tab-box"&gt;
		&lt;p&gt;tabA's Text&lt;/p&gt;
	&lt;/div&gt;
	&lt;div class="tab-box"&gt;
		&lt;p&gt;tabB's Text&lt;/p&gt;
	&lt;/div&gt;
	&lt;div class="tab-box"&gt;
		&lt;p&gt;tabC's Text&lt;/p&gt;
	&lt;/div&gt;
&lt;!-- / .tab --&gt;&lt;/div&gt;
</pre>

<p class="codeHeadline">jQuery Code</p>
<pre class="code" lang="js">$(function(){
	var box = $('.tab-box');	   
	var tabList = $('.tab-list').find('li');
	box.not(':first').hide();
	tabList.eq(0).addClass('selected');
	tabList.click(function(){
		var tabIndex = tabList.index(this);
		tabList.removeClass('selected');
		$(this).addClass('selected');
		box.hide().eq(tabIndex).addClass('selected').fadeIn();
	});
});
</pre>
<p>それでは順を追ってjQueryコードを書きながら解説して行きます。まずはjQueryを実効しても問題無い状態（HTMLが読み込まれた段階）になったら実効するようにする命令を書きます。これはjQueryを実効させるのに必ず必要になるので丸暗記で行きましょう。</p>
<pre class="code" lang="js">$(function() {
	Do Something
});
</pre>
<p>別の書き方も出来ます。</p>
<pre class="code" lang="js">$(document).ready(function() {
	Do Something
});
</pre>
<p>こう書くと意味がわかると思います。documentがreadyになったら、要するにドキュメントの準備が出来たら実効すると言う意味です。この(document).readyは省略する事が出来ます。</p>
<p>ではこのfunction(){}内に進みます。まずはページが表示された時の状態を作ります。</p>
<ul class="basic1 ">
<li>最初のタブが選択された状態</li>
<li>そのタブに対応した要素が表示されている</li>
</ul>
<p>この2つがページが表示された時の状態です。最初のタブが選択された状態はliにclass="selected"を付加、そのタブに対応した要素以外のdivを非表示にします。</p>
<pre class="code" lang="js">$(function() {
	var box = $('.tab-box');	   
	var tabList = $('.tab-list').find('li');
	box.not(':first').hide();
	tabList.eq(0).addClass('selected');
});
</pre>
<p>タブのリスト、表示・非表示を切り替えるdivを変数に代入してしまいます。表示・非表示を切り替えるdivを変数boxに、タブのリストを変数tabListにそれぞれ代入します。何度も出てきそうな要素はこのように変数に代入しておけば何度も要素を探す必要がなくなります。</p>
<p>変数名の先頭にvarとありますが、これはvarの次に書く名前は変数ですよと言う宣言です。</p>
<p>ここで$('.tab-list').find('li')とありますが、CSSで言う.tab-list liと同じ事です。jQueryではCSSと同じ書式で書く事が出来るので$('.tab-list li')と書いても良いのですが、この書き方だとjQueryではまずli要素を探し、次に.tab-listが付いた要素を探すと言う順になるようです。<br />
なので最初に.tab-listを探した方が効率よくセレクタを検索する事が出来ます。$('.tab-list').find('li')と記述すれば、まず.tab-listを探し、次にli要素を探すと言う順番になります。</p>
<p>表示・非表示を切り替えるdiv（以下変数名boxとします）は1番最初の要素以外を非表示にする必要があるります。1番最初の要素以外は<strong>.not('除外するセレクタ')</strong>で特定出来ます。<br />
そして非表示にするは<strong>.hide()</strong>と書きます。なので、box.not(':first').hide()と書けば、2番目以降のboxを非表示にしてくれます。</p>
<p>次にタブ内の最初のリストに選択中である事を示す.selectedを付加します。1番最初の要素を特定するには<strong>.eq(インデックス)</strong>で特定出来ます。インデックスとは選択中のセレクタに対して0から連番となる番号です。eq(0)と書けば1番最初、eq(1)と書けば2番目が特定出来ます。<br />
クラスを付加するには<strong>.addClass('クラス名')</strong>と書きます。と言う事はtabList.eq(0).addClass('selected')と書けば、tabListの1番目の要素に対して.selectedを付加すると言う事になります。</p>
<p>ではタブがクリックされた時の挙動に進みます。</p>
<pre class="code" lang="js">$(function(){
	var box = $('.tab-box');	   
	var tabList = $('.tab-list').find('li');
	box.not(':first').hide();
	tabList.eq(0).addClass('selected');
	tabList.click(function(){
		Do Something
	});
});
</pre>
<p>『クリックされたら◯◯をする』はclick(function() {◯◯});と書きます。◯◯の部分にまた命令を書いて行きます。</p>
<pre class="code" lang="js">$(function(){
	var box = $('.tab-box');	   
	var tabList = $('.tab-list').find('li');
	box.not(':first').hide();
	tabList.eq(0).addClass('selected');
	tabList.click(function(){
		var tabIndex = tabList.index(this);
		tabList.removeClass('selected');
		$(this).addClass('selected');
		box.hide().eq(tabIndex).addClass('selected').fadeIn();
	});
});
</pre>
<p>少々複雑なので箇条書きにします。</p>
<ul class="basic1">
<li>クリックされたタブ（li）が何番目なのかを調べる</li>
<li>クリックされたタブ（li）の番号（index）を変数に入れる</li>
<li>タブに付加されているclass='selected'を取り除く</li>
<li>クリックされたタブ（li）のみにclass='selected'を付加する</li>
</ul>
<p>クリックされたliが何番目のliかどうかは<strong>.index(引数)</strong>と書きます。引数にはクリックされた要素を入れます。<br />
ここでthisと言う引数が出てきますが、これはthisとは自分自信を指す言葉です。<br /> 
今tabListの中でクリックされた要素に対して◯◯をすると言う命令を書こうとしています。この場合はtabListの中でクリックされた要素がthisになります。
<br />
var tabIndex = tabList.index(this)と書く事により、tabListの中でクリックされた要素のindexをtabIndexと言う変数の中に入れます。</p>
<p>8行目でタブに付加されている.selectedを一旦削除します。クラスを付加するのは.addClass()ですが、削除は<strong>.removeClass()</strong>と書きます。</p>
<p>9行目でクリックされた要素に対して再度.selectedを付加します。</p>
<p>10行目が肝になります。まずはboxを一旦全て非表示にします。非表示にするには先ほど.hide()と書きました。そして先ほど解説したeq()を利用してクリックされた要素を特定します。eqフィルタに対してクリックされた要素の番号を渡せば、それに対応したboxが特定出来ます。.eq(tabIndex)でクリックされた要素に対するboxが特定出来ます。<br />
そしてそのboxに対して.addClass('selected')で.selectedを付加し、<strong>.fadeIn()</strong>で表示します。.fadeIn()はフェードインのアニメーションをしながら表示にしてくれます。アニメーションが不要でしたら.show()でも構いません。</p>
<p>これでjQueryでタブインターフェイスが実装されます。</p>
<p class="viewDemo"><a href="http://www.nk0206.com/demo/jquery/tab01.html"><span>View Demo</span></a></p>
<p>参考までに変数や.find()を使わず、直接セレクタに対して命令をしていくパターンを書いておきます。</p>
<pre class="code" lang="js">$(function(){
	$('.tab-list li:first-child').addClass('selected');
	$('.tab-box').not(':first').hide();
	$('.tab-list li').click(function() {
		var tabIndex = $('.tab-list li').index(this);
		$('.tab-list li').removeClass('selected');
		$(this).addClass('selected');
		$('.tab-box').hide().eq(tabIndex).addClass('selected').fadeIn();
	});
});
</pre>
<p>次のエントリーでこのタブをプラグインの形にしていこうかと思います。</p>]]>
    </content>
</entry>

<entry>
    <title>正規表現勉強会に参加しました</title>
    <link rel="alternate" type="text/html" href="http://www.nk0206.com/life/2011/12/regexp.html" />
    <id>tag:www.nk0206.com,2011:/life//2.1932</id>

    <published>2011-12-08T14:39:10Z</published>
    <updated>2011-12-08T15:11:40Z</updated>

    <summary>苦手意識があって尻込みしていた正規表現へのとっかかりをつかみたくて、勉強会を開いてもらいました。忘れないようにブログへメモしておきます。</summary>
    <author>
        <name>poundhound</name>
        
    </author>
    
        <category term="Web" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="正規表現" label="正規表現" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.nk0206.com/life/">
        <![CDATA[<p>なんとなく苦手意識があって尻込みしていた正規表現。何とかとっかかりをつかみたくて、以前一緒に働いていたSEの方に勉強会を開いてもらいました。</p>
<p>忘れないようにメモがてら記事にします。</p>
]]>
        <![CDATA[<dl class="basicDef1">
<dt>[...]</dt>
<dd>
<p class="photo"><a href="http://www.nk0206.com/life/images/2011/reg001.png"><img alt="reg001.png" src="http://www.nk0206.com/life/assets_c/2011/12/reg001-thumb-200x160-594.png" width="200" height="160" class="mt-image-none" style="" /></a></p>
<p>[]で囲まれた文字を1文字としてマッチする</p>
<p>ex：[a]でaに全てマッチ</p>
</dd>
<dt class="cl">.（ピリオド）</dt>
<dd>
<p class="photo"><a href="http://www.nk0206.com/life/images/2011/reg002.png"><img alt="reg002.png" src="http://www.nk0206.com/life/assets_c/2011/12/reg002-thumb-200x160-596.png" width="200" height="160" class="mt-image-none" style="" /></a></p>
<p>.（ピリオド）の後ろの任意の1文字にマッチ</p>
<p>ex：ae. の場合、先頭がaeで後ろの1文字が何であろうがマッチする 。</p>
</dd>
<dt class="cl">[...]?</dt>
<dd>
<p class="photo"><a href="http://www.nk0206.com/life/images/2011/reg003.png"><img alt="reg003.png" src="http://www.nk0206.com/life/assets_c/2011/12/reg003-thumb-200x160-598.png" width="200" height="160" class="mt-image-none" style="" /></a></p>
<p>[]で囲まれた1文字があるか無いかで判別する</p>
<p>ex：bon jovi　→　bon[ ]?jovi　※[]の中に半角スペースが1つ<br />
ファーストネームとラストネームの間に半角スペースがあったらマッチ。全角スペースの場合はもちろんマッチしない。</p>
</dd>
<dt class="cl">[...]*</dt>
<dd>
<p class="photo"><a href="http://www.nk0206.com/life/images/2011/reg004.png"><img alt="reg004.png" src="http://www.nk0206.com/life/assets_c/2011/12/reg004-thumb-200x160-600.png" width="200" height="160" class="mt-image-none" style="" /></a></p>
<p>[]で囲まれた中の文字があるか無いかで判別する（[]内の文字数は何文字でもマッチする）</p>
ex；bon&nbsp;&nbsp;jovi　→　bon[ ]*jovi<br />
<p>ファーストネームとラストネームの間が半角スペースならば何文字でもマッチする。全角スペースの場合はもちろんマッチしない。</p>
</dd>
<dt class="cl">[...]+</dt>
<dd>
<p class="photo"><a href="http://www.nk0206.com/life/images/2011/reg005.png"><img alt="reg005.png" src="http://www.nk0206.com/life/assets_c/2011/12/reg005-thumb-200x160-602.png" width="200" height="160" class="mt-image-none" style="" /></a></p>
<p>[]で囲まれた中の文字が1つ以上入っていればマッチ。</p>
<p>ex：bon　jovi　→　bon[ 　]+jovi　※[]の中には半角スペース1つと全角スペースが1つ<br />
ファーストネームとラストネームの間に半角スペース、全角スペースのいずれか1つ以上あればマッチ。</p>
</dd>
<dt class="cl">[ ]{第1引数,第2引数}</dt>
<dd>
<p class="photo"><a href="http://www.nk0206.com/life/images/2011/reg006.png"><img alt="reg006.png" src="http://www.nk0206.com/life/assets_c/2011/12/reg006-thumb-200x160-604.png" width="200" height="160" class="mt-image-none" style="" /></a></p>
<p>[]で囲まれた中の文字が第1引数以上、第2引数までであればマッチ。</p>
<p>ex：bon&nbsp;&nbsp;jovi　→　bon[ ]{2,3}jovi　※[]の中には半角スペース1つ<br />
ファーストネームとラストネームの間の半角スペースが2つ以上で3つまでならばマッチ。4つの場合ははずれる。</p>
</dd>
</dl>
<ul class="annotation">
<li>※-（ハイフン）にマッチさせたい場合は必ず先頭に。先頭以外に記述すると範囲指定になる。</li>
<li>※量指定子は[]の外に記述されたものだけ。[]内に書かれたものは量指定子の意味をなさない。</li>
<li>※量指定子とは?, +, *, {}の事。</li>
<li>※ドットなどの文字にマッチさせるには?でエスケープする。</li>
</ul>

<dl class="basicDef1">
<dt>(...)</dt>
<dd>
<p class="photo"><a href="http://www.nk0206.com/life/images/2011/reg007.png"><img alt="reg007.png" src="http://www.nk0206.com/life/assets_c/2011/12/reg007-thumb-200x160-606.png" width="200" height="160" class="mt-image-none" style="" /></a></p>
<p>グループ化。文字の並びをグループ化する。グループ化されたものは全てキャプチャされ、1つの文字列として再利用可能。<br />
グループ化するとグループ化した文字列の後に指定した文字列を差し込むような事が出来る。</p>
<p>ex：(aero)はaとeとrとoが並んだ文字列を1つとする。</p>
<ul class="photoList mb05 cl">
<li><a href="http://www.nk0206.com/life/images/2011/reg008.png"><img alt="reg008.png" src="http://www.nk0206.com/life/assets_c/2011/12/reg008-thumb-200x131-608.png" width="200" height="131" class="mt-image-none" style="" /></a></li>
<li><a href="http://www.nk0206.com/life/images/2011/reg009.png"><img alt="reg009.png" src="http://www.nk0206.com/life/assets_c/2011/12/reg009-thumb-200x160-610.png" width="200" height="160" class="mt-image-none" style="" /></a></li>
</ul>
<p>グループ化した文字列の後ろに文字を追加した例</p>
</dd>
<dt class="cl">(...|...)</dt>
<dd>
<p class="photo"><a href="http://www.nk0206.com/life/images/2011/reg010.png"><img alt="reg010.png" src="http://www.nk0206.com/life/assets_c/2011/12/reg010-thumb-200x160-612.png" width="200" height="160" class="mt-image-none" style="" /></a>
</p>
<p>パイプラインで区切った文字の何れかにマッチ。</p>
<p>ex：(aer|mith) でaerを1グループ、mithを1グループとしてマッチする。</p>
</dd>
</dl>
<p class="cl">基礎的な所をざっと解説してもらいました。次はもう少し突っ込んだ所を教わろうと思います。</p>]]>
    </content>
</entry>

<entry>
    <title>Mac OSX LionでMacPortsやDBD::MySQLなどをアップデートした際のメモ</title>
    <link rel="alternate" type="text/html" href="http://www.nk0206.com/life/2011/11/mac-osx-lion.html" />
    <id>tag:www.nk0206.com,2011:/life//2.1931</id>

    <published>2011-11-06T15:48:30Z</published>
    <updated>2011-11-06T16:00:40Z</updated>

    <summary>Mac OS X Snow LeopardからLionにアップデートした際にローカル環境を構成しているモジュールをアップデートする際のメモです。</summary>
    <author>
        <name>poundhound</name>
        
    </author>
    
        <category term="Web" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="mac" label="Mac" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="mt" label="MT" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="webサーバー" label="webサーバー" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.nk0206.com/life/">
        <![CDATA[<p class="photo"><a href="http://www.nk0206.com/life/images/2011/lion.jpg"><img alt="lion.jpg" src="http://www.nk0206.com/life/assets_c/2011/11/lion-thumb-200x125-591.jpg" width="200" height="125" class="mt-image-none" /></a></p>
<p>Xcode4が使いたくてSnow LeopardからLionにアップデートしました。</p>
<p>僕はMovableTypeやWordpressなどをテストする環境としてMAMPを利用しています。前回LeopardからSnow Leopardにアップデートした際、これらMAMPを利用したローカル環境が引き継がれなく、苦戦しました。今回も当然のように苦戦したのでメモしておく事にしました。</p>]]>
        <![CDATA[<p>ImageMagickやDBD::MySQLなどのモジュールはMacPortsを入れると楽にインストール出来ます。Lionにアップデートした際に、何が問題になるかを調べてみると、まずはMacPortsをアップデートする事。ターミナルからセルフアップデートのコマンドを入れてもエラーが出ます。MacPortsをアップデートするのにはXcode4へのアップデートが必要との事でした。</p>
<p><a href="http://cross.hvn.to/?p=468" class="oslink">LionアップデートでのmacportsとかXcodeとか</a></p>
<p>まずはターミナルを起動してXcode3をアンインストール<br />
<code>sudo /Developer/Library/uninstall-devtools --mode=all</code></p>
<p>Xcode4をApp Storeからダウンロードし、インストール。この時ダウンロードしただけではインストールされません。LaunchpadをクリックするとXcodeのアイコンがあるのでインストールをします。</p>
<p>Xcode4をインストールしたらMacPortsをアップデートします。<br />
<code>sudo port -d selfupdate<br />
sudo port -v selfupdate<br />
port outdated</code></p>
<p>さてこれからが毎度の事苦戦するモジュール系のインストール。BUNさんのブログ記事、<a href="http://gabs.cc/blog/bun/topic20090608-1456.php" class="oslink">Mac OS Xのローカル環境(MAMP+MacPorts)でMovable Typeを動かしてみよう - 準備編</a>が非常に参考になります。</p>
<p>まずはImageMagicのアップデート。念のため一度アンインストールします。<br />
<code>sudo port uninstall ImageMagick +perl</code></p>
<p>そして再度インストール<br />
<code>sudo port install ImageMagick +perl</code></p>
<p>ここでつまずきました。以下のようなエラーコードがつらつらと<br />
<code>Error: Target org.macports.activate returned: Image error: ...<br />
Please deactivate this port first, or use 'port -f activate ...</code></p>
<p>deactivateとなっているので何かアクティベートしないといけないと判断し、port -f activate の後のファイル名をコピーし、<br />
<code>sudo port -f activate ...</code> ※...に前でコピーしたファイル名をペースト<br />
これで行けました。<br />
<code>sudo port install ImageMagick +perl</code></p>
<p>同様にDBD::MySQLやDBD::SQLなどもアクティベートエラーが出たファイルに対して port -f activate を繰り返したら無事モジュール系のインストールが完了しました。</p>
<dl class="linkage">
<dt>参考サイト</dt>
<dd><a href="http://gabs.cc/blog/bun/topic20090608-1456.php" class="oslink">Mac OS Xのローカル環境(MAMP+MacPorts)でMovable Typeを動かしてみよう - 準備編</a></dd>
<dd><a href="http://cross.hvn.to/?p=468" class="oslink">LionアップデートでのmacportsとかXcodeとか</a></dd>
<dd><a href="http://typex2.wordpress.com/2011/08/29/os-x-lion%E3%81%A7macports%E3%81%AE%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88%E3%81%8C%E5%A4%B1%E6%95%97%E3%81%97%E3%81%A6%E3%81%97%E3%81%BE%E3%81%86%E6%99%82%E3%81%AE%E5%AF%BE%E5%87%A6/" class="oslink">OS X LionでMacPortsのアップデートが失敗してしまう時の対処方法</a></dd>
<dd><a href="http://www.zubapita.jp/2008/05/02/macports%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9/" class="oslink">MacPortsの使い方</a></dd>
<dd><a href="http://blog.cgfm.jp/garyu/archives/1327" class="oslink">ImageMagickのインストールでエラーが出たのでメモ</a></dd>
</dl>]]>
    </content>
</entry>

<entry>
    <title>任意の2つのバナーを表示するjQuery Random Banners</title>
    <link rel="alternate" type="text/html" href="http://www.nk0206.com/life/2011/09/2jquery-random-banners.html" />
    <id>tag:www.nk0206.com,2011:/life//2.1930</id>

    <published>2011-09-23T17:35:28Z</published>
    <updated>2012-01-08T04:46:40Z</updated>

    <summary>n個のバナー画像の中から任意の2個のバナーを表示させるjQueryプラグインです。2つの重複しない乱数の取得方法も解説します。</summary>
    <author>
        <name>poundhound</name>
        
    </author>
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="jquery" label="jQuery" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.nk0206.com/life/">
        <![CDATA[<p class="photo"><a href="http://www.nk0206.com/life/images/2011/rnd_bnr.jpg"><img alt="rnd_bnr.jpg" src="http://www.nk0206.com/life/assets_c/2011/09/rnd_bnr-thumb-200x131-589.jpg" width="200" height="131" class="mt-image-none" style="" /></a></p>
<p>n個のバナー画像の中から任意の2個のバナーを表示させるjQueryプラグインを考えてみました。</p>
<p>仕様としては、HTML上には全てのバナーを非表示で記述し、任意の2個を表示、バナーを追加しても対応出来る（3個でも4個でも10個でも任意の2個のバナーを表示）と言う仕様です。</p>]]>
        <![CDATA[<p class="cl">キーとなるのは２つの重複しない乱数を求める所です。まず最初に考えたのは2つの乱数を発生させ、それらが重複しなくなるまでループする方法です。</p>
<p>まず変数elemにul#rndBnrの子要素であるliの数を代入します。</p>
<pre class="code">var elem = $(this).children().length;
</pre>
<p>次に変数rnd1とrnd2に子要素の数からランダムにそれぞれ1つの数字を取得して代入します。</p>
<pre class="code">var elem = $(this).children().length;
var rnd1 = Math.floor(Math.random() * elem);
var rnd2 = Math.floor(Math.random() * elem);
</pre>

<p>もしrnd1とrnd2が同じだったら再度乱数を発生させ、rnd1とrnd2が重複しなくなるまでループします。</p>
<pre class="code">var elem = $(this).children().length;
var rnd1 = Math.floor(Math.random() * elem);
var rnd2 = Math.floor(Math.random() * elem);
while(rnd1 == rnd2) {
	var rnd2 = Math.floor(Math.random() * elem);
}
</pre>
<p>これでrnd1とrnd2は重複しない2つの乱数になります。</p>
<p class="viewDemo"><a href="http://www.nk0206.com/demo/jquery/rnd_bnr01.html"><span>View Demo</span></a></p>
<p>そしてもう一つはループを使わずに重複しない2つの乱数を取得する方法です。</p>

<p>まず同様に変数elemにul#rndBnrの子要素であるliの数を代入します。</p>
<pre class="code">var elem = $(this).children().length;
</pre>
<p>次に変数rnd1に子要素の数からランダムに1つの数字を取得して代入します。</p>
<pre class="code">var rnd1 = Math.floor(Math.random() * elem);
</pre>
<p>ここからが肝。rnd1に入った数と重複しない乱数の対応は以下の通りになります。</p>
<ul class="basic1">
<li>rnd1=0, rnd2=1 or 2 or 3</li>
<li>rnd1=1, rnd2=0 or 2 or 3</li>
<li>rnd1=2, rnd2=0 or 1 or 3</li>
<li>rnd1=3, rnd2=0 or 1 or 2</li>
</ul>
<p>rnd2はrnd1の数を0を除いた整数かつ子要素数-1で割った余りがrnd1と重複しない数になります。</p>
<p>例えばul#rndBnrの子要素が4つだった場合、(rnd1+子要素のインデックス)/子要素の数の余りは次のようになります。</p>
<ul class="basic1">
<li>rnd1=0の時<br />
0 + 0 = 0 0/4の余り0(×)<br />
0 + 1 = 1 1/4の余り1(○)<br />
0 + 2 = 2 2/4の余り2(○)<br />
0 + 3 = 3 3/4の余り3(○)<br />
0 + 4 = 4 4/4の余り0(×)</li>
<li>rnd1=1の時<br />
1 + 0 = 1 1/4の余り1
(×)<br />
1 + 1 = 2 2/4の余り2(○)<br />
1 + 2 = 3 3/4の余り3(○)<br />
1 + 3 = 4 4/4の余り0(○)<br />
1 + 4 = 5 5/4の余り1(×)</li>
<li>rnd1=2の時<br />
2 + 0 = 2 2/4の余り2(×)<br />
2 + 1 = 3 3/4の余り3(○)<br />
2 + 2 = 4 4/4の余り0(○)<br />
2 + 3 = 5 5/4の余り1(○)<br />
2 + 4 = 6 6/4の余り2(×)</li>
<li>rnd1=3の時<br />
3 + 0 = 3 3/4の余り3(×)
<br />
3 + 1 = 4 4/4の余り0(○)<br />
3 + 2 = 5 5/4の余り1(○)<br />
3 + 3 = 6 6/4の余り2(○)<br />
3 + 4 = 7 7/4の余り3(×)</li>
</ul>
<p>この事から0を除外した整数かつ子要素数-1の余りが重複しない乱数である事が分かります。</p>
<pre class="code">var rnd2=(rnd1 + Math.floor(Math.random() * (elem-1))+1) % elem;
</pre>
<p>これで2つの重複しない乱数が取得できます。よってrnd1番目とrnd2番目の要素のdisplayをblockにすれば良い訳です。</p>
<pre class="code">var rnd1 = Math.floor(Math.random() * elem);
var rnd2=(rnd1 + Math.floor(Math.random() * (elem-1))+1) % elem;		
$(this).children().eq(rnd1).css({'display': 'block'});
$(this).children().eq(rnd2).css({'display': 'block'});
</pre>
<p class="viewDemo"><a href="http://www.nk0206.com/demo/jquery/rnd_bnr02.html"><span>View Demo</span></a></p>
<p>ご利用はご自由にどうぞ</p>
<dl class="basicDef1">
<dt>Version1.0</dt>
<dd><p class="download"><a href="http://www.nk0206.com/demo/jquery/common/js/jquery.random-banners-1.0.js"><span>Download</span></a></p></dd>
<dt>Version1.1</dt>
<dd><p class="download"><a href="http://www.nk0206.com/demo/jquery/common/js/jquery.random-banners-1.1.js"><span>Download</span></a></p></dd>
</dl>]]>
    </content>
</entry>

<entry>
    <title>Dreamweaver テンプレートのスニペット</title>
    <link rel="alternate" type="text/html" href="http://www.nk0206.com/life/2011/03/dreamweaver-template-snippets.html" />
    <id>tag:www.nk0206.com,2011:/life//2.1924</id>

    <published>2011-03-22T14:49:50Z</published>
    <updated>2011-04-03T13:38:52Z</updated>

    <summary>Dreamweaverテンプレートで個人的に良く使うテンプレートコードをスニペットにしてみました。</summary>
    <author>
        <name>poundhound</name>
        
    </author>
    
        <category term="Application" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="dreamweaver" label="Dreamweaver" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.nk0206.com/life/">
        <![CDATA[ <p>Dreamweaverテンプレートで個人的に良く使うテンプレートコードをスニペットにしてみました。</p>
<p>Dreamweaverテンプレートはソースコードがコメントだらけになるので嫌う人が多いかもしれませんが、小規模サイトでCMSを入れるほどでも無いサイトを制作する場合にかなり有効だと思いますので、是非利用してみてください。</p>]]>
        <![CDATA[<h2>編集可能領域</h2>
<p>編集可能領域を追加。[挿入]→[テンプレートオブジェクト]→[編集可能領域]と同じ。</p>
<pre class="code" lang="html">&lt;!-- TemplateBeginEditable name="EditRegion1" --&gt;編集可能領域&lt;!-- TemplateEndEditable --&gt;
</pre>
<h2>bodyのClass名、ID名の入力</h2>
<p>[修正]→[テンプレートプロパティ]からbodyに付加するclassとIDを入力出来るようにする。</p>
<p class="mb0">head内</p>
<pre class="code" lang="html">&lt;!-- TemplateParam name="Class名" type="text" value="two-column" --&gt;
&lt;!-- TemplateParam name="bodyのID名" type="text" value="home" --&gt;
</pre>
<p class="mb0">body内</p>
<pre class="code" lang="html">&lt;body class="@@(_document['Class名'])@@" id="@@(_document['bodyのID名'])@@"&gt;
クラス名をテンプレートプロパティから入力
&lt;/body&gt;
</pre>

<h2>title、h1の入力</h2>
<p>[修正]→[テンプレートプロパティ]からページ名、h1画像のURLを入力出来るようにする。（ページ名とh1画像のaltの値が同じ場合に利用）</p>
<p class="mb0">head内</p>
<pre class="code" lang="html">&lt;title&gt;@@(_document['ページ名'])@@ | サイト名&lt;/title&gt;
&lt;!-- TemplateParam name="h1画像のパス" type="URL" value="/img/hoge.gif" --&gt;
&lt;!-- TemplateParam name="ページ名" type="text" value="page-name" --&gt;
</pre>
<p class="mb0">body内</p>
<pre class="code" lang="html">&lt;h1&gt;&lt;img src="@@(_document['h1画像のパス'])@@" alt="@@(_document['ページ名'])@@" /&gt;&lt;/h1&gt;
</pre>
<p class="annotation">※ head内のtitleタグを囲む<code>&lt;!-- TemplateBeginEditable name="doctitle" --&gt;&lt;!-- TemplateEndEditable --&gt;</code>を削除して利用。</p>

<h2>パンくずリストの切り替え</h2>
<p>[修正]→[テンプレートプロパティ]のパンくずリスト切り替えで0を選ぶとパンくず非表示。1を選ぶと2階層目のパンくずを表示。2を選ぶと3階層目のパンくずが表示されます。</p>

<p class="mb0">head内</p>
<pre class="code" lang="html">&lt;!-- TemplateParam name="パンくずリスト切り替え" type="number" value="0" --&gt;
&lt;!-- TemplateParam name="親ページURL" type="text" value="ページURL" --&gt;
&lt;!-- TemplateParam name="ページ名" type="text" value="page-name" --&gt;
</pre>
<p class="mb0">body内</p>
<pre class="code" lang="html">&lt;!-- TemplateBeginMultipleIf --&gt;
&lt;!-- TemplateBeginIfClause cond="_document['パンくずリスト切り替え'] == 1" --&gt;
&lt;ul id="topic-path"&gt;
&lt;li&gt;&lt;a href="/"&gt;ホーム&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;@@(_document['ページ名'])@@&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- TemplateEndIfClause --&gt;
&lt;!-- TemplateBeginIfClause cond="_document['パンくずリスト切り替え'] == 2" --&gt;
&lt;ul id="topic-path"&gt;
&lt;li&gt;&lt;a href="/"&gt;ホーム&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="@@(_document['親ページURL'])@@"&gt;&lt;!-- TemplateBeginEditable name="親ページ名" --&gt;親ページ名&lt;!-- TemplateEndEditable --&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;@@(_document['ページ名'])@@&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- TemplateEndIfClause --&gt;
&lt;!-- TemplateBeginIfClause cond="_document['パンくずリスト切り替え'] !=2" --&gt;&lt;!-- TemplateEndIfClause --&gt;
&lt;!-- TemplateEndMultipleIf --&gt;
</pre>

<h2>ページトップボタンの表示・非表示</h2>
<p>[修正]→[テンプレートプロパティ]のページトップボタン表示切り替えを"真"にするとページトップに戻るリンクを表示し、"偽"にすると非表示にします。</p>
<p class="mb0">head内</p>
<pre class="code" lang="html">&lt;!-- TemplateParam name="ページトップボタン表示切り替え" type="boolean" value="true" --&gt;
</pre>
<p class="mb0">body内</p>
<pre class="code" lang="html">&lt;!-- TemplateBeginIf cond="_document['ページトップボタン表示切り替え']" --&gt;&lt;p class="return"&gt;&lt;a href="#page-top"&gt;ページトップへ戻る&lt;/a&gt;&lt;/p&gt;&lt;!-- TemplateEndIf --&gt;
</pre>

<h2>バナー画像の表示・非表示</h2>
<p>[修正]→[テンプレートプロパティ]のバナー画像表示切り替えを"真"にするとページトップに戻るリンクを表示し、"偽"にすると非表示にします。</p>
<p class="mb0">head内</p>
<pre class="code" lang="html">&lt;!-- TemplateParam name="バナー画像1表示切り替え" type="boolean" value="true" --&gt;
&lt;!-- TemplateParam name="バナー画像2表示切り替え" type="boolean" value="true" --&gt;
</pre>
<p class="mb0">body内</p>
<pre class="code" lang="html">&lt;div class="banner"&gt;
&lt;ul&gt;
&lt;!-- TemplateBeginIf cond="_document['バナー画像1表示切り替え']" --&gt;&lt;li&gt;&lt;a href="url1.html"&gt;&lt;img src="" alt="" width="" height="" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;!-- TemplateEndIf --&gt;
&lt;!-- TemplateBeginIf cond="_document['バナー画像2表示切り替え']" --&gt;&lt;li&gt;&lt;a href="url2.html"&gt;&lt;img src="" alt="" width="" height="" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;!-- TemplateEndIf --&gt;
&lt;/ul&gt;
&lt;/div&gt;
</pre>

<h2>更新情報</h2>
<p>＋−矢印ボタンで更新情報の追加・削除・並び替えが出来るようになります。</p>
<pre class="code" lang="html">&lt;div class="whats-new"&gt;
&lt;h2&gt;更新情報&lt;/h2&gt;
&lt;dl&gt;
&lt;!-- TemplateBeginRepeat name="更新情報" --&gt;
&lt;dt&gt;&lt;!-- TemplateBeginEditable name="日付" --&gt;日付&lt;!-- TemplateEndEditable --&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;!-- TemplateBeginEditable name="更新内容" --&gt;更新内容&lt;!-- TemplateEndEditable --&gt;&lt;/dd&gt;
&lt;!-- TemplateEndRepeat --&gt;
&lt;/dl&gt;
&lt;/div&gt;
</pre>

<h2>bodyのIDをトリガーにして現在表示しているページの場合にclass="current"を付加する（三項演算子を利用）</h2>
<p>ページの階層をbodyのIDでグループ化している場合、その階層（グループ）を表示している時にナビゲーションリストにclass="current"を付加、または画像の場合_crの接尾辞が入った画像を表示します。</p>
<p class="mb0">body内（class="current")</p>
<pre class="code" lang="html">
&lt;ul class=&quot;nav&quot;&gt;
&lt;li @@((_document['bodyのID名'])=='ID名(例：homeなど)'?'class="current"':'')@@&gt;&lt;a href="/"&gt;Home&lt;/a&gt;&lt;/li&gt;
&lt;li @@((_document['bodyのID名'])=='ID名(例：companyなど)'?'class="current"':'')@@&gt;&lt;a href="/company/"&gt;Company&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</pre>
<p class="mb0">body内（画像の場合、接尾辞_crの画像を表示）</p>
<pre class="code" lang="html">
&lt;ul class=&quot;nav&quot;&gt;
&lt;li&gt;&lt;a href=&quot;/&quot;&gt;&lt;img src=&quot;/url/btn_home@@((_document['bodyのID名'])=='ID名(例：homeなど)'?'_cr':'')@@.gif&quot; alt=&quot;home&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/company/&quot;&gt;&lt;img src=&quot;/url/btn_company@@((_document['bodyのID名'])=='ID名(例：companyなど)'?'_cr':'')@@.gif&quot; alt=&quot;company&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</pre>

<h2>編集可能領域のロック</h2>
<p>ネスト化したテンプレートを作る場合で編集可能領域をロックする時に利用します。</p>
<pre class="code" lang="html">@@("")@@
</pre>]]>
    </content>
</entry>

<entry>
    <title>jQueryを利用したソーシャルサービスボタン生成プラグイン</title>
    <link rel="alternate" type="text/html" href="http://www.nk0206.com/life/2011/02/jquery-share.html" />
    <id>tag:www.nk0206.com,2011:/life//2.1922</id>

    <published>2011-02-12T16:14:24Z</published>
    <updated>2011-06-06T15:26:30Z</updated>

    <summary>Twitter, Facebook, はてなブックマーク, Yahoo!ブックマーク, Googleブックマーク, Livedoorブックマーク, Del.icio.us, Evernoteに対応したシェアボタンを生成するjQueryプラグイン jquery-share-button.jsの記事。</summary>
    <author>
        <name>poundhound</name>
        
    </author>
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="jquery" label="jQuery" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="plugin" label="plugin" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.nk0206.com/life/">
        <![CDATA[ <p>TwitterやFacebookを初めとして各種ソーシャルサービス（SNS）が公式でコンテンツをシェアする手段を公開しています。自分のブログにこれらのシェアボタンを利用している人は多いと思いますが、TwitterやFacebookなどは公式のソースを利用するとボタン画像が公式のものになってしまいます。今回はオリジナルシェアボタン画像を使いたい場合に利用出来るスクリプトをjQueryのプラグインとして用意しました。</p>
<p>対応SNS/SBS：Twitter, Facebook, はてなブックマーク, Yahoo!ブックマーク, Googleブックマーク, Livedoorブックマーク, Del.icio.us, Evernote</p>
<p>また、ブログの場合は大体がURLやtitleはそれぞれテンプレートタグが用意されていると思います。（例：MTならばmt:EntryPermalink / mt:EntryTitle）今回は静的ページでも利用出来るようにJavascriptのdocument.URL、document.titleでURLとtitleを取得しています。</p>

<div class="edit">
<p>追記 2011.06.07</p>
<p>Twitterの試用変更のため以前配布していたものではツイート機能が無効になっていました。修正しましたのでもし利用されている方がいましたら再度ダウンロードしてご利用ください。</p>
<!-- / .edit --></div>]]>
        <![CDATA[<p class="mb0">HTMLはul/liで各SNSのボタン画像をマークアップし、ulに対してidをつけます。不要なボタンは&lt;li&gt;〜&lt;/li&gt;を削除してください。</p>
<pre class="code" lang="html">&lt;ul id="share"&gt;
&lt;li id="twitter"&gt;&lt;img src="common/img/btn_twitter.png" width="25" height="25" alt="Twetter" /&gt;&lt;/li&gt;
&lt;li id="facebook"&gt;&lt;img src="common/img/btn_facebook.png" width="25" height="25" alt="Facebook" /&gt;&lt;/li&gt;
&lt;li id="hatena"&gt;&lt;img src="common/img/btn_hatena.png" width="25" height="25" alt="Hatena" /&gt;&lt;/li&gt;
&lt;li id="yahoo"&gt;&lt;img src="common/img/btn_yahoo.png" width="25" height="25" alt="Yahoo Bookmark" /&gt;&lt;/li&gt;
&lt;li id="google"&gt;&lt;img src="common/img/btn_google.png" width="25" height="25" alt="Google Bookmark" /&gt;&lt;/li&gt;
&lt;li id="livedoor"&gt;&lt;img src="common/img/btn_livedoor.png" width="25" height="25" alt="Livedoor Bookmark" /&gt;&lt;/li&gt;
&lt;li id="delicious"&gt;&lt;img src="common/img/btn_delicious.png" width="25" height="25" alt="delicious" /&gt;&lt;/li&gt;
&lt;li id="evernote"&gt;&lt;img src="common/img/btn_evernote.png" width="25" height="25" alt="Evernote" /&gt;&lt;/li&gt;
&lt;/ul&gt;
</pre>
<p class="mb0">idに対して次のようにプラグインを呼び出します。</p>
<pre class="code" lang="javascript">$(function() {
	$('ul#share').share();
});
</pre>
<p class="mb0">liに対してidが付いていますが、オプションを指定することにより独自のidに変更出来ます。Evernoteはサジェストタグを指定出来るので、カンマ区切りで3つまで指定することが出来ます。</p>
<pre class="code" lang="javascript">$(function() {
	$('ul#share').share({
		twitter: '#twitter',
		facebook: '#facebook',
		hatena: '#hatena',
		hLayout: 'simple',
		yahoo: '#yahoo',
		google: '#google',
		livedoor: '#livedoor',
		charset: 'utf-8',
		delicious: '#delicious',
		evernote: '#evernote',
		clipID: '#screen',
		suggestTags: 'tag1,tag2,tag3'
	});
});
</pre>
<p class="viewDemo"><a href="http://www.nk0206.com/demo/jquery/share.html"><span>View Demo</span></a></p>
<p class="mb0">zipでダウンロード出来るようにしました。利用はご自由にどうぞ。</p>
<p class="download"><a href="http://www.nk0206.com/download/jquery.share-button.zip"><span>Download</span></a></p>]]>
    </content>
</entry>

<entry>
    <title>あけましておめでとうございます</title>
    <link rel="alternate" type="text/html" href="http://www.nk0206.com/life/2011/01/newyear2011.html" />
    <id>tag:www.nk0206.com,2011:/life//2.1921</id>

    <published>2011-01-01T22:08:37Z</published>
    <updated>2011-01-01T22:24:41Z</updated>

    <summary>2011年初のブログ記事。今年も皆様よろしくお願いいたします。</summary>
    <author>
        <name>poundhound</name>
        
    </author>
    
        <category term="Diary" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://www.nk0206.com/life/">
        <![CDATA[<p class="photo"><a href="http://www.nk0206.com/life/images/2011/newyear2011.jpg"><img alt="newyear2011.jpg" src="http://www.nk0206.com/life/assets_c/2011/01/newyear2011-thumb-200x144-565.jpg" class="mt-image-none" style="" width="200" height="144" /></a></p>
<p>みなさま新年あけましておめでとうございます。ブログを始めてから7回目の年越しとなりました。</p>
<p>去年は5年半ほど務めていた会社を退社、WEBデザイナーからWEBディレクターへと職種が変わりました。今年は更にスキルアップに励み、誰からも一緒に仕事をしたいと思われるように頑張って行きたいと思います。</p>
<p>さてさて恒例のおみくじですが、今年は大吉でした。一緒に引いた息子も大吉を見事に引き、なかなか良いスタートを切ることが出来ました。</p>
<p>今年はどんな年になるのか...実りのある良い年にして行きたいですね。皆様今年も何卒よろしくお願いいたします。</p>]]>
        
    </content>
</entry>

<entry>
    <title>Dreamweaverコードヒントでfont-sizeプロパティのパーセント表記を追加する</title>
    <link rel="alternate" type="text/html" href="http://www.nk0206.com/life/2010/12/dreamweaver-codehints.html" />
    <id>tag:www.nk0206.com,2010:/life//2.1920</id>

    <published>2010-12-30T00:47:52Z</published>
    <updated>2010-12-30T01:00:01Z</updated>

    <summary>DreamweaverのCodehints.xmlをカスタマイズしてfont-sizeプロパティの値にパーセント表記を追加する方法を紹介します。</summary>
    <author>
        <name>poundhound</name>
        
    </author>
    
        <category term="Application" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="dreamweaver" label="Dreamweaver" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.nk0206.com/life/">
        <![CDATA[<p class="photo"><a href="http://www.nk0206.com/life/images/2010/dw_codehint.png"><img alt="dw_codehint.png" src="http://www.nk0206.com/life/assets_c/2010/12/dw_codehint-thumb-200x129-563.png" class="mt-image-none" style="" height="129" width="200" /></a></p>
<p>Dreamweaverはコードビューでコードを記述していると、最初の数文字で入力されるプロパティを予測してツールチップに表示してくれる便利な機能があります。</p>
<p>プロパティに対して値を入力する際に、そのプロパティに対して設定出来る値も一覧表示してくれるので、コーディング時にはこの機能は重宝します。</p>
<p class="cb">このコードヒントの機能ですが、configuration/CodeHints/CodeHints.xmlをカスタマイズすることで通常表示されない値を追加することが出来ます。</p>
<p>※カスタマイズは自己責任でお願いします。</p>]]>
        <![CDATA[<p>私の場合、ベースになるfont-sizeを13px相当に設定して13px基準に各フォントサイズをパーセント表記する事が多いので、13pxに対して10~26px相当で表示させる値を追加しています。</p>
<p class="mb0">まずは13px相当に表示させるためにbase.cssのフォントサイズの設定を次のようにします。</p>
<pre class="code" lang="css">body { color: #333; font-size: 100%; }
* html body {
	vertical-align: baseline;
	font-family: Verdana, Arial, "ＭＳ Ｐゴシック", sans-serif;
	font-size: 82%;
	text-align: center;
} /* lte ie6 */

*:first-child+html body {
	font-family: Verdana, Arial, "メイリオ", Meiryo, "ＭＳ Ｐゴシック", sans-serif;
	font-size: 82%;
} /* ie7 */

html&gt;/**/body {
	font-family: Verdana, Arial, "メイリオ", Meiryo, "ＭＳ Ｐゴシック", sans-serif;
	font-size: 82%;
} /* ie8 */

html:not(:target) body {
	font-family: Verdana, Arial, Hiragino Kaku Gothic Pro, "ヒラギノ角ゴ W3", Osaka, "ＭＳ Ｐゴシック", sans-serif;
	font-size: 13px;
} /* modern browser */
</pre>
<p>13pxを基準にした場合、各サイズで表示させるためのパーセントは次のような値になります。</p>
<blockquote cite="http://webtech-walker.com/archive/2008/05/16032443.html">
<div>
<p>10px - 77%<br />
11px - 85%<br />
12px - 93%<br />
13px - 100%<br />
14px - 108%<br />
15px - 116%<br />
16px - 124%<br />
17px - 131%<br />
18px - 139%<br />
19px - 147%<br />
20px - 154%<br />
21px - 162%<br />
22px - 170%<br />
23px - 177%<br />
24px - 185%<br />
25px - 193%<br />
26px - 200%</p>
<cite><a href="http://webtech-walker.com/archive/2008/05/16032443.html">font-sizeのパーセント表記一覧 - Webtech Walkerより</a></cite>
</div>
</blockquote>
<p>Codehint.xmlの<code>&lt;menu pattern="font-size:" additionaldismisschars=";:" allowwhitespaceprefix="true" displayrestriction="css"&gt;</code>の部分を次の値に書き換えます。</p>
<p class="mb0">※この場合は10~26pxのうち、10,11,12,14,16,18,20,22,24,26px相当の値を追加しています。</p>
<pre class="code" lang="html">&lt;menu pattern="font-size:" additionaldismisschars=";:" allowwhitespaceprefix="true" displayrestriction="css"&gt;
    &lt;menuitem label="13-10" value="77%" icon="shared/mm/images/hintMisc.gif" /&gt;
    &lt;menuitem label="13-11" value="85%" icon="shared/mm/images/hintMisc.gif" /&gt;
    &lt;menuitem label="13-12" value="93%" icon="shared/mm/images/hintMisc.gif" /&gt;
    &lt;menuitem label="13-14" value="108%" icon="shared/mm/images/hintMisc.gif" /&gt;
    &lt;menuitem label="13-16" value="124%" icon="shared/mm/images/hintMisc.gif" /&gt;
    &lt;menuitem label="13-18" value="139%" icon="shared/mm/images/hintMisc.gif" /&gt;
    &lt;menuitem label="13-20" value="154%" icon="shared/mm/images/hintMisc.gif" /&gt;
    &lt;menuitem label="13-22" value="170%" icon="shared/mm/images/hintMisc.gif" /&gt;
    &lt;menuitem label="13-24" value="185%" icon="shared/mm/images/hintMisc.gif" /&gt;
    &lt;menuitem label="13-26" value="200%" icon="shared/mm/images/hintMisc.gif" /&gt;
    &lt;menuitem label="10px" value="10px" icon="shared/mm/images/hintMisc.gif" /&gt;
    &lt;menuitem label="12px" value="12px" icon="shared/mm/images/hintMisc.gif" /&gt;
    &lt;menuitem label="14px" value="14px" icon="shared/mm/images/hintMisc.gif" /&gt;
    &lt;menuitem label="16px" value="16px" icon="shared/mm/images/hintMisc.gif" /&gt;
    &lt;menuitem label="18px" value="18px" icon="shared/mm/images/hintMisc.gif" /&gt;
    &lt;menuitem label="24px" value="24px" icon="shared/mm/images/hintMisc.gif" /&gt;
    &lt;menuitem label="36px" value="36px" icon="shared/mm/images/hintMisc.gif" /&gt;
&lt;/menu&gt;
</pre>
<p>これで<code>font-size:</code>と入力すると13-10のようなコードヒントが表示され13-10でreturnキーを押すと<code>font-size: 77%;</code>と入力されるようになります。</p>
<p>参考用に私のCodehints.xmlをダウンロード出来るようにしておきます。(Dreamweaver CS4用)<br />
上書きする場合やカスタマイズする際は必ずバックアップを取り、自己責任で行ってください。</p>
<p class="download"><a href="http://www.nk0206.com/download/codehints.zip"><span>Download</span></a></p>]]>
    </content>
</entry>

<entry>
    <title>CSS3/jQueryのnth-child()を利用したカラムレイアウト</title>
    <link rel="alternate" type="text/html" href="http://www.nk0206.com/life/2010/12/nth-child.html" />
    <id>tag:www.nk0206.com,2010:/life//2.1919</id>

    <published>2010-12-14T15:54:13Z</published>
    <updated>2010-12-14T16:06:46Z</updated>

    <summary>商品画像などのボックスを並べるレイアウトでCSS3のnth-child()を利用する方法を紹介します。IE6/7/8, FF2/3にはjQueryを利用して対応します。</summary>
    <author>
        <name>poundhound</name>
        
    </author>
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://www.nk0206.com/life/">
        <![CDATA[<p class="photo"><a href="http://www.nk0206.com/life/images/2010/img_nth_demo01.jpg"><img alt="img_nth_demo01.jpg" src="http://www.nk0206.com/life/assets_c/2010/12/img_nth_demo01-thumb-200x134-559.jpg" class="mt-image-none" style="" height="134" width="200" /></a></p>
<p>商品リストなんかを掲載する場合、ボックスを3カラム/4カラムにレイアウトするケースが多々あると思います。今は3商品しか掲載しないけれど、そのうち4、5、6...と増えていってもレイアウトを維持するためには少々工夫する必要があると思います。</p>
<br class="cb" />
<p class="photo"><a href="http://www.nk0206.com/life/images/2010/img_nth_demo02.jpg"><img alt="img_nth_demo02.jpg" src="http://www.nk0206.com/life/assets_c/2010/12/img_nth_demo02-thumb-200x156-561.jpg" class="mt-image-none" style="" height="156" width="200" /></a></p>
<p>当然のごとくボックス間にはマージンが存在していて、カラムの最後のボックスのマージンが邪魔...とは言えマージンを0にしたクラスを付加するのもメンテナンス性が落ちるため出来れば避けたい。</p>
<p>ul/li要素でマークアップしてpositionを利用する方法やネガティブマージンを利用する方法があると思います。今回はul/li要素を利用せずにシンプルにdivのみを利用した方法を紹介します。マークアップは次の通り。</p>]]>
        <![CDATA[<br class="cb" />
<pre class="code" lang="html">&lt;div class="item-box pkg"&gt;
&lt;h2&gt;Items Box&lt;/h2&gt;
&lt;div&gt;
&lt;div class="item"&gt;
&lt;h3&gt;Item1&lt;/h3&gt;
&lt;p&gt;&lt;img src="common/img/img_nth_001.jpg" width="200" height="150" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;ここには商品の説明が入ります。&lt;/p&gt;
&lt;p&gt;ここには商品の説明が入ります。&lt;/p&gt;
&lt;!-- / .item --&gt;&lt;/div&gt;

&lt;div class="item"&gt;
&lt;h3&gt;Item2&lt;/h3&gt;
&lt;p&gt;&lt;img src="common/img/img_nth_002.jpg" width="200" height="150" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;ここには商品の説明が入ります。&lt;/p&gt;
&lt;p&gt;ここには商品の説明が入ります。&lt;/p&gt;
&lt;!-- / .item --&gt;&lt;/div&gt;

&lt;div class="item"&gt;
&lt;h3&gt;Item3&lt;/h3&gt;
&lt;p&gt;&lt;img src="common/img/img_nth_003.jpg" width="200" height="150" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;ここには商品の説明が入ります。&lt;br /&gt;
ここには商品の説明が入ります。&lt;br /&gt;
ここには商品の説明が入ります。&lt;/p&gt;
&lt;!-- / .item --&gt;&lt;/div&gt;

&lt;!-- / .item-box --&gt;&lt;/div&gt;

</pre>
<p class="mb0">CSSは次のようになります</p>
<pre class="code" lang="css">div.item-box { margin: 0 20px 1em; }
div.item-box h2 {
	border-left: 5px solid #ccc;
	margin-bottom: 1em;
	padding-left: 5px;
}
div.item {
	float: left;
	width: 220px;
	margin-right: 20px;
	margin-bottom: 1em;
	background-color: #eee;
}
div.item h3 { margin: .5em 10px; }
div.item p {
	line-height: 1.5;
	margin: .5em 10px;
	text-align: justify;
	text-justify: inter-ideograph;
}
div.item:nth-child(3n+3){ margin-right: 0; }
div.item-last { margin-right: 0; }
</pre>
<p>CSS3のnth-child()擬似要素を利用して3つめのdivの右マージンを無効にするスタイルを記述しています。</p>
<p>nth-child()擬似要素は()内に数を記述すれば記述した場所にスタイルが有効になり、odd(奇数), even(偶数)などのキーワードも利用出来ます。また、3n+1のように『3つを1つのグループとして、そのグループの1番目にスタイルを有効にする』などと言った使い方が出来る便利な擬似要素です。(今回は3n+3で3カラムの1番最後の要素にスタイルを有効にしています。)</p>
<p>さて、この便利なnth-child()ですが、残念（当然）なことにIE6/7/8で利用出来ません。Firefoxも3.5からサポートしていますが、Firefox2/3では利用出来ません。そこでIE6/7/8, FF2/3にのみjQueryを利用して3カラムの最後の要素に.last-childを付加して対処します。</p>
<p>IE6/7/8はjQuery.supportを利用してブラウザを特定します。Firefox2/3は<a href="http://coliss.com/articles/build-websites/operation/javascript/js-detecting-firefox-and-safari-in-a-line.html" class="oslink">Firefox 2/3, Safariも判別する1行のスクリプト</a>を利用します。</p>
<p>JavaScriptのコードは次のようになります。</p>
<pre class="code" lang="javascript">&lt;script src="http://www.google.com/jsapi"&gt;&lt;/script&gt;
&lt;script&gt;google.load("jquery", "1.4");&lt;/script&gt;
&lt;script type="text/javascript" src="common/js/jqueryAutoHeight.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
(function($) {
	FF=/a/[-1]=='a' //FF2,3
	// only ie6,7,8 FF2,3
	if((!jQuery.support.opacity)||(FF)){
		$('div.item:nth-child(3n+3)').addClass('item-last');
	}
	$('div.item').autoHeight({column:3,clear:1});
})(jQuery);
&lt;/script&gt;
</pre>
<p>今回はかたつむりくんのWWWで配布されている<a href="http://www.tinybeans.net/blog/download/jquery-plugin/jquery-auto-height.html" class="oslink">jQuery Auto Height - 複数のカラムの高さを最大値にそろえるjQueryプラグイン</a>も利用して高さをそろえています。</p>
<p class="viewDemo"><a href="http://www.nk0206.com/demo/jquery/nth-child.html"><span>View Demo</span></a></p>]]>
    </content>
</entry>

</feed>

