Untitled de Go RSS

... because the code matters.

Archive

May
26th
Sat
permalink

リキッドイメージとFaux columns:CSS

リキッドやエラスティックレイアウトの時に図を一緒に拡大縮小する方法と、サイドバーの背景の高さを下まで持ってくるやりかたです。

リキッドイメージ、エラスティックイメージ

リキッドレイアウトやエラスティックレイアウトにおいて、コンテンツのイメージも一緒に拡大縮小するようにする方法です。文字をデカくしたい人は図もデカくしたいでしょうから。
Liquid Images図は実際にやってみたスクリーンショットです。リキッドレイアウトなので、フォントサイズは変わっていませんが、画像が縮小しているのが分かるかと思います。

Read more… or Read more right here… »

  • 実際見せるより大きい画像(幅500pxとか)を用意する。
  • HTMLのimgタグにwidth, height属性を書かない。
  • CSSでimgにwidthを%かemで指定する(25%(=125px)とか)。
  • 一応max-widthに最大幅を指定(max-width:500pxとか)しておき、モザイクにならないようにする1
  • imgのpaddingも%かemで付けるべきでしょう。

CSSの例

div#content p img {
   width: 25%;
   max-width: 500px;
   float: left;
   padding: 2%;
}

Faux columnsをリキッドレイアウトに適用する

今度は拡大縮小の話ではありません。

Faux columnsとは?

通常、サイドバーとメインコンテンツの高さは違いますので、サイドバーに当サイトのようにグレーに色を塗ると、ボックスが途中で切れているのがよく分かってしまいます。
通常のbox

これの例えばサイドバーを、下まで全部グレーに塗ろうと思うと、wrapperになっているボックス要素の背景にグレー帯の縦1ピクセルの背景画像をCSSでrepeat-yするのが一般的でしょう。
Faux columns 説明

CSS

div#wrapper {
   background: #fff url(images/bgbar.gif) repeat-y left top;
}

これをFaux columnsと言うそうです。良くやる手だと思います。当サイトはやってませんがw。

background-postionに%を指定するとは?

background-postionにpx(ピクセル)を指定した場合は、適用するボックスの左上から数えて指定したピクセルのところにbackground-imageの左上角が来るように配置されます。

ところが、%を指定した時は、「background-imageについて指定した%にあたる点が、適用するボックスについて指定した%に当たる点に来るように」配置されます(図)。
background position using %

リキッドレイアウトの背景をずらさないように配置する

上記の背景位置に%を指定した時の挙動を、水平方向だけ使用して、リキッドレイアウトで画面を広げていって、サイドバーが広がっても、背景も広がるように見せます。

  • とても長い、高さ1ピクセルの背景画像を作る(1000pxとか)。
  • サイドバーの背景部分に色を塗って、コンテンツの部分は透過させます(透過GIFを作る)。透明でも長さは必要です。
    Faux columns liquid 説明
  • サイドバー部分の色を塗る長さは、リキッドレイアウト時に、上記の例ではdiv#menuにあたるところが何%になっているかをそのまま適用します。例えば背景画像を1000pxとし、div#menuのwidthが25%だったら、250pxの長さまで塗ります。
  • CSSで背景の水平位置に指定した%を記述して、repeat-yします。

CSS

div#wrapper {
   background: #fff url(images/bg-liquid.gif) repeat-y 25% 0;
}

上記の例のように両側にサイドバーがある場合は、HTML構造上、もう一つ#wrapperを作るしかありません。

それと、上記の例でも同じですが、#wrapperの中身が全部フロートするとボックスの高さが無くなってしまいますので、footerとかを#wrapperに入れて、CSSでclear: both;とかしておかないと、背景も出なくなりますので、念のため。
Faux columns bothside

そして、反対向きの上記のような透過GIFを作成して、今度は例えば75%から右を塗ります。CSSは以下のようになります。透過GIFを重ねているので左右どちらの背景も表示されます。

CSS

div#wrapper1 {
   background: #fff url(images/bg-liquid-left) repeat-y 25% 0;
}
div#wrapper2 {
   background: #fff url(images/bg-liquid-right) repeat-y 75% 0;
}

最後は図を作るのが嫌になりました...

« Hide it

  1. IE6ではmax-widthは効きません。モザイクにしたくない場合は巨大な画像にすればOKです

Share This

(via Tech de Go)
May
25th
Fri
permalink

CSSのコメントを除去する

CSSのコメントは、/* — */ ですが、自分で分かるように区分したりメモをコメントにしていると、CSSのファイルサイズが結構大きくなるものです。だからと言ってエディタで消しちゃうと訳が分からなくなります。

先般、ある人が、CSSファイルをPHPとしてApacheに読み込ませることにより、サーバにはコメント入りCSSなのに、クライアントにはコメント無しのCSSを送るという技を使っていました。
.htaccessファイルにCSSのMIME typeを以下のように記述するだけです。

.htaccess

addtype application/x-httpd-php .css

コメントを消すだけではなく、CSSの中でphpで条件分岐してCSSコードを吐き出すことが出来るようになるので、ユーザーエージェントを判別して検索ボットさんだったらdisplay:none;を消す...とか出来るんですが、これは批判が来そうなので、機会があれば書くことにします。

最後に、コメントを除去したからクライアント側の表示が早くなるかというと、キャッシュするしくみ(XCacheやeAccerelator、phpモジュールなど)が無ければ、早くなることはないでしょう。早さを求めるならGZIPで送る等を考えた方がいいようです。

Share This

(via Tech de Go)
May
22nd
Tue
permalink

マージンの相殺について:CSS

垂直方向のマージンの相殺(margin collapsing)についてです。特に難しいことはないですが、レイアウトする時は気にする必要があると思います。

A.基本

  • 垂直方向のマージンは相殺されて、長い方のマージンになる。フロートしたボックス、及びposition: absoluteのボックスは相殺されない。
    Margin Collapse - Multiple box
  • あるボックスがボックスに内包されている場合、かつ外側のボックスにpaddingとborderが無い場合、垂直方向のマージンは相殺されて長い方のマージンになる。
    Margin Collapse - Innerbox
  • ボックス内が空の場合は、自分自身の上下マージンも相殺されて長い方のマージンにまとまる。
    Margin Collapse - boxself

B.Tips

Tipsというほどではありませんが、垂直マージンの相殺は、複数パラグラフの最初と最後のマージンと途中のマージンを同じにする効果があります。マージンを同じにするだけなら、最初のパラグラフにmargin-topでいくらとか、計算する必要はありません。
Margin Collapse with paragraphs

また、よくある

HTML

<div id="box">
   <p>このパラはmargin 20pxです。</p>
</div>

包含div#boxにmargin:10pxをして、

CSS

div#box {
   margin: 10px;
   background-color:#d5d5d5;
}

p{
   margin: 20px;
   background-color:#6699FF;
}

以下のような結果を期待しても、

このパラはmargin 20pxです。

以下のようになってしまいます。

このパラはmargin 20pxです。

これを期待したようにするためには、垂直方向のpaddingかborderを包含ボックスに入れれば良いです。

CSS

div#box {
   margin: 9px;
   padding: 1px;
   background-color:#d5d5d5;
}

p{
   margin: 20px;
   background-color:#6699FF;
}

これで、期待したとおり(上の方の例)の結果になります。

Share This


May
20th
Sun
permalink

フロートとネガティブマージンまとめ:CSS

tableレイアウトをやってた人も計算してからコーディングしてたと思います。CSSのfloatを使用したレイアウトにしても、floatの挙動を正確に覚えれば、緻密な構成が可能になります。以下は私が覚えたときのフロートレイアウトの考え方のまとめです。

A.フロートの基本(フロートしたボックスとしないボックスの関係)

良くあるHTML構造でフロートしてみます。div#wrapperの中のp#content1だけをフロートさせます。content1とcontent2にmarginを設定し、paddingとborderは全てゼロです。

HTML

<div id="wrapper">
  <p id="content1">
     ・・・
  </p>
  <p id="content2">
     ・・・
  </p>
  <p id="content3">
     ・・・
  </p>
</div>

CSS

#wrapper {
   width: 450px;
   border: dotted 1px;
}
#content1 {
   float: left;
   width: 160px;
   margin: 20px;
}
#content2 {
   margin: 10px;
}
#content3 {
   margin: 0px;
}

CONTENT1
Morbi eu arcu id ipsum aliquet lobortis. Pellentesque suscipit, quam at condimentum pharetra, nunc eros rhoncus metus, id luctus enim arcu vel risus.In urna leo, porttitor eget, tempus ut, fermentum non, libero. Ut aliquet. Ut consequat. Proin varius, dui ac mollis pulvinar, elit nulla feugiat nisi, a vehicula nisl magna ut nulla. Mauris gravida nunc ut augue. Donec leo. Aenean lorem mi, gravida eget, adipiscing ut, aliquam nec, mauris.

CONTENT2
Suspendisse at neque sit amet ante hendrerit porta. Maecenas sit amet ante quis pede ultricies consectetuer. Curabitur pellentesque faucibus nisi. Maecenas a dolor at massa fringilla adipiscing. Donec blandit vehicula nisi. Aliquam sem neque, tincidunt eu, ornare nec, tristique vitae, felis.

CONTENT3
Sed vel orci nec dui ullamcorper porttitor. In dapibus, sapien vitae semper gravida, nisi sem cursus justo, vel luctus quam velit a metus. Pellentesque sed lorem. Sed fringilla accumsan lacus. Suspendisse feugiat ipsum ac odio.
Donec adipiscing. Fusce placerat vehicula nunc. Donec nibh. Duis purus. Quisque diam. In mattis erat quis ligula. Nulla cursus risus. Ut tempus tincidunt enim. Suspendisse mi tellus, consequat et, vehicula ac, facilisis sed, pede. Praesent odio. Nam lorem. Suspendisse feugiat. Morbi justo arcu, dapibus vitae, aliquam sit amet, pulvinar ac, mauris.

  • 要素のボックスをフロートするので、何らかの形で幅(通常width)が指定されていること。
  • フロートされたボックスは外側のボックスの上、端(左右)に、マージンを縁として配置される1
  • テキスト:先行するフロートされたボックスに続くテキストは隣接する。隣接しなければ回り込む。
  • ボックス:フロートされたボックスに続くフロートじゃないボックスは、フロートボックスは無かったかのように配置される。重なる場合はフロートされたボックスの背面にボックスの背景とボーダーが隠れる。

Read more… or Read more right here… »

外側のボックスの高さについて

floated div with nocontentフロートボックスは、それを内包しているボックスの高さに影響しません。従って、上記の例で、#container2も(つまり内包ブロック全て)フロートさせると、以下のようにdiv#wrapperの高さはゼロになります。これを何とかするのがclearfixハックですが、他にも、ボックスの最後にカラの要素(フローとしてない)を入れてclear:bothすれば高さが出ます。

B.ボックスのフロート基本(フロートボックス同士の挙動)

  • 最初のフロートボックスのマージン外側が、外側のボックスの端につっかかるまで移動する。
    floatd explanation 2
  • 次のフロートボックスのマージン外縁は、最初のフロートボックスの端に突っかかるまで移動する。
  • カラム落ち:外側のボックスに入りきらないと、フロートボックスは下段におちてボックス端まで移動する。
    floatd explanation 3
  • 上記の際にフロートボックスの端があると、そこでつっかかって止まる。
    floatd explanation 4

C.ネガティブマージンによるフロート

通常HTMLの記述ではsidebarは以下のようにdiv#sidebarはdiv#maincontentの後にあります。
これをマイナスマージンでsidebarをmaincontentの左に持っていくやり方の考え方です。実際のレイアウト(fixed, liquid, elasticなど)については別途記事にする予定です。

HTML

<div id="wrapper">
  <p id="maincontent">
     ・・・
  </p>
  <p id="sidebar">
     ・・・
  </p>
</div>

float: left;の場合で説明します。

  • 基本:左にフロートされたボックスの後に、さらに左にフロートされたボックスがある場合、後のボックスのマージン右辺が、前のボックスのマージン左辺より右にあってはならない。同じ事が右にフロートされたボックスにも当てはまる。
    negative margin 1
  • 最初のボックスのマージン左辺を右側に大きく振ります(margin-left: -200pxとか)。
    negative margin 2
  • 次のフロートされたボックスの右辺が、前のボックスの左辺を探しながら、右からやってくる。
    negative margin 3
  • 最初のボックスは、次のフロートボックスを左へ受け流し、左に振ったマージン右辺のところまで、次のボックスがフロートして配置される。
    negative margin 4
  • 別のケースで、最初のボックスの左マージンを大きくとって、次のボックスの左辺を大きく右に振ります(margin-right: -200pxとか)。
    negative margin 5
  • 後にフロートされたボックスの右辺が、前のボックスの左辺にぶつかるまで左へ流れて止まる。
    negative margin 6

D.IE6様対策

ここではフロートレイアウトに影響するバグと対策だけ記述します。

1.widthの解釈

IE6 quirks mode
有名なwidthの解釈の違いです。レイアウト上は致命的です。「widthのある属性にpaddingやborderを使わない」ということにつきます。
「floatにはwidthを指定する」「widthとpadding, border」を使わないを合わせると、

floatした要素にはpadding, borderを使わない。

になります。paddingしたい場合はHTML構造で中にもう一つコンテナを作ってそこでpaddingやborderを指定するようにします。そうすればレイアウト上の苦労は少なくなります。

2.”have layout”問題

“have layout”プロパティを持つ要素はサイズや位置がコントロールされます。持ってない要素では親要素に従ってレイアウトされます。
“have layout”になるのは以下のような場合です。

  1. body, table, tr, td, img, hr, input, select, textarea, button, iframe, embed, object, applet, marqueeの各要素
  2. position: absolute; が指定された要素
  3. float: が指定された要
  4. display: inline-block; が指定された要素
  5. width, height が指定された要素

“have layout”にはいろんな問題があります。以下は一部です。

テキストが回り込まずにボックスになる。
本来(フロートしてない)テキストに関しては、フロートしたボックスの周りに回り込むべきですが、haslayoutの場合、ボックス型になってしまいます。これを避けるには、haslayoutにならないようにするしかないようです。
IE haslayout bug
widthを指定していても、幅が勝手に広がる。
widthを指定しているボックスは大きくしないであふれたテキストは次行に送って欲しいところですが、haslayoutの場合、はみ出したテキスト分だけwidthを無視して幅を広げてしまいます。
IE haslayout bug 2

3. margin double 問題

私はこのマージンが二倍になってしまう問題に良く出くわします。ただ、見てすぐわかるのと、解決方法が簡単なので、覚えるだけです。
doublemargin.png

4. その他のバグ

duplicate character 問題
ボックスの最後の数文字が、ボックスの下に重複して出現するバグです。連続する2つ以上のコメントが、フロートした要素のあいだに入っていることが2回以上あると発生します。
このような現象が出たら、連続するHTMLコメントを疑ってください。
peek-a-boo バグ
フロートした要素の後の、フロートしていない要素が、消えてしまう現象で、なぜかページをリロードすると出現します。この現象の発生条件は、①フロート要素の後にフロートしていない要素があり、②その後にclearした要素があり、それがフロートした要素に接触していて、③これらを内包する親ボックス要素にwidthやheightが設定されいない、かつ背景の色かイメージが設定されている。です。
解決するにはフロートした要素にposition: relative;を付け加えるだけです。

結局FirefoxかOperaでレイアウトを確認して、正しくレイアウトされてから、IE6で確認し、おかしかったら同じ現象のバグを検索するしかないでしょう。

« Hide it

  1. 「垂直マージンの相殺」については別途記事にする予定ですが、フロートとは関係ありません。

Share This

(via Tech de Go)
May
16th
Wed
permalink
変な雲。

変な雲。