Kanasan.JS JavaScript 第 5 版読書会 #7 に行ってきました (当日のチャットログ)。範囲は前回に引き続き CSS の操作、そしてイベント周りと、一般に「JavaScript」といったとき話題になりやすい部分です。参加者のブログ記事は「JavaScriptでCSSとイベントを扱う from Kanasan.JS | Blog.37to.net」のほか読書会のページからたどれます。
display: inline-block;
サイ本では解説されていませんが、CSS の display プロパティの値 inline-block に関して話が盛り上がりました。inline-block 及びそれがどのようなレイアウトに使えるかについては以下で解説されています。
ところで、上記ページのサンプルはいずれも Firefox 2 以下で -moz-inline-box を使っています。しかし、-moz-inline-box が指定された要素の子要素は XUL のボックスモデルに従って整形されるため、そのままでは期待した表示になりません。ヨモツネットのサンプルではこの問題への対策として子要素に幅を指定していますが、別のアプローチとして子要素に -moz-box-flex プロパティを指定するという方法もあります。実際にこの方法を用いたページ送りのサンプルを作ってみました。HTML と CSS は次のようになります。
<ul>
<li><a href="http://example.org/">1</a></li>
<li><a href="http://example.org/">10</a></li>
<li><a href="http://example.org/">100</a></li>
<li><a href="http://example.org/">1000000000000</a></li>
</ul>
/* デフォルトのマージン、パディングが影響しないように。 */
ul, li {
margin: 0;
padding: 0;
}
ul {
text-align: center;
}
li {
display: -moz-inline-box; /* Firefox 2 以下用。 */
display: inline-block;
/* 内容の幅が大きいとき自動的に自分の幅も広がるよう、width ではなく
* min-width を用いる。Firefox 2 以下では -moz-inline-box な要素の
* min-width がボーダーボックスの最小幅として解釈されてしまうが、
* ここではボーダー、パディングの幅が 0 なので影響しない。
*/
min-width: 3em;
}
/* IE 6/7 では、デフォルトで inline でない要素は inline-block を
* 指定した後、さらに inline を指定しないと inline-block 表示にならない。
* margin をつけるのは inline-block 間の空白文字が表示されないため。
*/
* + html li {
display: inline;
margin: 0 0.2em;
}
* html li {
display: inline;
width: 3em; /* IE 6 は min-width 非対応だが width で代用可。 */
margin: 0 0.2em;
}
li a {
display: block;
border: 0.1em solid;
/* Firefox 2 以下でマージンボックスの幅が包含ブロック (この場合は
* -moz-inline-box な要素の内容ボックス) の幅いっぱいに広がるように。
*/
-moz-box-flex: 1;
}
/* IE 6 でボーダーボックス全体がリンクとして機能するように。 */
* html li a {
height: 0;
}
この方法の利点として、-moz-inline-box な要素の幅が % 単位で指定されていても内容の幅がそれに追従してくれるといったことが挙げられます。
ちなみに、IE 7 以下での inline-block 表示に display: inline; zoom: 1;
セコメントをする