2008 Information Literacy Seminar.
CSS を使って要素をレイアウトする方法を学びます。 CSS が各要素をどのように扱っているかを理解することができれば、 ページのレイアウトを自在に設定することができるようになります。
CSS では、すべての要素はボックスと呼ばれる矩形領域を生成するものとして扱われる。
個々のボックスは、テキストや画像といった要素の内容が含まれる内容領域(content area)を中心に、
その周囲を空白領域(padding)、枠(border)、余白(margin)が順番に取り囲む階層構造になっている。
「ハリー・ポッター」を紹介する Web ページの各要素が、どのようなボックスとして表現されているのかを確認してみよう。
head 要素内に以下のように追加する。
•••
<head>
<title>ハリー・ポッターの世界</title>
<link rel="stylesheet" type="text/css" href="./harry_potter.css"/>
<link rel="stylesheet" type="text/css" href="./box_model.css"/>
</head>
•••
いくつかの例外はあるものの、文書中で使用される要素は、ブロックレベル要素かインラインレベル要素のいずれかに分類することができる。 ブロックレベル要素とインラインレベル要素は次のように分けられる。
hn)、段落(p)、表(table)、リスト(ol, ul)などがこれに含まれる。
つまり、文書の骨格となる要素群のことであり、文書本体をあらわす body 要素の直接の子要素になれるものである。
a)や強調(em, strong)などがこれに含まれる。
ボックスモデルを利用したレイアウトの練習として、Web ページにサイドメニューを追加してみよう。
まずは HTML ファイルを編集してメニューを追加しよう。
以下の手順へ移る前に、harry_potter.html をエディタで開き、先ほど head 要素内に追加した box_model.css へのリンクを削除しておく。
h2 要素)に id 属性で名前をつける。
こうすることによって個々の見出しが区別できるようになり、リンク先として指定したり、個別のスタイルを設定したりすることができるようになる。
各見出しにつける名前は半角英数字ならば何でもよいが、ひとつの文書中に同じ名前のものが複数あってはならない。
•••
<h1>ハリー・ポッターの世界</h1>
<h2 id="intro">はじめに</h2>
<p>
ハリー・ポッターは、イギリスの児童文学作家 J. K. ローリングによる子ども向けファンタジー小説シリーズです。
•••
</p>
•••
h1 要素)のすぐ下あたりに、ul 要素を利用して次のようなメニューを作成する。
•••
<h1>ハリー・ポッターの世界</h1>
<h2>目次</h2>
<ul>
<li>はじめに</li>
<li>作品紹介</li>
<li>作品リスト</li>
<li>リンク集</li>
</ul>
<h2 id="intro">はじめに</h2>
•••
li 要素)から対応する見出し(h2 要素)へ文書内のリンクを設定する。
文書間のリンクと同じように a 要素を使い、href 属性の値を " #id " とすればよい。
以下の例では、intro という id が設定された要素への文書内リンクを設定している。
•••
<ul>
<li><a href="#intro">はじめに</a></li>
•••
</ul>
•••
レイアウト作業がしやすいように、要素のグループ化や一時的なスタイルの追加をしておこう。
div 要素を追加しよう。
div 要素は汎用のブロックレベル要素で、複数の要素をグループ化したい場合や、HTML に定義されていない構造を表現したい場合などに用いる。
あとでスタイルシートから参照できるように、class 属性に menu、contents という値を指定しておくこと。
•••
<h1>ハリー・ポッターの世界</h1>
<div class="menu">
<h2>目次</h2>
<ul>
<li><a href="#intro">はじめに</a></li>
•••
</ul>
</div>
•••
•••
<div class="contents">
<h2 id="intro">はじめに</h2>
<p>
ハリー・ポッターは、イギリスの児童文学作家 J. K. ローリングによる子ども向けファンタジー小説シリーズです。
•••
</p>
•••
</div>
<hr/>
<address>SENSHU Tarô <ne17XXXX@isc.senshu-u.ac.jp></address>
•••
body > * {
color: inherit;
background-color: #eeeeff;
border: dotted thin blue;
}
link タグを追加しておく。
•••
<head>
<title>ハリー・ポッターの世界</title>
<link rel="stylesheet" type="text/css" href="./harry_potter.css"/>
<link rel="stylesheet" type="text/css" href="./side_menu.css"/>
</head>
•••
body 要素の子要素が薄い青で表示され、さらに青い細枠線が点線でついただろうか。
このように、border プロパティを使うと、ボックスの枠のスタイル、太さ、色を設定することができる。
メニューを左側へ配置して、サイドメニューとして利用できるようにしよう。
class 属性が "menu" となっている div 要素(div.menu)に対して、
横幅(width プロパティ)を 200 ピクセルと指定する。
side_menu.css に以下のスタイル定義を追加しよう。
div.menu {
width: 200px;
}
body 要素の padding プロパティを利用して、本文の左側に 200 ピクセル分のスペースを確保しよう。
padding プロパティは、ボックスの内容領域から枠(border)までの空白領域の幅を設定するプロパティである。
body {
padding-left: 200px;
}
position プロパティと top、right、bottom、left プロパティを組み合わせて使う。
position プロパティで絶対配置を指定し、親要素のボックス内でどこに配置されるかを top、right、bottom、left プロパティで指定する。
ここでは、左上隅に配置されるように top と left に 0 を指定している。
div.menu {
position: absolute;
top: 0;
right: auto;
bottom: auto;
left: 0;
}
ここまでの作業でメニューを左側に配置することができた。 よりサイドメニューらしく見えるように、少しだけ見栄えを整えておこう。
div.menu の子要素に赤色、子孫要素である li 要素に緑色の枠と背景色を指定している。
div.menu > * {
color: black;
background-color: #ffeeee;
border: dotted thin red;
}
div.menu li {
color: black;
background-color: #eeffee;
border: dotted thin green;
}
h2 要素)を非表示にする。
display プロパティを用いて以下のように指定しよう。
display プロパティは、要素のボックスの種類を指定するプロパティである。
その要素のボックスを表示するかどうか、表示するならばどのように表示するのかを制御する。
div.menu h2 {
display: none;
}
ul 要素が、周囲の余白なしで親ボックスいっぱいに表示されるように以下のスタイルを指定する。
margin プロパティは、ボックスの枠(border)の外側にある余白の幅を設定するプロパティである。
以下の例では、上下左右をまとめてマージンなし(=0)に指定している。
div.menu ul {
margin: 0;
}
li 要素)同士の間にもスペースを空けておこう。
ここでもやはり margin プロパティが利用できる。
以下のように記述すれば、上下に 1em のマージンを空け、左右のマージンは Web ブラウザに自動設定させていることになる。
div.menu li {
margin: 1em auto;
}
スタイルシートで指定できるスタイルは、コンピュータの画面で表示させるためのものばかりではない。 スクリーン出力だけではなく、印刷出力、音声出力、点字出力など、複数の出力メディアに対するスタイルを個別に指定することができる。
「ハリー・ポッター」を紹介する Web ページに印刷用スタイルを追加してみよう。
style 要素や link 要素の media 属性で指定することができる。
•••
<head>
<title>ハリー・ポッターの世界</title>
<link rel="stylesheet" type="text/css" href="./harry_potter.css" media="screen"/>
<link rel="stylesheet" type="text/css" href="./side_menu.css" media="screen"/>
<link rel="stylesheet" type="text/css" href="./print.css" media="print"/>
</head>
•••
Web 制作者は、複数のスタイルシートを用意して、ユーザーに好みのスタイルを選択させることができる。
この仕組みを代替スタイルシートと呼び、W3C の仕様に準拠した Web ブラウザには標準で搭載されている機能となっている。
Internet Explorer 7 には代替スタイルシート機能が実装されていないため、 ここでは JavaScript を用いて擬似的にスタイルシート切り替えの例を示すこととする。 なお、この部分はクラスの進行度によっては飛ばしてしまっても構わない。
head タグ内にある link タグと style タグをすべて削除する。
•••
<head>
<title>ハリー・ポッターの世界</title>
</head>
•••
script タグを追加する。
開始タグと終了タグのあいだには何も書かなくてよい。
•••
<head>
<title>ハリー・ポッターの世界</title>
<script type="text/javascript" src="./altstyle.js"></script>
</head>
•••
スタイルシートには以下の 3 種類がある。
rel 属性の値が "stylesheet" で title 属性をつけなかったものは、どの代替スタイルを選んだ場合にも必ず適用される。
すべてのスタイルで適用したい共通の設定を記述しておく。
<link rel="stylesheet" type="text/css" href="persistent.css"/>
rel 属性の値を "stylesheet" とし、title 属性でスタイルの名前を指定する。
この title 属性の値でグループ化して、相互に切り替えることができる。
<link rel="stylesheet" type="text/css" href="preferred.css" title="優先スタイル"/>
rel 属性の値を "alternate stylesheet" とし、 title 属性でスタイルの名前を指定する。
優先スタイルシートと同じように、title 属性の値でグループ化することができる。
<link rel="alternate stylesheet" type="text/css" href="alternate.css" title="代替スタイル"/>
Web 閲覧者は、好みのスタイルを記述したスタイルシートを用意して、閲覧するすべての Web ページに適用させることができる。 この仕組みをユーザースタイルシートと呼ぶ。 以下、Internet Explorer 7 でユーザースタイルシートを利用する方法について説明する。 なお、この部分はクラスの進行度によっては飛ばしてしまっても構わない。
user.css という名前の CSS ファイルが手元にあるものとする。
スタイルシートを複数用意し、ユーザーに選択させることにはどのような意味があるのでしょうか? とくにアクセシビリティの観点から考えてみてください。