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

徳保隆夫 2004.1.20

はじめに

CSSの"いろは"をご存知の方向けに、CSSを用いたリニューアルのサンプルをご紹介します。第3回までは講義に重点を置き、作例はひとつの実践例としてアッサリ取り扱ってきました。今後数回は実践篇となります。個別具体例の紹介に重点を置き、ていねいに私の試行錯誤の過程をご紹介します。よろしくお付き合いいただければ幸いです。

本講座の構成

  1. マークアップの修正
  2. CSSによる表示結果の再現
  3. CSSでお手軽リニューアル

ご確認ください

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

著作権について

筆者は本稿(本文)の著作権を主張いたしません。

解説の中で、筆者の著作物でないサンプルをご紹介しますが、いずれも必然性があって引用するものです。たしかに、一般論としてのテーブルレイアウトからの移行を解説するために、各サンプルが選ばれたこと自体には必然性がありません。しかしながら、一般論を語る際にも(絶対にその例でなければならないという必然性のない)具体例を持ち出すことは慣例的に認められています。ただし著作権法第32条に示される引用の要件を満たす必要はあるでしょう。

筆者はこのような考えに基づき、各著作者に断りなく批評の意図を持って各サンプルを例示しております。引用のみならず改変まで行っている点については、「彼の書いた「Aである」という文章は「Aです」と書くべきであった」といった批評が一般に問題ないものとして通用している事実をもって、説明に代えさせていただきます。

個人ニュースサイトをCSSでリニューアルする

実践篇初回のテーマとして、個人ニュースサイトをとりあげます。このジャンルの著名なサイトとして、今回はカトゆー家断絶をCSSを用いてリニューアルしていきます。長丁場の解説になりますが、よろしくお付き合いいただければ幸いです。

カトゆー家断絶
キャプチャ画像

マークアップの修正

2004年1月19日夜の表紙を原本とします。ただしあまりに長大な文書なので、一部の内容を切り詰めさせていただきました。

カトゆー家断絶 原本

原本のHTMLソース

作業開始

まず、原本からテキストを抽出します。

抽出されたテキスト

ここから、作業を始めましょう。

2つのレベル

マークアップの修正には、2つのレベルがあります。

  1. 文書全体の構成を再考する
  2. 各部分を適切にマークアップする

この順番はどちらでもよいのですが、私は全体の構成を先に考えることをお勧めします。慣れないうちは、順番を逆にすると手戻りが発生しやすいからです。とくに問題となりやすいのは見出しレベルです。

Ex.最初のマークアップ結果
Ex.全体構成を見直した後

この例では、内容から素直に構成を整理しています。しかし一般のWebサイト作成においては、そう明快にこれが正解と決められるものではありません。単に好みの問題で情報を提示する順番を決めてしまうとしてもです。

具体的には、例えばナビゲーションを本文の前におくか、後におくか、といったことが問題となります。どちらがいいのかは、判断が難しいところです。視覚系ブラウザにおいては、表示結果はCSSでどうとでもなるだけに、悩ましいですね。こうした構成に関する決定事項は多くの文書に波及することが多いわけです。各構成要素のマークアップを終えた段階で迷い出すと、何度も多くの文書をマークアップし直すことになりかねません。

文書全体の構成を再考する

さて、今回はまず、CSSで元のレイアウトを再現することを狙います。そこで基本的に、元の表示結果通りの順番で上からマークアップしていくことにします。

大きく4つに分ける

カトゆー家断絶のレイアウトは、大きく4つの部分に分けて考えることができます。この4つのブロックの順番が果たして適切なのかということは、今回、疑わないものとします。(CSSで表示結果を再現するのが困難になるため)

  1. 冒頭
  2. 目次など
  3. 諸注意
  4. ニュースとリンク

じつは、これとはまったく異なる分け方も考えられます。カトゆー家断絶は、変形の3段組レイアウトを採用していますから、「3段組が上下に二つ重なっているとみて、まず大きく上下2つに分け、それぞれを左、真ん中、右の3つに分ける」というのもアリです。

小項目の順番を考える

HTMLは、ソースを見れば明らかなように、いくつかの内容を並列に記録できる形式ではありません。結果としての見た目はともかく、マークアップの段階では情報の登場順は一意に定まっています。正しくHTMLを用いようと志したならば、文書を構成する要素の登場順序を考えないわけにはいきません。

さて、本来であれば結果としての見た目など気にせず、純粋に内容だけを考えて順番を決めてしまえばよいわけです。しかし、なかなかそう割り切ることもできないのが現実でしょう。そこで、何をどこまでこだわるのかが重要になります。

今回、大きな4つの構成要素の登場順序は、再現したい表示結果を考えて、手をつけないことにしました。しかし、大きな構成要素の中にある小項目の登場順序については、再考の余地があるでしょう。

左上に表示されるものが、ソース上でも最初に登場しなければいけない、ということはありません。小項目は、内容から考えて登場順序を考えていくことにいたします。

実践例

4つの大きな構成要素をそれぞれdiv要素とし、適当なid属性を与えました。

1.冒頭

<div id="header">
タイトル
サイト情報
募金バナー
</div>

2.目次など

<div id="menu">
イラスト
目次
近況(募金バナー含む)・更新履歴・検索
</div>

3.諸注意

<div id="caution">
諸注意
</div>

4.ニュースとリンク

<div id="contents">
ニュース記事
リンク柱(個人ニュースサイト)
リンク柱(その他)
</div>

HTML文書に仕立てる

マークアップ言語には、HTML4.01Transitionalを利用することにします。文書型宣言などを添えて、とりあえず以下のような文書が出来上がりました。

HTMLソース

各部分を適切にマークアップする

冒頭

見出しをh1要素、サイト情報をul要素としました。サイト情報は詳細にマークアップしようと考えたなら、もっといろいろありうるわけですけれども、ここでは非常に単純に考えることにします。

<div id="header">
<h1>カトゆー家断絶officialhomepage</h1>
<ul>

<li>最終更新日2004年1月19日 19:40</li>
<li>正式開設日2001年7月15日<a href="#"><img src="readme.png" width="37" height="10" border="0" alt="Readme"></a></li>
</ul>
<p><a href="#"><img src="ttsrc.jpg" border="0" alt="募金を"></a></p>
</div>

目次など

イラストはp要素とし、目次は定義リスト、近況なども定義リストにまとめました。div#menu直下にあるブロックレベル要素は、この3つだけです。詳細は、みな入れ子のリスト類でマークアップしました。

<div id="menu">
<p><a href="#"><img src="lmisao.jpg" border="0" alt="まだ塗ってます"></a></p>
<dl>

<dt>-CONTENTS-</dt>
<dd><dl><dt><a href="#">自己紹介</a></dt><dd>放置の方向で。</dd>(中略)</dl></dd>
<dd>mail:katoyuu&#64;trust.ocn.ne.jp</dd>
<dd><img src="counter.png" align="BOTTOM" alt="カウンター"></dd>
</dl>
<dl>

<dt>近況</dt>
(中略)
</dl>
</div>

諸注意

ごくシンプルに、h2要素とp要素、hr要素としてみました。

<div id="caution">
<h2>諸注意</h2>
<p>
当HPはInternet Explorer6.0で動作確認済みです。画面サイズ1024×768、文字サイズ小推奨。
当HP内のバナーを除く全ての画像について無断転載、複製を禁じます。(中略)</p>
<hr>

</div>

ニュースとリンク

見出しの使い方に注意してください。

「ニュースとリンク」コーナの文書構造(の概要)

リンク柱はニュース記事の一部ではありません。ですから、「戯言」という見出しの下に配置するのは奇妙です。「link」という見出しは原本に存在しないのですが、これがないと情報の整理ができませんので、私が追加しました。再現案では、この見出しをCSSで消します。

どうせ消すなら最初から書かなければいいじゃないか、という意見は正しくありません。原本のデザインでは「その見出しを表示する必要がないから表示しない」のであって、最初からなくていいというわけではないのです。例えば、リニューアルしてデザインを変えた場合にはどうでしょうか。特定の視覚デザインに依存してマークアップをサボると、他のデザインを採用できなくなってしまうのです。

世の中には少数とはいえ音声系ブラウザなどの利用者もいます。視覚デザインのことだけを考えてマークアップをサボってはいけません。

<div id="contents">
<h2><a href="#">戯れ言</a></h2>
<div id="news">
<p><a name="0119">1月19日(月)</a>(最終更新19:40)</p>
<dl>
<dt>■<a href="#">PULLTOP 『お願いお星さま』 キャラクター紹介追加</a></dt><dd>3人追加されております。</dd>
(中略)
</dl>
<hr>
<h3>◆美少女ゲーム関連◆</h3>
(中略)
</div>
<h2>link</h2>
<dl>

<dt class="e">◆Favoritelink◆</dt>
<dd><dl>
<dt>●ニュース(個人)</dt>
<dd><ul><li class="e"><a href="#">■=)</a></li>(中略)</ul></dd>
</dl></dd>
</dl>
<dl>

<dt class="e">◆Favoritelink◆</dt>
<dd><dl>
<dt>●日記・テキストその他</dt>
(中略)
</dl></dd>
</dl>
</div>

id属性とclass属性を付加

表示結果の再現はなかなか難題です。少々面倒ながら、id属性とclass属性をあちこちに付加します。(詳細は後述)

以上でマークアップの修正は完了です。HTMLソースと表示結果は次のようになります。

マークアップの修正が完了したHTMLソース
CSSなしの状態での表示結果

続いて、表示結果の再現に取り組みます。

CSSによる表示結果の再現

カトゆー家断絶 CSSによる表示結果の再現案

全体の背景・文字サイズなどを再現

原本のHTMLソースには以下の記述があります。まずはこれを再現しましょう。

<STYLE type="text/css">
<!--
body,th,td { font-size: 90% ;}
A { text-decoration: underline ;}
A:link { color: #3c38ba ;}
A:visited { color: #d36252 ;}
A:hover { background-color: #f5d6f3;color: #4e4e4e ;text-decoration: underline ;}
A:active { color: #84863c ;}
-->
</STYLE>

<BODY BGCOLOR="#ffffff" BACKGROUND="s4_6.gif">

再現案のCSS
キャプチャ画像

*
{font-size:100%; font-weight:normal; font-style:normal; text-decoration:none; margin:0; list-style:none outside;}

h1,h2,h3,p,dl,ul,ol,dt,dd,li,div,a
{padding:0;}

a
{text-decoration:underline;}
a:link
{color:#3c38ba;}
a:visited
{color:#d36252;}
a:hover
{background-color:#f5d6f3; color:#4e4e4e;}
a:active
{color:#84863c;}

body
{font-size:90%; background:#fff url(s4_6.gif); margin:0; padding:2em 1%;}

.selectsheet
{position:absolute; right:1em; top:0.5em; margin:0; padding:0.5em 0.5em 0.2em; z-index:1; background-color:#fff; border:1px solid #006;}

解説

冒頭部分をCSSで再現

原本の冒頭
原本のキャプチャ画像
冒頭のHTMLソース
再現案のCSS
キャプチャ画像

h1
{width:100%; height:30px; background:transparent url(title.png) no-repeat 50% 90%; padding:4em 0 0;}
h1 span
{display:none;}

#header ul
{position:absolute; top:1.5em; left:1em;}
#header p
{position:absolute; top:3.5em; right:1em;}

解説

目次などをCSSで再現

原本の目次など
原本のキャプチャ画像
目次などのHTMLソース
再現案のCSS
キャプチャ画像

div#menu
{width:705px; margin:1em auto; position:relative;}
#menu p
{text-align:center; padding:5em 230px;}
#menu p a
{display:block; height:13em;}
#menu dt,#menu dd
{margin:0 0 2px; background:#fff;}
#menu dd.t
{background:transparent;}
#menu .e,#contents .e
{background:#eae8f7;}
#menu .s,#counter,#caution
{text-align:center;}

dl#index
{position:absolute; top:0; left:0; width:230px;}
#index dl dt,#index dl dd
{width:48%; padding:0 1%;}
#index dl dt
{margin:0 0 -1em;}
#index dl dd
{margin-left:50%;}
#index dt#c
{color:#5173e6; font-weight:bold;}
#index dd#counter
{padding-top:2em;}

dl#info
{position:absolute; top:0; right:0; width:230px;}
#info dt,#info dd
{padding-bottom:1em;}
#info #now
{background:#bffbec;}
#info dt.history
{background:#eae8f7; text-align:center;}
#info dd.history
{background:#f7f7f7;}
#info dd#search
{padding:2em 0 0;}

解説

諸注意をCSSで再現

原本の諸注意
原本のキャプチャ画像
諸注意のHTMLソース
再現案のCSS
キャプチャ画像

#caution h2,#caution p
{width:600px; margin:0 auto; background:#fff;}
#caution p
{white-space:pre;}
hr.b
{color:#5173e6; border:thin solid #5173e6; margin:1em 0;}

解説

ニュースとリンクをCSSで再現

ようやくこれで、表示結果の再現も最終ステップです。

原本のニュースとリンク
原本のキャプチャ画像
ニュースとリンクのHTMLソース
再現案のCSS
キャプチャ画像

div#contents,#contents h2,div#news
{margin:0; padding:0;}

div#contents
{position:absolute; left:1%; width:98%; border-bottom:thin solid #fff;}

dl#l1,dl#l2
{position:absolute; top:0;}
dl#l1
{left:1%; width:16%;}
dl#l2
{right:1%; width:16%;}

div#news,dl#l1,dl#l2
{background:#fff;}

#contents h2
{margin:0 18%;}
div#news
{margin:0 18% 2em; border:thin solid #5173e6;}
#news p a
{font-size:x-large; color:#9370db;}
#news dt
{margin-top:0.5em;}
#news q
{display:block; color:#317333;}
#news h3
{font-weight:bold; text-decoration:underline;}
#news h3.gg
{color:#ff0000;}
#news h3.fg
{color:#991fa7;}
#news h3.ac
{color:#22b329;}
#news h3.tm
{color:#fcbe03;}
#news ul
{text-align:right;}

#contents dt,#contents dd,#contents li
{padding:0.2em;}

#lt1,#lt2
{color:#8e5492;}
dl.l dt
{color:#567856;}

解説

お疲れ様でした。

表示結果を比較

原本再現案

原本の表示結果を、CSSで(ほぼ)再現できたといっていいのではないでしょうか。

CSSでお手軽リニューアル

HTMLソースはそのままでも、CSSを書き換えるだけでこんなことができますよ、というコーナ。

趣味のWebデザイン 風
キャプチャ画像

適用しているCSSは以下の通り。

う〜ん、そのまんまですね。

Folio 風
キャプチャ画像

適用しているCSSは以下の通り。

これも、そのまんまといえばそうなんですけれども、目次周りをちょっと工夫して、あまり見かけない感じのデザインを少しだけ狙っていたりします。

NN7とOpera7ではIE6とけっこう違う表示になるのですが、(私には)黙認できる範囲内だったので、これでよしとします。

Green
キャプチャ画像

適用しているCSSは以下の通り。

なんだかゴチャゴチャしていて見にくいですね、これは。この段階では失敗作なんですけれども、丹念に作り込んでいけば新聞社風のデザインに進化させることができるのではないかと思います。

終わりに

今回は意想外に手間取りました。本当は、私のトライアンドエラーの過程まで詳述しようと考えていたのですが、分量が膨大になりすぎて全然書き終わりません。結局「こうしたらうまくいきました」という、いつも通りの展開になってしまいました。

以上で本稿を終えます。最後まで読んでくださったみなさま、本当にお疲れ様でした。それでは、次回をお楽しみに。

Back Issue

第1回
望ましいリニューアル方針/文章の内容に即したマークアップ/ブラウザのデフォルトスタイルに頼らない/素人の配色:3大原則/テキスト枠に余裕を!/etc
第2回
レガシーなHTMLの発想を乗り越えよう/Strict HTML + CSS の制約/制約が生む価値/CSSによるシナリオ風の文書整形/CSS Tips/position:absolute; で段組風レイアウト/etc
第3回
デザイン意図を損なわずにアクセシビリティ向上/解像度耐性を高めよう/背景画像をCSSで代替する/CSSでテキストを画像で置換する方法/etc