大和但馬屋日記

はてなダイアリーからの移行中

CSS再構築(その一) body要素

  • サンプル文書0(スタイルが一切定義されてゐない状態。設定画面のテーマの欄も「指定なし」を選択した。)

とりあへず、大枠から手を着けることにした。大枠といへばまづはbody要素だらう。
まるで呪文の様に、HTML文書の始めの方と終りの方に書けと言はれて書かされる要素である。もちろん、はてなダイアリーでは始めから用意されてゐるので、ユーザーが普段その存在を意識することはない。といふか、はてなダイアリーを普通に使ふ分にはどんなHTMLタグも意識する必要はないのだけれど、それではCSSが書けない。
で、こんな風に書いてみた。

body { 
    color:#033 ; /* 文字色の設定 */
    background-color:#3cc ;  /*背景色の設定 */
    margin:0 ; padding:0 ; /*枠の外側・内側の余白の設定*/
    font-family:osaka,verdana,sans-serif ; /*フォントの種類の設定*/
    font-size:100% ; /*フォントの大きさの設定*/
    }

body * { font-size:100% ; }

かうすることで、このダイアリーはサンプル文書1の様な見てくれになるはずである。なほ、サンプル文書の方でははてなヘッダなどの画像が表示されないが悪しからず。
何をしてゐるかはソースの注釈にある通りである。body要素に設定しておく項目としてこれが適切かどうかは正直わからないが、とりあへず私が設定しておきたいのはこれだけだ。
よく議論になるのがフォントサイズとフォントの種類の設定についてである。ここでは100%として、閲覧者のブラウザの標準設定の大きさに準拠する様にしてゐる。かうしておけば、閲覧者がブラウザの文字サイズを読みやすい様に変更できるので具合がいい。また、標準サイズが人によつて違ふからには100%以外の数値にすることに意味はない。
最後の body * { font-size:100% ; } は、body要素の中にあるすべての要素に対しても同じ様にフォントサイズに100%を適用せよといふ意味。おかげで、見出し要素だらうが何だらうがすべて同じ文字サイズとなつてゐる。これはこれで好みなのだが、見易さといふ点ではよろしくないだらう。見出しは見出しらしくあるべきだが、これは後で調整する。
もう一つ、フォントの種類の設定についてだが、これも設定すべきでないといふ意見があり、無碍にそれを否定すべきではないとは思ふ。ただ、個人的に標準的なパソコン用のセリフ付フォントは解像度の低いモニタ上では読むに耐へないものだと思つてゐるので、閲覧者が特に指定しない限りサンセリフ体で表示するようにさせていただいてゐる。この点、押付けがましいことには違ひないので要審議。
とりあへず、この項終り。次は日記本体を読み易くする方向で。

CSS再構築(その三) リンクアンカー

次に、リンク部分の色を設定する。ブラウザの標準色では大抵暗すぎて、暗い背景色には合はないのだ。リンクを示すa要素に対して次の様に設定する。

a:link { color:#ff6 ; background-color:transparent ; } /* リンク部の色 */
a:visited { color:#fc6 ; background-color:transparent ; } /* 一度訪れたことのあるリンクの色 */
a:hover { color:#fff ; background-color:#933 ; } /* マウスのポインタが重なつた時の色 */
a:active { color:#993 ; background-color:#fff ; } /* クリックした瞬間の色 */

特に重要なのは上の二つ。下二つは必要ないといへばないし、遊びの範囲だ。なほ、link、visited、hover、activeはこの順番で書かないと狙ひ通りに機能しない。CSSは常に「後から書いたものを優先」するからだ。理屈を考へてみよう。
それから、キーワードリンクのスタイルを別に設定する。キーワード用のa要素にはクラス名"keyword"が与へられるので、これを記述に加へる。

a.keyword { color:#fff ; border-bottom: 1px #99c dashed ; }  /* キーワードリンクのスタイル */

文字色を本文と同じ白にして、下に点線を表示。これで普通のリンクとキーワードリンクの区別がつく様になつた。サンプル文書4

CSS再構築(ちよいと横道)

いきなり瑣末な設定になるが、スタイルシートの記述部分が本文の説明と同じスタイルで並んでゐるとどうも見づらいので、ここを本文と分けて表示する様にしたい。この部分は"source"といふクラス名のpre要素でマークアップしてゐるので、次の記述を追加。

pre.source {
    border:1px #999 dashed ;  /* 枠線の設定 */
    padding:2em ;  /* 枠の内側の余白設定 */
    line-height:1.2em ; /* 行の高さの設定 */
    font-size:80% ; /*フォントの大きさの設定*/
    overflow:scroll ; /* はみ出したらスクロール */
    }

pre要素内のコンテンツは枠をはみ出す長さになつてもお構ひなしにぶつちぎってくれるので*1、はみ出し対策にスクロールバーを出してみた。‥‥ところが、InternetExplorerの表示を見てビックリ。そ・れ・は・意味が違ふだろ! こんなローカルなブラウザはさつさと捨ててしまへ。

*1:pre要素は「整形済テキスト」といふ意味だからさうしてくれないと困る

CSS再構築(その二) 日記本文

立て続けにその二である。といふのも、一のままでは読み辛くて仕方ないからだ。
さて、はてなダイアリーはdiv要素を沢山使ふ。div要素とは、特に目的の定められてゐない便宜的な要素である。「HTMLの各要素には意味や目的がきちんと定められてゐることが重要である」とする考へからは、divの多用はよろしくないこととされてゐる。しかしはてなダイアリーは自動的にdiv要素を出力してしまふのであり、それを避ける方法はない。ならば上手くレイアウトに活用するのが知恵といふものだ。
さて、日記本体に出力されるのは以下のdiv要素だ。

<div class="main">
  <div class="day">
  見出し:日付
    <div class="body">
      <div class="section">
      見出し:話題
      日記本文
      </div>
      <div class="section">
      見出し:話題
      日記本文
      </div>
      <div class="section">
      見出し:話題
      日記本文
      </div>
    </div>
  </div>
  <div class="day">
  見出し:日付
    <div class="body">
      <div class="section">
      見出し:話題
      日記本文
      </div>
      <div class="section">
      見出し:話題
      日記本文
      </div>
      <div class="section">
      見出し:話題
      日記本文
      </div>
    </div>
  </div>
</div>

この様に、クラス名"day"のdiv要素で一日単位に括られ、日付の見出しがあつて次に"body"、さらにその中に"section"で括られた話題が並ぶ。そして、画面に表示されてゐる一ページ分の日記が"main"で括られてゐる。随分深い入れ子構造だ。"body"は余計だろ、とも思ふが活用しだいでデザインに幅が出る可能性はある。それにしてもbody要素と同じ名前のクラス名は感心しない。
もちろんこれらはすべてデザインに利用できるが、よほど注意深くしない限り全部細かく指定しすぎてもややこしくなるだけなので、ひとまづ一日単位の"day"をターゲットにデザインを決めようと思ふ。下記の設定をスタイルシートに追加。

div.day { 
    color:#fff ; /* 文字色の設定 */
    background-color:#333 ; /* 背景色の設定 */
    border:1px #999 solid ;  /* 枠線の設定 */
    margin:2em 0 ; /* 枠の外側の余白設定 */
    padding:0 ;  /* 枠の内側の余白設定 */
    line-height:2em ; /* 本文の行の高さの設定 */
    }

これで一日ごとのブロックがグレーの枠線で括られ、その内側が濃いグレーの地に白い文字で表示される様になる。これだけでも少しはいつもの大和但馬屋らしくなつただらう。サンプル文書2
枠の外側の上下に一文字分の余白を空けて一日単位に分かれる様にし、本文の行間は一行分空けることにした。emは「一文字分の横幅」といふ単位なので厳密には一行分とはやや違ふが、ここではスルーしてほしい。
まだ少し読みづらいので、話題ごとの"section"に余白を設定する。上下に二行分、左右に一文字分の余白を空けるために、下記の設定を追加。

div.section { padding:2em 1em ; } /* 枠の内側の余白設定 */

サンプル文書3の通りである。

紹介御礼

何人もの方に、CSS再構築について紹介いただいてをります。あまりに基本的すぎてその筋の方には「何を今さら」な程度のことしかできませんが、見てくれる方がゐれば良いプレッシャーとなりますので生暖かく見守つてくだされば幸ひです。をかしな点は遠慮なく指摘して頂ければなお幸ひ。「自分もやつてみよう」といふ方がゐたら無上の喜びですが、そこまでは望みますまい。
あくまで目的は自分のCSSの適正化であることを忘れぬよう>オレ。

CSS再構築(その四) 見出し要素

さて、どんどん進めるぞ。
続いて、見出しの設定だ。見出しといへばh1〜h6要素である。HTMLの学び始めに「H1タグは文字を大きく表示します。FONTタグとは違い、数字が小さくなるほど大きい文字になります。文字を大きくしたいときはFONTタグを使いましょう」などと教へられ、HTMLのマークアップの道を踏み誤ることになるアレである。こんな「常識」は忘れるべきだ。こんな解説をしてゐる本は今すぐゴミ箱に捨てろ。こんな解説をしてゐるサイトはブックマークから消せ。オレたちは嘘を教へられたんだ。「人」といふ字は人と人とが支へあつてゐる形なんかぢやないんだ。騙されるな。
W3C曰く、HTML文書は須く「見出し」と「本文」がセットになつて構成されてゐるべし、である。これを言ふとすぐに「形に縛られすぎだ、オレのホームページはもつと自由でゐたいんだ」とか言ひ出したくなるのが人の常だが、そこはそれ、発想を逆転させてみよう。フォーマットに合はせながら、どこまで自由な発想ができるか、と。あるいは、自由な発想から生まれた文書を如何にしてフォーマットに合はせるか、と。どんな素晴らしい発想も、形に縛られることでしか他人には伝へられないのだ。誰もあなたの脳の中は覗けない。つふか、たかだかこの程度のフォーマットに合せることで損はれるやうな個性なんて云々。
さて、はてなダイアリー(に限らずすべてのHTML文書)で推奨される構造とはこんなものだ。

<body>
<h1>大見出し</h1>
  <h2>中見出し</h2>
      <h3>小見出し</h3>
      本文
      <h3>小見出し</h3>
      本文
  <h2>中見出し</h2>
      <h3>小見出し</h3>
      本文
      <h3>小見出し</h3>
      本文
  <h2>中見出し</h2>
      <h3>小見出し</h3>
      本文
      <h3>小見出し</h3>
      本文
</body>

本来、文書の構造はこれだけでよい。小見出しはさらにh4,h5,h6と細かく取ることができるが、基本構造はこれだけである。はてなダイアリーの場合、これをさらにdivで括るからかへつてわかりにくくなつてしまふが、文書の構造を作るのはdivではなくあくまで見出しと本文の関係によつてである。
見出しのレベルについては、あくまでその文書の中で最上位となるものを<h1>と見倣す。<h1>では文字が大きすぎるからといつていきなり<h3>あたりから始めたりするのは間違ひだ。文字の大きさはスタイルシートで決めればよい。
さて、はてなダイアリーでは、それぞれの見出しの内容が以下の様に自動的に決定される。

h4〜h6は特に定義されてゐない。わざわざ使はうと思はない限り、さう使ふものでもない。

h1,h2,h3,h4,h5,h6 { 
    font-weight:bold ; /* 見出しは全部太字に */
    margin:0 ; /* 外側の余白 */
    padding:0 ;  /* 内側の余白 */
    }

h1 { 
    font-size:180% ; /* 文字サイズ */
    color:#77bac1 ;  /* 文字色 */
    background-color:#4594a0 ; /* 見出し部分の背景色 */
    background-image:url("http://d.hatena.ne.jp/images/diary/yms-zun/2002-12-30.gif") ; /* はてなロゴ画像 */
    background-repeat:no-repeat ;  /* ロゴ画像の繰返し設定 */
    background-position:0% 100% ;  /* ロゴ画像の表示位置 */
    padding-left:110px ;  /* ロゴ画像の横幅分だけ左に余白を取る */
    border-bottom:1px #276d75 solid ;  /* 下に枠線表示 */
    vertical-align:bottom ;  /* 文字の配置を下揃えに */
    }

h2 { 
    font-size:140% ;  /* 文字サイズ */
    color:#066 ;  /* 文字色 */
    margin:0.5em 0 ;  /* 外側の余白 */
    padding-left:0.5em ; /* 内側左の余白 */
    border-bottom:2px #fff solid ;  /* 下に枠線表示 */
    }
div.main h2 { 
    font-size:120% ;  /* 文字サイズ */
    color:#fff ;   /* 文字色 */
    padding-left:1em ; /* 内側左の余白 */
    border-color:#fc0 ;   /* 下線の色を変更 */
    }

h3 { 
    font-size:120% ;   /* 文字サイズ */
    color:#fff ;   /* 文字色 */
    margin:1em 0 ;  /* 外側の余白 */
    border-bottom:3px #9ff solid ;   /* 下に枠線表示 */
    }

何やら記述が香ばしくなつてきた。順に説明すると、一行目で見出し要素六種類を全部太字で表示する様にしてしまつてゐる。余白も一旦全部詰めて、後から異なる部分だけ個別に設定することにした。
で、大見出しとなるh1要素である。これを「はてなダイアリー」のヘッダの様に見せかけるため、いろいろと設定しなくてはならない。まずはてなのロゴを切出して背景画像に設定し、見出しとなる文字列はロゴの幅だけ余白をとつて表示させるわけだ。この様にすることで、はてなダイアリーの出力するHTMLには手を出せなくともある程度自由に遊ぶことができる。これがCSSを使ふ醍醐味だと思ふがどうか。
続いて中見出しのh2要素。ここでまたややこしいことをしてゐる。まず普通のh2要素についてだが、ここでは文書の始めの方にある「この日記は」といふ見出しについて設定してゐる。レイトンブルーの背景に合せた配色だ。しかしこのままでは日記の日付の見出しとしては具合が悪い。そこで、日付の方では別の設定をしたいわけだ。
そこでdiv.main h2 { といふ記述が登場する。日記本体を括るdiv要素の中にあるh2要素については、こちらの設定を適用しますよといふ意味だ。先に書いたh2要素の設定はまんま生きてゐるから、そこから変更したい部分だけ上書きする様に設定すればよい。ここでは、下線の太さやスタイルはそのままに色だけを変更するようにしてゐる。
h3要素は、まあそのまんまだ。サンプル文書5。ついでにh4,h5のスタイルも設定。h6は使つた記憶がないし、使ふとしてもボールド表示だけで十分なので放置。

h4 { 
    padding-top:0.5em ; /* 内側上の余白 */
    border-bottom:1px #fff solid ; /* 下に枠線表示 */
    }

h5 { 
    border-width:1px 8px 1px 0 ; /* 枠線の幅 */
    border-color:#696 ; /* 枠線の色 */
    border-style:solid ; /* 枠線のスタイル */
    margin:0.5em 0 ; 外側の余白
    padding-top:0.25em ; /* 内側左の余白 */
    width:50% ; /* 横幅を表示領域の50%に設定 */
    }

h4の表示サンプル

h5の表示サンプル

ここで以前のCSS設定を改めて見返すと、何のために定義したかわからない様なクラス名が続々と出てきてゾッとする。それなりに意味はあるのだらうが、いつたいどこで使はれてゐるのやら。
ここまでのCSSid:yms-zun:20030104にまとめて置いた。参考にしたい人はご自由にどうぞ。