<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>w3g.jp RSS update information</title>
<id>http://w3g.jp/</id>
<link rel="alternate" type="text/html" href="http://w3g.jp/" />
<updated>2012-05-07T11:07:39+09:00</updated>
<subtitle>HTML5, CSS3, JavaScript, サーバ構築などについて、初学者向けのウェブサイト作成情報。</subtitle>
<author>
<name>World Wide Web Guide</name>
<uri>http://w3g.jp/</uri>
</author>
<icon>http://w3g.jp/favicon.png</icon>
<entry>
<title>JavaScriptでのユーザエージェント条件分岐便利スニペット</title>
<id>http://w3g.jp/blog/tools/js_browser_sniffing</id>
<link rel="alternate" type="text/html" href="http://w3g.jp/blog/tools/js_browser_sniffing" />
<published>2011-09-30T01:14:35+09:00</published>
<updated>2011-09-30T01:14:35+09:00</updated>
<summary>jQuery.supportだけで代表的なブラウザの判別を行うことができなくなってしまったので、UA情報には依存しないブラウザがサポートしている機能だけでブラウザ判別を行う試みです。</summary>
<author>
<name>World Wide Web Guide</name>
</author>
<content type="html" xml:lang="ja" xml:base="http://w3g.jp/blog/">
<![CDATA[<header>
<h2><abbr title="JavaScript">JS</abbr>での<abbr title="User Agent">UA</abbr>条件分岐便利スニペット</h2>
<p><a href="/blog/tools/jquery_browser_sniffing">jQuery.support</a>だけで代表的なブラウザの判別を行うことができなくなってしまったので、UA情報には依存しないブラウザがサポートしている機能だけでブラウザ判別を行う試みです。</p>
</header>
<section>
<h3>実験！あなたのブラウザを判別</h3>
<p>正解していますか？出力結果→「<strong><samp><script type="text/javascript">
var _ua = (function(){
return {
ltIE6:typeof window.addEventListener == "undefined" && typeof document.documentElement.style.maxHeight == "undefined",
ltIE7:typeof window.addEventListener == "undefined" && typeof document.querySelectorAll == "undefined",
ltIE8:typeof window.addEventListener == "undefined" && typeof document.getElementsByClassName == "undefined",
IE:document.uniqueID,
Firefox:window.sidebar,
Opera:window.opera,
Webkit:!document.uniqueID && !window.opera && !window.sidebar && window.localStorage && typeof window.orientation == "undefined",
Mobile:typeof window.orientation != "undefined"
}
})();
if(_ua.ltIE6){
document.write('あなたがお使いのブラウザはIE6以下っぽいです');
}else if(_ua.ltIE7){
document.write('あなたがお使いのブラウザはIE7以下っぽいです');
}else if(_ua.ltIE8){
document.write('あなたがお使いのブラウザはIE8以下っぽいです');
}else if(_ua.Webkit){
document.write('あなたがお使いのブラウザはchromeもしくはsafariっぽいです');
}else if(_ua.Firefox){
document.write('あなたがお使いのブラウザはFirefoxっぽいです');
}else if(_ua.Opera){
document.write('あなたがお使いのブラウザはOperaっぽいです');
}else if(_ua.IE && !_ua.ltIE8){
document.write('あなたがお使いのブラウザはIE9以上っぽいです');
}else if(_ua.Mobile){
document.write('あなたはスマートフォンとかタブレット端末っぽいです');
}
</script></samp></strong>」</p>
<pre><code>var _ua = (function(){
return {
ltIE6:typeof window.addEventListener == "undefined" &amp;&amp; typeof document.documentElement.style.maxHeight == "undefined",
ltIE7:typeof window.addEventListener == "undefined" &amp;&amp; typeof document.querySelectorAll == "undefined",
ltIE8:typeof window.addEventListener == "undefined" &amp;&amp; typeof document.getElementsByClassName == "undefined",
IE:document.uniqueID,
Firefox:window.sidebar,
Opera:window.opera,
Webkit:!document.uniqueID &amp;&amp; !window.opera &amp;&amp; !window.sidebar &amp;&amp; window.localStorage &amp;&amp; typeof window.orientation == "undefined",
Mobile:typeof window.orientation != "undefined"
}
})();
if(_ua.ltIE6){
document.write('あなたがお使いのブラウザはIE6以下っぽいです');
}else if(_ua.ltIE7){
document.write('あなたがお使いのブラウザはIE7以下っぽいです');
}else if(_ua.ltIE8){
document.write('あなたがお使いのブラウザはIE8以下っぽいです');
}else if(_ua.webkit){
document.write('あなたがお使いのブラウザはchromeもしくはsafariっぽいです');
}else if(_ua.Firefox){
document.write('あなたがお使いのブラウザはFirefoxっぽいです');
}else if(_ua.Opera){
document.write('あなたがお使いのブラウザはOperaっぽいです');
}else if(_ua.IE && !_ua.ltIE8){
document.write('あなたがお使いのブラウザはIE9以上っぽいです');
}else if(_ua.Mobile){
document.write('あなたはスマートフォンとかタブレット端末っぽいです');
}</code></pre>
<p><code>jQuery.support</code>同様、機能をサポートしているかどうかの条件文にのみこだわったブラウザの判別です。IEの判別は実用的にしておきました（<a href="http://twihelp.me/qRdUu" target="_blank">詳しい解説はこちらで説明しているので参照してください</a>）。</p>
<p>なお、IE10からは、<code>window.attachEvent</code>が消えるという噂もあるのであえて使わないようにしています。それと、safariが、<code>window.webkitNotifications</code>に対応していれば、Webkitの部分はもっと単純な条件で書けるはずなのですが。。。</p>
</section>]]>
</content>
</entry>
<entry>
<title>CSSハックもIEの独自拡張条件式も使わないIE(6/7/8)のCSS上書きテクニック</title>
<id>http://w3g.jp/blog/studies/iecss</id>
<link rel="alternate" type="text/html" href="http://w3g.jp/blog/studies/iecss" />
<published>2011-06-02T12:02:02+09:00</published>
<updated>2011-06-02T12:02:02+09:00</updated>
<summary>CSSハックもIEの独自拡張条件式も使わないセレクタを活用したIE(6/7/8)のCSS上書きテクニック。</summary>
<author>
<name>World Wide Web Guide</name>
</author>
<content type="html" xml:lang="ja" xml:base="http://w3g.jp/blog/">
<![CDATA[<?php
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://twihelp.me/7WGFF");
exit();
?>]]>
</content>
</entry>
<entry>
<title><![CDATA[URLのリンク置換&amp;自サイトと他サイトでの処理を分岐した正規表現]]></title>
<id>http://w3g.jp/blog/tools/url_regex</id>
<link rel="alternate" type="text/html" href="http://w3g.jp/blog/tools/url_regex" />
<published>2011-05-13T11:36:36+09:00</published>
<updated>2011-05-13T11:36:36+09:00</updated>
<summary>http://〜 の一連のURLを構成する文字列をリンクに置き換える場合の正規表現について紹介します。言明のサブパターンを使って、自サイトと他サイトとの処理を簡単に分岐させます。</summary>
<author>
<name>World Wide Web Guide</name>
</author>
<content type="html" xml:lang="ja" xml:base="http://w3g.jp/blog/">
<![CDATA[<?php
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://twihelp.me/Nbvhr");
exit();
?>]]>
</content>
</entry>
<entry>
<title>Twitterのハッシュタグ・スクリーンネームをリンク置換する正規表現</title>
<id>http://w3g.jp/blog/tools/twitter_regex</id>
<link rel="alternate" type="text/html" href="http://w3g.jp/blog/tools/twitter_regex" />
<published>2011-05-13T11:31:13+09:00</published>
<updated>2011-05-13T11:31:13+09:00</updated>
<summary>文中に存在するTwitterのハッシュタグやアカウント名(スクリーンネーム)を抽出してはリンクに置き換えるPHPでの正規表現のサンプルです。条件によっては置き換わって欲しくないケースもあるので、戻り読み言明の否定形を活用しています。</summary>
<author>
<name>World Wide Web Guide</name>
</author>
<content type="html" xml:lang="ja" xml:base="http://w3g.jp/blog/">
<![CDATA[<?php
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://twihelp.me/hyu35");
exit();
?>]]>
</content>
</entry>
<entry>
<title>JavaScriptのユーザエージェント条件分岐便利スニペット</title>
<id>http://w3g.jp/blog/tools/js_ua_switcher</id>
<link rel="alternate" type="text/html" href="http://w3g.jp/blog/tools/js_ua_switcher" />
<published>2011-05-13T11:20:29+09:00</published>
<updated>2011-05-13T11:20:29+09:00</updated>
<summary>JavaScriptでユーザエージェントを条件分岐する便利スニペット。頻度が多いIEとかスマートフォン対応用。</summary>
<author>
<name>World Wide Web Guide</name>
</author>
<content type="html" xml:lang="ja" xml:base="http://w3g.jp/blog/">
<![CDATA[<?php
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://twihelp.me/qRdUu");
exit();
?>]]>
</content>
</entry>
<entry>
<title>フロントエンドの高速化アプローチまとめ</title>
<id>http://w3g.jp/blog/studies/frontend_approach</id>
<link rel="alternate" type="text/html" href="http://w3g.jp/blog/studies/frontend_approach" />
<published>2011-05-05T20:44:15+09:00</published>
<updated>2011-05-05T20:44:15+09:00</updated>
<summary>フロントエンドの視点からウェブサイトを高速化するためのCSSの高速化・JavaScriptの高速化・転送量削減による高速化の三部構成です。</summary>
<author>
<name>World Wide Web Guide</name>
</author>
<content type="html" xml:lang="ja" xml:base="http://w3g.jp/blog/">
<![CDATA[<?php
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://twihelp.me/83rLv");
exit();
?>]]>
</content>
</entry>
<entry>
<title>TwihelpmeというWebサービスをオープンしました</title>
<id>http://w3g.jp/blog/topics/twihelpme</id>
<link rel="alternate" type="text/html" href="http://w3g.jp/blog/topics/twihelpme" />
<published>2011-04-21T10:30:00+09:00</published>
<updated>2011-04-21T10:30:00+09:00</updated>
<summary><![CDATA[エンジニア、プログラマー、デザイナー、クリエイターなどのコンピュータに携わる多くの分野の人たちがつながり・助け合えるTwitterと連動したソーシャル型のリアルタイムQ&amp;Aサイトをテーマにした「Twihelpme(ツイヘルプミー)」というWebサービスオープンしました。]]></summary>
<author>
<name>World Wide Web Guide</name>
</author>
<content type="html" xml:lang="ja" xml:base="http://w3g.jp/blog/">
<![CDATA[<header>
<h2>TwihelpmeというWebサービスをオープンしました</h2>
<p>半年以上空いての更新となってしまいましたが、その間、ひとつのWebサービスを作っていました。どんなWebサービスかといいますと、Twitter周りのAPIを使ったQ&amp;Aサイトで、Q&amp;A用途に限らず、多くの人とノウハウを共有したり・意見収集等にも利用できるものです。</p>
</header>
<section>
<h3>テストオープン期間を設けています</h3>
<p>実際、どんなサイトなのかは「来て・見て・触って」いただくのが一番良いかと思いますので、4月末(4月30日)までをテストオープンとして、投稿(スレッドの作成)や返信投稿を自由に試していただける期間を設けています。</p>
<p>とくに質問や相談したいことに関係なく、テストオープン期間は自由に投稿(スレッドの作成)や返信投稿を試してみて、もし利用されている最中に不具合や障害、表示が崩れているところ等を見つけられたら、こっそりと教えていただけると嬉しいです。また、いろいろな意見や感想、要望もお寄せ頂けると幸いです。</p>
<dl>
<dt><a href="http://twihelp.me/">Twihelpme</a></dt><dd>Twihelpme(ツイヘルプミー)は、エンジニア、プログラマー、デザイナー、クリエイターなどのコンピュータに携わる多くの分野の人たちがつながり・助け合えるTwitterと連動したソーシャル型のリアルタイムQ&Aサイトです。Q&A用途に限らず、多くの人とノウハウを共有したり・意見収集等にも利用できます。</dd>
</dl>
<p>オープン告知用のキャンペーンなんかもちゃっかりやっているので、よろしければ是非そちらもどうぞ<br>
<a href="http://twihelp.me/campaign">Twihelpme(ツイヘルプミー)オープン記念キャンペーン</a></p>
</section>]]>
</content>
</entry>
<entry>
<title>blockquote要素単体から引用元を視覚化する</title>
<id>http://w3g.jp/blog/tools/blockquote_linker</id>
<link rel="alternate" type="text/html" href="http://w3g.jp/blog/tools/blockquote_linker" />
<published>2010-08-22T14:00:00+09:00</published>
<updated>2010-08-22T14:00:00+09:00</updated>
<summary>blockquote要素単体から引用元を視覚化できるように、引用元へのリンク、及び引用元を示すテキストを生成するためのスクリプトです（jQuery使用）。引用元が書籍でISBNコードが示されている場合は、Amazonのリンク（アソシエイトID付き）へと変換します。</summary>
<author>
<name>World Wide Web Guide</name>
</author>
<content type="html" xml:lang="ja" xml:base="http://w3g.jp/blog/">
<![CDATA[<header>
<h2>blockquote要素単体から引用元を視覚化する</h2>
<p><code>blockquote</code>要素単体から引用元を視覚化できるように、引用元へのリンク、及び引用元を示すテキストを生成するためのスクリプトです（jQuery使用）。引用元が書籍で<abbr title="International Standard Book Number">ISBN</abbr>コードが示されている場合は、Amazonのリンク（アソシエイトID付き）へと変換します。</p>
<ins><p><a href="http://twitter.com/ub_pnr">@ub_pnr</a>さんがjQueryプラグイン版を公開されました。「<a href="http://unformedbuilding.com/articles/jquery-prettyquote-js/">jQuery.prettyQuote.js</a>」おすすめです！</p></ins>
</header>
<section>
<h3>諸背景と実現したいこと</h3>
<p><abbr title="User Agent">UA</abbr>が処理するにあたっては、<code>blockquote</code>や<code>q</code>要素の<code>cite</code>属性に引用元の<abbr title="Uniform Resource Identifier">URI</abbr>（リソースの所在や名前）と、<code>title</code>属性に引用元の説明情報があれば、適切に解釈されることになっていようとは思うのですが、残念ながら主要な視覚環境のUAにおいて<code>cite</code>属性、<code>title</code>属性で示された情報が視覚的に表され、それをハイパーリンク等で利用できるようにはなっていません。</p>
<p>そこで、利用者にとっても<code>blockquote</code>, <code>q</code>要素で示されている引用元の情報が視覚化され、ハイパーリンクで利用できるようになっている方が便利なはずであろうということで、スクリプトを利用して、今回は利用頻度が多いであろう<code>blockquote</code>要素のみに対象を絞り、引用元へのリンク、及び引用元を示すテキストを生成するためのスクリプトを考えてみたいと思います。</p>
<p>今回実現したいことは次のようなスクリプトです。</p>
<ul>
<li><code>blockquote</code>要素の<code>cite</code>属性に指定された引用元のリソースの所在(<abbr title="Uniform Resource Locator">URL</abbr>)、<code>title</code>属性に指定された引用元の説明情報をそれぞれリンク先とリンクタイトルに置き換わるようにする。</li>
<li>もし、引用元のリソースの所在が書籍のためにURLでない場合は、<abbr title="Uniform Resource Name">URN</abbr>として<abbr title="International Standard Book Number">ISBN</abbr>が与えられていれば、オンラインショッピングサイトのamazon.co.jpへのリンクへ変換するなど、できるだけハイパーリンクを通して情報を得られる機会を工夫する。</li>
</ul>
</section>
<section>
<h3>サンプルコード</h3>
<p>スクリプトを自分で書こうと思ったのですが、他にも似たようなスクリプトがないか探してみたところ、<a href="http://unformedbuilding.com/">Unformed Building</a>さんにて、今回実現したいことのほとんど完成形がすでにあったので、基本となるスクリプトには<a href="http://unformedbuilding.com/articles/blockquote-and-jquery/">公開されていたもの</a>を利用させて頂きました(<a href="http://twitter.com/ub_pnr">@ub_pnr</a>さんにお礼申し上げます)。jQueryのライブラリを利用しています。</p>
<pre><code>jQuery(function ($) {
$('blockquote').each(function(){
var trakingID = 'w3g-22';
var title = $(this).attr('title');
var cite = $(this).attr('cite');
var url = $(this).filter('[cite^=http]').attr('cite');
var isbn = $(this).filter('[cite^=urn:isbn]').attr('cite');
$(this).wrap('&lt;dl class=&quot;quote&quot;&gt;&lt;dd&gt;&lt;/dd&gt;&lt;/dl&gt;');
if (cite === url) {
if (title != '') {
$(this).parent('dd').before('&lt;dt&gt;&lt;cite&gt;&lt;a href=&quot;' + cite + '&quot;&gt;' + title + '&lt;/a&gt;&lt;/cite&gt;より&lt;/dt&gt;');
} else {
$(this).parent('dd').before('&lt;dt&gt;&lt;cite&gt;&lt;a href=&quot;' + cite + '&quot;&gt;' + cite + '&lt;/a&gt;&lt;/cite&gt;より&lt;/dt&gt;');
}
} else if (cite === isbn) {
isbn = isbn.replace(/^urn:isbn:/i,'').replace(/-/g,'');
if(trakingID != ''){
isbn = 'http://www.amazon.co.jp/o/ASIN/' + isbn + '/' + trakingID + '/rel=nofollow';
}else{
isbn = 'http://www.amazon.co.jp/o/ASIN/' + isbn;
}
if (title != '') {
$(this).parent('dd').before('&lt;dt&gt;&lt;cite&gt;&lt;a href=&quot;' + isbn + '&quot;&gt;' + title + '&lt;/a&gt;&lt;/cite&gt;より&lt;/dt&gt;');
} else {
$(this).parent('dd').before('&lt;dt&gt;&lt;cite&gt;&lt;a href=&quot;' + isbn + '&quot;&gt;' + cite + '&lt;/a&gt;&lt;/cite&gt;より&lt;/dt&gt;');
}
} else if ((cite === '') &amp;&amp; (title != '')) {
$(this).parent('dd').before('&lt;dt&gt;&lt;cite&gt;' + title + '&lt;/cite&gt;より&lt;/dt&gt;');
}
});
});</code></pre>
<p>変数<code>trakingID</code>の値に入っている<code><var>w3g-22</var></code>の部分は適宜、自分のAmazonアソシエイトIDに変更してください。もし、AmazonアソシエイトIDをお持ちでない場合は、<code>var trakingID = '';</code>と、値を空(<code>undefined</code>)で利用してください。後ほど、AmazonアソシエイトIDを取得されることがあったら、後日埋められると良いかと思います。</p>
<p>たとえば、次のような<code>blockquote</code>要素でマークアップしたものがあったとします。</p>
<pre><code>&lt;blockquote cite=&quot;urn:isbn:4873114683&quot; title=&quot;jQueryクックブック&quot;&gt;
&lt;h1&gt;1章　jQueryの基礎&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;レシピ1.1   HTMLページでjQueryライブラリコードをインクルードする&lt;/li&gt;
&lt;li&gt;レシピ1.2   ページの読み込みが完了する前にjQuery/JavaScriptコードを実行する&lt;/li&gt;
&lt;li&gt;レシピ1.3   セレクタとjQuery関数を使ってDOM要素を選択する&lt;/li&gt;
&lt;li&gt;レシピ1.4   指定されたコンテキストでDOM要素を選択する&lt;/li&gt;
&lt;li&gt;レシピ1.5   DOM要素のラッパーセットのフィルタリング&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;</code></pre>
<p>上記のソースコードがスクリプトを通すことで、引用元を視覚化できるようにHTMLを追加生成します。ここでは、引用元を示す<code>cite</code>要素と組み合わせて、できるだけ引用元のブロックとの対応が関連づけられるようなマークアップを出力するようにしています。</p>
<pre><code>&lt;dl class=&quot;quote&quot;&gt;
&lt;dt&gt;&lt;cite&gt;&lt;a href=&quot;http://www.amazon.co.jp/o/ASIN/4873114683/w3g-22/rel=nofollow&quot;&gt;jQueryクックブック&lt;/a&gt;&lt;/cite&gt;より&lt;/dt&gt;
&lt;dd&gt;&lt;blockquote cite=&quot;urn:isbn:4873114683&quot; title=&quot;jQueryクックブック&quot;&gt;
&lt;h1&gt;1章　jQueryの基礎&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;レシピ1.1   HTMLページでjQueryライブラリコードをインクルードする&lt;/li&gt;
&lt;li&gt;レシピ1.2   ページの読み込みが完了する前にjQuery/JavaScriptコードを実行する&lt;/li&gt;
&lt;li&gt;レシピ1.3   セレクタとjQuery関数を使ってDOM要素を選択する&lt;/li&gt;
&lt;li&gt;レシピ1.4   指定されたコンテキストでDOM要素を選択する&lt;/li&gt;
&lt;li&gt;レシピ1.5   DOM要素のラッパーセットのフィルタリング&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;&lt;/dd&gt;
&lt;/dl&gt;
</code></pre>
<section>
<h4>引用元が書籍の場合に<code>cite</code>属性に指定する<code>urn:isbn:<var>ISBNコード</var></code>について</h4>
<p>書籍は<abbr title="World Wide Web">WWW</abbr>上における「所在(URL)」という概念で結びつけることができないので、リソースを永続的な名前によって識別するURNとしてISBNコードを使用します。ISBNコードは、世界共通で用いられており10桁(2006年以前の規格でISBN-10という)、または13桁（2007年以降の規格でISBN-13という）の数字で国籍・出版社・製品を示します。書籍のISBNコードをamazon.co.jpへのリンクへと変換するにあたって、ASINコードがISBN-10のコードとイコールの関係になっているので、amazon.co.jpのASINコードをそのままISBNコードとして入力すれば良いと考えてもらえるとわかりやすいのではないかと思います。<code>urn:isbn:<var>ISBNコード</var></code>の形式です。</p>
</section>
</section>
<section>
<h3>CSSによる装飾のサンプル</h3>
<p>CSSによる装飾例を示します。引用元を視覚化した部分が最後に表示されるような装飾にしています。引用部分をわかりやすくするためにクォーテーションマークを模した背景画像を利用します。</p>
<p>この装飾例の画像を含むサンプル一式は<a href="http://w3g.jp/download/blockquote_linker.zip" onclick="javascript:pageTracker._trackPageview('/download/blockquote_linker');">こちらよりダウンロード</a>して利用してください。</p>
<pre><code>dl.quote{
margin:1em 0;
}
dl.quote dd{
margin:0;
}
dl.quote,
dl.quote dd{
padding:0;
position:relative;
}
blockquote {
border:1px solid #f9f9f9;
background:#eee;
padding:0 25px;
margin:1em 10px;
color:#666;
quotes:none;
display:block;
position:static;
-webkit-border-radius:10px;
-moz-border-radius:10px;
border-radius:10px;
}
dl.quote dd blockquote{
padding:0 25px 25px 25px;
margin:0 10px;
background:#eee url(/img/blockquote_start.gif) no-repeat 10px 15px;
}
blockquote h1{
font-size:115%;
font-weight:100;
border-bottom:1px dotted #0f527d;
color:#0f527d;
margin:1em 0 .5em 0;
padding:0 0 4px 0;
text-shadow:0 1px 1px #d0d0d0;
}
dl.quote dt{
background:transparent url(/img/blockquote_end.gif) no-repeat 100% 0;
position:absolute;
bottom:10px;
right:20px;
clear:none;
float:none;
border:0 none;
margin:0;
padding:15px 10px 0 0;
display:block;
z-index:10;
}</code></pre>
<p>なお、<abbr title="Internet Explorer">IE</abbr>においては、IE9未満のバージョンで<code>border-radius</code>をサポートしていないため角丸の装飾は反映されません。</p>
</section>
<section>
<h3>動作サンプル</h3>
<p>IEは6から動作します。その他の主要ブラウザにおいても問題なく動作します。</p>
<section>
<h4><code>cite</code>属性にURL、<code>title</code>属性に引用元の説明情報がある場合</h4>
<pre><code>&lt;blockquote cite=&quot;http://www.amazon.co.jp/o/ASIN/4873114683/w3g-22/rel=nofollow&quot; title=&quot;jQueryクックブック&quot;&gt;
&lt;h1&gt;1章　jQueryの基礎&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;レシピ1.1   HTMLページでjQueryライブラリコードをインクルードする&lt;/li&gt;
&lt;li&gt;レシピ1.2   ページの読み込みが完了する前にjQuery/JavaScriptコードを実行する&lt;/li&gt;
&lt;li&gt;レシピ1.3   セレクタとjQuery関数を使ってDOM要素を選択する&lt;/li&gt;
&lt;li&gt;レシピ1.4   指定されたコンテキストでDOM要素を選択する&lt;/li&gt;
&lt;li&gt;レシピ1.5   DOM要素のラッパーセットのフィルタリング&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;</code></pre>
<p>上記の<code>blockquote</code>要素のマークアップが次のように表示されます。</p>
<blockquote cite="http://www.amazon.co.jp/o/ASIN/4873114683/w3g-22/rel=nofollow" title="jQueryクックブック">
<h1>1章　jQueryの基礎</h1>
<ul class="list">
<li>レシピ1.1   HTMLページでjQueryライブラリコードをインクルードする</li>
<li>レシピ1.2   ページの読み込みが完了する前にjQuery/JavaScriptコードを実行する</li>
<li>レシピ1.3   セレクタとjQuery関数を使ってDOM要素を選択する</li>
<li>レシピ1.4   指定されたコンテキストでDOM要素を選択する</li>
<li>レシピ1.5   DOM要素のラッパーセットのフィルタリング</li>
</ul>
</blockquote>
</section>
<section>
<h4><code>cite</code>属性に<code>urn:isbn:<var>ISBNコード</var></code>、<code>title</code>属性に引用元の書籍名がある場合</h4>
<pre><code>&lt;blockquote cite=&quot;urn:isbn:4873114683&quot; title=&quot;jQueryクックブック&quot;&gt;
&lt;h1&gt;1章　jQueryの基礎&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;レシピ1.1   HTMLページでjQueryライブラリコードをインクルードする&lt;/li&gt;
&lt;li&gt;レシピ1.2   ページの読み込みが完了する前にjQuery/JavaScriptコードを実行する&lt;/li&gt;
&lt;li&gt;レシピ1.3   セレクタとjQuery関数を使ってDOM要素を選択する&lt;/li&gt;
&lt;li&gt;レシピ1.4   指定されたコンテキストでDOM要素を選択する&lt;/li&gt;
&lt;li&gt;レシピ1.5   DOM要素のラッパーセットのフィルタリング&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;</code></pre>
<p>上記の<code>blockquote</code>要素のマークアップが次のように表示されます。</p>
<blockquote cite="urn:isbn:4873114683" title="jQueryクックブック">
<h1>1章　jQueryの基礎</h1>
<ul class="list">
<li>レシピ1.1   HTMLページでjQueryライブラリコードをインクルードする</li>
<li>レシピ1.2   ページの読み込みが完了する前にjQuery/JavaScriptコードを実行する</li>
<li>レシピ1.3   セレクタとjQuery関数を使ってDOM要素を選択する</li>
<li>レシピ1.4   指定されたコンテキストでDOM要素を選択する</li>
<li>レシピ1.5   DOM要素のラッパーセットのフィルタリング</li>
</ul>
</blockquote>
</section>
<section>
<h4><code>cite</code>属性にURLがあるけれども、<code>title</code>属性が示されていない場合</h4>
<pre><code>&lt;blockquote cite=&quot;http://www.amazon.co.jp/o/ASIN/4873114683/w3g-22/rel=nofollow&quot; &gt;
&lt;h1&gt;1章　jQueryの基礎&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;レシピ1.1   HTMLページでjQueryライブラリコードをインクルードする&lt;/li&gt;
&lt;li&gt;レシピ1.2   ページの読み込みが完了する前にjQuery/JavaScriptコードを実行する&lt;/li&gt;
&lt;li&gt;レシピ1.3   セレクタとjQuery関数を使ってDOM要素を選択する&lt;/li&gt;
&lt;li&gt;レシピ1.4   指定されたコンテキストでDOM要素を選択する&lt;/li&gt;
&lt;li&gt;レシピ1.5   DOM要素のラッパーセットのフィルタリング&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;</code></pre>
<p>上記の<code>blockquote</code>要素のマークアップが次のように表示されます。</p>
<blockquote cite="http://www.amazon.co.jp/o/ASIN/4873114683/w3g-22/rel=nofollow">
<h1>1章　jQueryの基礎</h1>
<ul class="list">
<li>レシピ1.1   HTMLページでjQueryライブラリコードをインクルードする</li>
<li>レシピ1.2   ページの読み込みが完了する前にjQuery/JavaScriptコードを実行する</li>
<li>レシピ1.3   セレクタとjQuery関数を使ってDOM要素を選択する</li>
<li>レシピ1.4   指定されたコンテキストでDOM要素を選択する</li>
<li>レシピ1.5   DOM要素のラッパーセットのフィルタリング</li>
</ul>
</blockquote>
</section>
<section>
<h4><code>cite</code>属性に<code>urn:isbn:<var>ISBNコード</var></code>があるけれども、<code>title</code>属性が示されていない場合</h4>
<pre><code>&lt;blockquote cite=&quot;urn:isbn:4873114683&quot; &gt;
&lt;h1&gt;1章　jQueryの基礎&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;レシピ1.1   HTMLページでjQueryライブラリコードをインクルードする&lt;/li&gt;
&lt;li&gt;レシピ1.2   ページの読み込みが完了する前にjQuery/JavaScriptコードを実行する&lt;/li&gt;
&lt;li&gt;レシピ1.3   セレクタとjQuery関数を使ってDOM要素を選択する&lt;/li&gt;
&lt;li&gt;レシピ1.4   指定されたコンテキストでDOM要素を選択する&lt;/li&gt;
&lt;li&gt;レシピ1.5   DOM要素のラッパーセットのフィルタリング&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;</code></pre>
<p>上記の<code>blockquote</code>要素のマークアップが次のように表示されます。</p>
<blockquote cite="urn:isbn:4873114683">
<h1>1章　jQueryの基礎</h1>
<ul class="list">
<li>レシピ1.1   HTMLページでjQueryライブラリコードをインクルードする</li>
<li>レシピ1.2   ページの読み込みが完了する前にjQuery/JavaScriptコードを実行する</li>
<li>レシピ1.3   セレクタとjQuery関数を使ってDOM要素を選択する</li>
<li>レシピ1.4   指定されたコンテキストでDOM要素を選択する</li>
<li>レシピ1.5   DOM要素のラッパーセットのフィルタリング</li>
</ul>
</blockquote>
</section>
<section>
<h4><code>title</code>属性しか示されていない場合</h4>
<pre><code>&lt;blockquote title=&quot;jQueryクックブック&quot;&gt;
&lt;h1&gt;1章　jQueryの基礎&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;レシピ1.1   HTMLページでjQueryライブラリコードをインクルードする&lt;/li&gt;
&lt;li&gt;レシピ1.2   ページの読み込みが完了する前にjQuery/JavaScriptコードを実行する&lt;/li&gt;
&lt;li&gt;レシピ1.3   セレクタとjQuery関数を使ってDOM要素を選択する&lt;/li&gt;
&lt;li&gt;レシピ1.4   指定されたコンテキストでDOM要素を選択する&lt;/li&gt;
&lt;li&gt;レシピ1.5   DOM要素のラッパーセットのフィルタリング&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;</code></pre>
<p>上記の<code>blockquote</code>要素のマークアップが次のように表示されます。</p>
<blockquote title="jQueryクックブック">
<h1>1章　jQueryの基礎</h1>
<ul class="list">
<li>レシピ1.1   HTMLページでjQueryライブラリコードをインクルードする</li>
<li>レシピ1.2   ページの読み込みが完了する前にjQuery/JavaScriptコードを実行する</li>
<li>レシピ1.3   セレクタとjQuery関数を使ってDOM要素を選択する</li>
<li>レシピ1.4   指定されたコンテキストでDOM要素を選択する</li>
<li>レシピ1.5   DOM要素のラッパーセットのフィルタリング</li>
</ul>
</blockquote>
</section>
</section>]]>
</content>
</entry>
<entry>
<title>続HTML5についてのおさらい</title>
<id>http://w3g.jp/blog/studies/html5report2</id>
<link rel="alternate" type="text/html" href="http://w3g.jp/blog/studies/html5report2" />
<published>2010-08-19T01:50:10+09:00</published>
<updated>2010-08-19T01:50:10+09:00</updated>
<summary>HTML5についてのおさらい続編です。読者の方から質問があったことに対する回答のまとめであったり、セクション関連の新要素である見出しをグループ化するhgroup要素による効果、およびheader, footer要素を用いたセクションといった前回から一歩踏み込んだ内容をまとめました。</summary>
<author>
<name>World Wide Web Guide</name>
</author>
<content type="html" xml:lang="ja" xml:base="http://w3g.jp/blog/">
<![CDATA[<header>
<h2>続HTML5についてのおさらい</h2>
<p>HTML5についてのおさらい続編です。前回の内容を受けて読者の方から質問があったことに対する回答のまとめであったり、前回紹介しきれなかったセクション関連の新要素として見出しをグループ化する<code>hgroup</code>要素による効果、および<code>header</code>, <code>footer</code>要素を用いたセクションといった前回から一歩踏み込んだ内容をまとめました。</p>
<p>前回の<a href="html5report">HTML5についてのおさらい</a>の前提を含みます。先に参照しておくとより理解が進むかと思います。また、今回取り上げている要素は<a href="/html5/content_models">コンテンツ・モデル</a>も関係してくるのでこの点も抑えておく必要があります。</p>
</header>
<section>
<h3>hgroup要素 - 見出しのグループ化</h3>
<p><code>hgroup</code>要素は、複数の見出しをグループ化します。<code>hgroup</code>要素の中に入れることができるのは<code>h1</code>要素から<code>h6</code>要素までの見出しのみです。見出しのグループ化によって得られる効果は、副題やキャッチフレーズを伴う場合に意味的・構造的にそれを一つの見出しとして構成することができることと、加えて無駄なアウトラインの形成を抑止できることです。</p>
<pre><code>&lt;body&gt;
&lt;h1&gt;A&lt;/h1&gt;
&lt;h2&gt;A'&lt;/h2&gt;
&lt;h2&gt;B&lt;/h2&gt;
&lt;p&gt;C&lt;/p&gt;
&lt;/body&gt;</code></pre>
<p>上記のHTML5ドキュメントであれば、HTML5適合UAは暗黙のセクションに基づいて次のアウトライン（階層構造）を形成します。</p>
<ol>
<li>A...<code>body</code>セクションの見出し(レベルは<code>h1</code>)<ol>
<li>A'...暗黙のセクションを開始する見出し(レベルは<code>h2</code>)</li>
<li>B...暗黙のセクションを開始する見出し(レベルは<code>h2</code>)で、段落のCを含んでいる</li>
</ol></li>
</ol>
<p>もし、制作者が意図的にA'の見出しをAの見出しの副題やキャッチフレーズとして含めたくても従来のマークアップではアウトラインが生成されてしまい、構造的にもわかれてしまう問題がありました。そこで<code>hgroup</code>要素を利用することで、従来のマークアップが抱えていた問題を解決することができます。</p>
<pre><code>&lt;body&gt;
&lt;hgroup&gt;
&lt;h1&gt;A&lt;/h1&gt;
&lt;h2&gt;A'&lt;/h2&gt;
&lt;/hgroup&gt;
&lt;h2&gt;B&lt;/h2&gt;
&lt;p&gt;C&lt;/p&gt;
&lt;/body&gt;</code></pre>
<p><code>hgroup</code>要素を用いることにより、HTML5適合UAにおける上記のHTML5ドキュメントのアウトライン（階層構造）は次のように形成されます。</p>
<ol>
<li>A+A'...<code>body</code>セクションの見出し(レベルは<code>h1</code>)<ol>
<li>B...暗黙のセクションを開始する見出し(レベルは<code>h2</code>)で、段落のCを含んでいる</li>
</ol></li>
</ol>
<p><code>hgroup</code>要素内にある複数の見出しはグループ化が行われ、その見出しのレベルは複数の見出しの中で、もっとも高いレベルに準じ、意味的にも1つの見出しとして構成されます。そして、形成されるアウトラインも見出し1つ分であることが<code>hgroup</code>要素のもっとも注目すべき点です。</p>
<p>なお、ここでは説明にあたって便宜上わかりやすくするために暗黙のセクションを用いましたが、マークアップの際は暗黙のセクションに依存するのではなく、次のように必ずセクショニング・コンテンツ(<code>article</code>, <code>aside</code>, <code>nav</code>, <code>section</code>要素)を用いるようにしましょう。形成されるアウトライン（階層構造）は同じです。</p>
<pre><code>&lt;body&gt;
&lt;hgroup&gt;
&lt;h1&gt;A&lt;/h1&gt;
&lt;h2&gt;A'&lt;/h2&gt;
&lt;/hgroup&gt;
&#160;&#160;&#160;&#160;&lt;section&gt;
&#160;&#160;&#160;&#160;&lt;h2&gt;B&lt;/h2&gt;
&#160;&#160;&#160;&#160;&lt;p&gt;C&lt;/p&gt;
&#160;&#160;&#160;&#160;&lt;/section&gt;
&lt;/body&gt;</code></pre>
</section>
<section>
<h3>header要素 - ページ全体のヘッダと各セクションのヘッダ</h3>
<p><code>header</code>要素は導入部分（コンテンツの概略や目次）、ナビゲーションなどをグループ化して提供するために使います。<code>header</code>要素内に、<code>header</code>要素と<code>footer</code>要素を入れることはできません。<code>header</code>要素はセクションの一部であって、新しいセクションを開始するものでもなければ、アウトラインにも影響を及ぼしません。そして、<code>body</code>セクション内で使うか、各セクション内で使うかによって、それぞれ違った役割を果たすケースが多いはずです。</p>
<section>
<h4>ページ全体のヘッダ(ページ・ヘッダ)</h4>
<p><code>body</code>セクション内で<code>header</code>要素を使う場合は、サイト名称やロゴ、主要なナビゲーション、サイト内検索フォームなどをグループ化した典型的なヘッダとして提供することが一般的です。これは多くの制作者が従来使ってきた<code>&lt;div id=&quot;header&quot;&gt;...&lt;/div&gt;</code>に置き換わるものであると考えるとわかりやすいかもしれません。</p>
<pre><code>&lt;body&gt;
&lt;header&gt;
&lt;hgroup&gt;
&lt;h1&gt;サイト名&lt;/h1&gt;
&lt;h2&gt;サブタイトル&lt;/h2&gt;
&lt;/hgroup&gt;
&#160;&#160;&#160;&#160;&lt;nav&gt;
&#160;&#160;&#160;&#160;&lt;ul&gt;
&#160;&#160;&#160;&#160;&lt;li&gt;&lt;a href=&quot;/contents1/&quot;&gt;主コンテンツその1&lt;/a&gt;&lt;/li&gt;
&#160;&#160;&#160;&#160;&lt;li&gt;&lt;a href=&quot;/contents2/&quot;&gt;主コンテンツその2&lt;/a&gt;&lt;/li&gt;
&#160;&#160;&#160;&#160;&lt;li&gt;&lt;a href=&quot;/contents3/&quot;&gt;主コンテンツその3&lt;/a&gt;&lt;/li&gt;
&#160;&#160;&#160;&#160;&lt;/ul&gt;
&#160;&#160;&#160;&#160;&lt;/nav&gt;
&lt;/header&gt;
...
&lt;/body&gt;</code></pre>
</section>
<h4>各セクションのヘッダ</h4>
<p>各セクションのヘッダとは、暗黙のセクション、またはセクショニング・コンテンツによって生成されたセクションの中で使われる<code>header</code>要素を言います。ページ・ヘッダはサイト全体に関するナビゲーションをグループ化して提供するために使用されるケースが多いのに対し、各セクションのヘッダはセクション内のコンテンツについての概略（見出しと概要）や目次といった、そのコンテンツの導入部分を提供するために使用するケースが多くなるでしょう。たとえば、次のように<code>article</code>要素のセクション内で本文の導入部分として提供するような使い方です。</p>
<pre><code>&lt;body&gt;
...
&#160;&#160;&#160;&#160;&lt;article&gt;
&#160;&#160;&#160;&#160;&lt;header&gt;
&#160;&#160;&#160;&#160;&lt;h2&gt;続HTML5についてのおさらい&lt;/h2&gt;
&#160;&#160;&#160;&#160;&lt;p&gt;TML5についてのおさらい続編です。前回の内容を受けて...&lt;/p&gt;
&#160;&#160;&#160;&#160;&lt;/header&gt;
...
&#160;&#160;&#160;&#160;&lt;/article&gt;
...
&lt;/body&gt;</code></pre>
</section>
<section>
<h3>footer要素 - ページ全体のフッタと各セクションのフッタ</h3>
<p><code>footer</code>要素はそのセクションに関する情報をグループ化して提供するために使用します。<code>header</code>要素と使用ケースが似ているため説明がやや冗長ですが、文法等は<code>header</code>要素と同様で、<code>footer</code>要素内に<code>header</code>要素と<code>footer</code>要素を入れることができず、新しいセクションを開始するものでもなければ、アウトラインにも影響を及ぼしません。また、<code>body</code>セクション内で使うか、各セクション内で使うかによって、こちらもそれぞれ違った役割を果たすケースが多いはずです。</p>
<section>
<h4>ページ全体のフッタ(ページ・フッタ)</h4>
<p><code>body</code>セクション内で<code>footer</code>要素を使う場合は、サイトそのものに関するナビゲーションや著作権表記などをグループ化した典型的なフッタとして提供することが一般的です。もちろん、これは多くの制作者が従来使ってきた<code>&lt;div id=&quot;footer&quot;&gt;...&lt;/div&gt;</code>に置き換わるものであると考えるとわかりやすいでしょう。</p>
<pre><code>&lt;body&gt;
...
&lt;footer&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/sitepolicy/&quot;&gt;サイトポリシー&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/privacy/&quot;&gt;個人情報の取り扱いについて&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/sitemap/&quot;&gt;サイトマップ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;small&gt;Copyright 〜〜〜. All right reserved.&lt;/small&gt;
&lt;/footer&gt;
&lt;/body&gt;</code></pre>
</section>
<section>
<h4>各セクションのフッタ</h4>
<p>各セクションのフッタとは、暗黙のセクション、またはセクショニング・コンテンツによって生成されたセクションの中で使われる<code>footer</code>要素を言います。フッタと言っても必ずしもセクションの最後で使わなければいけないわけではなく、セクションの頭でも途中でも使用することができます。</p>
<p>各セクションのフッタは、主に<code>article</code>要素のセクション内で記事が誰によっていつ作成され、またいつ更新されたのかといった情報のグループ化であったり、本文の補足情報のグループ化、関連リンクのグループ化、ブログのコメントのグループ化などに使用されるケースが考えられます。</p>
</section>
</section>
<section>
<h3>もしセクショニング・コンテンツの使い方で迷ったら?</h3>
<p>質問の多かったところで、セクショニング・コンテンツである<code>article</code>, <code>aside</code>, <code>nav</code>, <code>section</code>要素のいずれでマークアップするのが良いのか使い分けに迷うような場合は、次のように意味がわかりやすいものから順に当てはめていくことで、<strong>必ずしも適当ではありません</strong>が、どのセクショニング・コンテンツでマークアップするのが良いのかの手引きにはできるかもしれません。</p>
<section>
<h4>
手順1. ナビゲーションかどうか</h4>
<p>マークアップしようとしている内容がナビゲーションであれば、<code>nav</code>要素を使います。ただし、ページ内に以降同じナビゲーションが登場する場合は先に登場する方にだけ<code>nav</code>要素を使います。内容がナビゲーションでない場合は次の手順へ移ります。</p>
</section>
<section>
<h4>手順2. 自己完結された内容かどうか</h4>
<p>その内容がそれ単独でコンテンツとして成り立つのであれば、<code>article</code>要素を使います。ただし、RSS等のフィードで提供する内容に相応しかどうかを基準とします。内容が単独で成り立つものではなかったり、成り立つものであってもフィードとして提供するのに相応しくない場合は次の手順へ移ります。</p>
</section>
<section>
<h4>手順3. なくなってもページとして成り立つかどうか</h4>
<p>その内容がなくなってもページ、またはメインコンテンツとして成り立つのであれば、<code>aside</code>要素を使います。その内容がなくなってしまうとページ、またはメインコンテンツが成り立たなくなるような場合は次の手順へ移ります。</p>
</section>
<section>
<h4>手順4. 自然に見出しを含められるかどうか</h4>
<p>その内容に自然に見出しを伴うことができるのであれば、<code>section</code>要素を使います。自然に見出しを入れられない（見出しを伴えない）ような内容の場合は、セクショニング・コンテンツ以外の要素でマークアップするのが相応しいということになります。</p>
</section>
</section>
<section>
<h3>strong, em, b, i, mark要素の使い分け</h3>
<p>これまでのセクションについての内容から話が大きくそれてしまいますが、読者の方から質問があったことに対する、一見解としてあわせてここに記載しておくことにします。</p>
<p>XHTML1.1でプレゼンテーションモジュールに分類されていた要素は、本来XHTML2.0からは削除予定であったのに対し、HTML5から<code>b</code>要素, <code>i</code>要素が削除されずに残っていることから、<code>strong</code>, <code>em</code>, <code>b</code>, <code>i</code>要素、加えて新たな<code>mark</code>要素をそれぞれ必要以上に使い分けなければならないのではないかと混乱される方が多いようです。</p>
<p>HTML5では、これらの要素における定義は明確にわけられており、<code>strong</code>要素と<code>em</code>要素の使い分けはわかりやすくなったかと思うのですが、<code>i</code>要素と<code>b</code>要素については使い分ける必要も、また無理に使う必要もない要素であると考えます。</p>
<section>
<h4>strong要素</h4>
<p>従来<code>strong</code>要素に与えられてきた論理的な意味は「強い強調」であり、強調と重要性どちらの意味でも利用可能でしたが、HTML5では強調の意味が失われ、「重要性」のみを表す要素に変更されました。また、その重要性の度合いは<code>strong</code>要素自身の入れ子関係によって表すことができます。たとえば、次のサンプルは注意喚起したい場合で、注意喚起のフレーズの中でも特に訴えたい何故なのかの部分を入れ子にしてあります。</p>
<pre><code>&lt;h1&gt;&lt;strong&gt;まぜるな&lt;strong&gt;危険&lt;/strong&gt;&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;酸性タイプ&lt;/strong&gt;の製品と一緒に使う（まぜる）と有毒な塩素ガスが出て&lt;strong&gt;危険&lt;/strong&gt;です。&lt;/p&gt;</code></pre>
</section>
<section>
<h4>em要素</h4>
<p>従来<code>em</code>要素に与えられてきた論理的な意味は「強調」であり、<code>strong</code>要素と同様で強調と重要性どちらの意味でも利用可能でしたが、HTML5では<code>strong</code>要素とは逆に重要性の意味が失われ、強調のみを表す要素に変更されました。その強調の度合いは<code>em</code>要素自身の入れ子関係で表すことができます。音声環境においては、<code>em</code>要素でマークされた部分は強勢として働き、他の音節よりも呼気エネルギーを大きくして、読み上げられることが期待されます。たとえば、次のサンプルは強勢としてトーンを強めたい部分における使用例で、さらにトーンを強めたい部分を入れ子にしてあります。</p>
<pre><code>&lt;p&gt;魚が&lt;em&gt;好き&lt;em&gt;です。でも、&lt;em&gt;お肉は&lt;em&gt;もっと好き&lt;/em&gt;です。&lt;/em&gt;&lt;/p&gt;</code></pre>
</section>
<section>
<h4>i要素</h4>
<p>従来の<code>i</code>要素はテキストを視覚的にイタリック体、または斜体で表示させることのみを目的とした物理要素でしかありませんでしたが、HTML5では声やムード、分類用語、技術用語、外国語の慣用句、思考、船の名前といった印刷表現において一般的にイタリック体で表記されるべきテキストを区別するために用いられます。しかしながら、ここで上げられている対象例は、一般的な日本語のサイトにおいてはほとんど使いどころがなく、また他に相応しい要素がない場合にのみ<code>i</code>要素を使うことが推奨されていることからも、日本語のサイトにおいては<code>i</code>要素は使い分ける必要も無理に使う必要もない要素と考えて良いでしょう。</p>
</section>
<section>
<h4>b要素</h4>
<p>従来の<code>b</code>要素はテキストを視覚的にボールド（太字）で表示させることのみを目的とした物理要素でしかありませんでしたが、HTML5では印刷表現において一般的にボールド（太字）で表記されるべきテキストを区別するために用いられます。<code>i</code>要素のような具体的な用例が設けられておらず、加えて<code>b</code>要素は他に相応しい要素がない場合に、他のテキストと区別したい場合の最後の手段として用いることになっているので、<code>i</code>要素よりもより一層、使い分ける必要も無理に使う必要もない要素と考えて良いでしょう。</p>
</section>
<section>
<h4>mark要素</h4>
<p><code>mark</code>要素はHTML5から新たに加えられた要素で、重要性でも強調性の意味をもたせるでもなく、他の文章から参照されることを目的に印付けるために使用します。たとえば、サイト内検索機能の検索結果で検索キーワードがスニペット内に含められている場合に該当キーワード部分をハイライトさせるために用いたり、引用文の中で言及したい部分に対して注目を引くために用いたり、コンピューターのプログラムコードの例示において読者に注目してほしい部分として印付けるために用いる等の利用シーンが考えらます。</p>
</section>
<p>以上、最後がマークアップについての見解コーナのようになってしまいましたが、HTML5のマークアップに関するおさらいはこれにて一段落とします。ご購読どうもありがとうございました。</p>
</section>]]>
</content>
</entry>
<entry>
<title>コンテンツ・モデル</title>
<id>http://w3g.jp/html5/content_models</id>
<link rel="alternate" type="text/html" href="http://w3g.jp/html5/content_models" />
<published>2010-08-13T09:30:00+09:00</published>
<updated>2010-08-13T09:30:00+09:00</updated>
<summary>コンテンツ・モデル（内容モデル）とは、要素ごとに目的に応じたグループ分けがなされており、従来のインライン要素にブロック要素を含めることができないといった概念と同様、そのカテゴリに属する要素にはどんなコンテンツ（要素およびテキスト）を含めることができるのかを定義したものです。</summary>
<author>
<name>World Wide Web Guide</name>
</author>
<content type="html" xml:lang="ja" xml:base="http://w3g.jp/html5/">
<![CDATA[<header>
<h2>HTML5コンテンツ・モデル</h2>
<p>コンテンツ・モデル（内容モデル）とは、要素ごとに目的に応じたグループ分けがなされており、従来のインライン要素にブロック要素を含めることができないといった概念と同様、そのカテゴリに属する要素にはどんなコンテンツ（要素およびテキスト）を含めることができるのかを定義したものです。</p>
</header>
<div id="doc">
<div class="frame"><code>&lt;!DOCTYPE html&gt;</code></div>
<p><em>必須</em>。この宣言はブラウザのレンダリングモードを標準準拠モードにする手段として用い、公式のDTDは存在しない。</p>
</div>
<div id="contentModels">
<div class="frame"><code>&lt;html&gt;</code>(省略可)</div>
<div>
<div class="frame"><code>&lt;head&gt;</code>(省略可)</div>
<section class="category ">
<h3>メタデータ・コンテンツ</h3>
<dl>
<dt><code>&lt;base /&gt;</code></dt>
<dd>空</dd>
<dt><code>&lt;command /&gt;</code></dt>
<dd>空</dd>
<dt><code>&lt;link /&gt;</code></dt>
<dd>空</dd>
<dt><code>&lt;meta /&gt;</code></dt>
<dd>空</dd>
<dt><code>&lt;noscript&gt;-&lt;/noscript&gt;</code></dt>
<dd><ul class="list">
<li>スクリプトが無効な場合:0個以上の<code>link</code>要素, <code>meta</code>要素, <code>style</code>要素</li>
<li>スクリプトが有効な場合:テキスト</li>
</ul></dd>
<dt><code>&lt;script&gt;-&lt;/script&gt;</code></dt>
<dd><ul class="list">
<li><code>src</code>属性がある場合:<br />
空、もしくは著作権情報やAPI 情報といったスクリプトの説明文</li>
<li><code>src</code>属性がない場合:<br />
JavaScriptのコード等(<code>text/javascript</code>以外を用いるのであれば、<code>type</code>属性は<em>必須</em>)</li>
</ul></dd>
<dt><code>&lt;style&gt;-&lt;/style&gt;</code></dt>
<dd>CSSのコード等(<code>text/css</code>以外を用いるのであれば、<code>type</code>属性は<em>必須</em>)</dd>
<dt><code>&lt;title&gt;-&lt;/title&gt;</code></dt>
<dd>テキストのみ<br />
<em>必須要素であり、必ず1個だけ定義</em></dd>
</dl>
</section>
<div class="frame"><code>&lt;/head&gt;</code>(省略可)</div>
</div>
<div>
<div class="frame"><code>&lt;body&gt;</code>(省略可)</div>
<section class="category ">
<h3>フロー・コンテンツ</h3>
<dl>
<dt><code>&lt;a&gt;-&lt;/a&gt;</code></dt>
<dd>トランスペアレント(ただし、インタラクティブ・コンテンツに該当する要素を除く)</dd>
<dt><code>&lt;address&gt;-&lt;/address&gt;</code></dt>
<dd>フロー・コンテンツ(ただし、ヘッディング・コンテンツとセクショニング・コンテンツにも該当する要素, <code>address</code>要素, <code>header</code>要素, <code>footer</code>要素を除く)</dd>
<dt><code>&lt;article&gt;-&lt;/article&gt;</code></dt>
<dd>フロー・コンテンツ</dd>
<dt><code>&lt;aside&gt;-&lt;/aside&gt;</code></dt>
<dd>フロー・コンテンツ</dd>
<dt><code>&lt;audio&gt;-&lt;/audio&gt;</code></dt>
<dd><ul class="list">
<li><code>src</code>属性がある場合:<br />
トランスペアレント(ただし、<code>video</code>要素, <code>audio</code>要素を除く)</li>
<li><code>src</code>属性がない場合:<br />
1個以上の<code>source</code>要素
<dl><dt><code>&lt;source /&gt;</code></dt><dd>空</dd></dl></li>
</ul></dd>
<dt><code>&lt;b&gt;-&lt;/b&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;bdo&gt;-&lt;/bdo&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;blockquote&gt;-&lt;/blockquote&gt;</code></dt>
<dd>フロー・コンテンツ</dd>
<dt><code>&lt;br /&gt;</code></dt>
<dd>空</dd>
<dt><code>&lt;button&gt;-&lt;/button&gt;</code></dt>
<dd>フレージング・コンテンツ(ただし、インタラクティブ・コンテンツにも該当する要素を除く)</dd>
<dt><code>&lt;canvas&gt;-&lt;/canvas&gt;</code></dt>
<dd>トランスペアレント</dd>
<dt><code>&lt;cite&gt;-&lt;/cite&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;code&gt;-&lt;/code&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;command /&gt;</code></dt>
<dd>空</dd>
<dt><code>&lt;datalist&gt;-&lt;/datalist&gt;</code></dt>
<dd><ul>
<li>フレージング・コンテンツ</li>
<li>0個以上の<code>option</code>要素</li>
</ul></dd>
<dt><code>&lt;del&gt;-&lt;/del&gt;</code></dt>
<dd>トランスペアレント</dd>
<dt><code>&lt;details&gt;-&lt;/details&gt;</code></dt>
<dd><ol>
<li>最初に1つの<code>summary</code>要素</li>
<li><code>summary</code>要素の直後(兄弟要素関係)にフロー・コンテンツ</li>
</ol><dl>
<dt><code>&lt;summary&gt;-&lt;/summary&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
</dl></dd>
<dt><code>&lt;dfn&gt;-&lt;/dfn&gt;</code></dt>
<dd>フレージング・コンテンツ(ただし、<code>dfn</code>要素を除く)</dd>
<dt><code>&lt;div&gt;-&lt;/div&gt;</code></dt>
<dd>フロー・コンテンツ</dd>
<dt><code>&lt;dl&gt;-&lt;/dl&gt;</code></dt>
<dd>1個以上の<code>dt</code>要素, <code>dd</code>要素<dl>
<dt><code>&lt;dt&gt;-&lt;/dt&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;dd&gt;-&lt;/dd&gt;</code></dt>
<dd>フロー・コンテンツ</dd>
</dl></dd>
<dt><code>&lt;em&gt;-&lt;/em&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;embed /&gt;</code></dt>
<dd>空</dd>
<dt><code>&lt;fieldset&gt;-&lt;/fieldset&gt;</code></dt>
<dd><ol>
<li>最初に1個の<code>legend</code>要素</li>
<li><code>legend</code>要素の直後(兄弟要素関係)にフロー・コンテンツ</li>
</ol><dl>
<dt><code>&lt;legend&gt;-&lt;/legend&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
</dl></dd>
<dt><code>&lt;figure&gt;-&lt;/figure&gt;</code></dt>
<dd><ul class="list">
<li>最初に1個の<code>figcaption</code>要素、その直後にフロー・コンテンツ</li>
<li>またはフロー・コンテンツの後に1つの<code>figcaption</code>要素</li>
<li>またはフロー・コンテンツ</li>
</ul><dl>
<dt><code>&lt;figcaption&gt;-&lt;/figcaption&gt;</code></dt>
<dd>フロー・コンテンツ</dd>
</dl></dd>
<dt><code>&lt;footer&gt;-&lt;/footer&gt;</code></dt>
<dd>フロー・コンテンツ(ただし、 <code>header</code>要素, <code>footer</code>要素を除く)</dd>
<dt><code>&lt;form&gt;-&lt;/form&gt;</code></dt>
<dd>フロー・コンテンツ(ただし、<code>form</code>要素を除く)</dd>
<dt><code>&lt;h1-h6&gt;-&lt;/h1-h6&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;header&gt;-&lt;/header&gt;</code></dt>
<dd>フロー・コンテンツ(ただし、 <code>header</code>要素, <code>footer</code>要素を除く)</dd>
<dt><code>&lt;hgroup&gt;-&lt;/hgroup&gt;</code></dt>
<dd>1個以上の<code>h1</code>, <code>h2</code>, <code>h3</code>, <code>h4</code>, <code>h5</code>, <code>h6</code>要素</dd>
<dt><code>&lt;hr /&gt;</code></dt>
<dd>空要素</dd>
<dt><code>&lt;i&gt;-&lt;/i&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;iframe&gt;-&lt;/iframe&gt;</code></dt>
<dd>テキストのみ</dd>
<dt><code>&lt;img /&gt;</code></dt>
<dd>空</dd>
<dt><code>&lt;input /&gt;</code></dt>
<dd>空</dd>
<dt><code>&lt;ins&gt;-&lt;/ins&gt;</code></dt>
<dd>トランスペアレント</dd>
<dt><code>&lt;kbd&gt;-&lt;/kbd&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;keygen /&gt;</code></dt>
<dd>空</dd>
<dt><code>&lt;label&gt;-&lt;/label&gt;</code></dt>
<dd>フレージング・コンテンツ(ただし、<code>label</code>要素自身と、そのラベル内容と関係のない<code>button</code>, <code>keygen</code>, <code>input</code>, <code>meter</code>, <code>output</code>, <code>progress</code>, <code>select</code>, <code>textarea</code>要素を除く)</dd>
<dt><code>&lt;map&gt;-&lt;/map&gt;</code></dt>
<dd>トランスペアレント<dl>
<dt><code>&lt;area /&gt;</code></dt>
<dd>空</dd>
</dl></dd>
<dt><code>&lt;mark&gt;-&lt;/mark&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;math&gt;-&lt;/math&gt;</code></dt>
<dd>インライン<abbr title="Mathematical Markup Language">MathML</abbr>の要素</dd>
<dt><code>&lt;menu&gt;-&lt;/menu&gt;</code></dt>
<dd>0個以上の <code>li</code>要素、またはフロー・コンテンツ</dd>
<dt><code>&lt;meter&gt;-&lt;/meter&gt;</code></dt>
<dd>フレージング・コンテンツ(ただし、<code>meter</code>要素を除く)</dd>
<dt><code>&lt;nav&gt;-&lt;/nav&gt;</code></dt>
<dd>フロー・コンテンツ</dd>
<dt><code>&lt;noscript&gt;-&lt;/noscript&gt;</code></dt>
<dd>トランスペアレント(ただし、<code>noscript</code>要素を除く)</dd>
<dt><code>&lt;object&gt;-&lt;/object&gt;</code></dt>
<dd>0個以上の<code>param</code>要素に続き、トランスペアレント(ただし、フロー・コンテンツが入る場合は、最初に<code>param</code>要素、その後にフロー・コンテンツが続く)<dl>
<dt><code>&lt;param /&gt;</code></dt>
<dd>空</dd>
</dl></dd>
<dt><code>&lt;ol&gt;-&lt;/ol&gt;</code></dt>
<dd>0個以上の <code>li</code>要素<dl>
<dt><code>&lt;li&gt;-&lt;/li&gt;</code></dt>
<dd>フロー・コンテンツ</dd>
</dl></dd>
<dt><code>&lt;output&gt;-&lt;/output&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;p&gt;-&lt;/p&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;pre&gt;-&lt;/pre&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;progress&gt;-&lt;/progress&gt;</code></dt>
<dd>フレージング・コンテンツ(ただし、<code>progress</code>要素を除く)</dd>
<dt><code>&lt;q&gt;-&lt;/q&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;ruby&gt;-&lt;/ruby&gt;</code></dt>
<dd>次のどちらかのセットを1個以上
<ul class="list">
<li>フレージング・コンテンツ(主にテキスト)の後に、1個の<code>rt</code>要素を並べたセット</li>
<li>または、<code>rp</code>, <code>rt</code>, <code>rp</code>要素の順で並べたセット</li>
</ul><dl>
<dt><code>&lt;rp&gt;-&lt;/rp&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;rt&gt;-&lt;/rt&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
</dl></dd>
<dt><code>&lt;samp&gt;-&lt;/samp&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;script&gt;-&lt;/script&gt;</code></dt>
<dd><ul class="list">
<li><code>src</code>属性がある場合:<br />
空、もしくは著作権情報やAPI 情報といったスクリプトの説明文</li>
<li><code>src</code>属性がない場合:<br />
JavaScriptのコード等(<code>text/javascript</code>以外を用いるのであれば、<code>type</code>属性は<em>必須</em>)</li>
</ul></dd>
<dt><code>&lt;section&gt;-&lt;/section&gt;</code></dt>
<dd>フロー・コンテンツ(章・節・項を表す対のヘッディング・コンテンツを必ず伴うこと)</dd>
<dt><code>&lt;select&gt;-&lt;/select&gt;</code></dt>
<dd>0個以上の<code>option</code>要素, <code>optgroup</code>要素<dl>
<dt><code>&lt;option&gt;-&lt;/option&gt;</code></dt>
<dd>テキストのみ</dd>
<dt><code>&lt;optgroup&gt;-&lt;/optgroup&gt;</code></dt>
<dd><code>label</code>属性必須、0個以上の<code>option</code>要素<dl>
<dt><code>&lt;option&gt;-&lt;/option&gt;</code></dt>
<dd>テキストのみ</dd></dl></dd>
</dl></dd>
<dt><code>&lt;small&gt;-&lt;/small&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;span&gt;-&lt;/span&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;strong&gt;-&lt;/strong&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;style&gt;-&lt;/style&gt;</code></dt>
<dd>CSSのコード等(<code>scoped</code>属性<em>必須</em>、<code>text/css</code>以外を用いるのであれば<code>type</code>属性は<em>必須</em>)</dd>
<dt><code>&lt;sub&gt;-&lt;/sub&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;sup&gt;-&lt;/sup&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;svg&gt;-&lt;/svg&gt;</code></dt>
<dd>インライン<abbr title="Scalable Vector Graphics">SVG</abbr>の要素</dd>
<dt><code>&lt;table&gt;-&lt;/table&gt;</code></dt>
<dd><ol>
<li><code>caption</code>要素が0個、または1個</li>
<li>0個以上の<code>col</code>要素、または 0個以上の<code>colgroup</code>要素</li>
<li><code>thead</code>要素が0個、または1個</li>
<li><code>tfoot</code>要素が0個、または1個</li>
<li>1個以上の<code>tbody</code>要素、または1個以上の<code>tr</code>要素</li>
</ol><dl>
<dt><code>&lt;caption&gt;-&lt;/caption&gt;</code></dt>
<dd>フロー・コンテンツ(ただし、<code>table</code>要素を除く)</dd>
<dt><code>&lt;col /&gt;</code></dt>
<dd>空</dd>
<dt><code>&lt;colgroup&gt;-&lt;/colgroup&gt;</code></dt>
<dd><ul class="list">
<li><code>span</code>属性がある場合:空</li>
<li><code>span</code>属性がある場合:0個以上の<code>col</code>要素<dl>
<dt><code>&lt;col /&gt;</code></dt>
<dd>空</dd>
</dl></li>
</ul></dd>
<dt><code>&lt;thead&gt;-&lt;/thead&gt;</code></dt>
<dd>0個以上の<code>tr</code>要素<dl>
<dt><code>&lt;tr&gt;-&lt;/tr&gt;</code></dt>
<dd>0個以上の<code>th</code>要素<dl>
<dt><code>&lt;th&gt;-&lt;/th&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
</dl></dd>
</dl></dd>
<dt><code>&lt;tfoot&gt;-&lt;/tfoot&gt;</code></dt>
<dd>0個以上の<code>tr</code>要素<dl>
<dt><code>&lt;tr&gt;-&lt;/tr&gt;</code></dt>
<dd>0個以上の<code>td</code>要素, <code>th</code>要素<dl>
<dt><code>&lt;th&gt;-&lt;/th&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;td&gt;-&lt;/td&gt;</code></dt>
<dd>フロー・コンテンツ</dd>
</dl></dd>
</dl></dd>
<dt><code>&lt;tbody&gt;-&lt;/tbody&gt;</code></dt>
<dd>0個以上の<code>tr</code>要素<dl>
<dt><code>&lt;tr&gt;-&lt;/tr&gt;</code></dt>
<dd>0個以上の<code>td</code>要素, <code>th</code>要素<dl>
<dt><code>&lt;th&gt;-&lt;/th&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;td&gt;-&lt;/td&gt;</code></dt>
<dd>フロー・コンテンツ</dd>
</dl></dd>
</dl></dd>
<dt><code>&lt;tr&gt;-&lt;/tr&gt;</code></dt>
<dd>0個以上の<code>td</code>要素, <code>th</code>要素<dl>
<dt><code>&lt;th&gt;-&lt;/th&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;td&gt;-&lt;/td&gt;</code></dt>
<dd>フロー・コンテンツ</dd>
</dl></dd>
</dl></dd>
<dt><code>&lt;textarea&gt;-&lt;/textarea&gt;</code></dt>
<dd>テキストのみ</dd>
<dt><code>&lt;time&gt;-&lt;/time&gt;</code></dt>
<dd>フレージング・コンテンツ(ただし、<code>time</code>要素を除く)</dd>
<dt><code>&lt;ul&gt;-&lt;/ul&gt;</code></dt>
<dd>0個以上の<code>li</code>要素<dl>
<dt><code>&lt;li&gt;-&lt;/li&gt;</code></dt>
<dd>フロー・コンテンツ</dd>
</dl></dd>
<dt><code>&lt;var&gt;-&lt;/var&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;video&gt;-&lt;/video&gt;</code></dt>
<dd><ul class="list">
<li><code>src</code>属性がある場合:<br />
トランスペアレント(ただし、<code>video</code>要素, <code>audio</code>要素を除く)</li>
<li><code>src</code>属性がない場合:<br />
1個以上の<code>source</code>要素に続き、トランスペアレント(ただし、<code>video</code>要素, <code>audio</code>要素を除く)
<dl><dt><code>&lt;source /&gt;</code></dt><dd>空</dd></dl></li>
</ul></dd>
<dt><code>&lt;wbr /&gt;</code></dt>
<dd>空</dd>
<dt>テキスト</dt>
<dd>テキストノードのこと</dd>
</dl>
</section>
<section class="category">
<h3>セクショニング・コンテンツ</h3>
<dl>
<dt><code>&lt;article&gt;-&lt;/article&gt;</code></dt>
<dd>フロー・コンテンツ</dd>
<dt><code>&lt;aside&gt;-&lt;/aside&gt;</code></dt>
<dd>フロー・コンテンツ</dd>
<dt><code>&lt;nav&gt;-&lt;/nav&gt;</code></dt>
<dd>フロー・コンテンツ</dd>
<dt><code>&lt;section&gt;-&lt;/section&gt;</code></dt>
<dd>フロー・コンテンツ(章・節・項を表す対のヘッディング・コンテンツを必ず伴うこと)</dd>
</dl>
</section>
<section class="category">
<h3>ヘッディング・コンテンツ</h3>
<dl>
<dt><code>&lt;h1-h6&gt;-&lt;/h1-h6&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;hgroup&gt;-&lt;/hgroup&gt;</code></dt>
<dd>1個以上の<code>h1-h6</code>要素</dd>
</dl>
</section>
<section class="category">
<h3>フレージング・コンテンツ</h3>
<dl>
<dt><code>&lt;a&gt;-&lt;/a&gt;</code></dt>
<dd>子孫要素にフレージング・コンテンツしか含んでいない場合に限る、コンテンツ・モデルはフレージング・コンテンツ(ただし、インタラクティブ・コンテンツに該当する要素を除く)</dd>
<dt><code>&lt;abbr&gt;-&lt;/abbr&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;audio&gt;-&lt;/audio&gt;</code></dt>
<dd><ul class="list">
<li><code>src</code>属性がある場合:<br />
フレージング・コンテンツ(ただし、<code>video</code>要素, <code>audio</code>要素を除く)</li>
<li><code>src</code>属性がない場合:<br />
1個以上の<code>source</code>要素
<dl><dt><code>&lt;source /&gt;</code></dt><dd>空</dd></dl></li>
</ul></dd>
<dt><code>&lt;b&gt;-&lt;/b&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;bdo&gt;-&lt;/bdo&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;br /&gt;</code></dt>
<dd>空</dd>
<dt><code>&lt;button&gt;-&lt;/button&gt;</code></dt>
<dd>フレージング・コンテンツ(ただし、インタラクティブ・コンテンツにも該当する要素を除く)</dd>
<dt><code>&lt;canvas&gt;-&lt;/canvas&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;cite&gt;-&lt;/cite&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;code&gt;-&lt;/code&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;command /&gt;</code></dt>
<dd>空</dd>
<dt><code>&lt;del&gt;-&lt;/del&gt;</code></dt>
<dd>子孫要素にフレージング・コンテンツしか含んでいない場合に限る、コンテンツ・モデルはフレージング・コンテンツ</dd>
<dt><code>&lt;details&gt;-&lt;/details&gt;</code></dt>
<dd><ol>
<li>最初に1つの<code>summary</code>要素</li>
<li><code>summary</code>要素の直後(兄弟要素関係)にフレージング・コンテンツ</li>
</ol><dl>
<dt><code>&lt;summary&gt;-&lt;/summary&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
</dl></dd>
<dt><code>&lt;dfn&gt;-&lt;/dfn&gt;</code></dt>
<dd>フレージング・コンテンツ(ただし、<code>dfn</code>要素を除く)</dd>
<dt><code>&lt;em&gt;-&lt;/em&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;embed /&gt;</code></dt>
<dd>空</dd>
<dt><code>&lt;i&gt;-&lt;/i&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;iframe&gt;-&lt;/iframe&gt;</code></dt>
<dd>テキストのみ</dd>
<dt><code>&lt;img /&gt;</code></dt>
<dd>空</dd>
<dt><code>&lt;input /&gt;</code></dt>
<dd>空</dd>
<dt><code>&lt;ins&gt;-&lt;/ins&gt;</code></dt>
<dd>子孫要素にフレージング・コンテンツしか含んでいない場合に限る、コンテンツ・モデルはフレージング・コンテンツ</dd>
<dt><code>&lt;kbd&gt;-&lt;/kbd&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;keygen /&gt;</code></dt>
<dd>空</dd>
<dt><code>&lt;label&gt;-&lt;/label&gt;</code></dt>
<dd>フレージング・コンテンツ(ただし、<code>label</code>要素自身と、そのラベル内容と関係のない<code>button</code>, <code>keygen</code>, <code>input</code>, <code>meter</code>, <code>output</code>, <code>progress</code>, <code>select</code>, <code>textarea</code>要素を除く)</dd>
<dt><code>&lt;map&gt;-&lt;/map&gt;</code></dt>
<dd>子孫要素にフレージング・コンテンツしか含んでいない場合に限る、コンテンツ・モデルはフレージング・コンテンツ<dl>
<dt><code>&lt;area /&gt;</code></dt>
<dd>空</dd>
</dl></dd>
<dt><code>&lt;mark&gt;-&lt;/mark&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;math&gt;-&lt;/math&gt;</code></dt>
<dd>インラインMathMLの要素</dd>
<dt><code>&lt;meter&gt;-&lt;/meter&gt;</code></dt>
<dd>フレージング・コンテンツ(ただし、<code>meter</code>要素を除く)</dd>
<dt><code>&lt;noscript&gt;-&lt;/noscript&gt;</code></dt>
<dd>フレージング・コンテンツ(ただし、<code>noscript</code>要素を除く)</dd>
<dt><code>&lt;object&gt;-&lt;/object&gt;</code></dt>
<dd>0個以上の<code>param</code>要素に続き、フレージング・コンテンツ<dl>
<dt><code>&lt;param /&gt;</code></dt>
<dd>空</dd>
</dl></dd>
<dt><code>&lt;output&gt;-&lt;/output&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;progress&gt;-&lt;/progress&gt;</code></dt>
<dd>フレージング・コンテンツ(ただし、<code>progress</code>要素を除く)</dd>
<dt><code>&lt;q&gt;-&lt;/q&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;ruby&gt;-&lt;/ruby&gt;</code></dt>
<dd>次のどちらかのセットを1個以上
<ul class="list">
<li>フレージング・コンテンツ(主にテキスト)の後に、1個の<code>rt</code>要素を並べたセット</li>
<li>または、<code>rp</code>, <code>rt</code>, <code>rp</code>要素の順で並べたセット</li>
</ul><dl>
<dt><code>&lt;rp&gt;-&lt;/rp&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;rt&gt;-&lt;/rt&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
</dl></dd>
<dt><code>&lt;samp&gt;-&lt;/samp&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;script&gt;-&lt;/script&gt;</code></dt>
<dd><ul class="list">
<li><code>src</code>属性がある場合:<br />
空、もしくは著作権情報やAPI 情報といったスクリプトの説明文</li>
<li><code>src</code>属性がない場合:<br />
JavaScriptのコード等(<code>text/javascript</code>以外を用いるのであれば、<code>type</code>属性は<em>必須</em>)</li>
</ul></dd>
<dt><code>&lt;select&gt;-&lt;/select&gt;</code></dt>
<dd>0個以上の<code>option</code>要素, <code>optgroup</code>要素<dl>
<dt><code>&lt;option&gt;-&lt;/option&gt;</code></dt>
<dd>テキストのみ</dd>
<dt><code>&lt;optgroup&gt;-&lt;/optgroup&gt;</code></dt>
<dd><code>label</code>属性必須、0個以上の<code>option</code>要素<dl>
<dt><code>&lt;option&gt;-&lt;/option&gt;</code></dt>
<dd>テキストのみ</dd></dl></dd>
</dl></dd>
<dt><code>&lt;small&gt;-&lt;/small&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;span&gt;-&lt;/span&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;strong&gt;-&lt;/strong&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;style&gt;-&lt;/style&gt;</code></dt>
<dd>CSSのコード等(<code>scoped</code>属性<em>必須</em>、<code>text/css</code>以外を用いるのであれば<code>type</code>属性は<em>必須</em>)</dd>
<dt><code>&lt;sub&gt;-&lt;/sub&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;sup&gt;-&lt;/sup&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;svg&gt;-&lt;/svg&gt;</code></dt>
<dd>インラインSVGの要素</dd>
<dt><code>&lt;textarea&gt;-&lt;/textarea&gt;</code></dt>
<dd>テキストのみ</dd>
<dt><code>&lt;time&gt;-&lt;/time&gt;</code></dt>
<dd>フレージング・コンテンツ(ただし、<code>time</code>要素を除く)</dd>
<dt><code>&lt;var&gt;-&lt;/var&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
<dt><code>&lt;video&gt;-&lt;/video&gt;</code></dt>
<dd><ul class="list">
<li><code>src</code>属性がある場合:<br />
フレージング・コンテンツ(ただし、<code>video</code>要素, <code>audio</code>要素を除く)</li>
<li><code>src</code>属性がない場合:<br />
1個以上の<code>source</code>要素に続き、フレージング・コンテンツ(ただし、<code>video</code>要素, <code>audio</code>要素を除く)<dl><dt><code>&lt;source /&gt;</code></dt><dd>空</dd></dl></li>
</ul></dd>
<dt><code>&lt;wbr /&gt;</code></dt>
<dd>空</dd>
<dt>テキスト</dt>
<dd>テキストノードのこと</dd>
</dl>
</section>
<section class="category">
<h3>エンベッディッド・コンテンツ</h3>
<dl>
<dt><code>&lt;audio&gt;-&lt;/audio&gt;</code></dt>
<dd><ul class="list">
<li><code>src</code>属性がある場合:<br />
トランスペアレント(ただし、<code>video</code>要素, <code>audio</code>要素を除く)</li>
<li><code>src</code>属性がない場合:<br />
1個以上の<code>source</code>要素
<dl><dt><code>&lt;source /&gt;</code></dt><dd>空</dd></dl></li>
</ul></dd>
<dt><code>&lt;canvas&gt;-&lt;/canvas&gt;</code></dt>
<dd>トランスペアレント</dd>
<dt><code>&lt;embed /&gt;</code></dt>
<dd>空</dd>
<dt><code>&lt;iframe&gt;-&lt;/iframe&gt;</code></dt>
<dd>テキストのみ</dd>
<dt><code>&lt;img /&gt;</code></dt>
<dd>空</dd>
<dt><code>&lt;math&gt;-&lt;/math&gt;</code></dt>
<dd>インラインMathMLの要素</dd>
<dt><code>&lt;object&gt;-&lt;/object&gt;</code></dt>
<dd>0個以上の<code>param</code>要素に続き、トランスペアレント(ただし、フロー・コンテンツが入る場合は、最初に<code>param</code>要素、その後にフロー・コンテンツが続く)<dl>
<dt><code>&lt;param /&gt;</code></dt>
<dd>空</dd>
</dl></dd>
<dt><code>&lt;svg&gt;-&lt;/svg&gt;</code></dt>
<dd>インラインSVGの要素</dd>
<dt><code>&lt;video&gt;-&lt;/video&gt;</code></dt>
<dd><ul class="list">
<li><code>src</code>属性がある場合:<br />
トランスペアレント(ただし、<code>video</code>要素, <code>audio</code>要素を除く)</li>
<li><code>src</code>属性がない場合:<br />
1個以上の<code>source</code>要素に続き、トランスペアレント(ただし、<code>video</code>要素, <code>audio</code>要素を除く)
<dl><dt><code>&lt;source /&gt;</code></dt><dd>空</dd></dl></li>
</ul></dd>
</dl>
</section>
<section class="category">
<h3>インタラクティブ・コンテンツ</h3>
<dl>
<dt><code>&lt;a&gt;-&lt;/a&gt;</code></dt>
<dd>トランスペアレント(ただし、インタラクティブ・コンテンツに該当する要素を除く)</dd>
<dt><code>&lt;audio&gt;-&lt;/audio&gt;</code></dt>
<dd><code>controls</code>属性が指定された場合に限る、コンテンツ・モデルは<ul class="list">
<li><code>src</code>属性がある場合:<br />
トランスペアレント(ただし、<code>video</code>要素, <code>audio</code>要素を除く)</li>
<li><code>src</code>属性がない場合:<br />
1個以上の<code>source</code>要素
<dl><dt><code>&lt;source /&gt;</code></dt><dd>空</dd></dl></li>
</ul></dd>
<dt><code>&lt;button&gt;-&lt;/button&gt;</code></dt>
<dd>フレージング・コンテンツ(ただし、
インタラクティブ・コンテンツにも該当する要素を除く)</dd>
<dt><code>&lt;details&gt;-&lt;/details&gt;</code></dt>
<dd><ol>
<li>最初に1つの<code>summary</code>要素</li>
<li><code>summary</code>要素の直後(兄弟要素関係)にフロー・コンテンツ</li>
</ol><dl>
<dt><code>&lt;summary&gt;-&lt;/summary&gt;</code></dt>
<dd>フレージング・コンテンツ</dd>
</dl></dd>
<dt><code>&lt;embed /&gt;</code></dt>
<dd>空</dd>
<dt><code>&lt;iframe&gt;-&lt;/iframe&gt;</code></dt>
<dd>テキストのみ</dd>
<dt><code>&lt;img /&gt;</code></dt>
<dd><code>usemap</code>属性が指定された場合に限る、コンテンツ・モデルは空</dd>
<dt><code>&lt;input /&gt;</code></dt>
<dd><code>type</code>属性が&quot;<code>hidden</code>&quot;でない場合に限る、コンテンツ・モデルは空</dd>
<dt><code>&lt;keygen /&gt;</code></dt>
<dd>空</dd>
<dt><code>&lt;label&gt;-&lt;/label&gt;</code></dt>
<dd>フレージング・コンテンツ(ただし、<code>label</code>要素自身と、そのラベル内容と関係のない<code>button</code>, <code>keygen</code>, <code>input</code>, <code>meter</code>, <code>output</code>, <code>progress</code>, <code>select</code>, <code>textarea</code>要素を除く)</dd>
<dt><code>&lt;object&gt;-&lt;/object&gt;</code></dt>
<dd><code>usemap</code>属性が指定された場合に限る、コンテンツ・モデルは<br />0個以上の<code>param</code>要素に続き、トランスペアレント(ただし、フロー・コンテンツが入る場合は、最初に<code>param</code>要素、その後にフロー・コンテンツが続く)<dl>
<dt><code>&lt;param /&gt;</code></dt>
<dd>空</dd>
</dl></dd>
<dt><code>&lt;menu /&gt;</code></dt>
<dd><code>type</code>属性が&quot;<code>toolbar</code>&quot;でない場合に限る、<br />コンテンツ・モデルは0個以上の<code>li</code>要素、またはフロー・コンテンツ</dd>
<dt><code>&lt;select&gt;-&lt;/select&gt;</code></dt>
<dd>0個以上の<code>option</code>要素, <code>optgroup</code>要素<dl>
<dt><code>&lt;option&gt;-&lt;/option&gt;</code></dt>
<dd>テキストのみ</dd>
<dt><code>&lt;optgroup&gt;-&lt;/optgroup&gt;</code></dt>
<dd><code>label</code>属性必須、0個以上の<code>option</code>要素<dl>
<dt><code>&lt;option&gt;-&lt;/option&gt;</code></dt>
<dd>テキストのみ</dd></dl></dd>
</dl></dd>
<dt><code>&lt;textarea&gt;-&lt;/textarea&gt;</code></dt>
<dd>テキストのみ</dd>
<dt><code>&lt;video&gt;-&lt;/video&gt;</code></dt>
<dd><code>controls</code>属性が指定された場合に限る、コンテンツ・モデルは<ul class="list">
<li><code>src</code>属性がある場合:<br />
トランスペアレント(ただし、<code>video</code>要素, <code>audio</code>要素を除く)</li>
<li><code>src</code>属性がない場合:<br />
1個以上の<code>source</code>要素に続き、トランスペアレント(ただし、<code>video</code>要素, <code>audio</code>要素を除く)
<dl><dt><code>&lt;source /&gt;</code></dt><dd>空</dd></dl></li>
</ul></dd>
</dl>
</section>
<div class="frame"><code>&lt;/body&gt;</code>(省略可)</div>
</div>
<div class="frame"><code>&lt;/html&gt;</code>(省略可)</div>
</div>
<section>
<h3>補足事項</h3>
<section>
<h4>トランスペアレントについて</h4>
<p>一部の要素にはトランスペアレントというコンテンツ・モデルが定義されています。トランスペアレントは、コンテンツ・モデルとして透過という意味であり、親要素のコンテンツ・モデルを継承します。親要素がフロー・コンテンツで、フロー・コンテンツを含むことができるコンテンツ・モデルであれば、同じようにフロー・コンテンツを含むことができます。親要素がフレージング・コンテンツしか含めない場合は、同じようにフレージング・コンテンツしか含むことができません。</p>
</section>
<section>
<h4>空要素について</h4>
<p>終了タグをもたない空要素については便宜上わかりやすいように 、最後の区切り子の手前に半角スペースを空けてから続けてスラッシュ(<code>/</code>)を付け足していますが、HTML5のHTMLシリアライゼーションにおいてはあってもなくてもどちらでも良いです。XHTMLシリアライゼーションでは必須です。</p>
</section>
<section>
<h4>CSSとの兼ね合いについて</h4>
<p>HTML5における要素の関係はブロック要素・インライン要素のどちらかという2値では表すことができなくなったため、ブロック要素・インライン要素という概念はなくなりました。そこでCSSの兼ね合いとして、適用対象がブロック要素とあるCSSのプロパティは、HTML4.01, XHTML1.0/1.1等における<a href="/xhtml/dic/block_element">ブロック要素</a>のことを対象に指すのではなく、視覚環境においてブロックレベルとして整形されている(<code>display:block;</code>が指定されている)要素のことを対象に指します。そのためHTML5の各要素には新要素も含めて、デフォルトで各々の<code>display</code>プロパティの値が定義されることになるはずです(<a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/rendering.html#display-types">12.2.2 Display types</a>)。</p>
</section>
</section>]]>
</content>
</entry>
<entry>
<title>jQuery.supportでのブラウザ判別</title>
<id>http://w3g.jp/blog/tools/jquery_browser_sniffing</id>
<link rel="alternate" type="text/html" href="http://w3g.jp/blog/tools/jquery_browser_sniffing" />
<published>2010-08-04T09:30:09+09:00</published>
<updated>2010-08-04T09:30:09+09:00</updated>
<summary>jQueryでブラウザを判別するjQuery.browserのAPIは1.3より非推奨のため、代わりにブラウザがサポートする機能を判別するAPIであるjQuery.supportで代表的なブラウザの判別方法をまとめてみました。これで万が一User Agentが偽装されても安心、UA情報には依存しないサポートしている機能だけでのブラウザ判別を行う試みです。</summary>
<author>
<name>World Wide Web Guide</name>
</author>
<content type="html" xml:lang="ja" xml:base="http://w3g.jp/blog/">
<![CDATA[<header>
<h2>jQuery.supportでのブラウザ判別</h2>
<p><strong>下記に記載の内容は情報が古くなったために正しく動作しなくなりました。JSでのUA条件分岐便利スニペットとして、<a href="/blog/tools/js_browser_sniffing">代替案を提示しています。</a></strong></p>
<del><p>jQueryでブラウザを判別する<code>jQuery.browser</code>のAPIは1.3より非推奨のため、代わりにブラウザがサポートする機能を判別するAPIである<code>jQuery.support</code>で代表的なブラウザの判別方法をまとめてみました。これで万が一User Agentが偽装されても安心、UA情報には依存しないサポートしている機能だけでのブラウザ判別を行う試みです。</p>
</del>
</header>
<section>
<h3>jQuery.browserは非推奨</h3>
<pre><code>if(jQuery.browser.msie){
alert('あなたがお使いのブラウザはIEです');
}else if(jQuery.browser.mozilla){
alert('あなたがお使いのブラウザはFirefoxです');
}else if(jQuery.browser.webkit){
alert('あなたがお使いのブラウザはchromeもしくはsafariです');
}else if(jQuery.browser.opera){
alert('あなたがお使いのブラウザはoperaです');
}</code></pre>
<p><code>jQuery.browser</code>を使えば、上記の簡単なコードだけでブラウザを判別した条件分岐が行えます。加えてバージョンの判別も<code>jQuery.browser.version</code>を使ってできます。</p>
<pre><code>if(jQuery.browser.msie &amp;&amp; parseInt(jQuery.browser.version) == 8){
alert('あなたがお使いのブラウザはIE8です');
}else if(jQuery.browser.msie &amp;&amp; parseInt(jQuery.browser.version) == 7){
alert('あなたがお使いのブラウザはIE7です');
}else if(jQuery.browser.msie &amp;&amp; parseInt(jQuery.browser.version) == 6){
alert('あなたがお使いのブラウザはIE6です');
}</code></pre>
<p><code>jQuery.browser</code>と<code>jQuery.browser.version</code>はすごく便利ですが、jQuery1.3からはどちらも<strong>非推奨</strong>となっています。1.3以降のバージョンでは後方互換とプラグイン利用のためにまだ含まれていますが、今後のjQueryのバージョンアップに伴い、この機能は廃止される見通しです。また、飽くまでもこれらは<code>navigator.userAgent</code>の値をもとにしており、<abbr title="User Agent">UA</abbr>情報は簡単に偽装することもできます。そこで、代わりにブラウザがサポートする機能に基づいて判別を行う<code>jQuery.support</code>を使うことが推奨されています。</p>
</section>
<section>
<h3>jQuery.supportについて</h3>
<p><code>jQuery.support</code>は、ブラウザごとの各機能のサポート状態をBoolean型の <code>true</code> or <code>false</code>の値で返すAPIです。各機能にあたるプロパティには次のようなものがあります。</p>
<dl>
<dt><code>leadingWhitespace</code></dt>
<dd><code>innerHTML</code>で、先頭に空白があった場合にそれを残して返すブラウザであれば<code>true</code>です。</dd>
<dt><code>tbody</code></dt>
<dd><code>table</code>要素内に、<code>tbody</code>要素が無い状態を許可する(省略時に自動的に付加しない)ブラウザであれば<code>true</code>です。</dd>
<dt><code>htmlSerialize</code></dt>
<dd><code>innerHTML</code>を用いた際に、シリアライズされた値を返すブラウザであれば<code>true</code>です。</dd>
<dt><code>style</code></dt>
<dd><code>getAttribute(&quot;style&quot;)</code>で要素に記述された<code>style</code>属性値を取得できるブラウザであれば<code>true</code>です。</dd>
<dt><code>hrefNormalized</code></dt>
<dd><code>href</code>属性の値を取得する際に、属性値をそのまま返す（勝手に補完しない）ブラウザであれば<code>true</code>です。</dd>
<dt><code>opacity</code></dt>
<dd><code>opacity</code>による透明度を指定する機能を実装しているブラウザであれば<code>true</code>です。</dd>
<dt><code>cssFloat</code></dt>
<dd><code>float</code>の値を取得する場合に<code>style.cssFloat</code>で取得できるブラウザであれば<code>true</code>です。</dd>
<dt><code>checkOn</code></dt>
<dd>チェックボックスの値が指定されていない場合のデフォルト値が&quot;on&quot;であるブラウザであれば<code>true</code>です（webkitはデフォルト値が&quot;&quot;の空なので、<code>false</code>です）。</dd>
<dt><code>deleteExpando</code></dt>
<dd>拡張した要素の属性を、<code>delete</code>演算子で削除できるブラウザであれば<code>true</code>です。</dd>
<dt><code>checkClone</code></dt>
<dd><code>cloneNode()</code>を使用して要素を複製する場合に要素のチェック状態も含めコピーできるブラウザでれば<code>true</code>です。
</dd>
<dt><code>scriptEval</code></dt>
<dd><code>appendChild()</code>や<code>createTextNode()</code>で要素を追加した際、そこにスクリプトが含まれていると、それを自動的に実行できるブラウザであれば<code>true</code>です。</dd>
<dt><code>noCloneEvent</code></dt>
<dd>要素がコピーされる場合に、元の要素がもっていたイベントハンドラをコピーしないブラウザであれば<code>true</code>です。</dd>
<dt><code>boxModel</code></dt>
<dd>W3C CSS Box Model に基づいてページをレンダリングしているブラウザであれば<code>true</code>です。</dd>
</dl>
<p>これらのプロパティのブラウザ毎の値を一覧表にまとめると、次の通りです。Yoursの欄はご覧になられている環境での結果がそれぞれtrue or falseで返ります。IE9は最新のRC版におけるデータです。</p>
<script type="text/javascript">
$(function(){
var leadingWhitespace = "";
leadingWhitespace +=  jQuery.support.leadingWhitespace;
$('#leadingWhitespace').html(leadingWhitespace);
var tbody = "";
tbody +=  jQuery.support.tbody;
$('#tbody').html(tbody);
var htmlSerializeDammy = "";
htmlSerializeDammy +=  jQuery.support.htmlSerialize;
$('#htmlSerialize').html(htmlSerializeDammy);
var style = "";
style +=  jQuery.support.style;
$('#style').html(style);
var hrefNormalized = "";
hrefNormalized +=  jQuery.support.hrefNormalized;
$('#hrefNormalized').html(hrefNormalized);
var opacity = "";
opacity +=  jQuery.support.opacity;
$('#opacity').html(opacity);
var cssFloat = "";
cssFloat +=  jQuery.support.cssFloat;
$('#cssFloat').html(cssFloat);
var checkOn = "";
checkOn +=  jQuery.support.checkOn;
$('#checkOn').html(checkOn);
//出力されるのになぜ存在しないのよくわからない
//var optSelected = "";
//optSelected +=  jQuery.support.optSelected;
//$('#optSelected').html(optSelected);
//var parentNode = "";
//parentNode +=  jQuery.support.parentNode;
//$('#parentNode').html(parentNode);
var deleteExpando = "";
deleteExpando +=  jQuery.support.deleteExpando;
$('#deleteExpando').html(deleteExpando);
var checkClone = "";
checkClone +=  jQuery.support.checkClone;
$('#checkClone').html(checkClone);
var scriptEval = "";
scriptEval +=  jQuery.support.scriptEval;
$('#scriptEval').html(scriptEval);
var noCloneEvent = "";
noCloneEvent +=  jQuery.support.noCloneEvent;
$('#noCloneEvent').html(noCloneEvent);
var boxModel = "";
boxModel +=  jQuery.support.boxModel;
$('#boxModel').html(boxModel);
//こいつらも存在しない
//var submitBubbles = "";
//submitBubbles +=  jQuery.support.submitBubbles;
//$('#submitBubbles').html(submitBubbles);
//var changeBubbles = "";
//changeBubbles +=  jQuery.support.changeBubbles;
//$('#changeBubbles').html(changeBubbles);
$("#support tbody tr td:contains('false')").css("color", "#c00");
$("#support thead tr th").css("font-size", "85%");
});
</script>
<table id="support">
<thead>
<tr><th>プロパティ名</th><th>Yours</th><th>Chrome<br />5+</th><th>Safari<br />5+</th><th>Firefox<br />3.6+</th><th>Opera<br />10.5+</th><th>IE6</th><th>IE7</th><th>IE8</th><th>IE9</th></tr></thead>
<tbody><tr><th>leadingWhitespace</th><td id="leadingWhitespace"></td><td>true</td><td>true</td><td>true</td><td>true</td><td>false</td><td>false</td><td>false</td><td>true</td></tr>
<tr><th>tbody</th><td id="tbody"></td><td>true</td><td>true</td><td>true</td><td>true</td><td>false</td><td>false</td><td>true</td><td>true</td></tr>
<tr><th>htmlSerialize</th><td id="htmlSerialize"></td><td>true</td><td>true</td><td>true</td><td>true</td><td>false</td><td>false</td><td>false</td><td>true</td></tr>
<tr><th>style</th><td id="style"></td><td>true</td><td>true</td><td>true</td><td>true</td><td>false</td><td>false</td><td>true</td><td>true</td></tr>
<tr><th>hrefNormalized</th><td id="hrefNormalized"></td><td>true</td><td>true</td><td>true</td><td>true</td><td>false</td><td>false</td><td>true</td><td>true</td></tr>
<tr><th>opacity</th><td id="opacity"></td><td>true</td><td>true</td><td>true</td><td>true</td><td>false</td><td>false</td><td>false</td><td>true</td></tr>
<tr><th>cssFloat</th><td id="cssFloat"></td><td>true</td><td>true</td><td>true</td><td>true</td><td>false</td><td>false</td><td>false</td><td>true</td></tr>
<tr><th>checkOn</th><td id="checkOn"></td><td>false</td><td>false</td><td>true</td><td>true</td><td>true</td><td>true</td><td>true</td><td>true</td></tr>
<!--<tr><th>optSelected</th><td id="optSelected"></td><td>true</td><td>true</td><td>true</td><td>true</td><td>false</td><td>false</td><td>false</td><td>false</td></tr>
<tr><th>parentNode</th><td id="parentNode"></td><td>true</td><td>true</td><td>true</td><td>true</td><td>false</td><td>false</td><td>false</td><td>true</td></tr>-->
<tr><th>deleteExpando</th><td id="deleteExpando"></td><td>true</td><td>true</td><td>true</td><td>true</td><td>false</td><td>false</td><td>false</td><td>true</td></tr>
<tr><th>checkClone</th><td id="checkClone"></td><td>true</td><td>true</td><td>true</td><td>true</td><td>true</td><td>true</td><td>true</td><td>true</td></tr>
<tr><th>scriptEval</th><td id="scriptEval"></td><td>true</td><td>true</td><td>true</td><td>true</td><td>false</td><td>false</td><td>false</td><td>true</td></tr>
<tr><th>noCloneEvent</th><td id="noCloneEvent"></td><td>true</td><td>true</td><td>true</td><td>true</td><td>false</td><td>false</td><td>false</td><td>false</td></tr>
<tr><th>boxModel</th><td id="boxModel"></td><td>true</td><td>true</td><td>true</td><td>true</td><td>true</td><td>true</td><td>true</td><td>true</td></tr>
<!--<tr><th>submitBubbles</th><td id="submitBubbles"></td><td>true</td><td>true</td><td>true</td><td>true</td><td>false</td><td>false</td><td>false</td><td>true</td></tr>
<tr><th>changeBubbles</th><td id="changeBubbles"></td><td>true</td><td>true</td><td>true</td><td>true</td><td>false</td><td>false</td><td>false</td><td>true</td></tr>-->
</tbody>
</table>
</section>
<section>
<h3>chromeとsafariを対象とする場合</h3>
<pre><code>if(!jQuery.support.checkOn){
alert('あなたがお使いのブラウザはChromeもしくはSafariっぽいです');
}</code></pre>
<p>if文の条件式の中で<code>!</code>をつけたので、<code>checkOn</code>が<code>false</code>であればこの条件文に該当します。該当するのはwebkitだけなので、これでchormeとsafariのみに振り分けたコードを記述できます。なお、Android標準ブラウザ、iPhone / iPad標準ブラウザといったスマートフォンも同じChromeとSafariなので、この条件に合致します。</p>
</section>
<section>
<h3>FirefoxとOperaを対象とする場合</h3>
<pre><code>if(jQuery.support.checkOn &amp;&amp; jQuery.support.noCloneEvent){
alert('あなたがお使いのブラウザはFirefoxもしくはOperaっぽいです');
}</code></pre>
<p>まず、<code>checkOn</code>が<code>true</code>条件なので、chromeとsafariがこれにはじかれ、IEの全バージョンで<code>false</code>が返る<code>noCloneEvent</code>をand条件に加えることで、FirefoxかOperaのみに振り分けたコードを記述できます。さらにここから、FirefoxかOperaかを判別するには、jQueryではなく、<code>window.globalStorage</code>を使います。<code>globalStorage</code>を使うのはFirefoxのみです。ただし、問題があります。<code>globalStorage</code>がWeb Storageの仕様自体から削除されたため、今後Firefoxのアップデートによって<code>globalStorage</code>自体が削除されると、<strong>以下のOperaとFirefoxの判別は今後通用しなくなるかもしれません</strong>ということで注意してください。一応、Firefox4 betaでは<code>globalStorage</code>自体は残されていたので問題なく動作確認できています。</p>
<pre><code>if(jQuery.support.checkOn &amp;&amp; jQuery.support.noCloneEvent &amp;&amp; window.globalStorage){
alert('あなたがお使いのブラウザはFirefoxっぽいです');
}else if(jQuery.support.checkOn &amp;&amp; jQuery.support.noCloneEvent &amp;&amp; !window.globalStorage){
alert('あなたがお使いのブラウザはOperaっぽいです');
}</code></pre>
</section>
<section>
<h3>IEのみを対象として各バージョンでの振り分けもできるようにしたい場合</h3>
<p>ブラウザ判別でのコード分岐は特にIEにおいて活躍することが多いので、いろいろなアプローチを取り上げてみます。</p>
<section>
<h4>IE9を除く、IE6,7,8を対象にしたい場合</h4>
<pre><code>if(!jQuery.support.opacity){
alert('あなたがお使いのブラウザはIE6,7,8っぽいのいずれかです');
}</code></pre>
<p>IE9からは<code>opacity</code>をサポートしているので、これをサポートしていない（<code>false</code>が返る）のはIE6,7,8だけです。IE6,7,8に対してのみまとめて書きたい場合に使えます。特にIE9は他のモダンブラウザと並ぶくらいサポートが良化してきているので、IE9を除くIE6,7,8にだけという場面は今後も頻発するかと思います。</p>
</section>
<section>
<h4>IE6,7,8の各バージョン判別もできるようにしたい場合</h4>
<pre><code>if(!jQuery.support.opacity){
&#160;&#160;&#160;&#160;if(!jQuery.support.style){
&#160;&#160;&#160;&#160;alert('あなたがお使いのブラウザはIE6,7っぽいのどちらかです');
&#160;&#160;&#160;&#160;}else{
&#160;&#160;&#160;&#160;alert('あなたがお使いのブラウザはIE8っぽいです');
&#160;&#160;&#160;&#160;}
}</code></pre>
<p><code>style</code>はIE8からサポートしているのでIE6,7とIE8を切り分けることができます。しかし、IE6とIE7の切り分けがまだできていません。IE6とIE7をブラウザのサポート状態だけで切り分けるには、こちらもjQueryではなく<code>typeof document.documentElement.style.maxHeight != &quot;undefined&quot;</code>を利用します。これは<code>maxHeight</code>プロパティをサポートしているかどうかで判別します。なお、IE8の互換表示モード時はIE7の部分が通ります。</p>
<pre><code>if(!jQuery.support.opacity){
&#160;&#160;&#160;&#160;if(!jQuery.support.style){
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if (typeof document.documentElement.style.maxHeight != "undefined") {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;alert('あなたがお使いのブラウザはIE7っぽいです');
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;else {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;alert('あなたがお使いのブラウザはIE6っぽいです');
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;}else{
&#160;&#160;&#160;&#160;alert('あなたがお使いのブラウザはIE8っぽいです');
&#160;&#160;&#160;&#160;}
}</code></pre>
</section>
<section>
<h4>IE9のみを対象にしたい場合</h4>
<pre><code>if(!jQuery.support.noCloneEvent &amp;&amp; jQuery.support.opacity){
alert('あなたがお使いのブラウザはIE9っぽいです');
}</code></pre>
<p><code>noCloneEvent</code>が<code>false</code>なのはIEだけなので、まずIEのみに対象を絞り込むことができ、IE6,7,8,9の中で<code>opacity</code>が<code>true</code>なのはIE9だけなので、IE6,7,8を除いたIE9のみの条件分岐が可能です。</p>
</section>
</section>
<section>
<h3>実験！あなたのブラウザを判別</h3>
<p><code>alert</code>だと鬱陶しいので、ここでは<code>document.write()</code>に書き換えて地味に実験です。</p>
<p>正解していますか？出力結果→「<strong><samp><script type="text/javascript">
if(!jQuery.support.checkOn && jQuery.support.checkClone){
document.write('あなたがお使いのブラウザはchromeもしくはsafariっぽいです');
}else if(jQuery.support.checkOn && jQuery.support.noCloneEvent && window.globalStorage){
document.write('あなたがお使いのブラウザはFirefoxっぽいです');
}else if(jQuery.support.checkOn && jQuery.support.noCloneEvent && !window.globalStorage){
document.write('あなたがお使いのブラウザはOperaっぽいです');
}else if(!jQuery.support.noCloneEvent && jQuery.support.opacity){
document.write('あなたがお使いのブラウザはIE9っぽいです');
}else if(!jQuery.support.opacity){
if(!jQuery.support.style){
if (typeof document.documentElement.style.maxHeight != "undefined") {
document.write('あなたがお使いのブラウザはIE7っぽいです');
}
else {
document.write('あなたがお使いのブラウザはIE6っぽいです');
}
}else{
document.write('あなたがお使いのブラウザはIE8っぽいです');
}
}else{
document.write('ごめんなさい、あなたのブラウザを特定できませんでした');
}
</script></samp></strong>」</p>
<pre><code>if(!jQuery.support.checkOn &amp;&amp; jQuery.support.checkClone){
document.write('あなたがお使いのブラウザはchromeもしくはsafariっぽいです');
}else if(jQuery.support.checkOn &amp;&amp; jQuery.support.noCloneEvent &amp;&amp; window.globalStorage){
document.write('あなたがお使いのブラウザはFirefoxっぽいです');
}else if(jQuery.support.checkOn &amp;&amp; jQuery.support.noCloneEvente &amp;&amp; !window.globalStorage){
document.write('あなたがお使いのブラウザはOperaっぽいです');
}else if(!jQuery.support.noCloneEvent && jQuery.support.opacity){
document.write('あなたがお使いのブラウザはIE9っぽいです');
}else if(!jQuery.support.opacity){
&#160;&#160;&#160;&#160;if(!jQuery.support.style){
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if (typeof document.documentElement.style.maxHeight != &quot;undefined&quot;) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;document.write('あなたがお使いのブラウザはIE7っぽいです');
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;} else {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;document.write('あなたがお使いのブラウザはIE6っぽいです');
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;}else{
&#160;&#160;&#160;&#160;document.write('あなたがお使いのブラウザはIE8っぽいです');
&#160;&#160;&#160;&#160;}
}else{
document.write('ごめんなさい、あなたのブラウザを特定できませんでした');
}</code></pre>
<p>以上、<code>jQuery.support</code>に加えて、機能をサポートしているかどうかの条件文にのみこだわったブラウザの判別でした。IEの判別はまあまあ使えるでしょうか。それ以外のブラウザはサポートしている機能が同じなので、条件分岐させる必要もないことでしょう。</p>
</section>]]>
</content>
</entry>
<entry>
<title>IE用HTML5新要素のMinify生成</title>
<id>http://w3g.jp/blog/studies/ie_html5_minify</id>
<link rel="alternate" type="text/html" href="http://w3g.jp/blog/studies/ie_html5_minify" />
<published>2010-08-02T15:24:24+09:00</published>
<updated>2010-08-02T15:24:24+09:00</updated>
<summary>latest logさんでエントリーされていたコードを削る方法がすごく勉強になったので、練習がてらに早速IE8以下でHTML5の新要素をCSSセレクタで使う際にdocument.createElement()で事前に書き出しておく必要があるコードをMinify化してみました。</summary>
<author>
<name>World Wide Web Guide</name>
</author>
<content type="html" xml:lang="ja" xml:base="http://w3g.jp/blog/">
<![CDATA[<header>
<h2>IE用HTML5新要素のMinify生成</h2>
<p>latest logさんでエントリーされていた<a href="http://d.hatena.ne.jp/uupaa/20100730/1280502000">コードを削る</a>方法がすごく勉強になったので、練習がてらに早速IE8以下でHTML5の新要素をCSSセレクタで使う際にdocument.createElement()で事前に書き出しておく必要があるコードをMinify化してみました。</p>
</header>
<section>
<h3>書き出す必要のあるHTML5の新要素</h3>
<p>まず最初に、IE8以下では未知の要素となるために書き出す必要のあるHTML5の新要素名を列挙しておきます。</p>
<ul>
<li><code>article</code>要素</li>
<li><code>aside</code>要素</li>
<li><code>nav</code>要素</li>
<li><code>section</code>要素</li>
<li><code>hgroup</code>要素</li>
<li><code>header</code>要素</li>
<li><code>footer</code>要素</li>
<li><code>figure</code>要素</li>
<li><code>figcaption</code>要素</li>
<li><code>time</code>要素</li>
<li><code>mark</code>要素</li>
</ul>
<p>この他にも、HTML5の新要素には<code>canvas</code>要素, <code>audio</code>要素, <code>embed</code>要素, <code>video</code>要素, <code>source</code>要素, <code>progress</code>要素, <code>meter</code>要素, <code>ruby</code>要素, <code>rt</code>要素, <code>rp</code>要素, <code>details</code>要素, <code>summary</code>要素, <code>datalist</code>要素, <code>keygen</code>要素, <code>output</code>要素, <code>command</code>要素, <code>menu</code>要素(※<code>menu</code>要素はHTML2から規定されている要素名ですが全く異なる用途として新たに導入されています)があるのですが、この内、<code>embed</code>要素はIE3から、<code>ruby</code>要素,<code>rt</code>要素,<code>rp</code>要素はIE5のバージョンから既に先行実装済みであり、その他の要素についてはCSSで整形できるものでなっかり、全く機能すらしないので<code>document.createElement()</code>で書き出す必要はありません。</p>
</section>
<section>
<h3>Minify化のポイント</h3>
<p>latest logさんからポイントを抜粋させてもらいます。</p>
<blockquote cite="http://d.hatena.ne.jp/uupaa/20100730/1280502000" title="コードを削る - latest log">
<h1>ドット演算子以降を自力で Minify する</h1>
<p>JavaScriptは動的な言語なので、ドット演算子以降は基本的に minify しても圧縮されません。</p>
<pre><code>document.createElement(&quot;div&quot;);
document.createElement(&quot;a&quot;);
document.createElement(&quot;p&quot;);</code></pre>
<p> ↓ このままだと、minify しても縮まらない</p>
<pre><code>document.createElement(&quot;div&quot;);document.createElement(&quot;a&quot;);document.createElement(&quot;p&quot;)</code></pre>
<p>ドット演算子によるアクセス( Object.property )は、Object["property"] のシンタックスシュガー(糖衣構文)です。</p>
<p>これらは、同じ処理速度でほぼ同じ価値を持ち、見た目がちょっと違うだけ(ドット演算子は制限も多いけど)。</p>
<p>そこで minifier が処理しやすいように、シンタックスシュガーを解除すると</p>
<pre><code>var doc = document, createElement = &quot;createElement&quot;;
doc[createElement](&quot;div&quot;);
doc[createElement](&quot;a&quot;);
doc[createElement](&quot;p&quot;);</code></pre>
<p>↓ minify</p>
<pre><code>var a=document,b=&quot;createElement&quot;;a[b](&quot;div&quot;);a[b](&quot;a&quot;);a[b](&quot;p&quot;)</code></pre>
</blockquote>
<p>すごいですよね、可読性は犠牲になりますが、同じ処理速度で且つここまで削ることができるというのは、目から鱗でした。</p>
<p>早速この書き方を取り入れて、HTML5の新要素を書き出してみます。</p>
</section>
<section>
<h3>HTML5の新要素をIE8以下で認識させるためのコード例</h3>
<p>代表的なライブラリにhtml5.jsがありますが、これと同様のことができる最小コードへの試みです。</p>
<pre><code>var a=document,b=&quot;createElement&quot;,c=&quot;article,aside,nav,section,hgroup,header,footer,figure,figcaption,time,mark&quot;.split(','),i=c.length;while(--i&gt;=0)a[b](c[i]);
</code></pre>
<p>よしなかなかシンプルにできたぞと思っていましたら、<a href="http://p2b.jp/">ppBlog official</a>さんでもまったく同じようにHTML5新要素の<code>document.createElement()</code>の最小書き出しがエントリーされていました。書き出している要素は便宜上異なっていますが、ppBlogさんで紹介されているコードの方がいろいろなアプローチで断然ショートでした。</p>
<blockquote cite="http://p2b.jp/201007-various-HTML5-enabling-scripts" title="IE8でのHTML5要素有効化あれこれ">
<p>どこで最初に見かけたのか失念しましたが、これを一行（ワンライナー）で簡潔に済ませたスクリプトを見たときはいたく感心しました。<a href="http://dean.edwards.name/weblog/">Dean Edwards氏のブログ</a> もこうなっています。</p>
<pre><code>&quot;header,nav,article,section,aside,footer&quot;.replace(/¥w+/g, function(a){document.createElement(a)});</code></pre>
<p>上のポイントは、replaceメソッドの引数に関数を指定できて、その関数内では、正規表現にマッチした要素を適宜適用していく点です。ループみたいなことを勝手にやってくれる点ですね。おそらくこれ以上短くは書けないのではないかと思うのですが、息抜きに自分なりにいくつか考えてみました。</p>
<pre><code>&quot;header,nav,article,section,aside,footer&quot;.split(',').sort(function(a){return document.createElement(a)*1});</code></pre>
<p>これも、似たような発想からですね。自動でなんかやってくれるという。</p>
<pre><code>with(&quot;header,nav,article,section,aside,footer&quot;.split(',')))while(length)document.createElement(pop());</code></pre>
<p>ここではwith構文を使ってみました。これもなかなかシンプルです。同じくwithと、Enumeratorを使って、</p>
<pre><code>with(new Enumerator(&quot;header,nav,article,section,aside,footer&quot;.split(',')))for(;!atEnd();moveNext())document.createElement(item());</code></pre>
<p>これは、ちょっと長いし、Enumerator Object はマイナーですかね。</p>
<p>短さ命で、グローバル変数の汚染なんて気にしないぜっ、という向きには以下のようなものもありかと思います。</p>
<pre><code>s=&quot;header,nav,article,section,aside,footer&quot;.split(',');while(s[0])document.createElement(s.pop());</code></pre>
<p>for文関連では、</p>
<pre><code>for(i in s=&quot;header,nav,article,section,aside,footer&quot;.split(','))document.createElement(s[i]);</code></pre>
<p>とか</p>
<pre><code>for(i=0;n=&quot;header,nav,article,section,aside,footer&quot;.split(',')[i++];document.createElement(n));</code></pre>
<p>とかですかねぇ。</p>
</blockquote>
<p>コードを短くためのアプローチは本当勉強になります。なお、これらの書き方をしたからといってパフォーマンスがどの程度最適化されるのか等についてはわからないので、飽くまでもコード自体をMinify化するためのアプローチとして受け取ってください。</p>
</section>]]>
</content>
</entry>
<entry>
<title>Yahoo!に振り回された愚かな過去</title>
<id>http://w3g.jp/blog/topics/stupid_past_by_yahoo</id>
<link rel="alternate" type="text/html" href="http://w3g.jp/blog/topics/stupid_past_by_yahoo" />
<published>2010-08-02T00:25:10+09:00</published>
<updated>2010-08-02T00:25:10+09:00</updated>
<summary>桑田さんの歌われるどん底のブルースには「皆見て見ぬフリして本当は知っている、この平和の裏に、愚かな過去があったのを」という詩があるのですが、先日のYahoo!JAPANと米Googleが提携することを受けて、Yahoo!JAPANの検索エンジンの歴史とそれに振り回されてきた愚かな過去についての話しです。</summary>
<author>
<name>World Wide Web Guide</name>
</author>
<content type="html" xml:lang="ja" xml:base="http://w3g.jp/blog/">
<![CDATA[<header>
<h2>Yahoo!に振り回された愚かな過去</h2>
<p>桑田佳祐さんが食道ガンということで一ファンとしてとても心配しています。桑田さんの歌を聞いて、いつも元気をもらっているので、一日も早く良くなられることを祈っています。桑田さんの歌われるどん底のブルースには「皆見て見ぬフリして本当は知っている、この平和の裏に、愚かな過去があったのを」という詩があるのですが、先日のYahoo!JAPANと米Googleが提携することを受けて、Yahoo!JAPANの検索エンジンの歴史とそれに振り回されてきた愚かな過去についての話しです。</p>
</header>
<section>
<h3>Google採用に至った経緯</h3>
<p>現在のYahoo!JAPANが採用している検索エンジンは、米Yahoo!が開発したYSTことYahoo Search Technologyです。YSTはもともと、米Yahoo!が2002年12月に検索エンジン大手のInktomiを買収し、そこからオリジナルの検索技術を加えつくりあげていったものです。</p>
<p>そして、YSTを採用する以前は、2001年から2004年5月末までYahoo!JAPANはGoogleの検索エンジンを採用していました（後述しますが、さらにその前となるとgooの国産検索エンジンを採用していました）。ゆえに7月27日に発表された今回のYahoo!JAPANと米Googleの提携は、丸6年ぶりに再びGoogleの検索エンジンに戻ってきたことになります。</p>
<p>一年前の2009年に米Yahoo!はMicroSoftと提携し、YSTからBingに切り替えることを発表してから、Yahoo!JAPANもBingを搭載していく可能性が高いと言われていたようですが、<q>Googleは確固たる日本語環境の検索エンジンと広告配信システムを持っており、その機能も現時点ではベストと判断した</q>ということに至り、Yahoo!JAPANはGoogleの採用を決めたようです。</p>
<p>このニュースはウェブ業界におけるここ数年来でもかなり大きな出来事であり、ウェブでビジネスを展開する人にとっては、何かしらの影響を受けることは避けれません。</p>
</section>
<section>
<h3>Yahoo!JAPAN独自の味付け!?</h3>
<p><a href="http://www.netratings.co.jp/New_news/News05272010.htm">ネットレイティングス調べ</a>によれば、2010年4月時点での日本国内の検索シェアは、Yahoo!JAPANがトップで53%、次いでGoogleが37%と、Yahoo!JAPANがGoogleのエンジンを採用すれば、実質、国内検索エンジンシェアの9割をGoogleが握ることになります。</p>
<p>しかしながら次のようなコメントが発表されているように、もちろんGoogleとは競合関係であり、単純にGoogleの検索結果と同じものを提供するだけにはならないようです。</p>
<blockquote cite="http://www.itmedia.co.jp/news/articles/1007/27/news088.html" title="「Bingも無視していたわけではないが」――井上社長が語る、ヤフーがGoogleを選んだ理由">
<h1>「独自の味付け」でGoogleと勝負</h1>
<p>ヤフーにとっては「技術の提供元が変わる」（井上社長）というイメージ。技術の上に、ユーザーの要望に合わせた&quot;味付け&quot;を加えて独自サービスを展開することで、Googleとは引き続き競合していく。</p>
<p>現在、検索キーワードによっては、検索結果ページに地図や天気などWeb検索以外の要素も表示されるが、これらは「検索エンジン以外から出している」味付けに当たる部分。Googleの検索エンジンに変わっても「付加価値を付ける自由度は極めて高い」とした。</p>
</blockquote>
<p>ここで言及されている一部の味付け以外にも、どのような味付けが施されていくのか。ウェブ業界で仕事をしていると検索エンジンで上位に表示してくれというクライアントの要望が尽きることはありませんが、これまでYahoo!の検索結果の独自の味付けには苦い経験を強いられてきました。今では影響力が薄れてきたと言われていますが、数年前まで確かにひどい味付けがあったのです。</p>
</section>
<section>
<h3>これまでにもあった独自の味付け</h3>
<p>Yahoo!JAPANは日本のインターネットビジネスがまだ黎明期であった1996年4月からディレクトリによるウェブサイト検索サービスを提供開始しました。当時、Yahoo!JAPAN以外にもディレクトリサービスを提供する検索サイトは乱立していましたが、Yahoo!JAPANの利用者数はその中でも圧倒的であり、別格の存在でした。他の検索サイトにはいくら登録されてもアクセス数にはほとんど影響しなかったのに対し、Yahoo!JAPANのディレクトリにひとたび登録されればアクセス数はうなぎ上りに激増しました。</p>
<p>1990年代後半、一般家庭におけるインターネット回線の普及率が高まるとともにウェブも爆発的に普及し、人の手を介したディレクトリサービスだけでは満足な検索サービスを提供できなくなってきました。そこで、infoseekやgooといったロボット型検索エンジンが人気を集め始める中、ディレクトリ型検索サービスしかなかったYahoo!JAPANも、99年よりgooのロボット型検索エンジンを採用し、従来のディレクトリ検索にロボット検索を加えた検索サービスを開始しました。</p>
<p>大きなターニングポイントとなったのが2001年5月の出来事です。Yahoo!JAPANはこれまで無料で登録を受け付けていたディレクトリサービスから、有料（5万円、一部の指定業種は15万円）にて優先的に登録を受け付ける<a href="http://pr.yahoo.co.jp/release/2001/0420a.html">ビジネスエクスプレスサービス</a>を開始しました（さらに2005年4月から商用目的のサイトは完全有料登録となりました）。これを機に無料の登録申請で、Yahoo!JAPANに登録されることは非常に狭き門となり、「このサイトはYahoo!JAPANに登録されています」ということを掲げられているサイトが多く見られるようになるなど、Yahoo!JAPANのディレクトリに登録されることがサイト管理者にとっては一種のステータスとなっていました。</p>
<p>当時のYahoo!JAPANの検索結果は、ディレクトリに登録されているサイトの中で検索キーワードに該当するサイトが先行して表示され、その後にロボット検索の結果が続いて表示されるという形式でした。調査結果によって数値はいろいろと異なりますが、2ページ目以降を見るのは半数以下等の調査結果があったように、ディレクトリに登録されていなければ、ほとんどアクセスが期待できるはずもなく、多くのサイト管理者がYahoo!JAPANのディレクトリに登録されることを目標に日夜頑張られていたのです。</p>
<p>月日は流れ、検索ニーズは多様化していき、これに応じるため、2005年10月よりようやくディレクトリに登録されているサイト中心の検索結果から現在のYahoo!JAPANの検索結果と同じロボット検索による検索結果中心の形式となりました。しかしながら、その検索結果もディレクトリに登録されているサイトが優遇して表示され、ディレクトリに未登録だったサイトが目的のキーワードを含んでディレクトリに登録されれば検索結果の順位は見違えるほど上がるなど、これまでのYahoo!JAPANの検索結果にはディレクトリ登録に基づく独自の味付けが施されてきたのは紛れもない事実です。</p>
</section>
<section>
<h3>検索エンジンにおけるユーザの違い</h3>
<p>Googleが日本にやってきたのは、2000年9月のことです。Yahoo!JAPANの検索結果とは違い、Googleの検索結果は当初からロボット検索によるもので、すっきりとしたインターフェースに、クエリーに対して的を得た検索結果を返してくれると、インターネットの活用になれた利用者は、Yahoo!JAPANの検索結果に満足できず、続々とGoogleへと流れていきました。 </p>
<p>しかしながら、日本のインターネット利用者をレベル分けすると、ライトユーザ層が大半で、Yahoo!JAPANはそのライトユーザ層にとって絶対的な地位を今日まで築き続けてきました。その結果、Yahoo!JAPANにはライトユーザーや女性・若年層が多く、Googleにはヘビーユーザーや男性が多いといった、日本の検索エンジン市場にはいつのまにか独自の棲み分けが形成されてしまいました。</p>
</section>
<section>
<h3>仕事のためとペテン師も演じてきた</h3>
<p>ここまで長々と書いてきましたが、ポイント部分を抜粋してみると、</p>
<ul>
<li>Yahoo!JAPANの検索結果ではディレクリに登録されているサイトが優遇して表示されてきた。</li>
<li>商用目的のサイトは有料のビジネスエクスプレスサービスでしかディレクトリ登録を受け付けていない。</li>
<li>ライトユーザおよび、女性・若年層はYahoo!JAPANに定着してしまっている。</li>
</ul>
<p>と纏めることができるのですが、この条件が揃っているということは、たとえばウェブ上で女性をターゲットとした商売をする場合、対象となる女性ユーザ層の多くがYahoo!JAPANを利用することから検索エンジンによる入り口はYahoo!JAPANに絞られ、その結果、Yahoo!JAPANの検索結果で上位に表示されるためには有料のディレクトリ登録が必須要件であり、もはやビジネスエクスプレスサービスに頼らざるを得なかったというのが実態でした。</p>
<p>そして、私の仕事の話へと移るのですが、現在のフロントエンドエンジニア職に転身する前はWebプランナー兼ディレクター職だったということもあり、クライアントから検索結果で上位に表示してくれと<abbr title="Search Engine Optimization">SEO</abbr>に関する仕事依頼がおりてくることは少なくありませんでした。その都度、企画書を作成し、クライアントのもとへ説明に行くのですが、こういった仕事をしている時は何とも言えない虚無感に苛まされていました。</p>
<p>お金さえ払えば上位に表示されるということ自体は単純で分かり良いのですが、人の手を介していないロボットによる平等の検索結果が提供されるはずが、そうではなく恣意的に操作された検索結果であることがどうも納得できなかったのです。結局、お金で検索結果の順位を買っているようなものであり、自分がクライアントに説明している姿を客観的に想像すると、まるでペテン師を演じていたようなものでした。これでは親の経済力により学力に格差が生じ、教育機会に平等がないのと同じことだと、こんな仕事が自分のやりたかった仕事ではないと、3年間経験してきたプランナー・ディレクター職を離れることにしたひとつの理由がこのYahoo!JAPANに振り回されてきた愚かな過去にあります。</p>
<p>新たに生まれ変わるYahoo!JAPANの検索結果では、ロボット検索にディレクトリの登録有無による影響を受けることのないような、平等な検索結果を提供してくれるものであることに期待します。</p>
</section>]]>
</content>
</entry>
<entry>
<title>HTML5についてのおさらい</title>
<id>http://w3g.jp/blog/studies/html5report</id>
<link rel="alternate" type="text/html" href="http://w3g.jp/blog/studies/html5report" />
<published>2010-07-29T00:30:00+09:00</published>
<updated>2010-07-29T00:30:00+09:00</updated>
<summary>これからHTML5を使いはじめようという方に向けたHTML5のおさらいです。HTML5の記述方法にはじまり、導入にあたって間違いやすいところや勘違いしがちなところをまとめてあります。</summary>
<author>
<name>World Wide Web Guide</name>
</author>
<content type="html" xml:lang="ja" xml:base="http://w3g.jp/blog/">
<![CDATA[<header>
<h2>HTML5についてのおさらい</h2>
<p>これからHTML5を使いはじめようという方に向けたHTML5のおさらいです。HTML5の記述方法にはじまり、導入にあたって間違いやすいところや勘違いしがちなところをまとめてあります。</p>
<ins><p><code>hgroup</code>, <code>header</code>, <code>footer</code>要素の説明を含めた続きもあります(<a href="/blog/studies/html5report2">続HTML5についてのおさらい</a>)。</p></ins>
</header>
<section>
<h3>HTML5の記述方法</h3>
<p>まず最初に、必ずDOCTYPE宣言を行います。HTML5には公式の<abbr title="Document Type Definition">DTD</abbr>がないので、すごくシンプルになっています。</p>
<pre><code>&lt;!DOCTYPE html&gt; </code></pre>
<p>続いて、<code>html</code>要素にドキュメントの言語を宣言します。</p>
<pre><code>&lt;html lang=&quot;ja&quot;&gt;</code></pre>
<p>そして順番に<code>head</code>要素ときて、文字エンコーディングの指定ですが、<code>charset</code>属性が新たに利用できるようになりました。</p>
<pre><code>&lt;meta charset=&quot;UTF-8&quot;&gt; </code></pre>
<p>あとは今までで慣れ親しんだ書き方と同じなので、だいたいの骨格をまとめると次のようになります。</p>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ja&quot;&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;HTML5についてのおさらい - W3G&lt;/title&gt;
&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;/common.css&quot;&gt;
&lt;/head&gt;
&lt;body&gt;
...
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>なお、<code>html</code>,<code>head</code>,<code>body</code>要素と<code>link</code>, <code>script</code>要素に設定する<code>type</code>属性（例：<code>type=&quot;text/css&quot;</code>, <code>type=&quot;text/javascript&quot;</code>）は省略可能です。こうするとさらにすっきり。</p>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;HTML5についてのおさらい - W3G&lt;/title&gt;
&lt;link rel=&quot;stylesheet&quot; href=&quot;/common.css&quot;&gt;
...
</code></pre>
<p>XHTMLの記法になれてしまった方には朗報。終了タグの存在しない要素については、HTMLシリアライゼーションでもXHTMLのように<code> /&gt;</code>を付け足すこともできます。</p>
<pre><code>&lt;meta charset=&quot;UTF-8&quot; /&gt;</code></pre>
</section>
<section>
<h3>HTML5の新要素を使うには</h3>
<p>Firefox, Chromeが着々とシェアを伸ばしてはいますが、まだまだ全体的に見るとInternet Explorerがブラウザシェアの過半数を占めており、現在正式リリースされている最新バージョンであるInternet Explorer8でさえも、HTML5の新要素は未知の要素として、無視して取り扱われます。そのためHTML5の新要素を使うには、IEにとって未知の要素であるHTML5の新要素をレンダリングが行われる前に、その存在を覚えさせてあげる必要があります。</p>
<p>その方法とは<code>document.createElement(HTML5の新要素名);</code>を<code>head</code>内など先に記述しておきます。ですが、新要素の数はけっこうあるので、これを一つずつ記述するのは非常に面倒です。そこで、古いブラウザでもHTML5が使えるようになる便利なオープンソースのライブラリが用意されていますので、次のJavaScriptを<code>head</code>内に読み込ませれば、すぐにHTML5の新要素が使えるようになります。</p>
<pre><code>&lt;!--[if lt IE 9]&gt;
&lt;script src=&quot;http://html5shiv.googlecode.com/svn/trunk/html5.js&quot;&gt;&lt;/script&gt;
&lt;![endif]--&gt;</code></pre>
<p>最初の<code>&lt;!--[if lt IE 9]&gt;</code>と<code>&lt;![endif]--&gt;</code>がコメントで囲まれていますが、これはIEの独自仕様でIEだけ「もしIE9未満だった場合にのみ実行する」というコードとしてこれを解釈します。IE9からはHTML5に標準対応予定なので、このライブラリを読み込む必要がないためにこのように記述します。</p>
</section>
<section>
<h3>カテゴリ分けを知っておこう</h3>
<p>HTML5では要素ごとに目的に応じたグループ分けがなされており、従来のインライン要素にブロック要素を含めることができないといった概念と同様、そのカテゴリに属する要素にはどんなコンテンツ（要素およびテキスト）を含めることができるのかが定義されています（<a href="/html5/content_models">コンテンツ・モデル</a>を参照）。</p>
<p>このグループ分けによってできたカテゴリには次の8つがあります。</p>
<section>
<h4>メタデータ・コンテンツ</h4>
<p>主にドキュメントのメタデータや、スタイル、スクリプトの定義を行う要素がこれに分類されています。</p>
</section>
<section>
<h4>フロー・コンテンツ</h4>
<p><code>body</code>内（一部例外あり）に記述するコンテンツ（要素およびテキスト）全般がフロー・コンテンツに属します。ですので、HTML5の要素の多くはフロー・コンテンツに属し、フロー・コンテンツに属する要素は他のカテゴリにも属しています。</p>
</section>
<section>
<h4>セクショニング・コンテンツ</h4>
<p><strong>アウトライン（階層構造）を形成</strong>し、その内容が含んでいる範囲を定義する要素がこれに属します。</p>
<p>要素名を書き出しておきます。<code>article</code>,<code>aside</code>,<code>nav</code>,<code>section</code>の新要素です。</p>
</section>
<section>
<h4>ヘッディング・コンテンツ</h4>
<p>見出し関連の要素が属します。</p>
</section>
<section>
<h4>フレージング・コンテンツ</h4>
<p>これまでのインライン要素と似たようなものでテキストノードの要素がこれに属します。</p>
</section>
<section>
<h4>エンベッディド・コンテンツ</h4>
<p>他のリソースを組み込む要素やSVG, MathMLなどのHTMLではない別の言語で表されるコンテンツがこれに属します。</p>
</section>
<section>
<h4>インタラクティブ・コンテンツ</h4>
<p>ハイパーリンクなどユーザが何かしらの操作ができる要素がこれに属します。</p>
</section>
<section>
<h4>セクショニング・ルート</h4>
<p>独立した<strong>自身のアウトライン（階層構造）をもつ</strong>ことができる要素がこれに属します。</p>
<p>要素名を書き出しておきます。<code>blockquote</code>,<code>body</code>,<code>details</code>,<code>fieldset</code>,<code>fiqure</code>,<code>td</code>の要素です。</p>
</section>
<p>Aの要素の中にBの要素を含めてはいけないなどの構文については間違っていれば単純に文法エラーとなりますので、そこは<a href="/html5/content_models">コンテンツ・モデル</a>を参照してもらうとして、以上の8つのカテゴリ分けの中でもアウトライン（階層構造）に関わるところを強調したように、HTML5でのマークアップをはじめるにあたって重要になってくるのが<strong>アウトライン（階層構造）を意識したマークアップ</strong>です。HTML5でのマークアップをはじめる際にはセクションとアウトラインの関係についてしっかりと理解しておく必要があります。ここからが本題で、以下、主にアウトラインを意識したマークアップのための説明です。</p>
</section>
<section>
<h3>暗黙のセクションについて</h3>
<p>これから説明するセクションというのは、<code>section</code>要素のことではなく、概念上のセクションという意味です。</p>
<pre><code>&lt;body&gt;
&lt;h1&gt;A&lt;/h1&gt;
&lt;p&gt;B&lt;/p&gt;
&lt;h2&gt;C&lt;/h2&gt;
&lt;p&gt;D&lt;/p&gt;
&lt;h3&gt;E&lt;/h3&gt;
&lt;p&gt;F&lt;/p&gt;
&lt;h2&gt;G&lt;/h2&gt;
&lt;p&gt;H&lt;/p&gt;
&lt;/body&gt;</code></pre>
<p>HTML4やXHTML1では、どこからどこまでがその範囲なのかを明示的に示す要素はなかったため、<code>h1</code>〜<code>h6</code>の見出し要素を使って、その手がかりとしていました。HTML5に適合する<abbr title="User Agent">UA</abbr>であれば、HTML5のドキュメントにおいては、上記のようにセクショニング・コンテンツで明示されていない場合、アウトライン・アルゴリズムに従って、見出し要素が登場する度に、自動的に新たなセクションが始まるものと見なします。つまり次のようなアウトライン（階層構造）が形成されます。</p>
<ol>
<li>A...<code>body</code>セクションの見出しで、段落のBを含んでいる<ol>
<li>C...暗黙のセクションを開始する見出しで、段落のDを含んでいる<ol>
<li>E...暗黙のセクションを開始する見出しで、段落のFを含んでいる</li>
</ol></li>
<li>G...暗黙のセクションを開始する見出しで、段落のHを含んでいる</li>
</ol></li>
</ol>
<p>今度は上記の内容をセクショニング・コンテンツを使ってセクションを明示したマークアップを例にとってみましょう。なお、暗黙のセクションを取り上げましたが、HTML5のマークアップをする際は、この<strong>暗黙のセクションに依存するのではなく、必ずセクショニング・コンテンツでセクションを明示するようにしましょう</strong>。</p>
</section>
<section>
<h3>セクショニング・コンテンツを使ったセクションについて</h3>
<p>先の内容であれば、マークアップには<code>section</code>要素が妥当なので、<code>section</code>要素でセクションを明示していきます。</p>
<pre><code>&lt;body&gt;
&lt;h1&gt;A&lt;/h1&gt;
&lt;p&gt;B&lt;/p&gt;
&#160;&#160;&#160;&#160;&lt;section&gt;
&#160;&#160;&#160;&#160;&lt;h2&gt;C&lt;/h2&gt;
&#160;&#160;&#160;&#160;&lt;p&gt;D&lt;/p&gt;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;section&gt;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;h3&gt;E&lt;/h3&gt;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;p&gt;F&lt;/p&gt;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;/section&gt;
&#160;&#160;&#160;&#160;&lt;/section&gt;
&#160;&#160;&#160;&#160;&lt;section&gt;
&#160;&#160;&#160;&#160;&lt;h2&gt;G&lt;/h2&gt;
&#160;&#160;&#160;&#160;&lt;p&gt;H&lt;/p&gt;
&#160;&#160;&#160;&#160;&lt;/section&gt;
&lt;/body&gt;</code></pre>
<p>これで上記でもHTML5に適合するUAであれば暗黙のセクションの際と同じアウトライン（階層構造）が形成されます。</p>
<ol>
<li>A<ol>
<li>C<ol>
<li>E</li>
</ol></li>
<li>G</li>
</ol></li>
</ol>
<p>このようにHTML5ではセクションを明示したマークアップで、アウトライン（階層構造）を形成していく要領がつかめたかと思います。セクションを明示するセクショニング・コンテンツは<code>section</code>要素だけでなく、他にも<code>article</code>,<code>aside</code>,<code>nav</code>が存在し、どのように使い分ければ良いのかを迷うところでもあるのでそれぞれの用途について簡単に触れておきます。</p>
<section>
<h4><code>article</code>要素</h4>
<p>それ自身が独立した自己完結のコンテンツであることを表すのに使います。ブログのエントリーやエントリーへの各コメントなどです。RSS等のフィードで提供する内容に相応しかどうかで、<code>article</code>要素を使うかどうかの基準となります。</p>
</section>
<section>
<h4><code>aside</code>要素</h4>
<p>メインコンテンツから切り離すことができるコンテンツ（このコンテンツがなくなってもページが成り立つというコンテンツ）である場合に使います。メインコンテンツの中で使うか、外で使うかによって意味が変わってきます。たとえば、<code>article</code>要素の中で使う場合は、メインコンテンツの内容と何かしらの関連性がなければなりません。補足記事やブログのエントリーに対する各コメント（<code>article</code>要素として表すほどコメント自体が重要でないブログの場合）などが該当します。中で使う場合に対して、メインコンテンツの外で使う場合は、サイトやページ全体に関連性があることを示し、サイドバー（サイトによってはサイドではないかもしれません）や広告などに使います。</p>
<p><code>aside</code>要素のセクション内に無理に見出しを入れる必要はなく、HTML5適合UAであればデフォルトで<strong>Sidebar</strong>等(UAにより異なります)の見出しを生成してくれるはずです。サイドバーの用途じゃなくてもSidebarとなる点については気にしなくて大丈夫です。</p>
</section>
<section>
<h4><code>nav</code>要素</h4>
<p>主要なナビゲーションである場合に使います。<code>aside</code>要素のようにメインコンテンツ内で使う場合は、パンくずリストなどメインコンテンツに関連したナビゲーションであることを示すのに使ったり、メインコンテンツの外であれば、サイトやページ全体に関連するナビゲーションであることを指し示すためのグローバルナビゲーションなどに使用します。ただし、ヘッダとフッタの両方に全く同じリンク先の内容が重複しているようなナビゲーションの場合には、ヘッダの方のナビゲーションにだけ<code>nav</code>要素を使い、フッタの方にも<code>nav</code>要素を使用することは適しません。主要であることが大事で、ページ内に存在するナビゲーションの種類が多いか少ないかにもよりますが、ページ内の2〜3の主要なナビゲーションに使うのが良いのではないでしょうか。</p>
<p><code>aside</code>要素と同じでセクション内に無理に見出しを入れる必要はなく、HTML5適合UAであればデフォルトで<strong>Navigation</strong>等(UAにより異なります)の見出しを生成してくれるはずです。</p>
</section>
<section>
<h4><code>section</code>要素</h4>
<p>章・節・項のようなもっとも汎用的なセクションを表すのに使います。他のセクショニング・コンテンツ（<code>article</code>, <code>aside</code>, <code>nav</code>）の方が適しているような内容の場合には、必ずそちらを使います。また、自然に見出しを入れられない（見出しを伴えない）ような内容の場合や、スタイリングのためやスクリプティングを動作させる起点のために<code>section</code>要素を使ってはいけません。スタイリングやスクリプティング用途であれば、<code>div</code>要素を使います。</p>
<p>もし、<code>section</code>要素内に見出しを伴えない場合、そのセクションは<strong>Untitled section</strong>となります。この間違いも多いので、HTML5を使いはじめる際は、<code>section</code>要素によるセクションで<strong>Untitled section</strong>を生み出さないように注意しましょう。</p>
</section>
<p>では、以上をふまえて、次のようなHTML5ドキュメントの場合はどのようなアウトラインが形成されるか想像がつくでしょうか。</p>
<pre><code>&lt;body&gt;
&#160;&#160;&#160;&#160;&lt;nav&gt;
&#160;&#160;&#160;&#160;&lt;p&gt;&lt;a href=&quot;/&quot;&gt;Home&lt;/a&gt;&lt;/p&gt;
&#160;&#160;&#160;&#160;&lt;/nav&gt;
&lt;p&gt;Hello world.&lt;/p&gt;
&#160;&#160;&#160;&#160;&lt;aside&gt;
&#160;&#160;&#160;&#160;&lt;p&gt;My cat is cute.&lt;/p&gt;
&#160;&#160;&#160;&#160;&lt;/aside&gt;
&lt;/body&gt;</code></pre>
<p>上記には<code>body</code>,<code>nav</code>,<code>aisde</code>の3つのセクションが存在しますが、問題はセクショニング・ルートである<code>body</code>要素に対する見出しが存在しないことです。このため、この場合のアウトライン（階層構造）は次のように形成されてしまいます。</p>
<ol>
<li><strong>Untitled document</strong><ol>
<li>Navigation</li>
<li>Sidebar</li>
</ol></li>
</ol>
<p>これもHTML5の使いはじめの際によくやってしまいがちな間違いですので気をつけましょう。</p>
<p>また自分のドキュメントにて、どのようなアウトライン（階層構造）が形成されているかを確認できるオンラインツール（<a href="http://gsnedders.html5.org/outliner/">HTML 5 Outliner</a>）もあるので、ぜひ利用しましょう。このツールでは、<code>aside</code>, <code>nav</code>のデフォルトの見出しは生成しないので、Untitled sectionとなりますが、<code>aside</code>, <code>nav</code>によるセクションの場合のUntitled sectionは間違いではありませんので気にしなくて大丈夫です。</p>
</section>
<section>
<h3>見出しレベルの正しい使い方</h3>
<p>最後にもうひとつ、以下は推奨事項ですが、HTML5でのマークアップの際には気をつけておくべきなのが、見出しレベルの使い方です。</p>
<p>セクション内には、<code>h1</code>から<code>h6</code>までのどのレベルの見出しをも含むことができるのですが、<code>h1</code>要素だけを使うか、または、セクションのネストに合ったレベルの見出し要素を使うかの、どちらかの見出しレベルの出現ルールに沿ったマークアップをすることが強く推奨されています。</p>
<p>また、「暗黙のセクションに依存するのではなく...」と先述していたように一つのセクション内に複数の見出しを入れるのではなく、見出しごとにセクションを明示的に包含させていくことが推奨されています。</p>
<p><code>h1</code>要素だけを使った場合は、下記のようになります。</p>
<pre><code>&lt;body&gt;
&lt;h1&gt;A&lt;/h1&gt;
&lt;p&gt;B&lt;/p&gt;
&#160;&#160;&#160;&#160;&lt;section&gt;
&#160;&#160;&#160;&#160;&lt;h1&gt;C&lt;/h1&gt;
&#160;&#160;&#160;&#160;&lt;p&gt;D&lt;/p&gt;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;section&gt;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;h1&gt;E&lt;/h1&gt;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;p&gt;F&lt;/p&gt;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;/section&gt;
&#160;&#160;&#160;&#160;&lt;/section&gt;
&#160;&#160;&#160;&#160;&lt;section&gt;
&#160;&#160;&#160;&#160;&lt;h1&gt;G&lt;/h1&gt;
&#160;&#160;&#160;&#160;&lt;p&gt;H&lt;/p&gt;
&#160;&#160;&#160;&#160;&lt;/section&gt;
&lt;/body&gt;</code></pre>
<section>
<h4>セクショニング・ルートにおける見出しとアウトライン</h4>
<p>なお、セクショニング・ルートである<code>blockquote</code>,<code>details</code>,<code>fieldset</code>,<code>fiqure</code>,<code>td</code>の要素内に見出しを伴う際は、<strong>独自のアウトラインをもつことになるので上位要素からの見出しレベルを継承しません</strong>。</p>
<p>たとえば、<code>h1</code>要素から開始してセクションのネストに合った見出しレベルに沿ったマークアップをしていたのであれば、セクショニング・ルート内では見出しレベルをリセットして、再び<code>h1</code>要素から開始させることもできます（もちろん、どのレベルの見出しをも含むことができるので、そのセクショニング・ルート内での後続の見出しレベルがセクションのネストにあった見出しレベルの使い方に沿っていれば<code>h1</code>要素以外から開始しても可です）。</p>
<pre><code>&lt;body&gt;
&lt;h1&gt;A&lt;/h1&gt;
&lt;p&gt;B&lt;/p&gt;
&#160;&#160;&#160;&#160;&lt;section&gt;
&#160;&#160;&#160;&#160;&lt;h2&gt;C&lt;/h2&gt;
&#160;&#160;&#160;&#160;&lt;p&gt;D&lt;/p&gt;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;blockquote&gt;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;h1&gt;E&lt;/h1&gt;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;p&gt;F&lt;/p&gt;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;section&gt;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;h2&gt;G&lt;/h2&gt;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;p&gt;H&lt;/p&gt;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;/section&gt;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;/blockquote&gt;
&#160;&#160;&#160;&#160;&lt;/section&gt;
&lt;/body&gt;</code></pre>
<p>このHTML5ドキュメントの場合のアウトライン（階層構造）は次のように形成されます。</p>
<ol>
<li>A<ol>
<li>C</li>
</ol></li>
</ol>
<p><code>blockquote</code>要素に含まれているEとGが見当たりませんが、これは前述のとおり、セクショニング・ルートのアウトラインは自身のアウトラインとして独立するので、<code>blockquote</code>要素のセクションはここからは別離しているためです。</p>
</section>
</section>]]>
</content>
</entry>
<entry>
<title>IE+jQueryでHTML5新要素のDOM操作</title>
<id>http://w3g.jp/blog/studies/jquery_html5element_attention</id>
<link rel="alternate" type="text/html" href="http://w3g.jp/blog/studies/jquery_html5element_attention" />
<published>2010-07-26T16:22:47+09:00</published>
<updated>2010-07-26T16:22:47+09:00</updated>
<summary>jQueryのオブジェクトを操作できるメソッドを用いてHTML5の新要素を操作する際は、現行MicrosoftからリリースされているIE8までのバージョンでは、HTML5の新要素を認識できずシンタックスエラーがでるので注意が必要です。</summary>
<author>
<name>World Wide Web Guide</name>
</author>
<content type="html" xml:lang="ja" xml:base="http://w3g.jp/blog/">
<![CDATA[<header>
<h2>IE+jQueryでHTML5新要素のDOM操作</h2>
<p>jQueryの<code>prepend()</code>, <code>append()</code>, <code>appendTo()</code>, <code>before()</code>, <code>after()</code>, <code>html()</code>, <code>wrap()</code>, <code>wrapInner()</code>, <code>wrapAll()</code>など、指定のセレクタに対してオブジェクトを操作できるメソッドを用いてHTML5の新要素を操作する際は、現行MicrosoftからリリースされているIE8までのバージョンでは、HTML5の新要素が認識できないので注意が必要です。</p>
</header>
<section>
<h3>この罠に嵌ることが想定される事態</h3>
<p>HTML5でリニューアルされているサイトが散見されるようになってきた今日この頃ですが、表題の問題で混乱が起こることが想定される事態としては、IE6～8の環境用に<code>HTML5.js</code>のライブラリを組み込んでいたり、もしくは事前にHTML5の新要素群を<code>document.createElement()</code>で作成済みなので、「よし、これでjQueryでもHTML5の新要素群が操作できるね！」と思い込んでしまうところに罠が潜んでいるのです。つまり、jQueryでの操作の際には、IE6～8にはまだHTML5の新要素群が認識できていないのです。じゃあ、どうすれば良いのさということで、解決のアプローチを！</p>
</section>
<section>
<h3>ネイティブのDOM操作と組み合わせる</h3>
<p>ネイティブっていうのは、JavaScriptのことを指します。HTML5の新要素群が認識できないIE6～8のようなブラウザに対しては、jQueryのメソッドを使うのではなく、ネイティブのJavaScriptでのDOM操作を上手く組み合わせてあげる必要があります。では作例を。</p>
<pre><code>var testSection = document.createElement('section');
testSection.id = "test";
document.getElementById('追加したい部分のID名').appendChild(testSection);
$('#test').html('これで安心してjQueryでも操作できるよ!');
</code></pre>
<p>まず最初に追加したいHTML5の新要素は、<code>document.createElement('ここに追加したいHTML5の要素名')</code>で作成しておいてあげる必要があります。これを変数に格納し、加えてDOM操作がしやすいようにID名も付与（<code>先の変数名.id="ID名"</code>）しておいてあげます。あとは追加したいところに対して、appendChild等で追加します。最後の<code>$('#test')</code>の行にはjQueryの書式を用いているように、この流れで追加してあげたHTML5の新要素については、IE6～8+jQueryでも操作することができます。</p>
<p>ですが、これだけでは万事がOKとは中々いかないですよね。ネイティブのJavaScriptのDOM操作である<code>appendChild()</code>だと追加したい要素の子ノードリストの末尾にしか追加できないため、他にも要素を追加されていると、順番がうまく制御できません。では、もう少しネイティブのJavaScriptで追加したい場所の選択肢を広げられる方法を模索してみましょう。</p>
</section>
<section>
<h3>追加できる場所の選択肢を広げる</h3>
<p>jQueryだと、<code>prepend()</code>, <code>append()</code>, <code>appendTo()</code>, <code>before()</code>, <code>after()</code>などDOM操作は自由自在で、こういう時にこそ、jQueryの偉大さを痛感します。普段、jQueryでDOMを操作している人が、ネイティブのJavaScriptでDOMを操作するとなると不便を感じますが、近しいことができるように以下にいくつかのアプローチ例を示します。</p>
<section>
<h4>対象ノードの前に挿入する場合</h4>
<pre><code>var testSection = document.createElement('section');
testSection.id = "test";
var target = document.getElementById('追加したい部分のID名');
変数targetの親ノード.insertBefore(testSection, target);
$('#test').html('これで安心してjQueryでも操作できるよ!');</code></pre>
<p>これでjQueryの<code>before()</code>と同様のことが実現できます。</p>
</section>
<section>
<h4>子ノードの先頭に挿入する場合</h4>
<pre><code>var testSection = document.createElement('section');
testSection.id = "test";
var target = document.getElementById('追加したい部分のID名');
target.insertBefore(testSection, target.firstChild);
$('#test').html('これで安心してjQueryでも操作できるよ!');</code></pre>
<p>末尾に追加する<code>appendChild()</code>とは反対で、これでjQueryの<code>prepend()</code>と同じ先頭に追加させることが実現できます。</p>
</section>
<section>
<h4>対象ノードの後に挿入する場合</h4>
<pre><code>var testSection = document.createElement('section');
testSection.id = "test";
var target = document.getElementById('追加したい部分のID名');
変数targetの親ノード.insertBefore(testSection, target.nextSibling);
$('#test').html('これで安心してjQueryでも操作できるよ!');</code></pre>
<p>jQueryの<code>after()</code>と同様のことが実現できます。</p>
</section>
<section>
<h4>子ノード内の何番目に挿入するか指定する場合</h4>
<pre><code>var testSection = document.createElement('section');
testSection.id = "test";
var target = document.getElementById('追加したい部分のID名');
target.insertBefore(testSection, target.childNodes.item(数字));
$('#test').html('これで安心してjQueryでも操作できるよ!');</code></pre>
</section>
<p>これでjQueryでHTML5の新要素を追加しようとしていたのと同様のことが、IE6〜8のようにHTML5の新要素を認識していないブラウザにおいてもカバーさせることができるようになったのではないかと思います。</p>
</section>]]>
</content>
</entry>
</feed>

