"いろは"の先のCSS 第2回

徳保隆夫 2003.09.23

はじめに

CSSの"いろは"をご存知の方向けに、CSSを用いたリニューアルのサンプルをご紹介します。ただし、いきなり作例を示して、ハイおしまい、とはいたしません。私はこれまで、多くの方へのアドバイスの中で、CSSの活用案をいくつか作成してきました。この連載では、私が実際に遭遇した活きた課題に、みなさんにも取り組んでいただきます。

すぐに解答(もちろんこれは"ひとつの解答"に過ぎません)を読んでしまってもかまいませんが、ほんの数分でもご自分で考えをめぐらせると、よりいっそう楽しめるはずです。よろしくお付き合いいただければ幸いです。

本講座の構成

前提知識
HTMLとCSSの"いろは"
想定する閲覧環境
代替CSSを利用できる視覚系WWWブラウザ(Windows版IE6+JavaSript/NN7/Opera7/etc)

CSS の苦手なこと

早速、課題に取り組んでいただいてもよいのですが、今回の課題はたいへんです。改善案の作成は簡単なのですが、再現案の作成が困難を極めます。つまり、CSSで元のデザインを復元するのが大変なのです。元のデザインが、凝ったレイアウトを採用しているのでしょうか? いいえ、違います。難しいことは何もしていません。ただ、装飾のパターンが多すぎるのです。

CSSを用いたデザインの再現において、最終的に最大の難関となるのが、この「装飾のパターンが多すぎる」という問題なのです。

レガシーなHTMLの発想を乗り越えよう

従来、font要素やbr要素、あるいはtable要素などを多用してHTML文書を装飾する方法が多く用いられてきました。その一方で、見出し、段落、箇条書き、といった文書構造に注意が払われることはありませんでした。「ちょっとこの辺、本文と区別しようか」といっては文章をテーブルの中に入れたり、「見出しを強調する」と称してfont要素を用いたり、そんなことばかりに精力が注がれてきたのです。

その結果、見出しはfont要素とb要素で表現し、段落はbr要素による改行で区分、箇条書きは改行と中点で表す、などいうやり方が横行する状況となりました。結果として見出し(段落/箇条書き)のように見えればよいという認識が広まってしまい、HTMLできちんとそれらを明示する必要性にまったく気付かない人が多いのが現状です。この知的怠惰こそが、Web製作の手数を増やす最大の原因です。

結果として見出しに見えるような装飾の仕方は、無数にあります。だから、その場の思いつきで「この見出しは文字サイズ4、文字色blue、太字、前後の改行は2つずつにしよう」などと決めていくと、ひとつの文書、ひとつのサイトの中で、見出しの装飾パターンが無数に増えます。ついにはサイト内での整合が全く取れなくなり、デザインが破綻します。

趣味の個人サイトはたいてい、デザインが破綻しています。「表示結果」という自由度の高い道具を自律的に用いるのは、非常に困難なのです。

Strict HTML + CSS の制約

正しくHTMLを使い、CSSで装飾する手法は、ある意味、窮屈です。例えば、これまで無数の表現パターンを使い分けて表現してきた見出しは、h1〜h6というたった6種類に制限されます。前後の改行幅をbr要素で自在に増減し、(主に全角の)空白を用いてインデント量を調節してきた段落も、ただ1種類のp要素に統合されます。順不同リストはすべてul要素で、順列リストはすべてol要素です。文中の強調表現だって、em要素とstrong要素の2種類しかありません。

それだけではありません。例えば、見出しをp要素としてマークアップするのは禁止です。b要素やfont要素で装飾すれば、p要素でも十分に見出しらしく表現されるかもしれません。けれども、見出しはh1〜h6要素と決まっているのだから、p要素では絶対にダメなのです。箇条書きは箇条書きとしてマークアップしなければならず、段落は段落としてマークアップしなければならない。これは非常に厳しい制約です。

そしてCSS最大の制約は、「HTMLでマークアップされた各要素を装飾する」という仕組みにあります。CSSはHTMLの仕様に定められた要素の表現しか指定できません。したがって、CSSでは、レガシーなHTMLの発想を置き換えることはできません。例えばp要素への指定は、すべてのp要素に適用されるので、様々な装飾の段落を同居させることは(基本的に)できないわけです。

制約が生む価値

こうした制約にすべて合理的な理由があることは、HTMLとCSSのいろはを既に習得されているみなさんなら、よくご存知でしょう。

なぜ、きちんとマークアップする必要があるのでしょうか? そう、計算機に見出しは見出し、段落は段落と認識させるためでした。見た目と文脈で判断できるのは人間だけです。だから例えば検索エンジンが情報を整理するには、音声系ブラウザが正しく文書を読み上げるためには、計算機が文書構造を判断する目印が必要なのです。

そしてCSSの制約もまた、結果的にはよい方向へと働きます。「内容的には些細な差なのに見た目が全然違う」「区別するべきものがそっくりな外見だ」といった欠陥デザインはよく見かけます。HTMLで明示した要素毎に表現を指定するCSSの仕様は、装飾の段階で文書構造を意識することを要求しますから、ピントのずれた表現の防止につながります。

Strict HTML + CSS という手法に従えば、HTMLの制約により文書の表現がかっちり制御されます。内容に即した自然で統制の取れた表現を実現できますから、文書は見やすくわかりやすいものとなるはずです。

CSSの苦手なこと

レガシーなHTMLによる装飾のひとつひとつは、たしかにCSSでも再現できます。しかし、CSSは場当たり的な表現の指定には向きません。ですから、ルール無用の不統一なデザインをCSSで再現するのは難しいのです。とはいえ、そのようなデザインはあまりよいものではないはずです。せっかくCSSを導入してリニューアルするならば、原状の再現を放棄して、新しいデザインを模索するべきでしょう。

課題 No.03 (前半)

じっくり取り組みましょう。

教材の紹介

課題 No.03(別ウィンドウに開くと便利です)
課題 No.03 キャプチャ画像

HTMLの修正

"表示結果"ではなく"文章の内容"に即したマークアップに修正します。そうすれば、適切なCSSと組み合わせることで、その文書にふさわしい様々な表示結果を無理なく実現できるようになります。……と、前回は書きました。

ところが今回の教材は、HTML文書として破格の構造をもっています。すんなりとマークアップを修正できそうにありません。こんなときは、以下の手順を踏むことにしましょう。

  1. テキストのみ抽出し、イチからマークアップをやり直します。
  2. blocklevel要素をすべてp要素とします。
  3. p要素ではおかしいと思われる箇所について、適宜マークアップを修正します。h1〜h6要素、ul要素、ol要素、dl要素、blockquote要素、address要素でほとんど足りるはずです。(慣れないうちは無闇に使う要素を増やさないこと)
  4. inline要素を必要最小限マークアップします。a要素、em要素、strong要素、q要素でほとんど足りるはずです。(慣れないうちは以下略)

今回の課題が難しいのは、続きがあるからです。

マークアップの結果と教材を見比べると、教材では段落も見出しも箇条書きも、箇所によって全然違った表示結果が与えられていることに気づきます。詳細に見ていけば、なるほど、内容によって表示結果を使い分けているとわかります。

内容による段落の見た目の違いが、見出しと本文の見た目の違いより大きいことには当惑させられます。しかし、今回はまずこの表示結果をCSSで再現しようと考えていますので、教材をよく検討して、箇所により異なる見た目が与えられている要素はすべてclass属性、id属性を与えていかねばなりません。この作業には慎重を要します。

ひとつの解答

修正案の作成で、困ったことがありました。この教材は、大見出し、目次、サイトの説明からなっているのですが、目次の前には見出しがあるのに、サイトの説明の前には見出しがありません。これでは文書の構造上、サイトの説明も目次の一部ということになってしまいます。困ったので、サイトの説明の前に見出しを挿入しました。しかし教材にはないものですから、再現案ではこれをCSSで表示しないよう設定しています。

CSSによる表示結果の再現

課題 No.03 再現案(別ウィンドウに開くと便利です)
課題 No.03 再現案 キャプチャ画像

class属性とid属性で分類された各要素について、ひとつひとつ地道に表現を指定していきます。たったこれだけの長さの文書ですが、気の遠くなるような作業になります。

とはいえ、ほとんどの箇所は文字色、文字サイズ、揃え方向、背景、borderといった基本的なプロパティーを、ふつうに使うだけで目標を達成できます。だから、技術的な困難はそれほどではない……といいたいところなのですが、数箇所、どうやっているのかよくわからない部分もあるでしょう。興味のある方は、別途解説を書きましたので、そちらをご覧ください。

coffee break

CSSによるシナリオ風の文書整形について考えてみましょう。

文章を書いた後にマークアップするときはとても迷う事があって「えい、これでいいや」としてしまうこともあり、この言葉はなんだか気が楽になるのだけどもちろんマークアップは適当でええんちゃう? ということではないのでなるべくそれらしくやろうとは思っていたり思っていなかったり。マークアップの理念(?)とは直接関係ないんだけど見え方の問題として俺が最も苦心しているのはシナリオ形式のマークアップで、行頭にその科白を言う人の名前を書くとどうやったらいいのか途方に暮れる。具体的な見え方は以下。


繁子「あたいはもう走れない。ごめん、あたいはもう……」

つんく「走れない豚はただの豚だ」


「繁子」と「つんく」の字数が違うのでセリフの始まる部分が見た目ズレてしまっていて面白くない。また、長いセリフだとブラウザの幅によって強制改行されるわけなんだけど、それが名前の部分にかぶってしまって読みにくくなる。これをCSSでなんとかしようと思うのだけど全然いい方法が見つからなくて、じゃあ定義型リストの<dl><dt><dd>を使ってかぶらないようにしようとか考えると、どうもマークアップ本来の意味と違ってきてしまうような。入れ子のリスト(<ul><li>)も然り。table要素は論外。自分が書いた過去ログの会話劇(のソース)を見ると、毎回毎回はちゃめちゃなマークアップで笑えるという話。

私なら、dl要素を用います。しかしul要素というのもアリでしょう。p要素でもいい。いずれにせよ、整形に用いるCSSの記述は同じです。

HTML文書

<dl>
<dt>繁子</dt>
<dd>「あたいはもう走れない。ごめん、あたいはもう……」</dd>
<dt>つんく</dt>
<dd>「走れない豚はただの豚だ」</dd>
</dl>
<ul>
<li><span class="speaker">繁子</span>
「あたいはもう走れない。ごめん、あたいはもう……」</li>
<li><span class="speaker">つんく</span>
「走れない豚はただの豚だ」</li>
</ul>
<p><span class="speaker">繁子</span>
「あたいはもう走れない。ごめん、あたいはもう……」</p>
<p><span class="speaker">つんく</span>
「走れない豚はただの豚だ」</p>

CSSの記述

*
{margin:0; padding:0; list-style:none;}
body
{padding:1em;}
dl,ul
{margin:1em 0;}
dl,ul,p
{margin-left:4em;}
dt,span.speaker
{position:absolute; left:1em;}

整形結果

CSSによるシナリオ風整形例

課題 No.03 (後半)

再現案の作成にたいへん苦労したのは、求める整形結果がCSSに向かないデザインだったからでした。改善案ではCSSを無理なく使ってすっきりとした表現を追及していきます。

CSSによる改善案の作成 1

課題 No.03 改善案1(別ウィンドウに開くと便利です)
課題 No.03 改善案1 キャプチャ画像
basicというタイトルの代替CSS(→css2.txt)を適用してください。

CSSデザインらしい整然とした美しさを追求した、素朴な作例です。配色を中心に、教材と似た雰囲気も残しています。

  1. 画像が用いられている場合には、画像に合わせた配色にするのが最も自然です。したがって、テーマカラーはオレンジ(#ffa500)としています。
  2. Information 以降は教材に倣って青を基調としました。ただし、h1と目次のオレンジが強い色なので、h2の「Information」以外には淡い青を用いています。
  3. レイアウトでは配色と逆に教材との対比を狙いました。

CSSによる改善案の作成 2

課題 No.03 改善案2(別ウィンドウに開くと便利です)
課題 No.03 改善案2 キャプチャ画像
2columnというタイトルの代替CSS(→css3.txt)を適用してください。

段組風レイアウトに挑戦してみましょう。今回は2段組です。

  1. CSSで段組風にレイアウトするには、position プロパティーか float プロパティーを活用する他ありません。改善案では position を用いました。(→詳細な解説
  2. 2段組みレイアウトにも、いくつかのパターンがあります。
    1. 簡単なのは、画面全体を非対称に2分割し、小さな側をナビゲーションに使い、他方をコンテンツ領域にあてるものです。
    2. 実際によく使われるのは、ヘッダーやフッターを組み合わせた変則2段組みレイアウトです。
    3. 今回はとくに、ヘッダーと左段がつながって見える、逆L字型のレイアウトに挑戦してみました。
  3. 逆L字型レイアウトは、コンテンツ部と周辺情報部(ナビゲーションなど)を視覚的に切り分ける手法として、よく用いられるものです。MSNではこれを発展させ、白背景のコンテンツ部を青背景の周辺情報部がぐるりと取り囲んでいます。
  4. 配色は改善案1の考え方を踏襲しています。
  5. 「information」の背景は薄青としました。オレンジの横に並べた場合、改善案1で用いた青では少々色が強すぎると感じたからです。その代わり、オレンジの border を上下に設定し、下位項目との差異化を図っています。(註:強い色同士を直接ぶつけない、というのは配色の定石です)

CSSによる改善案の作成 3

課題 No.03 改善案3(別ウィンドウに開くと便利です)
課題 No.03 改善案3 キャプチャ画像
plusというタイトルの代替CSS(→css4.txt)を適用してください。

CSSの記述は非常に簡単ですが、背景画像が230KBもあります。いわば説明のための作例。

  1. 単純明快な幅固定のレイアウトです。きれいな絵に半透明の白いシートを敷いたようなデザインの画像を背景に貼りこみ、白いシートの上にページの内容が収まるよう、調整しているわけです。
  2. 半透明の白いシートというモチーフを実現しつつ、幅固定にしない方法はいくつかあります。 じつは、背景画像を固定しなくてもよいならば話は簡単なのですが、その話はまた後日。
  3. すっきりしたレイアウトにあわせ、重要度の低い情報を非表示としています。
(おまけ)課題 No.03 改善案3.1(別ウィンドウに開くと便利です)
plus2というタイトルの代替CSS(→css5.txt)を適用してください。

背景画像を軽いもの(2KB)に取り替えた実用的な改善案です。

CSSによる改善案の作成 Folio Ver.

課題 No.03 改善案 Folio Ver.(別ウィンドウに開くと便利です)
課題 No.03 改善案 Folio Ver. キャプチャ画像
folioというタイトルの代替CSS(→0309folio.txt)を適用してください。

本稿に適用しているCSSは単純素朴なものなので、少々カスタマイズすれば、たいていの文書にマッチします。課題 No.3 とも案外、相性がよかったようで、一部におかしいところもありますが、悪くない感じではないでしょうか。(黒とオレンジは相性のいい配色だから、というのが、じつは大きいのですが……)

BonusTrackです。

coffee break

みなが正しくHTML文書を作成するためには、ツールの進化が欠かせない、といわれてきました。そして現在、いくつかのツールは十分に進化を遂げたといえます。日本で最もよく売れているというWebサイト作成ソフト「ホームページビルダー(HPB)」は、正しく使えば(たいていの局面において)文法違反のないHTML文書とCSSを作成できます。より高級なツールは、みな同等以上の能力を持っています。

では、HPBの利用者は、みな正しくHTML文書を作成しているのでしょうか? いいえ、まったくダメです。

現在、自然言語を人間と同等に解釈できるソフトはありません。翻訳ソフトの類は、膨大な事例を元に機械的な構文解析を行っているに過ぎません。音声認識ソフトは、抑揚のパターンを認識しているだけです。「自然言語要訳」を実用レベルで実現するソフトもありますが、これもパターン認識しかしていません。いずれのケースにおいても、人間のように言葉を理解しているわけではないのです。

ですから、HPBなどのHTML文書作成ツールに可能なことは、文法のチェックだけなのです。したがって、本来ならば段落としてマークアップすべき文字列を見出しとしても、箇条書きを改行と中点で実現しても、それをチェックし修正することは不可能です。引用でないのに、左右に余白がほしいというだけの理由でblockquote要素を用いる愚行も、指摘できません。

ツールの進化は、もはやひとつの限界に達しています。プログラムが人間のように自然言語を解釈できるようになるのは、遠い未来のことです。ツールがダメだ、という議論はもはや意味がありません。「ツールは進化した。にもかかわらず、ダメなHTML文書が一向に減らない。それは何故なんだ?」この認識を出発点としなければ、未来は開けないでしょう。

「ツールが進化すれば、人間はHTMLに無理解でもOK」という予測は外れました。それはあまりにも安直な考えでした。たしかに、ツールを前提とすれば細かい文法規則を覚える必要はありません。開始タグ、終了タグを自分で直接に記述する手間もいりません。しかし、見出しは見出し、段落は段落、箇条書きは箇条書きとしてマークアップする、というHTMLの基本的な考え方だけは、勉強する必要があったのです。

課題 No.04

課題 No.04
課題 No.04 キャプチャ画像
課題 No.04 改善案

練習問題です。No.03 に引き続き、やっかいな課題です。そこで今回は、再現案を作らず、いきなり改善案を作成いたします。「マークアップをいかに修正するか」を焦点とし、改善案のCSSには本稿と同じものを使いました。

FAQ

最近のQ&A実例から。(一部、改稿しています)

No.01 CSSはフォントいじりに向かない

ご相談

アホらしいと思うかもしれませんが、僕は余白とかフォント弄りが好きです。サイトのデザインに関しても、現時点では全員に同じ見た目を提供したいと考えています。(最終的には、何通りかのスタイルを閲覧者が選べるようにしたい)

回答

ご相談の内容を実現するためには、CSSを邪道なやり方で用いるのが、現実的な解となります。

ただし、全員に同じ見た目を提供する目的があるなら、CSSはつまらないと思います。なぜなら、CSSには次のような問題点があるからです。

  1. 製作者CSSを閲覧者CSSで上書きできる
  2. 閲覧者はCSSをOFFにできる(ブラウザのデフォルトスタイルが適用される)
  3. 各ブラウザのクセに精通し、CSSをブラウザ毎に用意しなければ、現状ではブラウザ間のCSS実装のズレは解消が困難

しかし、実際問題としてはほとんどの閲覧者(おそらく95%以上)は、製作者CSSを閲覧者CSSで上書きなどしないし、CSSをOFFにもしません。よって問題点1、2は気にしなくともよいでしょう。

残るは問題点3ですが、何通りかのスタイルを閲覧者が選べるようにしたいのであれば、どれほど苦労するとしてもCSSを使うしかありません。ひとつのスタイルだけでよいのであれば、実装のズレがほぼ解消されている(註:IE、NN、Operaという主要なPC向け視覚系ブラウザについての話)テーブルレイアウトを採用するのが、目標の現実的な実現手段としては簡単です。

ご相談

なるほど、CSSはつまらないというのはわかりましたが、CSSを使用せずに今のような(もしくはそれに近い)レイアウトをしようと思えば、どうすれば良いのでしょうか?その場合テーブルを使うのでしょうか? いや、それはないですよね。それだったら以前に逆戻りだし・・・

回答

CSSは、HTMLの各要素の表現方法を指定するものですから、本来の使い方をする限り、強調表現は2種類に限定されます。em要素とstrong要素です。このたったふたつの要素にしか、CSSによる強調表現の指定はできません。

一般に、フォントいじりをされる方は、「文字サイズ」と「文字色」と「文字の太さ」を適宜使い分けますから、全部で20パターン以上の強調表現を駆使されます。ということはつまり、CSSでフォントいじりを再現するのは不可能なのです。

もちろん、em要素などをひたすらclassで分類すればいいのですが、製作者CSSを潰してしまえば全部同じem要素としてしか扱われないのですから、CSSとHTMLを正しく使う限り、強調表現は2種類限定と考えるべきです。

レイアウトについても同じことがいえます。HTMLにはレイアウトを組むための(大きな)要素がありませんので、div要素で文書をまとめることがしばしばあります。しかしdiv要素には仕様上、意味が与えられていません。したがって、やはり製作者CSSを潰してしまえば、レイアウトブロックは表現されません。

非常に悲観的な回答になってしまうのですが、そもそもHTMLにレイアウトやフォントいじりの付け入る余地はありません。したがって、正しく作られたHTML文書をCSSで装飾するならば、ご相談の要求を満たすことは根本的に不可能なのです。希望を貫くならば邪道なことをする他なく、その意味でテーブルレイアウト+フォントいじりだろうとCSSデザインだろうとサイト作成の苦労に変わりはありません。

ご希望を実現する現実的な手段を考えるならば、(スタイルの選択ということを考えないならば)テーブルレイアウトとfont要素、br要素の多用は有力な選択肢なのです。かなりの割合で、テーブルレイアウト+フォントいじりからCSSへ移行できる部分はあるでしょう。しかし、全面的に移行するならば、あきらめねばならない部分が少なくないわけです。

No.02 HTML文書の出来が重要

ご相談

CSSを使うと、どんな場面でトクするのですか?

回答

端的にいって、いわゆるタグ屋や、ちゃらけたCSS辞典などを眺めつつ、「あ、この表現、きれいだな、使えそう!」などといっているうちは、何もいいことはありません。その場の思いつきで場当たり的にCSSを用いた装飾をしているのなら、font要素やら何やらを使って適当にHTML文書を楽しげに装飾するのと変わりないのです。

一歩進んで、CSSファイルをHTML文書と別に作成するとしましょう。いくつかのHTML文書に対して、ひとつのCSSファイルでいくつかの装飾を指定するようにしてみました。ここまで勉強したのだから、CSS導入も大きな成果を生み出すことができそう……と思ったら大間違い。まだまだ全然ダメです。

こう話すと、「ええー!?」と驚かれることが多いのですが、私の失敗事例をごらんいただければ、一目瞭然かと思います。

このサイトでは150以上あるHTML文書のほぼ全てにCSSファイルが読み込まれています。さて、このサイトをリニューアルするのは簡単でしょうか? CSSで表現を指定している部分に限れば、たしかに簡単です。2002年1月19日版をご覧ください。ほぼ全ての文書で背景画像が変更されていますが、書き換えたのはCSSファイルのみです。しかしじつは、簡単にできるのはその程度のことだけなのです。選択の余地があらかじめ想定された範囲内に限定されてしまいます。

CSSはHTML文書の表現手段ですから、不出来なHTML文書はうまく装飾できません。CSSで自由自在にHTML文書を装飾するためには、HTML文書が正しい構造をもっている必要があります。

「どんな場面で?」というご質問ですが、HTML文書さえよいものならば、その答えは「プレゼンテーションを考えるあらゆる場面」です。HTML文書の出来が悪くなるにつれて、CSSが便利に使える場面は減っていきます。

No.03 CSSデザイン導入の心構え

ご相談

いろいろ便利なようなので、正しいHTMLとCSSでサイトをリニューアルしようと思っています。CSSデザインに取り組むにあたって、何に一番気をつけたらよいでしょうか?

回答

本来できないことを擬似的に実現しようとしているから、テーブルレイアウトは無理に無理を重ねた方式になっているのです。CSSを採用した場合も同じことで、できないことをやろうとする限り、やはり無理に無理を重ねることになります。するとCSSデザインの利点など、すぐに相殺されてしまいます。

その場の思いつきで特定の文書内の特定の文字列について、文字を右に寄せたり、フォントをいじったり、改行で空白を増減したりし続けたいならば、少なくともそれらの表現をCSSで代替しようとは考えないことです。CSSはそのような使い方を想定していません。ですから、それらの部分は、(もし今後も続けたいのなら)これまでと同様のやり方を踏襲していく方がよいでしょう。

ご相談

では、CSSはどのように用いるべきなのでしょう?

回答

意識の変革なしにCSSを導入しても、思うような効果は上がりません。何よりまず、正しくHTML文書を作成しようと心がけること。そうすれば、自ずと答えは見えてきます。