CSSの実習(7) - レイアウト関連の指定(1)・フローティング。

お詫び(平成23年11月12日)
本コンテンツでサンプルとしている HTML 文書に以下のマークアップ漏れがありました。

平成23年11月10日以降に本コンテンツをご利用の方は、訂正した HTML 文書を御覧ください。

ご迷惑をお掛け致しました事を深くお詫び申し上げます。

前回の実習(6) - リスト要素関連の指定では、各要素の背景に画像を用いる事で、幾つかの視覚効果を与えてみました。

今度はレイアウト関連のスタイル指定、すなわち要素の配置の指定をやってみましょう。

レイアウトを指定するための方法には幾つかありますが、今回は最も単純な方法であるフローティングを用いたレイアウトをやってみましょう。

フローティング関連のプロパティはフローティング関連の主なプロパティに纏めておきましたので、そちらも適宜参照してください。

フローティングの指定で出来る事。

CSSでのフローティングとは、ある要素を左または右に寄せ、後続するテキストをその反対側に廻り込ませる事です。

通常のウェブブラウザのレイアウトはブロックレヴェル要素を上から下に、一次元的にレイアウトされます。

フローティングを用いと、ブロックレヴェル要素を左または右に寄せる事が出来、その結果二次元的なレイアウトも可能になります。

今回やりたい事。

今回は以下の事をしてみましょう。

  1. HTML文書内に埋め込んだ以下の画像を、左にフローティングさせ、後続のテキストを反対側に廻り込ませます。
    • 堀北真希ちゃんをモデルにした制作者の創作キャラクタ・堀北真希うさぎ(うさ耳女子大生)を描いたGIF画像(幅218ピクセルズ、高さ269ピクセルズ)
  2. ただ、廻り込みを指定した場合、そのままにしておくと延々廻り込みとなりますので、適切な処で廻り込みを解除しましょう。
    • 廻り込みを解除しないと、大きな画像の場合思わぬところまで廻り込みの影響が出ますので、廻り込みを行う場合には何処で廻り込みを解くかは考えておく必要があります。

    ここでは、後程現れる<hr>要素(段落間の区切り)で廻り込みを解除する事とします。

  3. これ以外にはフローティングは一切行いません。すなわち、デフォルトではフローティングは一切なしとします。

ここでは、実習としてやりたい事を挙げておりますが、もし読者の方がここで挙げているスタイルではなく、別のスタイルにしてみたいと思うのであれば、それを実際にやってみるのが何よりの実習です。

是非挑戦してみてください

実際のスタイル定義。

さて、これから実際に前回までのスタイル定義ファイル style.css にスタイルを追記していきましょう。

まず、基本スタイルではフローティングは一切しません。

CSSの仕様ではデフォルトではフローティングをしない事となっておりますが、実際のウェブブラウザではそのようになっているかどうかは分かりません。

実際にブラウザのデフォルトスタイルで特定の要素をフローティングすると言うのは聞いた事がありませんが、絶対無いとも断言出来ません。

  • 何故なら、HTMLの仕様に於いてデフォルトスタイルでフローティングをする事を禁じていないからです。

そこで、念のため、初めに決めた通りの基本スタイルとしてフローティングをしないようにしてやります。

スタイル定義ファイル style.css 内の全称セレクタに対するプロパティ定義に、以下のように追記する事で新たなプロパティを指定します。

* {
    background-color: transparent;
    background-image: none;
    color: #000;
    margin: 0;
    padding: 0;
    border: none 0;
    background-color: #fff;
    color: #000;
    font-family: "MS Pゴシック", sans-serif;
    font-size: 100%;
    font-style: normal;
    text-decoration: none;
    font-weight: normal;
    text-align: left;
    line-height: 1.5em;
    text-indent: 0;
    float: none;
    }

ここで、

で、今回は none 値、すなわちフローティングなしとしております。

画像の廻り込みの指定。

基本となるスタイルを指定したら、初めに決めた通り、画像の左フロートを指定します。

具体的には、<img>要素(埋め込み画像)に対して float: left プロパティを適用します。

ただ、今回実例として挙げているHTML文書にはありませんが、画像も単なるお飾りの画像だけでなく、テキスト内に埋め込まれた画像もあり、そのような画像はフローティングされると却って困ります。

このため、お飾りの画像は <figure class="sample">要素としてマークアップされておりますので、この要素内の<img>要素に限り適用する事とします。

スタイル定義ファイル style.css の末尾に、sample と言うクラス名を与えられた<figure>要素の下位にある<img>要素と言う下位セレクタ(子孫セレクタ)に対する以下のスタイル定義を追記します。

実際の<figure class="sample">要素へのスタイル定義は以下のようになります。

尚、新しいセレクタに対するスタイル定義を書き足す場合、初めの @charset 規則以降であれば何処に書き足しても良いのですが、ここではクラス名を与えられた特別な要素へのスタイル定義、つまり一般的なスタイル定義ではないため、取り敢えず一般のスタイル定義と分けて考えると言う事から、末尾に書き足す事とします。

  • 既に定義したスタイル定義の影響などから、書き足す場所に制約が出る場合もあるのですが、今回は他のスタイル定義の影響をうける事はありませんし、また他のスタイル定義に悪影響を及ぼす恐れもありません。
/* 特別なクラス名を持った要素のスタイル定義 */
figure.sample img {
    float: left;
    }

廻り込み解除の指定。

続けて、今度は基本となるスタイルを指定したら、予め決めておいた廻り込みの解除を指定します。

今回は、<hr>要素(段落間の区切り)で廻り込みを解除する事としているので、<hr>要素を対象とした要素セレクタ(型セレクタ)に対し、float: both プロパティを適用します。

  • 今回は左廻り込みだけですが、右廻り込みも解除の対象とします。

実際の<hr>要素へのスタイル定義は以下のようになります。

hr {
    margin: 3em 0 1em;
    border: 1px solid #888;
    clear: both;
    }

ここまででのスタイル定義ファイルの纏め。

以上のスタイルを纏めると、スタイル定義ファイル style.css は以下のようになっているでしょう。

@charset "shift_jis";

* {
    background-color: transparent;
    background-image: none;
    color: #000;
    margin: 0;
    padding: 0;
    border: none 0;
    background-color: #fff;
    color: #000;
    font-family: "MS Pゴシック", sans-serif;
    font-size: 100%;
    font-style: normal;
    text-decoration: none;
    font-weight: normal;
    text-align: left;
    line-height: 1.5em;
    text-indent: 0;
    float: none;
    }

html {
    background-color: #fff;
    padding: 2em 1em;
    }

h1 {
    margin-bottom: 1em;
    background-color: #ff0;
    color: #090;
    font-style: italic;
    font-weight: bold;
    font-size: 200%;
    line-height: 1.2em;
    text-align: center;
    }

h2 {
    margin: 3em 0 1em;
    border-color: #cc0;
    border-style: solid;
    border-width: 1px 2px 4px;
    background-color: #fff;
    background-image: url("Background-H2.GIF");
    background-repeat: repeat-y;
    background-position: right top;
    color: #090;
    font-size: 120%;
    line-height: 1.2em;
    }

p {
    margin: 1em 0 0 2em;
    text-indent: 1em;
    }

ul {
    margin: 1em 0 0 4em;
    list-style-image: url("ListMarker.GIF");
    list-style-type: disc;
    list-style-position: outside;
    }

figure {
    margin: 1em 0 0 2em;
    }

hr {
    margin: 3em 0 1em;
    border: 1px solid #888;
    clear: both;
    }

a:link {
    color: #090;
    text-decoration: underline;
    }

a:visited {
    color: #000;
    text-decoration: underline;
    }

dfn {
    border-bottom: 2px solid #cc0;
    color: #090;
    }

em {
    padding-top: 4px;
    background-color: #fee;
    background-image: url("Background-EM.GIF");
    background-repeat: repeat-x;
    background-position: left top;
    color: #000;
    }

/* 特別なクラス名を持った要素のスタイル定義 */
figure.sample img {
    float: left;
    }

このスタイル定義ファイルを適用したHTML文書を表示させると以下のようになります。

前回までのスタイル定義の場合
画像の直後のテキストは新たな段落のため、改行されて画像の下に配置されております。
今回のスタイルを適用した場合
画像の直後のテキストは画像のフローティングに依り、右側に廻り込んで表示されております。また、後続の<hr>要素の姿である横罫線は画像廻り込みが解除された結果、画像の下に表示されております。

画像周りの修正。

さて、実際に表示させてみたところ、画像の右のテキストがぴったり画像にくっ付いてしまい、その結果リストに付けたマーカが画像に喰い込んでしまっております。

また、今回は後続のテキストがそれ程ないため影響が出ておりませんが、後続するテキストが長い場合、画像の横に入り切らなかった文が画像のすぐ下にぴったりくっついて廻り込んでしまいます。

これらは、フロートさせた画像の右と下に適切な余白が入っていない事が原因です。

  • このように、フローティングを行う場合には、フロートさせる要素に適切に余白を与えないと思わぬ失敗を犯す事となります。

そこで、フローティングの対象となる<img>要素について、

  • 右側には二文字分の余白
  • 下側には一文字分の余白

を与える事にします。

具体的には、margin: 0 2em 1em 0; プロパティを与えれば良い事になります。

figure.sample img {
    margin: 0 2em 1em 0;
    float: left;
    }

この結果、本講での最終的なスタイル定義ファイルは以下のようになります。

@charset "shift_jis";

* {
    background-color: transparent;
    background-image: none;
    color: #000;
    margin: 0;
    padding: 0;
    border: none 0;
    background-color: #fff;
    color: #000;
    font-family: "MS Pゴシック", sans-serif;
    font-size: 100%;
    font-style: normal;
    text-decoration: none;
    font-weight: normal;
    text-align: left;
    line-height: 1.5em;
    text-indent: 0;
    float: none;
    }

html {
    background-color: #fff;
    padding: 2em 1em;
    }

h1 {
    margin-bottom: 1em;
    background-color: #ff0;
    color: #090;
    font-style: italic;
    font-weight: bold;
    font-size: 200%;
    line-height: 1.2em;
    text-align: center;
    }

h2 {
    margin: 3em 0 1em;
    border-color: #cc0;
    border-style: solid;
    border-width: 1px 2px 4px;
    background-color: #fff;
    background-image: url("Background-H2.GIF");
    background-repeat: repeat-y;
    background-position: right top;
    color: #090;
    font-size: 120%;
    line-height: 1.2em;
    }

p {
    margin: 1em 0 0 2em;
    text-indent: 1em;
    }

ul {
    margin: 1em 0 0 4em;
    list-style-image: url("ListMarker.GIF");
    list-style-type: disc;
    list-style-position: outside;
    }

figure {
    margin: 1em 0 0 2em;
    }

hr {
    margin: 3em 0 1em;
    border: 1px solid #888;
    clear: both;
    }

a:link {
    color: #090;
    text-decoration: underline;
    }

a:visited {
    color: #000;
    text-decoration: underline;
    }

dfn {
    border-bottom: 2px solid #cc0;
    color: #090;
    }

em {
    padding-top: 4px;
    background-color: #fee;
    background-image: url("Background-EM.GIF");
    background-repeat: repeat-x;
    background-position: left top;
    color: #000;
    }

/* 特別なクラス名を持った要素のスタイル定義 */
figure.sample img {
    margin: 0 2em 1em 0;
    float: left;
    }

このスタイル定義ファイルを適用したHTML文書を表示させると以下のようになります。

修正前のスタイル定義の場合
画像周り、ここでは右にテキストがくっ付いております。
今回のスタイルを適用した場合
画像周りのテキストが適切に引き離されております。