画像で枠を作る方法
テーマを作成していると、画像で枠を作りたいと思うことが多々あります。このような時に使用するテクニックを紹介します。
目標
HTMLのソース(詳細はこちら)。両サイドバー表示の左側です。
<div class="side-a"> <div class="side-a-top"></div><div class="side-a2"> サイドバーの中身 </div><div class="side-a-bottom"></div> </div>
部品の分解
まずサイドバーの枠画像を3つの部品に分解します。
side-top.gif | side-middle.png | side-bottom.png |
---|---|---|
155×28 | 155×1 | 155×23 |
最初の画像だけgifになっているのは、左上部を透過させるためです。透過pngはIE6がまともに扱えません。各モジュールのタイトル部画像は次を使います。
side-title.png | |
---|---|
137×40 |
CSSの記述
横幅は 155px ですから、まずそれに合わせて全体の外枠を決めます。
div.side-a { width: 155px; }
このブロックの上下に画像を貼り付けます。HTMLとよく対比してみてください。
div.side-a-top { background-image: url("side-top.gif"); height: 28px; width: 155px; } div.side-a-bottom { background-image: url("side-bottom.png"); height: 23px; width: 155px; }
中間部分はリピートさせ、また内部の要素が画像をはみ出さないように適切な padding を指定します。
div.side-a2 { background-image: url("side-middle.png"); background-repeat: repeat-y; padding: 1px 9px 1px 9px; /* 155-9-9 = 137px(内側) */ }
上下の「パディング 1px」を取らないとマージンの相殺が発生しうまく表示されなくなります。
モジュールの記述
モジュールは次のように記述しました。
div.hatena-module { /* モジュール間の隙間 */ margin-bottom: 1em; } div.hatena-moduletitle { background-image: url("side-title.png"); background-repeat: no-repeat; /* 文字がはみ出すとIEで領域が大きくなるため */ color: #444; min-height: 29px; /* = 40-11 */ _height: 40px; /* IEが min-height 非対応のため */ padding: 11px 0px 0px 0px; font-size: 115%; font-weight: bold; text-align: center; } /* sidebar項目本体 */ div.hatena-modulebody { color: #644; padding: 0 0.4em 0.2em 0.4em; margin-top: 0; }
テーマを作っているとIEの計り知れないバグの多さ(理解に苦しむレンダリングの挙動)に辟易するかも知れませんが、_ (アンダーバー付き)のプロパティで地道に修正するしかありません。