HITP 広島工業大学専門学校

ホームページの基礎(2. CSS 編)

← 2.20 スタイルコンテナ  CSS総目次  2.22 レイアウト(2) →

  1. 2.21 レイアウト(1)
    1. 2.21.1 マージンの調整
    2. 2.21.2 センタリング
    3. 2.21.3 リストのレイアウト
    4. 2.21.4 回り込み

2.21 レイアウト(1)

このページでは,これまで説明してきたCSSの各プロパティを使って,実際にいくつかの基本的なレイアウトを行ってみましょう。

2.21.1 マージンの調整

各マージン幅の初期値はゼロですが,これは仕様上の初期値であり,現実のブラウザでは,各要素ごとに初期値を上書きしています。例えば,多くのブラウザでは,p要素の前後に1行の空行が出現します。

例えば,つぎのようなXHTMLのコードの場合を考えてみましょう。

<p>1つ目の段落です</p>
<p>2つ目の段落です</p>
<p>3つ目の段落です</p>

まずは,スタイルシートを適用せずに,一般的なブラウザで表示すれば,以下のような結果が得られるでしょう。

スタイルシートを適用しないp要素

つぎに,以下のようなp要素のマージン幅をゼロに設定したスタイルシートを適用した場合の 表示結果を示します。

p {
    margin-top: 0;
    margin-bottom: 0;
}

スタイルシートを適用したp要素

そこで,すべての要素についてブラウザに依存しないマージン幅を設定するならば,ユニバーサルセレクタを使用して,マージン幅をゼロに設定しておくことが推奨されます。同様に,パディング幅もゼロにすれば,なお,いいでしょう。以下にスタイルシートの例を示しめします。

* {
    margin: 0;
    padding: 0;
}

CSS総目次 | ページ先頭に戻る

2.21.2 センタリング

ブロック内におけるテキストの「センタリング」には,「text-alignプロパティ」を使います。例えば,h1要素に以下のスタイルを指定して表示した場合,つぎのような表示結果になるでしょう。

* {
    margin: 0;
    padding: 0;
}
h1 {
    color: #000;
    background-color: #ccc;
    text-align: center;
}

テキストのセンタリング

では,h1要素の横幅を"250px"として,body要素の横幅に応じて,常にh1要素自体がセンタリングできるようにレイアウトしてみましょう。これには,"margin-leftプロパティ"と"margin-rightプロパティ"に"auto"を指定します。これによってブロックレベル要素のセンタリングが可能となります。

以下に,そのスタイルシートと表示結果を示します。

* {
    margin: 0;
    padding: 0;
}
h1 {
    width: 250px;
    color: #000;
    background-color: #ccc;
    text-align: center;
    margin-left: auto;
    margin-right: auto;
}

ブロックレベルのセンタリング

ただし,ブラウザによっては,"auto"を指定してもセンタリングされないものもあります。これを避けるためには,親要素であるbody要素の"text-alignプロパティ"に"center"を指定します。

* {
    margin: 0;
    padding: 0;
}
body {
    text-align: center;
}
h1 {
    width: 250px;
    color: #000;
    background-color: #ccc;
    text-align: center;
    margin-left: auto;
    margin-right: auto;
}

ただし,このコードではまだ不十分です。body要素の"text-alignプロパティ"でセンタリングを行うと,ブラウザによっては,その子孫要素のテキストもセンタリングされてしまいます(継承されるということです)。以下のXHTMLコードに先のスタイルシートを適用した場合の表示結果を示します。

<body>
<h1>h1要素の見出し</h1>
<p>段落は左寄せで始まります。</p>
</body>

センタリングの失敗

これを避けるためには,つぎのようなスタイルコンテナを用いたスタイルシートを用意します。

* {
    margin: 0;
    padding: 0;
}
body {
    text-align: center;
}
div#body {
    text-align : left;
}
h1 {
    width: 250px;
    color: #000;
    background-color: #ccc;
    text-align: center;
    margin-left: auto;
    margin-right: auto;
}

このスタイルシートを適用するためにXHTMLコードを,つぎのように修正します。

<body>
<h1>h1要素の見出し</h1>
<div id="body">
    <p>段落は左寄せで始まります。</p>
</div>
</body>

すると,この表示結果は,つぎのようになります。

互換性を考慮したセンタリング

ただし,最近のブラウザでは,このような互換性を考慮しなくてもよいものが多くなっています。最初から,互換性を無視して auto のみの指定で,表示できないものは考慮しないのも一つの手段かもしれません。

CSS総目次 | ページ先頭に戻る

2.21.3 リストのレイアウト

つぎのようなリスト構造を持ったXHTMLについて考えてみましょう。

<ul>
    <li>項目1</li>
    <li>項目2</li>
    <li>項目3</li>
    <li>項目4</li>
    <li>項目5</li>
<ul>

このXHTMLコードをスタイル指定せずに表示すれば,一般的なブラウザでは,つぎのように表示されるでしょう。

一般的なブラウザによるリスト表示

つぎに以下のスタイルを適用してみましょう。

* {
    margin: 0;
    padding: 0
}
ul li {
    display: inline;
    list-style-type: none;
}

これは,li要素をインラインブロック化したものです。この場合の表示は,以下のような表示になるでしょう。

li要素のインラインブロック化

つぎに,もう少し見栄えを考えて,項目をボタン風にしてみましょう。

* {
    margin: 0;
    padding: 0
}
ul li {
    width: 5em;
    color: #000;
    background-color: #ccc;
    display: inline;
    list-style-type: none;
    padding: 2px 10px;
    border: outset #ccc;
}

これは,以下のように表示されるでしょう。

li要素のボタン風表示

さらに,ボタンのような動きを加えてみることにします。

* {
    margin: 0;
    padding: 0
}
ul li {
    width: 5em;
    color: #000;
    background-color: #ccc;
    display: inline;
    list-style-type: none;
    padding: 2px 10px;
    border: outset #ccc;
}
ul li:hover {
    background-color: #999;
    padding: 2px 10px;
    border: inset #999;
}

このスタイルシートの指定によりカーソルをボタンに重ねると,選択しようとしているボタンが押されているように見えるようになります。

li要素のボタン風動作

後は,これを応用して,li要素内にa要素を記述し,a要素に動きを加えれば,ボタンによるリンクが見栄えとして完成することになります。また,ボタンではなく,平面的なパネルとし,横1行に表示すれば,「ナビゲーションバー」としても使えるでしょう。

CSS総目次 | ページ先頭に戻る

2.21.4 回り込み

まずは,つぎのXHTMLコードと,その表示結果を見てください。

<h1>回り込み</h1>
<p><img alt="四角形" src="images/image1.jpg" width="61" height="61"/></p>
<p>floatプロパティは,フロートの配置方法を指定する。
フロートの前後に配置される位置指定されていない通常のボックスは,
フロートを無視して配置される。 
ただし,フロートに後続するラインボックスは,その幅がフロート分だけ短くなる。
floatプロパティの書式は以下のとおりである。</p>

回り込みのない表示

この表示は,「回り込み」のない通常の表示です。ここで,画像部分に回り込みを指定してみましょう。つまり,画像部分を「フロート(浮動体)」として,左に寄せ,その右側部分にテキストを回り込ませるようにします。そのスタイルシートは,以下のようになります。

img { float: left; }

このスタイルを指定した場合の表示は,つぎのようになります。

画像の左フロートのサンプル表示

このとき,XHTMLコードを以下のように記述したときは,どのようになるでしょうか?

<h1>回り込み</h1>
<p>floatプロパティは,フロートの配置方法を指定する。
フロートの前後に配置される位置指定されていない通常のボックスは,
フロートを無視して配置される。 
ただし,フロートに後続するラインボックスは,その幅がフロート分だけ短くなる。
floatプロパティの書式は以下のとおりである。</p>
<p><img alt="四角形" src="images/image1.jpg" width="61" height="61"/></p>

このコードでは,テキストのみのp要素の後に画像を含むp要素のブロックが記述されています。XHTMLコードの記述順序は表示順序と密接に関係しています。つまり,基本となる表示順序は,記述した順序で表示されることになる訳です。このような順番になっている構造を「線形」と呼びます。

線形による表示

前述のコードを線形で表示した場合,最初にh1要素ブロックが画面幅で表示され,つぎにp要素ブロック,それから画像が左側にフロートされます。回り込みを使用する場合,この"線形"という概念は,非常に重要になるので注意してください。

では,XHTMLコードを元に戻して,つぎのスタイルシートを考えてみましょう。

h1,img { float: left; }

この表示結果は,つぎのようになります。

h1要素とimg要素へのフロート指定

このようにフロート指定は,画像だけでなくさまざまな要素に指定できます。また,h1要素と画像が共に左フロートですから,右側の余白が許す限り,指定されたフロートは寄せて表示されることになります。では,つぎの例を見てみましょう。

<h1>回り込み</h1>
<p>floatプロパティは,フロートの配置方法を指定する。
フロートの前後に配置される位置指定されていない通常のボックスは,
フロートを無視して配置される。 
ただし,フロートに後続するラインボックスは,その幅がフロート分だけ短くなる。
floatプロパティの書式は以下のとおりである。</p>
<p><img alt="四角形" src="images/image1.jpg" width="61" height="61"/></p>

<table border="1">
    <tr><th colspan="2">floatプロパティ</th></tr>
    <tr><th>値</th><td>left | right | none | inherit</td></tr>
    <tr><th>初期値</th><td>none</td></tr>
    <tr><th>適用対象</th><td>すべての要素</td></tr>
    <tr><th>継承</th><td>しない</td></tr>
    <tr><th>パーセント値</th><td>受けつけない</td></tr>
</table>

<dl>
<dt>left</dt>
<dd>左側にフロートするブロックボックスを生成する。
後続の内容は,"clearプロパティ"の指定に従って,
ボックスの右側に上から回り込む。</dd>
<dt>right</dt>
<dd>右側にフロートするブロックボックスを生成する。
後続の内容は,"clearプロパティ"の指定に従って,
ボックスの左側に上から回り込む。</dd>
<dt>none</dt>
<dd>フロートするブロックボックスを生成しない。</dd>
</dl>

このXHTMLコードに,以下のようなスタイルシートを適用してみることにします。

h1    { float: left; }
img   { float: right; }
table { float: left; }

この場合,h1要素が左フロートで表示され,余白部分にp要素のテキストが表示されます。つぎに画像が右フロートされ,その余白にテーブルが左フロートで表示されます。さらに,余白があれば,そこにdl要素のブロックが回り込んで表示されることになります。

複雑な回り込み

このとき,もしdl要素の部分を回り込ませたくなければ,dl要素に「回り込み解除」を指定します。

h1    { float: left; }
img   { float: right; }
table { float: left; }
dl    { clear: both; }

回り込みの解除

CSS総目次 | ページ先頭に戻る

(C)Copyright 2010 HIROTAKA.YAMASHITA. HITP 広島工業大学専門学校. All Rights Reserved.