<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
   <title>スタイルシートをめぐる冒険</title>
   <link rel="alternate" type="text/html" href="http://norisfactory.com/stylesheetlab/" />
   <link rel="self" type="application/atom+xml" href="http://norisfactory.com/stylesheetlab/atom.xml" />
   <id>tag:norisfactory.com,2006:/stylesheetlab//1</id>
   <updated>2007-10-20T04:51:51Z</updated>
   <subtitle>スタイルシートを飼いならすためのtips集</subtitle>
   <generator uri="http://www.sixapart.com/movabletype/">Movable Type 3.35</generator>

<entry>
   <title>「font-family: 細明朝体」でスタイル指定が無視される</title>
   <link rel="alternate" type="text/html" href="http://norisfactory.com/stylesheetlab/000060.php" />
   <id>tag:norisfactory.com,2007:/stylesheetlab//1.60</id>
   
   <published>2007-10-19T13:46:51Z</published>
   <updated>2007-10-20T04:51:51Z</updated>
   
   <summary>font-familyに細明朝体を指定すると、それ以降のスタイル指定がすべて無視される、という現象。これを発見したのは、管理人が...</summary>
   <author>
      <name>nori</name>
      
   </author>
         <category term="ソースの記述" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://norisfactory.com/stylesheetlab/">
      <![CDATA[<p>font-familyに細明朝体を指定すると、それ以降のスタイル指定がすべて無視される、という現象。これを発見したのは、管理人が手がけたあるサイトの中のページについて、顧客から「レイアウトがガタガタにくずれているよ」と指摘されたことがきっかけだった（公開前のテスト段階の話だが）。なぜ、指摘されるまで気付かなかったかというと、これがIE6以前でのみ起こり、IE7やFirefoxでは発生しない現象だからだ。Web制作を仕事としている以上、こんなことは言い訳にならないのだが、このときはたまたま見逃してしまった。<br />
[該当するブラウザ]<br />
Windows／IE5.0、IE5.5、IE6.0</p>]]>
      <![CDATA[<div class="label3">症状</div>
<p>この現象を再現してみよう。スタイルシートとHTMLは以下の通りである。</p>
<div class="section">
【スタイルシート】
<code class="pre">p.default {
	border: 1px solid #000000;
	background: #cccccc;
	padding: 10px;
	width: 200px;
	font-size: 9px;
	text-align: center;
	margin-bottom: 10px;
}
p.hosomin {
	font-family: &quot;細明朝体&quot;;
	border: 1px solid #000000;
	background: #cccccc;
	padding: 10px;
	width: 200px;
	font-size: 9px;
	text-align: center;
	margin-bottom: 10px;
}</code>
【HTML】
<code>&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot;<br />
&quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;<br />
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;<br />
&lt;head&gt;<br />
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;<br />
&lt;title&gt;「font-family: 細明朝体」以降のスタイル指定が無視される&lt;/title&gt;<br />
&lt;link href=&quot;../sample_css/code003_1.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;p class=&quot;default&quot;&gt;フォントファミリー指定なし&lt;/p&gt;<br />
&lt;p class=&quot;hosomin&quot;&gt;フォントファミリー: 細明朝体&lt;/p&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</code>
</div>
<div class="fig">●Firefoxで表示させた場合<img src="http://norisfactory.com/stylesheetlab/sample_img/screen_code3_1.gif" alt="" width="238" height="105" />
●IE6.0で表示させた場合<img src="http://norisfactory.com/stylesheetlab/sample_img/screen_code3_2.gif" alt="" width="238" height="92" /></div>
<p>これをFirefoxとIE6.0で表示させ、それぞれスクリーンショットをとってみた。二つのパラグラフは、font-family以外まったく同じスタイル指定なのだが、IE6.0では、1行目に「font-family: "細明朝体"」としたパラグラフへのスタイル指定がすべて無視されてしまう。（&rarr;<a href="http://norisfactory.com/stylesheetlab/sample_html/code003_ex1.html">テストページ1</a>）</p>
<div class="label3">原因</div>
<p>原因、というか、この現象が起こるメカニズムは解明できなかったのだが、検証した内容を簡単にまとめておく。</p>
<p>まず、悪さをしているのはおそらく「細」「明」「朝」「体」という4文字のうちのどれかではないかと当たりをつけ、個々の文字で試してみたところ、「細」と「体」でこの現象が起きることがわかった。</p>
<p>次に「細」と「体」の文字コードを調べてみると、前者は8DD7、後者は91CC。それぞれの末尾の文字コードが共通する「沌」（93D7）、「栂」（92CC）、半角カタカナの「ﾗ」（D7）、「ﾌ」（CC）でも試してみると、想像通り、いずれの場合もスタイル指定無視が発生した。</p>
<p>さらに、文字を囲むダブルクォーテーションをとると、以降のスタイル指定がすべて無視されるのでなく、その次の行だけ無視されることがわかった（&rarr;<a href="http://norisfactory.com/stylesheetlab/sample_html/code003_ex2.html">テストページ2</a>）。</p>
<div class="section">
【スタイルシート】
<code class="pre">p.hosomin-test1 {
	font-family: &quot;細&quot;;
	border: 1px solid #000000;
	background: #cccccc;
	padding: 10px;
	width: 200px;
	font-size: 9px;
	text-align: center;
	margin-bottom: 10px;
}
p.hosomin-test2 {
	font-family: &quot;明&quot;;
	border: 1px solid #000000;
	background: #cccccc;
	padding: 10px;
	width: 200px;
	font-size: 9px;
	text-align: center;
	margin-bottom: 10px;
}
p.hosomin-test3 {
	font-family: &quot;朝&quot;;
	border: 1px solid #000000;
	background: #cccccc;
	padding: 10px;
	width: 200px;
	font-size: 9px;
	text-align: center;
	margin-bottom: 10px;
}
p.hosomin-test4 {
	font-family: &quot;体&quot;;
	border: 1px solid #000000;
	background: #cccccc;
	padding: 10px;
	width: 200px;
	font-size: 9px;
	text-align: center;
	margin-bottom: 10px;
}
p.hosomin-test5 {
	font-family: &quot;栂&quot;;
	border: 1px solid #000000;
	background: #cccccc;
	padding: 10px;
	width: 200px;
	font-size: 9px;
	text-align: center;
	margin-bottom: 10px;
}
p.hosomin-test6 {
	font-family: &quot;沌&quot;;
	border: 1px solid #000000;
	background: #cccccc;
	padding: 10px;
	width: 200px;
	font-size: 9px;
	text-align: center;
	margin-bottom: 10px;
}
p.hosomin-test7 {
	font-family: &quot;ﾌ&quot;;
	border: 1px solid #000000;
	background: #cccccc;
	padding: 10px;
	width: 200px;
	font-size: 9px;
	text-align: center;
	margin-bottom: 10px;
}
p.hosomin-test8 {
	font-family: &quot;ﾗ&quot;;
	border: 1px solid #000000;
	background: #cccccc;
	padding: 10px;
	width: 200px;
	font-size: 9px;
	text-align: center;
	margin-bottom: 10px;
}
p.hosomin-test9 {
	font-family: ﾗ;
	border: 1px solid #000000;
	background: #cccccc;
	padding: 10px;
	width: 200px;
	font-size: 9px;
	text-align: center;
	margin-bottom: 10px;
}</code>
</div>
<div class="label3">対策</div>
<p>種明かしのようになってしまうが、実は、この現象はMovable TypeでWebサイト構築を行っているときにたまたま発生した。「Movable Typeで～」ということは、HTMLファイルの文字コードはデフォ ルトではUTF-8になる。それに対して、CSSファイルはDreamweaverで作ってFTPで直接サーバーにアップロードしたので、文字コードはシフトJIS。つまり、HTMLファイルとCSSファイルの文字コードが一致していないためにこのような現象が起きたのである。したがって、CSSとHTMLの文字コードを統一するか、または、CSSに文字コードを明示すればこの現象は回避される（&rarr;<a href="http://norisfactory.com/stylesheetlab/sample_html/code003_ex3.html">テストページ3</a>）。</p>
<div class="section">
【スタイルシート】
<code class="pre">@charset "shift_jis";
p.default {
	border: 1px solid #000000;
	background: #cccccc;
	padding: 10px;
	width: 200px;
	font-size: 9px;
	text-align: center;
	margin-bottom: 10px;
}
p.hosomin {
	font-family: &quot;細明朝体&quot;;
	border: 1px solid #000000;
	background: #cccccc;
	padding: 10px;
	width: 200px;
	font-size: 9px;
	text-align: center;
	margin-bottom: 10px;
}</code>
</div>]]>
   </content>
</entry>
<entry>
   <title>clearfixの決定版を作る －Mac IE編－</title>
   <link rel="alternate" type="text/html" href="http://norisfactory.com/stylesheetlab/000047.php" />
   <id>tag:norisfactory.com,2007:/stylesheetlab//1.47</id>
   
   <published>2007-09-08T06:23:55Z</published>
   <updated>2007-09-08T06:25:45Z</updated>
   
   <summary>前回のIE編の冒頭で、私は「CSS自体の正しさとか美しさを優先し、そのためには古いバージョンのブラウザは犠牲になってもしょうがな...</summary>
   <author>
      <name>nori</name>
      
   </author>
         <category term="01_CSS実験室" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://norisfactory.com/stylesheetlab/">
      <![CDATA[<p>前回のIE編の冒頭で、私は「CSS自体の正しさとか美しさを優先し、そのためには古いバージョンのブラウザは犠牲になってもしょうがない」と書いた。その流れでいえば、マイクロソフトもサポートを打ち切ったMac版IEにそもそも対応する必要があるのか、IE編でWin版IE5.0を無視したのだから、Mac版IEも無視していいのではないか、という疑問が当然わく。至極もっともなことである。が、しかし、それで終わってしまっては本稿自体が成り立たない。しぶしぶではあるが、Mac版IE（5.x）でfloatをクリアする方法を探ってみよう。結論はもうすでに出ている。以下の通りである。</p>]]>
      <![CDATA[<div class="section">
<code class="pre">.clearfix:after {
	content: url(pixel.gif);
	display: block;
	clear: both;
	height: 0;
}
.clearfix { display: inline-block; }
/* Mac版IEを除外 \*/
.clearfix { display: block; }
/* */</code>
</div>
<p>前回、触れたように、「display: inline-block」にはMac版IEでもfloatクリア効果がある。しかし、Win版IEと違って、「display: block」に戻すとfloatクリア効果も消えてしまうので、その部分にバックスラッシュハックを用い、適用対象からMac版IEを除外する。結局、最後にハックに手を出してしまい、スッキリしない気持ちは残るが、これで、晴れてMac版IEでもfloatをクリアできるようになったわけだ。</p>
<p>ただし、気を付けなければならないのは、このclearfixを適用させた要素は、Mac版IEではインライン的に扱われてしまうこと。例えば、margin: autoでのセンター合わせなどはできなくなる。したがって、div要素などに一律に指定するのでなく、上記ソースのようにクラスとして用意し、floatクリアが必要な要素にだけ適用させるようにしたほうがいい。でないと、Mac版IEで予期せぬ事態を引き起こす。</p>
<p>もし、インライン的に扱われることを嫌うなら、ソースとしてはますます汚くなるが、下記のように「overflow: hidden」をMac版IEにだけ適用させる方法もある。</p>
<div class="section">
<code class="pre">.clearfix:after {
	content: url(pixel.gif);
	display: block;
	clear: both;
	height: 0;
}
.clearfix { display: inline-block; }
.clearfix { display: block; }
/* Mac版IEのみに適用 \*//*/
.clearfix { overflow: hidden; }
/* */</code>
</div>]]>
   </content>
</entry>
<entry>
   <title>clearfixの決定版を作る －IE編－</title>
   <link rel="alternate" type="text/html" href="http://norisfactory.com/stylesheetlab/000046.php" />
   <id>tag:norisfactory.com,2007:/stylesheetlab//1.46</id>
   
   <published>2007-09-04T12:30:35Z</published>
   <updated>2007-09-05T12:51:05Z</updated>
   
   <summary>今回は、floatバグ対策における鬼門ともいえるIEのclearfixに挑戦する。しかし、その前に、何をもって「決定版」とするか...</summary>
   <author>
      <name>nori</name>
      
   </author>
         <category term="01_CSS実験室" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://norisfactory.com/stylesheetlab/">
      <![CDATA[<p>今回は、floatバグ対策における鬼門ともいえるIEのclearfixに挑戦する。しかし、その前に、何をもって「決定版」とするか、あらためておさえておこう。本来なら、ひとつでも多くの種類、バージョンのブラウザでfloatをクリアできる（もしくは同じ効果を得られる）ことをもって、決定版とすべきなのだろうが、ここでは少し違う方針をとりたいと思う。簡単にいえば、CSS自体の正しさとか美しさを優先したいということだ。逆に、そのためには古いバージョンのブラウザなどは犠牲になってもしょうがない、と考えている。ここでいう「決定版」を定義してみよう。</p>]]>
      <![CDATA[<p><strong>1. 文法的に正しいこと</strong><br />
このこととイコールとするには異論があるかもしれないが、「W3Cのvalidatorを通ること」と言い換えることもできる。少なくとも、通らないより通るほうがいい。</p>
<p><strong>2. 内容的に理にかなっていること、意味不明でないこと</strong><br />
いわゆるCSSハックは、記述通りに理解しようとするとその多くが意味不明である。文法的に間違っていれば当然として、仮に文法的に正しかったとしても、そういったテクニックにはなるべく頼らないようにしたい。また、CSSプロパティを本来とは異なる目的で使用することもできる限り避けたい。</p>
<p><strong>3. シンプルであること</strong><br />
極力無駄な記述を省き、1行でも短くする。</p>
<p>さて、前置きが長くなってしまったが、本論に入ることにする。今回のIE編の検証にあたって用意したスタイルシートとHTMLは以下の通りである。（<a href="http://norisfactory.com/stylesheetlab/sample_html/clearfix_for_IE.html">サンプルページはこちら</a>）</p>

<div class="section">
【スタイルシート】
<code class="pre">/* その1 */
.clearfixforie1 { height: 1%; }
/* その2 */
.clearfixforie2 { display: inline-block; }
.clearfixforie2 { display: block; }
/* その3 */
.clearfixforie3 { zoom: 1; }
/* その4 */
.clearfixforie4 {
	overflow: auto;
	width: 100%;
}
/* その5 */
.clearfixforie5 {
	overflow: hidden;
	width: 100%;
}
/* モダンブラウザ向けclearfix */
.clearfix:after {
	content: url(pixel.gif);
	display: block;
	clear: both;
	height: 0;
}
/* ボックスの設定 */
.wrapper { width: 200px; }
.box-A {
	background: #cccccc;
	margin-bottom: 10px;
}
.box-B {
	width: 100px;
	height: 100px;
	background: #000000;
	float: left;
}
.box-C {
	width: 100px;
	height: 50px;
	background: #666666;
	float: right;
}</code>
【HTML】
<code>&lt;div class=&quot;wrapper&quot;&gt;<br />
&lt;div class=&quot;box-A clearfixforie1 clearfix&quot;&gt;<br />
&lt;div class=&quot;box-B&quot;&gt;&lt;/div&gt;<br />
&lt;div class=&quot;box-C&quot;&gt;&lt;/div&gt;<br />
&lt;/div&gt;<br />
&lt;div class=&quot;box-A clearfixforie2 clearfix&quot;&gt;<br />
&lt;div class=&quot;box-B&quot;&gt;&lt;/div&gt;<br />
&lt;div class=&quot;box-C&quot;&gt;&lt;/div&gt;<br />
&lt;/div&gt;<br />
&lt;div class=&quot;box-A clearfixforie3 clearfix&quot;&gt;<br />
&lt;div class=&quot;box-B&quot;&gt;&lt;/div&gt;<br />
&lt;div class=&quot;box-C&quot;&gt;&lt;/div&gt;<br />
&lt;/div&gt;<br />
&lt;div class=&quot;box-A clearfixforie4&quot;&gt;<br />
&lt;div class=&quot;box-B&quot;&gt;&lt;/div&gt;<br />
&lt;div class=&quot;box-C&quot;&gt;&lt;/div&gt;<br />
&lt;/div&gt;<br />
&lt;div class=&quot;box-A clearfixforie5&quot;&gt;<br />
&lt;div class=&quot;box-B&quot;&gt;&lt;/div&gt;<br />
&lt;div class=&quot;box-C&quot;&gt;&lt;/div&gt;<br />
&lt;/div&gt;<br />
&lt;/div&gt;</code>
</div>

<p>簡単に解説を。</p>
<p>その1の「height: 1%」は、IE向け記述の標準形。通常は、IE以外に適用させないために、いわゆるスターハックと組み合わせて、「* html .clearfix { height: 1%; }」という形で用いられる。別名、Holly Hackとも呼ばれる。（<a href="http://www.positioniseverything.net/explorer/escape-floats.html">IE Escaping Floats Bug</a> 参照）</p>
<p>その2の「display: inline-block」は、一般にIE7およびMac版IE向けの記述とされるもの。すぐその後に、「display: block」としているのは、Opera、Safari対策である（inline-blockについては、<a href="http://norisfactory.com/stylesheetlab/000039.php">inline-blockの奇妙な世界</a> 参照）。</p>
<p>その3の「zoom: 1」は、IE5.5以降の独自拡張であるzoomプロパティを利用した記述で、Holly Hackと同じ効果をCSSハックに頼ることなく得られる。</p>
<p>その4とその5は、IEに限らず全ブラウザが対象で、いわゆるclearfixのようなややこしいことをしなくてももっと簡単にfloatをクリアできる、としてよく紹介されているテクニックである。（<a href="http://www.quirksmode.org/css/clearing.html">CSS - Clearing floats</a> 参照）</p>
<p>さらに、モダンブラウザへの影響を調べるために、全ブラウザ向けのその4とその5を除いては、after擬似要素を用いたモダンブラウザ向けclearfixも併記した。</p>
<p>このソースを用いて、各ブラウザで検証してみた結果は以下の通りである。</p>

<table cellspacing="0">
<tr>
<th>IEの場合</th><th>7.0</th><th>6.0</th><th>5.5</th><th>5.0</th>
</tr>
<tr>
<td>その1（height: 1%）</td><td>○</td><td>○</td><td>○</td><td>○</td>
</tr>
<tr>
<td>その2（display: inline-block）</td><td>○</td><td>○</td><td>○</td><td>×</td>
</tr>
<tr>
<td>その3（zoom: 1）</td><td>○</td><td>○</td><td>○</td><td>×</td>
</tr>
<tr>
<td>その4（overflow: auto）</td><td>○</td><td>○</td><td>○</td><td>×</td>
</tr>
<tr>
<td>その5（overflow: hidden）</td><td>○</td><td>○</td><td>○</td><td>○</td>
</tr>
<tr>
<th>モダンブラウザの場合</th><th>Firefox2.0</th><th>Opera9.21</th><th>Netscape7.1</th><th>Safari1.0</th>
</tr>
<tr>
<td>その1（height: 1%）</td><td>○</td><td>○</td><td>○</td><td>○</td>
</tr>
<tr>
<td>その2（display: inline-block）</td><td>○</td><td>○</td><td>○</td><td>○</td>
</tr>
<tr>
<td>その3（zoom: 1）</td><td>○</td><td>○</td><td>○</td><td>○</td>
</tr>
<tr>
<td>その4（overflow: auto）</td><td>○</td><td>○</td><td>○</td><td>○</td>
</tr>
<tr>
<td>その5（overflow: hidden）</td><td>○</td><td>○</td><td>×</td><td>○</td>
</tr>
</table>

<p>この検証結果を踏まえて、消去法でclearfixの決定版を探っていこう。</p>
<p>まず、最初に候補から外れるのは、その4とその5のoverflowを用いた方法だ。値がautoではIE5.0がダメ（この表にはないがMac版IE5.xも）。hiddenでは、Netscape7.1がダメ。さらに、Netscape6ではauto、hiddenともにレイアウトくずれが発生する。また、IE6以前用にwidth: 100%としなければならないのも、同時にpaddingやborderが指定できない点で汎用的なクラスとしての使い勝手を狭めている。</p>
<p>と、ここまでは簡単なのだが、次のステップで早々につまづいてしまう。残りの3つとも、それぞれ一長一短があり、頭ひとつ抜けたものがないのだ。ブラウザへの対応状況を優先するなら文句なしに「height: 1%」だが、その意味不明の記述がどうしても引っかかる。しかし、ここで冒頭に掲げた決定版の定義をあらためて思い出して、強引に話を進めることにしよう。</p>
<p>まず、IE独自拡張のためvalidaterを通らない「zoom: 1」は外す。次に、IE5.0は無視することにして、「height: 1%」も外す。これで自動的に、IE向けclearfixの決定版は「display: inline-block」ということになった。しかも、inline-blockという値自体には、Operaでも、Safariでも、Mac版IEでもfloatクリア効果があるので、その目的で使用するのは理にかなったことともいえる。難は、すぐその後に「display: block」と続けなければならないところが、パッと見には「？」であることだが。</p>
<p>最後に、モダンブラウザ・IE両対応のclearfix決定版をまとめておこう。</p>

<div class="section">
<code class="pre">.clearfix:after {
	content: url(pixel.gif);
	display: block;
	clear: both;
	height: 0;
}
.clearfix { display: inline-block; }
.clearfix { display: block; }</code>
</div>

<p>次回は、Mac版IE向けclearfixの決定版を探り、このシリーズの最終回としたい。</p>]]>
   </content>
</entry>
<entry>
   <title>inline-blockの奇妙な世界</title>
   <link rel="alternate" type="text/html" href="http://norisfactory.com/stylesheetlab/000039.php" />
   <id>tag:norisfactory.com,2007:/stylesheetlab//1.39</id>
   
   <published>2007-06-02T01:47:34Z</published>
   <updated>2007-08-25T12:11:53Z</updated>
   
   <summary>inline-blockとは、displayプロパティの値のひとつで、表示形式を「インラインに流し込むことのできるブロック要素」...</summary>
   <author>
      <name>nori</name>
      
   </author>
         <category term="01_CSS実験室" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://norisfactory.com/stylesheetlab/">
      <![CDATA[<p>inline-blockとは、displayプロパティの値のひとつで、表示形式を「インラインに流し込むことのできるブロック要素」にするためのもの。まともに対応しているのが、OperaとSafari、それになぜかMac版IEくらいというマイナーな存在だが、なかなか興味深い振る舞いをする値なので、いろいろと検証してみた。</p>]]>
      <![CDATA[<p>まず、「インラインに流し込むことのできるブロック要素」とはどういうものなのかを見てみるために、.inlineblockというクラスを作り、div要素に指定してみた。また、「インラインに流し込むことのできるブロック要素」とは、言い換えれば、「幅と高さを指定できるインライン要素」ということだから、span要素にも指定した。</p>
<div class="section">
<a href="http://norisfactory.com/stylesheetlab/sample_html/inline-block1.html">インラインブロックの検証 その1</a><br />
【スタイルシート】
<code class="pre">.inlineblock {
	display: inline-block;
	width: 100px;
	height: 30px;
	background: #000000;
	font-size: 10pt;
	line-height: 30px;
	text-align: center;
	color: #ffffff;
	margin-bottom: 1px;
}</code>
<br />
【HTML】
<code>&lt;p&gt;div要素にdisplay: inline-blockを指定した場合&lt;/p&gt;<br />
&lt;div class=&quot;inlineblock&quot;&gt;inline-block&lt;/div&gt;<br />
&lt;div class=&quot;inlineblock&quot;&gt;inline-block&lt;/div&gt;<br />
&lt;div class=&quot;inlineblock&quot;&gt;inline-block&lt;/div&gt;<br />
&lt;div class=&quot;inlineblock&quot;&gt;inline-block&lt;/div&gt;<br />
&lt;p&gt;span要素にdisplay: inline-blockを指定した場合&lt;/p&gt;<br />
&lt;span class=&quot;inlineblock&quot;&gt;inline-block&lt;/span&gt;<br />
&lt;span class=&quot;inlineblock&quot;&gt;inline-block&lt;/span&gt;<br />
&lt;span class=&quot;inlineblock&quot;&gt;inline-block&lt;/span&gt;<br />
&lt;span class=&quot;inlineblock&quot;&gt;inline-block&lt;/span&gt;</code>
</div>
<p>これを、inline-blockに対応しているOperaと、対応していないFirefoxで表示させてみようと思うのだが、その前に、IEについて触れておかなければならない。最初に、inline-blockにちゃんと対応しているのは、OperaとSafari、Mac版IEくらいと書いたが、実はIE6.0以降もいちおう対応している。以下、<a href="http://www.microsoft.com/japan/msdn/ie/ie60/cssenhancements.asp#cssenhancements_topic8">「Internet Explorer 6 におけるCSSの拡張」</a>より引用。</p>
<blockquote>SPAN、B、および I などのインライン 要素は、width や height プロパティをサポートしません。標準準拠モードを有効にして、インライン 要素の width や height プロパティを設定するには、インライン 要素の display プロパティを inline-block に設定します。</blockquote>
<p>要するに、ブロック要素をインライン要素的に扱うことはできないが、インライン要素をブロック要素的に扱うことはできる、ということである。これを踏まえ、Opera（9.21）、Firefox（2.0）、そしてIE（6.0）の3種類のブラウザで検証してみることにする。</p>
<p>●Operaの場合<br />
inline-block完全対応のOperaでは、div要素がインライン要素的に横に並び、span要素がブロック要素的に幅と高さを持つ。結果、両方とも見た目的には同じになる。<br />
<img src="http://norisfactory.com/stylesheetlab/sample_img/screen_inlineb_opr1.gif" alt="" width="445" height="152" /></p>
<p>●Firefoxの場合<br />
inline-blockに対応していないFirefoxでは、div要素はブロック要素のまま、縦に積み重なり、span要素はインライン要素のまま、指定した幅・高さは無効になっている。<br />
<img src="http://norisfactory.com/stylesheetlab/sample_img/screen_inlineb_ff1.gif" alt="" width="445" height="240" /></p>
<p>●IEの場合<br />
変則的なのがこのIE。div要素にinline-blockを指定してもブロック要素のままだが、span要素にinline-blockを指定した場合は、ブロック要素的に幅と高さの指定が有効になる。<br />
<img src="http://norisfactory.com/stylesheetlab/sample_img/screen_inlineb_ie1.gif" alt="" width="445" height="263" /></p>
<p>さて、ここまでは、まあ、はっきりいってどうでもいいことである。しょせん、Firefoxなどではiline-blockは使えないのだから。そもそも、なぜinline-blockに着目したかというと、いわゆるclearfixでIE7 &amp; MacIE対策用にinline-blockが使われているからだ。しかし、floatのクリアにinline-blockが有効なのはIE7とMacIEだけではない。もともとinline-blockに完全対応しているOpera、Safariはもちろん、IE6でも、inline-blockでfloatをクリアできる。このことを次のソースを使って確認してみよう。</p>
<div class="section">
<a href="http://norisfactory.com/stylesheetlab/sample_html/inline-block2.html">インラインブロックの検証 その2</a><br />
【スタイルシート】
<code class="pre">.wrapper {
	display: inline-block;
	background: #cccccc;
	padding: 6px;
	font-size: 10pt;
	line-height: 30px;
	text-align: center;
	color: #ffffff;
}
.left-box {
	width: 100px;
	height: 100px;
	background: #000000;
	float: left;
}
.right-box {
	width: 100px;
	height: 100px;
	background: #666666;
	float: left;
}</code>
<br />
【HTML】
<code>&lt;div class=&quot;wrapper&quot;&gt;<br />
&lt;div class=&quot;left-box&quot;&gt;ボックスA&lt;/div&gt;<br />
&lt;div class=&quot;right-box&quot;&gt;ボックスB&lt;/div&gt;<br />
&lt;/div&gt;<br />
&lt;div class=&quot;wrapper&quot;&gt;<br />
&lt;div class=&quot;left-box&quot;&gt;ボックスA&lt;/div&gt;<br />
&lt;div class=&quot;right-box&quot;&gt;ボックスB&lt;/div&gt;<br />
&lt;/div&gt;</code>
</div>
<p>●Operaの場合<br />
floatがクリアされているので、親ボックスに子ボックス（A、B）の高さが反映され、背景がきちんと表示されている。さらに、このセットを繰り返しているので、親ボックスはインラインに流し込まれ、横に並ぶ。<br />
<img src="http://norisfactory.com/stylesheetlab/sample_img/screen_inlineb_opr2.gif" alt="" width="445" height="130" /></p>
<p>●IEの場合<br />
こちらもfloatはクリアされているが、親ボックスはあくまでブロック要素として、横いっぱいに広がり、縦に並ぶ。<br />
<img src="http://norisfactory.com/stylesheetlab/sample_img/screen_inlineb_ie2.gif" alt="" width="445" height="252" /></p>
<p>●Firefoxの場合<br />
floatはクリアされないので、親ボックスに子ボックスの高さは反映されず、さらにボックスBの右に次のボックスが回り込んでしまう。<br />
<img src="http://norisfactory.com/stylesheetlab/sample_img/screen_inlineb_ff2.gif" alt="" width="445" height="150" /></p>
<p>ここで、clearfixの記述を思い出してみよう。</p>
<p>IE7 &amp; MacIE対策用にdisplay: inline-blockを指定した後、いわゆるバックスラッシュハックを使ってMacIEを除外した上で、display: blockに戻す。OperaやSafariでは、inline-blockのままでは具合が悪いからだ（MacIEでもinline-block指定による弊害がないわけではない。ブロック要素ではなくなってしまうので、例えばmargin: autoを使ったセンター揃えなどはできなくなってしまう）。</p>
<p>では、IE7はどうなるのか。IE7用にdisplay: inline-blockを指定しておいて、それをまたdisplay: blockに戻してしまうのはどういうことなのか。</p>
<p>実は、IE6以降では、いったんdisplay: inline-blockを指定して } で閉じた後、あらためてdisplay: blockとしても上書きされない、というか、floatのクリアに関してdisplay: inline-blockの指定は生きたままなのである（※）。試しに、先ほどのソースに、親ボックスへのdisplay: block指定を追加してみよう。</p>
<div class="section">
<a href="http://norisfactory.com/stylesheetlab/sample_html/inline-block3.html">インラインブロックの検証 その3</a><br />
【スタイルシート】
<code class="pre">.wrapper {
	display: inline-block;
	background: #cccccc;
	padding: 6px;
	font-size: 10pt;
	line-height: 30px;
	text-align: center;
	color: #ffffff;
}
.wrapper {
	display: block;
}</code>
以下、その2と同じ<br />
<br />
【HTML】<br />
その2と同じ
</div>
<p>●Operaの場合<br />
display: blockと上書きされ、Firefoxの時と同じ表示になる。<br />
<img src="http://norisfactory.com/stylesheetlab/sample_img/screen_inlineb_opr3.gif" alt="" width="445" height="140" /></p>
<p>●IEの場合<br />
display: inline-blockの指定が生きており、その2と表示は変わらない。<br />
<img src="http://norisfactory.com/stylesheetlab/sample_img/screen_inlineb_ie3.gif" alt="" width="445" height="252" /></p>
<p>これはIEのバグなんだろうか、仕様なんだろうか。とにもかくにも、この奇妙な振る舞いのおかげで、inline-blockがclearfixにおけるＩＥ7対策として有効に機能しているわけだが、何だかスッキリしない話ではある。</p>
<p>※ } で閉じる前にdisplay: blockとすれば上書きされる。また、インライン要素にinline-block指定した場合は、 } で閉じた後でも、display: blockとすれば上書きされ、完全なブロック要素になる。</p>
<p id="haslayout">【追記】<br />
inline-blockに対応しているのはIE6.0以降と書いたが、<a href="http://browsers.evolt.org/?ie/32bit/standalone">evolt.org - Browser Archive</a>より旧バージョンのIEを入手し、検証を試みたところ、インライン要素へのwidth、heightの指定についてはIE5.0以降、floatのクリアおよび「display: blockとしても上書きされない」という現象についてはIE5.5以降で確認できた。さらに、floatのクリアの件に関しては、hasLayoutというIE独自のプロパティが関係しているらしいこともわかってきた。</p>
<p>hasLayoutとは、IE（5.5以降）が内部的に持つ読み込みのみのプロパティで、その要素がレイアウトを持っているかどうかを示すもの。デフォルトの値はfalse（レイアウトを持っていない）で、ある種のCSSプロパティがトリガーとなって、true（レイアウトを持っている）となる。例えば、height（auto以外の値）、width（auto以外の値）、zoom（すべての値）などで、display（値がinline-blockの時）もそのひとつだ。そして、hasLayoutがtrueと判断されると、例のfloatがクリアされる（のと同じ）現象が起きるのである。いわゆるHolly Hackにおいてheight: 1%と記述するのも、このhasLayoutが背景にあるわけだ。</p>
<p>したがって、「display: blockとしても上書きされない」という件についても、display: inline-blockによって、いったんhasLayoutの値がtrueになると、再びdisplay: blockに戻しても（つまり上書きはされている）、hasLayoutはtrueのまま、ということなのだろうと想像できる。</p>
<p># hasLayoutに関する参考ページ<br />
<a href="http://msdn2.microsoft.com/en-us/library/ms533776.aspx">hasLayout Property</a> <br />
<a href="http://msdn2.microsoft.com/en-us/library/bb250481.aspx">HasLayout Overview</a></p>]]>
   </content>
</entry>
<entry>
   <title>clearfixの決定版を作る －モダンブラウザ編－</title>
   <link rel="alternate" type="text/html" href="http://norisfactory.com/stylesheetlab/000038.php" />
   <id>tag:norisfactory.com,2007:/stylesheetlab//1.38</id>
   
   <published>2007-05-03T22:39:14Z</published>
   <updated>2007-09-04T12:26:48Z</updated>
   
   <summary>floatに起因するレイアウトくずれの多くは、floatをしかるべき場所でクリアすることによって解決する。このことを発見して以来...</summary>
   <author>
      <name>nori</name>
      
   </author>
         <category term="01_CSS実験室" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://norisfactory.com/stylesheetlab/">
      <![CDATA[<p>floatに起因するレイアウトくずれの多くは、floatをしかるべき場所でクリアすることによって解決する。このことを発見して以来、もっぱら空ボックスにclearを指定するという方法（&lt;div style=&quot;clear: both&quot;&gt;&lt;/div&gt;）を多用してきたが、HTMLにある種の不純物が混じることに居心地の悪さはずっと感じていた（「<a href="http://norisfactory.com/stylesheetlab/000004.php">floatを繰り返すとレイアウトがくずれる</a>」参照）。この気持ち悪さを解消してくれるのが、clearfixというテクニックだ。</p>
<p>基本的な発想は上記の空ボックスによるクリアと同じだが、それをHTMLには一切手を加えず、スタイルシートだけで実現しているところに大きな特徴がある。しかし、ひとくちにclearfixといっても様々なバリエーションがあり、その記述のしかたは微妙に異なる。</p>]]>
      <![CDATA[<p>例えば、clearfixの提唱者ではないかと類推される<a href="http://www.positioniseverything.net/easyclearing.html">Position Is Everything版clearfix</a>はこう。</p>
<div class="section">
<code class="pre">.clearfix:after {
    content: "."; 
    display: block; 
    height: 0; 
    clear: both; 
    visibility: hidden;
}
.clearfix {display: inline-block;}
/* Hides from IE-mac \*/
* html .clearfix {height: 1%;}
.clearfix {display: block;}
/* End hide from IE-mac */</code>
</div>
<p>一方、Movable Typeのデフォルトスタイルシートでもclearfixは採用されており、該当箇所だけ取り出すとこのようになっている（<em>赤字</em>はPosition Is Everything版clearfixと異なる部分）。</p>
<div class="section">
<code class="pre">.pkg:after {
    <em>content: " ";</em>
    display: block;
    visibility: hidden;
    clear: both;
    <em>height: 0.1px;
    font-size: 0.1em;
    line-height: 0;</em>
}
<em>* html</em> .pkg { display: inline-block; }
/* no ie mac \*/
* html .pkg { height: 1%; }
.pkg { display: block; }
/* */</code>
</div>
<p>もちろんclearfixはこの2種類だけではない。いったいどのclearfixがベストなのか。まずは対象ブラウザをいわゆるモダンブラウザ（Firefox、Opera、Safari）に絞り込んで、clearfixの決定版を探っていきたいと思う。</p>
<p>検証のため共通で用意したスタイルシートとHTMLは以下の通り。</p>
<div class="section">
【スタイルシート】
<code class="pre">body {
	margin: 0;
	padding: 0;
	width: 208px;
}
#wrapper {
	border: 1px solid #000000;
	padding: 3px;
	background: #cccccc;
}
#box-A {
	width: 100px;
	height: 1000px;
	background: #000000;
	float: left;
}
#box-B {
	width: 100px;
	height: 50px;
	background: #666666;
	float: right;
}</code>
<br />
【HTML】
<code>&lt;div id=&quot;box&quot; class=&quot;clearfix&quot;&gt;<br />
&lt;div id=&quot;box-A&quot;&gt;&lt;/div&gt;<br />
&lt;div id=&quot;box-B&quot;&gt;&lt;/div&gt;<br />
&lt;/div&gt;<br />
</code></div>
<p>clearfixについては、:after擬似要素を用いた部分がモダンブラウザ用の記述なので、そのバリエーションを以下の10種類、用意した。</p>
<div class="section">
<a href="http://norisfactory.com/stylesheetlab/sample_html/clearfix_for_mb_01.html">CASE 1</a>
<code class="pre">.clearfix:after {
	content: ".";
	display: block;
	height: 0;
	visibility: hidden;
	clear: both;
}</code>
</div>
<p>CASE 1は、<a href="http://www.positioniseverything.net/easyclearing.html">Position Is Everything版clearfix</a> と同じ記述。:after擬似要素にcontentを指定して、ボックス内要素の末尾にピリオドを追加、さらにそれを高さ0、不可視のブロック要素とし、clearを適用させる。最も一般的なスタイルだけに特に問題はないように思えるが、clearfixを適用させたボックスの高さをブラウザいっぱいにした時、ボトムにマージンが生じてしまうという不具合がある（ボックスを縦に積み重ねた場合は、マージンは生じない）。</p>
<p>以下、このCASE 1の記述をベースに、Movable Type版clearfixの設定を取り入れていく形でバリエーションを展開させていく。</p>
<div class="section">
<a href="http://norisfactory.com/stylesheetlab/sample_html/clearfix_for_mb_02.html">CASE 2</a>
<code class="pre">.clearfix:after {
	content: ".";
	font-size: 0;
	display: block;
	height: 0;
	visibility: hidden;
	clear: both;
}</code>
</div>
<p>CASE 2は、font-sizeの指定を追加した場合。ただし、Movable Type版clearfixとは変えて、0.1emでなく0とした。</p>
<div class="section">
<a href="http://norisfactory.com/stylesheetlab/sample_html/clearfix_for_mb_03.html">CASE 3</a>
<code class="pre">.clearfix:after {
	content: ".";
	font-size: 0.1em;
	display: block;
	height: 0;
	visibility: hidden;
	clear: both;
}</code>
</div>
<p>CASE 3では、Movable Type版clearfixにならい、font-sizeを0.1emとした。</p>
<div class="section">
<a href="http://norisfactory.com/stylesheetlab/sample_html/clearfix_for_mb_04.html">CASE 4</a>
<code class="pre">.clearfix:after {
	content: ".";
	line-height: 0;
	display: block;
	height: 0;
	visibility: hidden;
	clear: both;
}</code>
</div>
<p>CASE 4は、font-sizeではなく、line-heightの指定を追加した場合。</p>
<div class="section">
<a href="http://norisfactory.com/stylesheetlab/sample_html/clearfix_for_mb_05.html">CASE 5</a>
<code class="pre">.clearfix:after {
	content: ".";
	font-size: 0;
	line-height: 0;
	display: block;
	height: 0;
	visibility: hidden;
	clear: both;
}</code>
</div>
<p>CASE 5は、font-sizeとline-heightの指定を併記。ただし、font-sizeは0とした。</p>
<div class="section">
<a href="http://norisfactory.com/stylesheetlab/sample_html/clearfix_for_mb_06.html">CASE 6</a>
<code class="pre">.clearfix:after {
	content: ".";
	font-size: 0.1em;
	line-height: 0;
	display: block;
	height: 0;
	visibility: hidden;
	clear: both;
}</code>
</div>
<p>CASE 6は、Movable Type版clearfixと同様のfont-size、line-height指定を併記した場合。</p>
<div class="section">
<a href="http://norisfactory.com/stylesheetlab/sample_html/clearfix_for_mb_07.html">CASE 7</a>
<code class="pre">.clearfix:after {
	content: ".";
	font-size: 0.1em;
	line-height: 0;
	display: block;
	height: 0.1px;
	visibility: hidden;
	clear: both;
}</code>
</div>
<p>CASE 7では、さらにMovable Type版clearfixに近づけ、heightを0.1pxとした。</p>
<div class="section">
<a href="http://norisfactory.com/stylesheetlab/sample_html/clearfix_for_mb_08.html">CASE 8</a>
<code class="pre">.clearfix:after {
	content: " ";
	display: block;
	height: 0;
	visibility: hidden;
	clear: both;
}</code>
</div>
<p>CASE 8は、再び記述をCASE 1に戻した上で、追加する要素をMovable Type版clearfixにならいピリオドでなくスペースとした。</p>
<div class="section">
<a href="http://norisfactory.com/stylesheetlab/sample_html/clearfix_for_mb_09.html">CASE 9</a>
<code class="pre">.clearfix:after {
	content: "";
	display: block;
	height: 0;
	visibility: hidden;
	clear: both;
}</code>
</div>
<p>CASE 9は、スペースでなく、alt="" のように空にしてみた場合。</p>
<div class="section">
<a href="http://norisfactory.com/stylesheetlab/sample_html/clearfix_for_mb_10.html">CASE 10</a>
<code class="pre">.clearfix:after {
	content: "";
	display: block;
	clear: both;
}</code>
</div>
<p>最後に、CASE 10では、空なら最初から高さもないし、不可視にする必要もないから、height、visibilityの指定を削除してみた。</p>
<p>以上、10通りのclearfixを、Firefox（バージョン2.0）、Opera（バージョン9.2）、Safari（バージョン1.0）、3種類のブラウザで検証した結果が以下の表である。○はマージンの発生なし、×はマージンの発生あり、△もマージンが発生するが×よりは小さい。さらに、△の数字は大きいほど生じるマージンは小さい、つまり○に近いということである。</p>
<table cellspacing="0">
<tr>
<th>&nbsp;</th><th>&nbsp;</th><th>Safari</th><th>Firefox</th><th>Opera</th>
</tr>
<tr>
<td>CASE 1</td><td>基本形</td><td>×</td><td>×</td><td>×</td>
</tr>
<tr>
<td>CASE 2</td><td>基本形＋font-size:0</td><td>×</td><td>○</td><td>△</td>
</tr>
<tr>
<td>CASE 3</td><td>基本形＋font-size:0.1em</td><td>△1</td><td>○</td><td>△</td>
</tr>
<tr>
<td>CASE 4</td><td>基本形＋line-height:0</td><td>△2</td><td>△</td><td>○</td>
</tr>
<tr>
<td>CASE 5</td><td>基本形＋font-size:0; line-height:0</td><td>△2</td><td>○</td><td>○</td>
</tr>
<tr>
<td>CASE 6</td><td>基本形＋font-size:0.1em; line-height:0</td><td>△3</td><td>○</td><td>○</td>
</tr>
<tr>
<td>CASE 7</td><td>CASE 6 のheightを0.1pxに変更</td><td>△3</td><td>○</td><td>○</td>
</tr>
<tr>
<td>CASE 8</td><td>基本形のピリオドをスペースに変更</td><td>○</td><td>○</td><td>○</td>
</tr>
<tr>
<td>CASE 9</td><td>基本形のピリオドを空に変更</td><td>○</td><td>○</td><td>○</td>
</tr>
<tr>
<td>CASE 10</td><td>CASE 9 からheight、visibilityを削除</td><td>○</td><td>○</td><td>○</td>
</tr>
</table>
<p>Safariはバージョンが少々古いので、最新版では違う結果となるかもしれないが、ここから判断する限り、3ブラウザとも表示に不具合がないのは、CASE 8、CASE 9、CASE 10の3つ。中でも、記述のシンプルさ、論理性から、CASE 10がモダンブラウザ向けclearfixの決定版といえるのではないか。しかし、最初にclearfixを考えた人はなぜcontentをスペースや空でなくピリオドにしたんだろう。</p>
<p>【追記】<br />
「clearfixを考えた人はなぜcontentをスペースや空でなくピリオドにしたんだろう」という問いについては、3ping.orgさんがおおよその解答を示してくれたが（トラックバック参照）、その後やっと問題のブラウザを特定できた。contentがスペースや空だとfloatをクリアできないのは、Netscapeだった。7.1で確認しているので、それより古いバージョンでも同様だろう。ただし、ここで検証したような親ボックスにborderまたはpaddingを設定したケースでは、floatがクリアされてしまうため見逃してしまったのだ（<a href="http://norisfactory.com/stylesheetlab/sample_html/clearfix_for_NS.html">検証ページはこちら</a>）。とはいえ、ピリオドにして、visibilityやらfont-sizeやらline-heightやら長々と記述するのは避けたい。そこで、少々反則かもしれないが、ピリオドの代わりに1×1ピクセルの透明GIFを用いたやり方を決定版としたいと思う。</p>
<div class="section">
<a href="http://norisfactory.com/stylesheetlab/sample_html/clearfix_for_mb_11.html">CASE 11</a>
<code class="pre">.clearfix:after {
	content: url(pixel.gif);
	display: block;
	clear: both;
	height: 0;
}</code>
</div>
<table cellspacing="0">
<tr>
<th>&nbsp;</th><th>&nbsp;</th><th>Safari</th><th>Firefox</th><th>Opera</th>
</tr>
<tr>
<td>CASE 11</td><td>CASE 10のcontentを透明GIFに、height: 0 追加</td><td>○</td><td>○</td><td>○</td>
</tr>
</table>]]>
   </content>
</entry>
<entry>
   <title>font-sizeを%で指定すると、ある値でサイズの逆転が起きる</title>
   <link rel="alternate" type="text/html" href="http://norisfactory.com/stylesheetlab/000037.php" />
   <id>tag:norisfactory.com,2007:/stylesheetlab//1.37</id>
   
   <published>2007-04-21T08:06:59Z</published>
   <updated>2007-04-21T08:25:36Z</updated>
   
   <summary>フォントサイズについては、私の場合、キーワードによる指定（small、mediumなど）を基本としているが、例えば、smallと...</summary>
   <author>
      <name>nori</name>
      
   </author>
         <category term="ソースの記述" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://norisfactory.com/stylesheetlab/">
      <![CDATA[<p>フォントサイズについては、私の場合、キーワードによる指定（small、mediumなど）を基本としているが、例えば、smallとx-smallなどはけっこう大きさに差があって、どうしてもその間の大きさの文字を使いたくなる。そんなときは、パーセントによる指定を併用するのだが、70%台のある範囲の値については注意が必要である。<br />
[該当するブラウザ]
Windows／IE6.0、IE7.0（5.5以前は未確認）</p>

<div class="label3">症状</div>
<div class="fig" style="width: 225px;">font-sizeを%で指定した時のIE6の表示<img src="http://norisfactory.com/stylesheetlab/sample_img/screen_fontsize1.gif" alt="" width="225" height="145" /></div>
<p>まず、右のスクリーンショットを見てもらおう。</p>
<p>71%よりも72％の方が大きく、73%、74%と文字の大きさが変わらないのは、とりあえずいいとして、その上のサイズの75%になると、今度は逆に小さくなってしまうことがおわかりいただけると思う。その後、78%まで大きさは変わらず、79%でようやく72～74％と同じ大きさを回復する。</p>
<p>ただし、この現象が発生するのは条件が限られる。</p>]]>
      <![CDATA[<p>まず、大前提として、ブラウザはWindows/IE（6と7で確認）で、文字のサイズは中、日本語の場合のみ。さらに、以下のケースでこの現象が現れる。</p>
<ul>
<li>エンコーディング形式にかかわらず欧文フォントを指定したとき</li>
<li>UTF-8でフォント指定なしのとき</li>
</ul>
<p>逆にこの現象が起きないのは、</p>
<ul>
<li>エンコーディング形式にかかわらず和文フォントを指定したとき</li>
<li>シフトJISでフォント指定なしのとき</li>
</ul>
<p>フォント指定のあり、なしなど、いろいろと条件を変えて、<a href="sample_html/fontsize001_ex1.html">UTF-8の場合</a>と<a href="sample_html/fontsize001_ex2.html">シフトJISの場合</a>の2種類のサンプルページを用意したので、確認してみてほしい。</p>

<div class="section">
【スタイルシート】
<code class="pre">.percent71 { font-size: 71%; }
.percent72 { font-size: 72%; }
.percent73 { font-size: 73%; }
.percent74 { font-size: 74%; }
.percent75 { font-size: 75%; }
.percent76 { font-size: 76%; }
.percent77 { font-size: 77%; }
.percent78 { font-size: 78%; }
.percent79 { font-size: 79%; }</code>
<br />
【HTML】
<code>&lt;div class=&quot;percent71&quot;&gt;あいうえおかきくけこさしすせそ－71%&lt;/div&gt;<br />
&lt;div class=&quot;percent72&quot;&gt;あいうえおかきくけこさしすせそ－72%&lt;/div&gt;<br />
&lt;div class=&quot;percent73&quot;&gt;あいうえおかきくけこさしすせそ－73%&lt;/div&gt;<br />
&lt;div class=&quot;percent74&quot;&gt;あいうえおかきくけこさしすせそ－74%&lt;/div&gt;<br />
&lt;div class=&quot;percent75&quot;&gt;あいうえおかきくけこさしすせそ－75%&lt;/div&gt;<br />
&lt;div class=&quot;percent76&quot;&gt;あいうえおかきくけこさしすせそ－76%&lt;/div&gt;<br />
&lt;div class=&quot;percent77&quot;&gt;あいうえおかきくけこさしすせそ－77%&lt;/div&gt;<br />
&lt;div class=&quot;percent78&quot;&gt;あいうえおかきくけこさしすせそ－78%&lt;/div&gt;<br />
&lt;div class=&quot;percent79&quot;&gt;あいうえおかきくけこさしすせそ－79%&lt;/div&gt;</code>
</div>

<div class="label3">原因</div>
<p>これはIEのバグとしか言いようがないと思うが、72%～74%と75%～78%のどちらの表示が間違っているというべきなのだろう。先ほどは、説明の流れの都合上、72%～74%について「とりあえずいい」としたが、Firefoxでの表示と見比べる限り、72%～74%の表示が変ということにしておきたい。</p>

<div class="label3">対策</div>
<p>和文フォントを指定すれば、とりあえずこの問題を回避できるが、Verdanaを使えないのは非常に困る。そこで、仕方ないので、フォントサイズをパーセント指定するときは、72%、73%、74%は使わないようにしている。まあ、それで特に不都合なことはないだろう。</p>]]>
   </content>
</entry>
<entry>
   <title>背景画像の位置指定では正確にセンタリングできない</title>
   <link rel="alternate" type="text/html" href="http://norisfactory.com/stylesheetlab/000010.php" />
   <id>tag:norisfactory.com,2006:/stylesheetlab//1.10</id>
   
   <published>2006-11-09T15:15:41Z</published>
   <updated>2007-05-05T11:50:25Z</updated>
   
   <summary>スタイルシートでは背景画像の表示位置をキーワード（left, center, right, top, middle, botto...</summary>
   <author>
      <name>nori</name>
      
   </author>
         <category term="background関連" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://norisfactory.com/stylesheetlab/">
      <![CDATA[<p>スタイルシートでは背景画像の表示位置をキーワード（left, center, right, top, middle, bottom）または、ピクセル数（x, y座標）で指定できるが、centerと指定した場合、marginの設定によるセンタリングとは位置が一致しない。<br />
[該当するブラウザ]<br />
Windows／IE6.0</p>

<div class="label3">症状</div>
<div class="fig" style="width: 130px;">
画像Aを背景に<img src="http://norisfactory.com/stylesheetlab/sample_img/bg.gif" alt="" width="100" height="50" /><br />
ボックスBをセンタリングすると<div style="width: 98px; height: 50px; background: #999999;">&nbsp;</div><br />
こうなるはずだが…<img src="http://norisfactory.com/stylesheetlab/sample_img/screen_bg1_1.gif" alt="" width="130" height="50" /><br />
こうなってしまう<img src="http://norisfactory.com/stylesheetlab/sample_img/screen_bg1_2.gif" alt="" width="130" height="50" />
</div>
<p>全体の幅が100ピクセルで左右に1ピクセルの罫線を持つ画像Aを背景に指定し、表示位置センターで縦方向にタイルさせ、さらに、幅98ピクセルのボックスBをmarginの設定でセンタリングして配置した（&rarr;<a href="http://norisfactory.com/stylesheetlab/sample_html/bg001_ex1.html">サンプルページ1</a>）。</p>
<p>本来であれば、ボックスBは左右がピッタリ背景画像Aの中に収まるはずだが、Windows版のIE6.0では、背景画像Aが右に1ピクセルずれるため、背景画像Aの左の罫線の一部がボックスBに隠れて消えてしまう。</p>]]>
      <![CDATA[<div class="section">
【スタイルシート】
<code class="pre">body {
    margin: 0;
    background: #cccccc url(bg.gif) center repeat-y;
}
#box {
    width: 98px;
    height: 50px;
    background-color: #999999;
    margin: 0 auto;
}</code>
<br />
【HTML】
<code>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot; &quot;http://www.w3.org/TR/html4/loose.dtd&quot;&gt;<br />
&lt;html lang=&quot;ja&quot;&gt;<br />
&lt;head&gt;<br />
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=Shift_JIS&quot;&gt;<br />
&lt;title&gt;&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;div id=&quot;box&quot;&gt;&amp;nbsp;&lt;/div&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</code>
</div>

<div class="label3">原因</div>
<p>不明。しかし、Windows IE6.0でのみ発生するということは、このブラウザの、背景画像の表示位置に対する解釈がおかしいのではないか。しかし、相手が最もシェアの高いIEのしかも最新版では、ブラウザのせいという一言で片付けるわけにもいかない。</p>

<div class="label3">対策</div>
<p>結局、背景画像の表示位置指定によるセンタリングはあきらめて、高さ100%のボックスで全体を囲み、そのボックスに対して背景画像を指定するしかない（&rarr;<a href="http://norisfactory.com/stylesheetlab/sample_html/bg001_ex2.html">サンプルページ2</a>）。その際、標準モードではボックスの高さを100％にすることはできないので、互換モードにする必要がある。したがって、一番いいのはこの手のレイアウトは最初からしないことだろう。</p>

<div class="section">
赤字は変更部分<br />
【スタイルシート】
<code class="pre">body {
    margin: 0;
    <em>background: #cccccc;
    text-align: center;</em>
}
<em>#background {
    width: 100px;
    height: 100%;
    background: url(bg.gif) repeat-y;
    margin: 0 auto;
}</em>
#box {
    width: 98px;
    height: 50px;
    background-color: #999999;
    margin: 0 auto;
}</code>
<br />
【HTML】
<code><em>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;&gt;</em><br />
&lt;html lang=&quot;ja&quot;&gt;<br />
&lt;head&gt;<br />
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=Shift_JIS&quot;&gt;<br />
&lt;title&gt;&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
<em>&lt;div id=&quot;background&quot;&gt;</em><br />
&lt;div id=&quot;box&quot;&gt;&amp;nbsp;&lt;/div&gt;<br />
<em>&lt;/div&gt;</em><br />
&lt;/body&gt;<br />
&lt;/html&gt;</code>
</div>]]>
   </content>
</entry>
<entry>
   <title>マージンをまとめて設定するとテーブルはセンタリングされない</title>
   <link rel="alternate" type="text/html" href="http://norisfactory.com/stylesheetlab/000009.php" />
   <id>tag:norisfactory.com,2006:/stylesheetlab//1.9</id>
   
   <published>2006-11-09T15:12:02Z</published>
   <updated>2007-04-21T10:04:32Z</updated>
   
   <summary>ブロックレベル要素は左右マージンの値をautoにすることによってセンタリングされる。ところが、テーブルについては、その記述のしか...</summary>
   <author>
      <name>nori</name>
      
   </author>
         <category term="ソースの記述" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://norisfactory.com/stylesheetlab/">
      <![CDATA[<p>ブロックレベル要素は左右マージンの値をautoにすることによってセンタリングされる。ところが、テーブルについては、その記述のしかたによってセンタリングされない時がある。<br />
[該当するブラウザ]<br />
Macintosh／IE5.0、IE5.1</p>

<div class="label3">症状</div>
<div class="fig" style="width: 329px;"><img src="http://norisfactory.com/stylesheetlab/sample_img/screen_code2_1.gif" alt="" width="329" height="229" /></div>
<p>幅・高さとも50ピクセルで背景色が黒のテーブルをセンタリングさせるために、マージンを「margin: 0 auto」と上下左右まとめて設定してみた（&rarr;<a href="http://norisfactory.com/stylesheetlab/sample_html/code002_ex1.html">サンプルページ1</a>）。しかし、各種ブラウザで検証したところ、Macintosh版のIE5.1、5.0ではセンタリングされないことがわかった。</p>]]>
      <![CDATA[<div class="section">
【スタイルシート】
<code class="pre">#centering {
    width: 50px;
    height: 50px;
    background-color: #000000;
    margin: 0 auto;
}</code>
<br />
【HTML】
<code>&lt;table id=&quot;centering&quot;&gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;/table&gt;</code>
</div>

<div class="label3">原因</div>
<p>Macintosh版IE5.1、5.0のバグと思われる。</p>

<div class="label3">対策</div>
<div class="fig" style="width: 329px;"><img src="http://norisfactory.com/stylesheetlab/sample_img/screen_code2_2.gif" alt="" width="329" height="229" /></div>
<p>上下左右まとめてではなく、「margin-right: auto; margin-left: auto」と設定すればOK（&rarr;<a href="http://norisfactory.com/stylesheetlab/sample_html/code002_ex2.html">サンプルページ2</a>）。Windowsで作業していると気が付きにくいが、テーブルをセンタリングさせる時は、左右マージンを別々に設定すると覚えておこう。</p>

<div class="section">
赤字は変更部分（HTMLは変更なし）<br />
【スタイルシート】
<code class="pre">#centering {
    width: 50px;
    height: 50px;
    background-color: #000000;
    <em>margin-left: auto;
    margin-right: auto;</em>
}</code>
</div>]]>
   </content>
</entry>
<entry>
   <title>コメントで「表」の字を使うと直後のスタイル指定が無効になる</title>
   <link rel="alternate" type="text/html" href="http://norisfactory.com/stylesheetlab/000008.php" />
   <id>tag:norisfactory.com,2006:/stylesheetlab//1.8</id>
   
   <published>2006-11-09T15:10:20Z</published>
   <updated>2007-04-21T10:02:48Z</updated>
   
   <summary>「表」のほか「構」「予」など、コメントで使うとスタイル指定が無効になるクセ者の文字がいくつかある。Macintosh版のIEでの...</summary>
   <author>
      <name>nori</name>
      
   </author>
         <category term="ソースの記述" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://norisfactory.com/stylesheetlab/">
      <![CDATA[<p>「表」のほか「構」「予」など、コメントで使うとスタイル指定が無効になるクセ者の文字がいくつかある。Macintosh版のIEでのみ発生するマイナーな現象のせいか、このことに触れている文章をあまり見たことがない。筆者の場合、コメントに「表示」という言葉を使ったため、たまたま遭遇した。<br />
[該当するブラウザ]<br />
Macintosh／IE5.0、IE5.1</p>

<div class="label3">症状</div>
<p>どのような条件下においてこの現象が発生するか、細かく見ていこう。<br />
まず、外部スタイルシートにおいて、box-A、box-B、box-C、box-Dという4つのボックスを定義する。いずれも、高さ・幅とも80ピクセル、背景色黒、文字色は白。ただし、box-Aとbox-Dの定義の前にはコメントなし。box-Bとbox-Cの定義の前にはコメントあり、前者には「構」、後者には「表」の1文字を入れた。<br />
次に、HTMLファイルでは、テーブルを組んでbox-A、box-B、box-C、box-Dを横に並べ、それぞれのボックスの中に文字を入れた（&rarr;<a href="http://norisfactory.com/stylesheetlab/sample_html/code001_ex1.html">サンプルページ1</a>）。<br />
これをMacintosh版IE5.1で表示させるとこうなる（以下の図はすべてMacintosh版IE5.1によるスクリーンショット）。</p>
<div class="fig" style="width: 332px;">外部スタイルシートの場合<img src="http://norisfactory.com/stylesheetlab/sample_img/screen_code1_1.gif" alt="" width="332" height="81" /></div>
<p>ご覧のとおり、外部スタイルシートで定義した場合、コメントありのbox-B、box-Cは表示されない。box-Dがちゃんと表示されているところから見ると、「構」「表」などの文字が入ったコメント以降すべてのスタイル指定が無効となってしまうわけではないようだ。</p>
<div class="fig" style="width: 332px;">HTMLにCSSを組み込んだ場合<br /><img src="http://norisfactory.com/stylesheetlab/sample_img/screen_code1_2.gif" alt="" width="332" height="81" /></div>
<p>また、コメントも含めてまったく同じスタイル定義をHTMLファイルの中に組み込んだとき（&rarr;<a href="http://norisfactory.com/stylesheetlab/sample_html/code001_ex2.html">サンプルページ2</a>）のスクリーンショットがこれ。こちらは4つのボックスともちゃんと表示される。</p>]]>
      <![CDATA[<div class="section">
【スタイルシート】
<code class="pre">#box-A {
    width: 80px;
    height: 80px;
    background: #000000;
    color: #ffffff;
}
/* 構 */
#box-B {
    width: 80px;
    height: 80px;
    background: #000000;
    color: #ffffff;
}
/* 表 */
#box-C {
    width: 80px;
    height: 80px;
    background: #000000;
    color: #ffffff;
}
#box-D {
    width: 80px;
    height: 80px;
    background: #000000;
    color: #ffffff;
}</code>
<br />
【HTML】
<code>&lt;table&gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;&lt;div id=&quot;box-A&quot;&gt;box-A&lt;/div&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;div id=&quot;box-B&quot;&gt;box-B&lt;/div&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;div id=&quot;box-C&quot;&gt;box-C&lt;/div&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;div id=&quot;box-D&quot;&gt;box-D&lt;/div&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;/table&gt;</code>
</div>

<div class="label3">原因</div>
<p>問題を2つに切り分けて考える必要があるだろう。ひとつは、なぜコメントの中に「構」「表」などの文字があると、スタイル指定が無効になってしまうのか。もうひとつは、なぜ外部スタイルシートだと無効になって、HTMLの中に組み込んだ場合は大丈夫なのか。</p>
<p>まず、1番目の問題から考えてみる。「構」と「表」の共通点を探るべく、文字コード（Shift_JISコード）を調べてみると、「構」は8D5C、「表」は955C、つまり、5Cの部分が共通していることがわかった。さらに調べていくと、5Cは￥（円記号、ここでは都合上全角で表記している）に当たることもわかった。￥は、CGIプログラムなどでエスケープ処理をされる場合に使われる文字で、メタ文字と呼ばれる（この辺のことは、<a href="http://www.shtml.jp/mojibake/">ウェブマスターのための文字化け講座</a>に詳しい）。この￥が原因と考えて間違いないだろう。つまり、文字コードに含まれる5Cが￥と誤読され、その後のスタイル指定がエスケープされてしまうわけだ。</p>
<div class="fig" style="width: 332px">外部スタイルシートの場合：コメントに￥あり<img src="http://norisfactory.com/stylesheetlab/sample_img/screen_code1_3.gif" alt="" width="332" height="81" /><br />
HTMLにCSSを組み込んだ場合：コメントに￥あり<br /><img src="http://norisfactory.com/stylesheetlab/sample_img/screen_code1_4.gif" alt="" width="332" height="81" /></div>
<p>このことを検証するために、コメントの「構」と「表」を￥に変えた場合も試してみた。（&rarr;<a href="http://norisfactory.com/stylesheetlab/sample_html/code001_ex3.html">サンプルページ3</a>）</p>
<p>やはり想像通りで、コメントに￥を入れると、HTMLの中にCSSを組み込んだ場合でもスタイル指定は無効になってしまう（&rarr;<a href="http://norisfactory.com/stylesheetlab/sample_html/code001_ex4.html">サンプルページ4</a>）。</p>
<div style="clear: both;"></div>
<p>なお、文字コードに5Cを含むのは以下の37文字である（機種依存文字を除く）。<br />
<em>―ソЫ噂浬欺圭構蚕十申曾箪貼能表暴予禄兔喀媾彌拿杤歃濬畚秉綵臀藹觸軆鐔饅鷭</em></p>

<div class="section">
赤字は変更部分<br />
【スタイルシート】
<code class="pre">#box-A {
    width: 80px;
    height: 80px;
    background: #000000;
    color: #ffffff;
}
<em>/* ￥ */</em>
#box-B {
    width: 80px;
    height: 80px;
    background: #000000;
    color: #ffffff;
}
<em>/* ￥ */</em>
#box-C {
    width: 80px;
    height: 80px;
    background: #000000;
    color: #ffffff;
}
#box-D {
    width: 80px;
    height: 80px;
    background: #000000;
    color: #ffffff;
}</code>
</div>

<p>次に2番目の問題について検証する。HTMLの中にCSSを組み込むのと、外部スタイルシートの場合の違いは何だろうと考えていって思い当たるのが、文字コード宣言の有無だ。つまり、&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=Shift_JIS&quot;&gt;というアレだが、DreamweaverなどのHTML作成ソフトを使っていると、自動的に文字コード宣言が挿入されるので入れ忘れることはない。しかし、外部スタイルシートで文字コード宣言が入っているのはあまり見たことがない。スタイルシートの場合は、@charset "shift_jis";とファイルの先頭に入れるらしく、さっそく実行してみた（&rarr;<a href="http://norisfactory.com/stylesheetlab/sample_html/code001_ex5.html">サンプルページ5</a>）。</p>
<div class="fig" style="width: 332px;">外部スタイルシートの場合：文字コード宣言あり<img src="http://norisfactory.com/stylesheetlab/sample_img/screen_code1_5.gif" alt="" width="332" height="81" /></div>
<p>しかし、どうやら文字コード宣言の有無は、この問題には関係ないようだ。そもそも、この現象自体、Macintosh版のIEでのみ発生するもので、他のブラウザの場合は問題ない。また、本来、コメントに何が書かれていようとブラウザは飛ばし読みしてくれるはずで、それでもMacintosh版のIEでのみ不具合が起きるのは、ブラウザ側のバグというしかないだろう。</p>

<div class="section">
赤字は変更部分<br />
【スタイルシート】
<code class="pre"><em>@charset &quot;shift_jis&quot;;</em>
#box-A {
    width: 80px;
    height: 80px;
    background: #000000;
    color: #ffffff;
}
/* 構 */
#box-B {
    width: 80px;
    height: 80px;
    background: #000000;
    color: #ffffff;
}
/* 表 */
#box-C {
    width: 80px;
    height: 80px;
    background: #000000;
    color: #ffffff;
}
#box-D {
    width: 80px;
    height: 80px;
    background: #000000;
    color: #ffffff;
}</code>
</div>

<div class="label3">対策</div>
<p>先に掲げた37文字を使わないことは当然だが、文字コードの5Cだけが問題なのか、他にも似たようなバグがあるのかわからないので、念のため、コメントには日本語を使わないのが安全・確実と考える。さらに、font-familyで日本語フォント（ＭＳ Ｐゴシック など）を使うなら、外部スタイルシートにも文字コード宣言をちゃんと入れておくのがベストである。</p>]]>
   </content>
</entry>
<entry>
   <title>フォントサイズの指定がテーブル内に継承されない</title>
   <link rel="alternate" type="text/html" href="http://norisfactory.com/stylesheetlab/000007.php" />
   <id>tag:norisfactory.com,2006:/stylesheetlab//1.7</id>
   
   <published>2006-11-09T15:06:49Z</published>
   <updated>2007-04-21T09:41:39Z</updated>
   
   <summary>ブラウザの表示モードには、W3Cの標準的仕様に準拠した標準モードと旧来のブラウザと互換性のある互換モードの2つがある。Windo...</summary>
   <author>
      <name>nori</name>
      
   </author>
         <category term="標準モードと互換モード" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://norisfactory.com/stylesheetlab/">
      <![CDATA[<p>ブラウザの表示モードには、W3Cの標準的仕様に準拠した標準モードと旧来のブラウザと互換性のある互換モードの2つがある。Windows版IE6.0以降、Macintosh版IE5.X以降、およびNetscape6.0以降では、この2つを文書型宣言の書き方（※注）によってスイッチするが、問題なのは、それより以前のバージョンのブラウザでは、文書型宣言の書き方にかかわらずすべて互換モードと表示になってしまうことだ。標準モードと互換モード（※注）では、スタイルシートの解釈の違いにさまざまなものがあるが、今回検証する「フォントサイズの指定がテーブル内に継承されるか、されないか」もそのひとつ。ちなみに、標準モードでは継承されるが、互換モードでは継承されない。<br />
[該当するブラウザ]<br />
Windows版IE5.5以前、Macintosh版IE4.5以前<br />
Netscape4.7以前</p>
<p>※注：簡単にいうと、文書型宣言の中の「URLあり」が標準モード、「URLなし」および文書型宣言そのものなしが互換モードとなる。詳しくは<a href="http://norisfactory.com/stylesheetlab/archives/dtd.html">DTD（文書型宣言）とブラウザの表示モード</a>を参照されたし。</p>

<div class="label3">症状</div>
<div class="fig" style="width: 334px;">Windows/IE6.0の場合<img src="http://norisfactory.com/stylesheetlab/sample_img/screen_mode1_1.gif" alt="" width="334" height="64" /><br />
Windows/IE5.5の場合<img src="http://norisfactory.com/stylesheetlab/sample_img/screen_mode1_2.gif" alt="" width="334" height="64" /></div>
<p>この現象を実際に再現させてみよう。まず、文書型宣言はURLを含むフル表記。次に、スタイルシートで、body要素に対してフォントサイズを84％に設定した。テキストは、bodyタグ内に直接／divタグで囲んで／テーブル内に入れて／入れ子にしたテーブル内に入れて、の4通りで記述した（&rarr;<a href="http://norisfactory.com/stylesheetlab/sample_html/mode001_ex1.html">サンプルページ1</a>）。これをWindows版IE6.0で表示させた場合のスクリーンショットが上。Windows版IE5.5で表示させた時のスクリーンショットが下。Windows版IE5.5では、テーブル内の文字に84％のサイズ指定は効かず、デフォルトに戻ってしまう。</p>]]>
      <![CDATA[<div class="section">
【スタイルシート】
<code class="pre">body {
    font-size: 84%;
}</code>
<br />
【HTML】
<code>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;<br />
&quot;http://www.w3.org/TR/html4/loose.dtd&quot;&gt;<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=Shift_JIS&quot;&gt;<br />
&lt;title&gt;&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
文字の大きさ&larr;bodyタグ内に直接記述しています。<br />
&lt;div&gt;文字の大きさ&larr;divタグで囲んでみました。&lt;/div&gt;<br />
&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;文字の大きさ&larr;テーブルの中に入れてみました。<br />
&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;文字の大きさ&larr;テーブルを入れ子にしてみました。&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;/table&gt;<br />
&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;/table&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</code>
</div>

<div class="label3">原因</div>
<p>すでに概略のところで述べたとおり、ブラウザのバージョンによるスタイルシートの解釈の違いが原因。せっかく、URLもきちんと書いて、validなHTMLを心がけているのに、そのことがかえって仇となってしまう。</p>

<div class="label3">対策</div>
<p>古いブラウザでも新しいブラウザと同じように表示させることはできない。しかし、その逆、つまり、新しいブラウザでも古いブラウザと同じように表示させることはできる。要するに、互換モードで表示させるということだ。</p>
<div class="fig" style="width: 334px;"><img src="http://norisfactory.com/stylesheetlab/sample_img/screen_mode1_3.gif" alt="" width="334" height="64" /></div>
<p>まず、文書型宣言からURLを抜く。次に、テーブル内の文字も縮小されるように、body要素に対してだけでなく、td要素に対してもフォントサイズを84％に設定する。この時気になるのが、そうするとテーブルを入れ子にした場合、84％×84％で、さらに文字が縮小されてしまうのではないかということ。しかし、幸いなことに、tableタグが入るたびにフォントサイズ指定は白紙に戻されてしまうようで、84％×84％とはならない（&rarr;<a href="http://norisfactory.com/stylesheetlab/sample_html/mode001_ex2.html">サンプルページ2</a>）。ケガの功名というか、互換モードではテーブル内の文字にフォントサイズ指定が継承されないといういい加減さが逆に好都合な結果を生んでいるわけだ。もっとも、解決法が互換モードというのは何だかスッキリしないのだが。</p>

<div class="section">
赤字は変更部分<br />
【スタイルシート】
<code class="pre">body {
    font-size: 84%;
}
<em>td {
    font-size: 84%;
}</em></code>
<br />
【HTML】
<code><em>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;&gt;<br /></em>
&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=Shift_JIS&quot;&gt;<br />
&lt;title&gt;&lt;/title&gt;<br />
&lt;/head&gt;<br />
（以下省略）
</code>
</div>]]>
   </content>
</entry>
<entry>
   <title>floatと一緒にwidthも指定しないと回り込まない</title>
   <link rel="alternate" type="text/html" href="http://norisfactory.com/stylesheetlab/000006.php" />
   <id>tag:norisfactory.com,2006:/stylesheetlab//1.6</id>
   
   <published>2006-11-07T12:48:41Z</published>
   <updated>2007-04-21T09:59:31Z</updated>
   
   <summary>ある要素にfloatを指定するときは、一緒にwidthも指定するのが基本的ルールである。実際、widthを指定しないとどんな不具...</summary>
   <author>
      <name>nori</name>
      
   </author>
         <category term="float関連" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://norisfactory.com/stylesheetlab/">
      <![CDATA[<p>ある要素にfloatを指定するときは、一緒にwidthも指定するのが基本的ルールである。実際、widthを指定しないとどんな不具合が起きるのか、それを検証してみたい。<br />
[該当するブラウザ]<br />
Macintosh／IE5.0、IE5.1</p>
  
<div class="label3">症状</div>
<p>widthを指定しないことによる不具合はいくつかあると思うが、ここでは2つのケースを取り上げる。
<div class="fig" style="width: 212px;"><img src="http://norisfactory.com/stylesheetlab/sample_img/screen_float4_1.gif" width="212" height="140" /></div>
<p>ひとつは、floatさせたいボックスにtext-alignを指定した場合。たとえば、画像の下にキャプションを右揃えで入れ、その左側に本文を回り込ませたいときなどだ。この形にするためには、画像とキャプションを含むボックスにfloat:rightとtext-align:rightを指定することになるが、そうした時、Macintosh版IEでは本文が回り込まずに画像の下に来てしまう（&rarr;<a href="http://norisfactory.com/stylesheetlab/sample_html/float004_ex1.html">サンプルページ1</a>）。これは、text-align:centerとしても同様である。</p>
<div class="fig" style="width: 212px;"><img src="http://norisfactory.com/stylesheetlab/sample_img/screen_float4_2.gif" width="212" height="140" /></div>
<p>もうひとつは、divタグを入れ子にした場合。上記と同じケースで、さらに画像とキャプションの間隔も細かく指定したいときなどは、画像を含むボックスの中にさらにキャプションを含むボックスを入れ、画像とのマージンを設定することになるが、この場合もMacintosh版IEでは本文が回り込まない（&rarr;<a href="http://norisfactory.com/stylesheetlab/sample_html/float004_ex2.html">サンプルページ2</a>）。</p>]]>
      <![CDATA[<div class="section">
●サンプルページ1<br />
【スタイルシート】
<code class="pre">.content {
    width: 200px;
}
.float-content {
    float: right;
    font-size: 84%;
    text-align: right;
}</code>
【HTML】
<code>&lt;div class=&quot;content&quot;&gt;<br />
&lt;div class=&quot;float-content&quot;&gt;<br />
&lt;img src=&quot;square.gif&quot; alt=&quot;&quot; width=&quot;80&quot; height=&quot;70&quot;&gt;&lt;br&gt;<br />
キャプション<br />
&lt;/div&gt;<br />
この例では、画像Aとキャプションを含むボックスにfloat:rightとtext-align:rightを指定している。<br />
&lt;/div&gt;</code>
</div>

<div class="section">
●サンプルページ2<br />
【スタイルシート】
<code class="pre">.content {
    width: 200px;
}
.float-content {
    float: right;
}
.caption {
    margin-top: 3px;
    font-size: 84%;
    text-align: right;
}</code>
【HTML】
<code>&lt;div class=&quot;content&quot;&gt;<br />
&lt;div class=&quot;float-content&quot;&gt;<br />
&lt;img src=&quot;square.gif&quot; alt=&quot;&quot; width=&quot;80&quot; height=&quot;70&quot;&gt;<br />
&lt;div class=&quot;caption&quot;&gt;キャプション&lt;/div&gt;<br />
&lt;/div&gt;<br />
こちらは、divタグを入れ子にして、キャプションの部分にだけtext-align:rightを指定している。<br />
&lt;/div&gt;</code>
</div>

<div class="label3">原因と対策</div>
<p>最初からタネを明かしているように、いずれもwidthを指定すれば解決する（&rarr;<a href="http://norisfactory.com/stylesheetlab/sample_html/float004_ex3.html">サンプルページ3</a>／<a href="http://norisfactory.com/stylesheetlab/sample_html/float004_ex4.html">サンプルページ4</a>）。</p>

<div class="section">
●サンプルページ3<br />
【スタイルシート】
<code class="pre">.content {
    width: 200px;
}
.float-content {
    <em>width: 80px;</em>
    float: right;
    font-size: 84%;
    text-align: right;
}</code>
</div>

<div class="section">
●サンプルページ4<br />
【スタイルシート】
<code class="pre">.content {
    width: 200px;
}
.float-content {
    <em>width: 80px;</em>
    float: right;
}
.caption {
    margin-top: 3px;
    font-size: 84%;
    text-align: right;
}</code>
</div>]]>
   </content>
</entry>
<entry>
   <title>ひとつの要素にfloatとmarginを同時に設定すると位置がずれる</title>
   <link rel="alternate" type="text/html" href="http://norisfactory.com/stylesheetlab/000005.php" />
   <id>tag:norisfactory.com,2006:/stylesheetlab//1.5</id>
   
   <published>2006-11-07T12:45:22Z</published>
   <updated>2007-04-21T09:57:53Z</updated>
   
   <summary>ある要素にfloatと横方向のmarginの指定を同時に行うと、marginで指定した位置よりも右または左にずれるというもの。 ...</summary>
   <author>
      <name>nori</name>
      
   </author>
         <category term="float関連" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://norisfactory.com/stylesheetlab/">
      <![CDATA[<p>ある要素にfloatと横方向のmarginの指定を同時に行うと、marginで指定した位置よりも右または左にずれるというもの。<br />
[該当するブラウザ]<br />
Windows／IE5.5、6.0</p>

<div class="label3">症状</div>
<div class="fig" style="width: 160px;">Mac/IE5.1の場合<img src="http://norisfactory.com/stylesheetlab/sample_img/screen_float3_1.gif" alt="" width="160" height="60" /></div>
<p>右のスクリーンショットを見てもらおう。左側に10ピクセルの余白をとってコンテンツA、その右にコンテンツB、というような2段組のレイアウトを組んだとする。スタイルシートでは、コンテンツAに float: left、margin-left: 10px と指定する。ちゃんと正しい位置に配置されているかわかるように背景画像に10ピクセル刻みで縦の罫線を入れてみた。ご覧のとおりMac（およびNetscape6.0以降）では位置のズレはない。</p>
<div class="fig" style="width: 160px;">Windows/IE6.0の場合<img src="http://norisfactory.com/stylesheetlab/sample_img/screen_float3_2.gif" alt="" width="160" height="60" /></div>
<p>しかし、Windows版のIE5.5、6.0ではコンテンツAの位置がずれ、余白は10ピクセルより広くなってしまう（&rarr;<a href="sample_html/float003_ex1.html">サンプルページ1</a>）。右にマージンをとり、コンテンツBを左に回り込ませた場合も同様である（&rarr;<a href="http://norisfactory.com/stylesheetlab/sample_html/float003_ex2.html">サンプルページ2</a>）。指定したマージンに対してどれくらいずれるか、マージンの数字を変えて試してみたところ、ほぼ指定したマージンの2倍になるようだ。</p>]]>
      <![CDATA[<div class="section">
【スタイルシート】
<code class="pre">#scale {
    width: 160px;
    height: 70px;
    background-image: url(bg3.gif);
}
#content-A {
    width: 100px;
    height: 50px;
    background-color: #000000;
    color: #ffffff;
    float: left;
    margin-left: 10px;
}
#content-B {
    width: 40px;
    height: 50px;
    background-color: #999999;
    color: #ffffff;
    float: left;
}</code>
<br />
【HTML】
<code>&lt;div id=&quot;scale&quot;&gt;<br />
&lt;div id=&quot;content-A&quot;&gt;A&lt;/div&gt;<br />
&lt;div id=&quot;content-B&quot;&gt;B&lt;/div&gt;<br />
&lt;/div&gt;</code>
</div>

<div class="label3">原因</div>
<p>"float" とは、直訳すれば「浮かぶ」もしくは「浮かせる」という意味である。これがなぜ回り込みの指定になるのか、ピンとこないのだが、今回のようなケースを検証していると、何となくわかったような気がしてこないでもない。つまり、floatとは指定した要素とそれに続く要素を無重力状態の中にプカリと浮かせるようなものなのではないか。そして、float: leftとすると要素は左に寄ろうとし、float: rightとすると右に寄ろうとする。したがって、floatを指定した要素はフワフワと浮いているようなものだから、marginを設定して位置を横にずらそうとすると、指定した位置でピタリと止まらずに必要以上に動いてしまうのではないかと想像される。</p>

<div class="label3">対策</div>
<p>この現象がすべてのOS/ブラウザで等しく同条件で発生するなら、あらかじめズレを織り込んで指定すればよいだけの話だが、Netscape6.0以降やMacでは発生しないためそうはいかない。したがって、ひとつの要素に対してmarginとfloatを同時に設定しないようにするしかないだろう。</p>
<p>そこで、コンテンツAとコンテンツBの左右配置については、<a href="float001.html">「要素を左右に隙間なく配置することができない」</a>のところで検証した2番目の方法を採用し、全体の幅を固定するためのボックス（#both-content）に対して左マージンを設定した（&rarr;<a href="http://norisfactory.com/stylesheetlab/sample_html/float003_ex3.html">サンプル3</a>）。</p>

<div class="section">
赤字は変更部分<br />
【スタイルシート】
<code class="pre">#scale {
    width: 160px;
    height: 70px;
    background-image: url(bg3.gif);
}
<em>#both-content {
    width: 140px;
    margin-left: 10px;
}</em>
#content-A {
    width: 100px;
    height: 50px;
    background-color: #000000;
    color: #ffffff;
    float: left;
}
#content-B {
    width: 40px;
    height: 50px;
    background-color: #999999;
    color: #ffffff;
    <em>float: right;</em>
}</code>
<br />
【HTML】
<code>&lt;div id=&quot;scale&quot;&gt;<br />
<em>&lt;div id=&quot;both-content&quot;&gt;</em><br />
&lt;div id=&quot;content-A&quot;&gt;A&lt;/div&gt;<br />
&lt;div id=&quot;content-B&quot;&gt;B&lt;/div&gt;<br />
<em>&lt;/div&gt;</em><br />
&lt;/div&gt;</code>
</div>]]>
   </content>
</entry>
<entry>
   <title>floatを繰り返すとレイアウトがくずれる</title>
   <link rel="alternate" type="text/html" href="http://norisfactory.com/stylesheetlab/000004.php" />
   <id>tag:norisfactory.com,2006:/stylesheetlab//1.4</id>
   
   <published>2006-11-07T12:37:00Z</published>
   <updated>2007-05-03T22:51:35Z</updated>
   
   <summary>これは、いわゆる段組レイアウトを縦に重ねた場合と考えてもらえばいいだろう。レイアウトくずれが発生するのは段の高さが一律でない時で...</summary>
   <author>
      <name>nori</name>
      
   </author>
         <category term="float関連" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://norisfactory.com/stylesheetlab/">
      <![CDATA[<p>これは、いわゆる段組レイアウトを縦に重ねた場合と考えてもらえばいいだろう。レイアウトくずれが発生するのは段の高さが一律でない時である。<br />
[該当するブラウザ]<br />
すべてのブラウザ</p>

<div class="label3">症状</div>
<div class="fig" style="width: 127px;">
ボックスA
<div style="width: 60px; height: 60px; background: #000000;">&nbsp;</div>
ボックスB
<div style="width: 60px; height: 30px; background: #cccccc;">&nbsp;</div>
Netscape7.1の場合のスクリーンショット
<img src="http://norisfactory.com/stylesheetlab/sample_img/screen_float2_1.gif" alt="" width="127" height="122" />
</div>
<p>単純化するために、AとB、高さの異なるボックスを2つ設定した（A＞B）。そして、ボックスAをfloat: leftで左側に配置、ボックスBをfloat: rightで右側に配置、さらに全体をひとつのボックス（クラス名: column）で囲み、それを2回繰り返してみた（&rarr;<a href="http://norisfactory.com/stylesheetlab/sample_html/float002_ex1.html">サンプルページ1</a>）。Winows版IEでは問題ないのでOKと思ってしまいそうだが、実はそれ以外のブラウザではちゃんと表示されない。</p>]]>
      <![CDATA[<div class="section">
【スタイルシート】
<code class="pre">.column {
	width: 125px;
	margin-bottom: 5px;
}
.box-A {
	width: 60px;
	height: 60px;
	background-color: #000000;
	float: left;
}
.box-B {
	width: 60px;
	height: 30px;
	background-color: #cccccc;
	float: right;
}</code>
<br />
【HTML】
<code>&lt;div class=&quot;column&quot;&gt;<br />
&lt;div class=&quot;box-A&quot;&gt;&amp;nbsp;&lt;/div&gt;<br />
&lt;div class=&quot;box-B&quot;&gt;&amp;nbsp;&lt;/div&gt;<br />
&lt;/div&gt;<br />
&lt;div class=&quot;column&quot;&gt;<br />
&lt;div class=&quot;box-A&quot;&gt;&amp;nbsp;&lt;/div&gt;<br />
&lt;div class=&quot;box-B&quot;&gt;&amp;nbsp;&lt;/div&gt;<br />
&lt;/div&gt;</code>
</div>

<div class="label3">原因</div>
<p>レイアウトがくずれるのは、全体を囲むボックスを繰り返す前に回り込みを解除していないせいである。にもかかわらず、Windows版IEでは正しく表示されてしまうのは、そちらの方がおかしいというべきだろう。</p>

<div class="label3">対策</div>
<p>解決法は2つある。ひとつは、「原因」で指摘している回り込みの解除を用いる方法（&rarr;<a href="http://norisfactory.com/stylesheetlab/sample_html/float002_ex2.html">サンプル2</a>）。ただ、「HTMLは論理構造を記述し、見栄えはスタイルシートで定義する」という本来のあり方からすると、HTMLの中にレイアウトを制御する以外まったく意味を持たない要素が入り込んでくるのはやや気になる。<br />
もうひとつは、全体を囲むボックスに高さを与える方法（&rarr;<a href="http://norisfactory.com/stylesheetlab/sample_html/float002_ex3.html">サンプル3</a>）。ただし、コンテンツがテキスト主体で、高さを特定できない場合はこの方法を使えないのが難点である。</p>

<div class="section">
●回り込みを解除する場合<br />
赤字は変更部分（スタイルシートは変更なし※）<br />
【HTML】
<code>&lt;div class=&quot;column&quot;&gt;<br />
&lt;div class=&quot;box-A&quot;&gt;&amp;nbsp;&lt;/div&gt;<br />
&lt;div class=&quot;box-B&quot;&gt;&amp;nbsp;&lt;/div&gt;<br />
&lt;/div&gt;<br />
<em>&lt;div style=&quot;clear: both;&quot;&gt;&lt;/div&gt;</em><br />
&lt;div class=&quot;column&quot;&gt;<br />
&lt;div class=&quot;box-A&quot;&gt;&amp;nbsp;&lt;/div&gt;<br />
&lt;div class=&quot;box-B&quot;&gt;&amp;nbsp;&lt;/div&gt;<br />
&lt;/div&gt;</code>
※実際には、Netscape対策のため、ボックスA、ボックスBにもmargin-bottomを追加して設定している。具体的には<a href="http://norisfactory.com/stylesheetlab/sample_html/float002_ex2.html">サンプル2</a>のソースを参照されたし。
</div>

<div class="section">
●全体を囲むボックスに高さを与える場合<br />
赤字は変更部分（HTMLは変更なし）<br />
【スタイルシート】
<code class="pre">
.column {
    width: 125px;
    <em>height: 60px;</em>
    margin-bottom: 5px;
}
.box-A {
    width: 60px;
    height: 60px;
    background-color: #000000;
    float: left;
}
.box-B {
    width: 60px;
    height: 30px;
    background-color: #cccccc;
    float: right;
}
</code>
</div>]]>
   </content>
</entry>
<entry>
   <title>要素を左右に隙間なく配置することができない</title>
   <link rel="alternate" type="text/html" href="http://norisfactory.com/stylesheetlab/000003.php" />
   <id>tag:norisfactory.com,2006:/stylesheetlab//1.3</id>
   
   <published>2006-11-04T06:08:59Z</published>
   <updated>2007-04-21T09:54:15Z</updated>
   
   <summary><![CDATA[スタイルシートによるレイアウトで、「ボックス」を最重要 &quot;概念&quot; とするなら、floatは最重要 &quot...]]></summary>
   <author>
      <name>nori</name>
      
   </author>
         <category term="float関連" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://norisfactory.com/stylesheetlab/">
      <![CDATA[<p>スタイルシートによるレイアウトで、「ボックス」を最重要 &quot;概念&quot; とするなら、floatは最重要 &quot;テクニック&quot; と言えるだろう。floatとは、後に続く要素を左右どちらかに回り込ませるためのものだが、この性質を利用して要素を横にピッタリ隙間なく並べようとするとなかなかうまくいかない。<br />
[該当するブラウザ]<br />
Windows／IE5.5、6.0</p>

<div class="label3">症状</div>
<div class="fig" style="width: 87px;"><img src="http://norisfactory.com/stylesheetlab/sample_img/screen_float1_1.gif" alt="" width="87" height="84" /></div>
<p>この現象を検証するために、左右それぞれの半円画像を背景とするボックスを設定し、floatを使って横に配置した。意図するところは、左右ピッタリくっつけて完全な円にしたいということなのだが、Windows版のIEでは間に3ピクセルほどの隙間ができてしまう。（&rarr;<a href="http://norisfactory.com/stylesheetlab/sample_html/float001_ex1.html">サンプルページ1</a>）</p>]]>
      <![CDATA[<div class="section">
【スタイルシート】
<code class="pre">#half-left-circle {
    width: 40px;
    height: 80px;
    background-image: url(circle_l.gif); 
    float: left;
}
#half-right-circle {
    width: 40px;
    height: 80px;
    background-image: url(circle_r.gif);
}</code>
<br />
【HTML】
<code>&lt;div id=&quot;half-left-circle&quot;&gt;&amp;nbsp;&lt;/div&gt;<br />
&lt;div id=&quot;half-right-circle&quot;&gt;&amp;nbsp;&lt;/div&gt;</code>
</div>

<div class="label3">原因</div>
<p>もともとfloatは写真などの画像にテキストを回り込ませるような使い方を想定して作られたプロパティと思われるため、Windows版のIEではfloatさせる要素と回り込ませる要素の間に自動的にマージンをとってしまうようだ。</p>

<div class="label3">対策</div>
<p>floatを使うことを前提にした場合、次の2つの方法が考えられる。<br />
(1) 右に配置する要素も左にfloatさせる（&rarr;<a href="http://norisfactory.com/stylesheetlab/sample_html/float001_ex2.html">サンプルページ2</a>）</p>

<div class="section">
赤字は変更部分（HTMLは変更なし）<br />
【スタイルシート】
<code class="pre">#half-left-circle {
    width: 40px;
    height: 80px;
    background-image: url(circle_l.gif);
    float: left;
}
#half-right-circle {
    width: 40px;
    height: 80px;
    background-image: url(circle_r.gif);
    <em>float: left;</em>
}</code>
</div>

<p>(2) 右に配置する要素は右にfloatさせ、全体の幅を固定する（&rarr;<a href="http://norisfactory.com/stylesheetlab/sample_html/float001_ex3.html">サンプルページ3</a>）</p>

<div class="section">
赤字は変更部分<br />
【スタイルシート】
<code class="pre"><em>#full-circle {
    width: 80px;
}</em>
#half-left-circle {
    width: 40px;
    height: 80px;
    background-image: url(circle_l.gif);
    float: left;
}
#half-right-circle {
    width: 40px;
    height: 80px;
    background-image: url(circle_r.gif);
    <em>float: right;</em>
}</code>
<br />
【HTML】
<code><em>&lt;div id=&quot;full-circle&quot;&gt;</em><br />
&lt;div id=&quot;half-circle-A&quot;&gt;&amp;nbsp;&lt;/div&gt;<br />
&lt;div id=&quot;half-circle-B&quot;&gt;&amp;nbsp;&lt;/div&gt;<br />
<em>&lt;/div&gt;</em></code>
</div>]]>
   </content>
</entry>
<entry>
   <title>ボックス内でテキスト・画像の下揃えはできない</title>
   <link rel="alternate" type="text/html" href="http://norisfactory.com/stylesheetlab/000002.php" />
   <id>tag:norisfactory.com,2006:/stylesheetlab//1.2</id>
   
   <published>2006-11-03T07:59:02Z</published>
   <updated>2007-04-21T09:53:02Z</updated>
   
   <summary>ボックスとは「セルが一つしかないテーブルのようなもの」と別項で書いたが、もちろん目的は全く違うものものだし、性格も特性も異なる。...</summary>
   <author>
      <name>nori</name>
      
   </author>
         <category term="ボックス関連" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://norisfactory.com/stylesheetlab/">
      <![CDATA[<p>ボックスとは「セルが一つしかないテーブルのようなもの」と別項で書いたが、もちろん目的は全く違うものものだし、性格も特性も異なる。例えば、テーブルの場合、セルの中にテキストを下揃えで流すといったデザインが可能だが、ボックスではそれができない。<br />
[該当するブラウザ]<br />
すべて</p>

<div class="label3">症状</div>
<div class="fig" style="width: 140px;">こうしたいのだが…<img src="http://norisfactory.com/stylesheetlab/sample_img/screen_box2_1.gif" alt="" width="140" height="80" /><br />こうなってしまう<img src="http://norisfactory.com/stylesheetlab/sample_img/screen_box2_2.gif" alt="" width="140" height="73" /></div>
<p>これを実現したいのは、例えば、背景画像の下辺に合わせてテキストを乗せたい時などだ。そこで、ボックスに図のような三角形の画像を背景として入れ、vertical-align: bottomと指定した。しかし、ボックス内のテキストは上揃えになったままである（&rarr;<a href="http://norisfactory.com/stylesheetlab/sample_html/box002_ex1.html">サンプルページ1</a>）。同様に、middleを指定してもテキストを中央に配置することはできない。</p>]]>
      <![CDATA[<div class="section">
【スタイルシート】
<code class="pre">#box {
    width: 140px;
    height: 70px;
    background-image: url(bg2.gif);
    vertical-align: bottom;
    text-align: center;
}</code>
<br />
【HTML】
<code>&lt;div id=&quot;box&quot;&gt;← 140ピクセル &rarr;&lt;/div&gt;</code>
</div>

<div class="label3">原因</div>
<p>仕様というしかない。そもそもvertical-alignは、画像やテキストなどのインライン要素か、テーブルのセルに対して指定するのが本来の使い方のようだ。</p>

<div class="label3">対策</div>
<p>テーブルを使う以外に方法はないだろう。（&rarr;<a href="http://norisfactory.com/stylesheetlab/sample_html/box002_ex2.html">サンプルページ2</a>）</p>

<div class="section">
赤字は変更部分（スタイルシートは変更なし）<br />
【HTML】
<code><em>&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;<br />
&lt;tr&gt;<br />
&lt;td id=&quot;box&quot;&gt;← 140ピクセル &rarr;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;/table&gt;</em></code>
</div>]]>
   </content>
</entry>

</feed>
