inline要素とblock要素

CSSとは、同名のHTML開始タグと終了タグで囲われた部分を要素とみなし、その要素に対するレンダリング(表示方法)を指示するものです。

<div>タイトル<span>作成講座</span></div>

この例では、<div> の要素は「タイトル<span>作成講座</span>」であり、<span>の要素は「作成講座」です。このような構造が無数に入れ子状になったものがHTML、このHTMLの表示方法を指示するものがCSSとなります。*1

このような要素には大きく分けて2つの種類があります。

*1 : 昔はCSSはなく、直接HTMLを使ってデザインすることが多かったのですが、文章の意味とデザインを分離するという立場からCSSが広く使われるようになると、HTMLから徐々にデザインの要素が排除されていきました。(新しいHTMLの仕様ではデザインに関するタグや属性は非推奨や使用禁止になっています。)

inline要素とblock要素

インライン要素とは文章の一部を太字に修飾するといった、ある文章中での装飾などに使われる要素です。代表選手は<span>タグになります。

ブロック要素とは<p>タグで囲まれた段落や記事のかたまり、adiaryで言えば1つの記事、1つのサイドバー要素などはすべてブロック要素です。代表選手は<div>タグになります。この2つを区別することはCSSでデザインを行う上で大変重要です

例を示します。次のようなHTMLを書いてみます。*2

<div class="box1">タイトルはブロック要素にします</div>
<span class="box1">インライン要素は</span>
<span class="box1">このように横に連結されます。</span>
<span class="box1">しかし</span>
<div class="box1">ブロック要素は横に連結せず行を独占します</div>
何もタグがついていない部分もインライン要素です。

外枠線を付けるため、今box1というクラスを指定しました*3

タイトルはブロック要素にします
インライン要素は このように横に連結されます。 しかし
ブロック要素は横に連結せず行を独占します
何もタグがついていない部分もインライン要素です。

*2 : adiaryの編集画面で単純に入力する場合は、パーサーが働くので改行されてしまいます。

*3 : このクラスは、ユーザースタイルシートで指定したものですので、他の記事にコピーしても枠線はでません。

CSSによる指定

CSSによって特定のクラスのインライン/ブロックを変更することができます。例えば通常のリスト

<ul>
<li>リスト1</li>
<li>リスト2</li>
<li>リスト3</li>
</ul>

を表示すると

  • リスト1
  • リスト2
  • リスト3

となりますが、CSSでliをインライン要素にしてしまうと表示ががらりと変わります。

<ul class="inline">
<li>リスト1</li>
<li>リスト2</li>
<li>リスト3</li>
</ul>
(CSS)
ul.inline li { display: inline; }

表示例

  • リスト1
  • リスト2
  • リスト3

このようにCSSを使うことで、リストをインラインに変えるなんてこともできてしまいます。

特殊なクラス

より凝った(複雑な?)テーマ作成を支援する、条件によって変わる特殊なクラス出力を解説します。

wiki関連クラス出力

body.wikiクラス
wikiコンテンツを単一記事表示しているときに出力されます。
div.wikiクラス
該当記事がwikiコンテンツのとき出力されます(詳細)。

システム関連クラス出力

この項目の div.* は div.adiary-body と同時クラス指定として出力されます。

body.system
システムモードのとき出力されます。
div.daybook-owner
日記帳(ブログ)の所有者/管理者のとき出力されます。
div.daybook-editor
日記帳の記事編集権限があるとき(管理者含む)出力されます。
div.contents-bar-exists
コンテンツバーが存在するとき出力されます。この条件でマージン(パディング)値が指定されているので、CSSでコンテンツバーを扱う際は解除してください。

例として、ログイン時(編集権限があるとき)およびシステムモード以外では、右上のログインなどを隠すCSSを示します。

div.adminmenu { display: none; }
body.system div.adminmenu, 
div.daybook-editor div.adminmenu {
	display: none;
}

これで一般利用者にはログイン等が見えなくなります。ただ、ログインへのリンクも無くなりますので、ログインのページをブックマークしておくなどの対策が必要です。*1

*1 : もっとも URL に ?login を付加するだけですが

コンテンツバー

コンテンツ一覧をサイドバーではなくプルダウンメニューしとて表示するため機能があります。これをコンテンツバーと言います。

かなり高度であるため触らない方が無難です。テーマとしての対応は任意です(必須ではない)。

コンテンツバーの詳細

div.page-titleのあとに出力されます。日記帳の詳細設定で「コンテンツバー」の表示をオンにしてコンテンツを作成すると表示されます。HTMLとしては単なるulです。

<div class="contents-bar">
<div id="contents-bar0"></div><div id="contents-bar">
<ul class="clist">
	<li><a href="~">あいうえお</a></li>
	<li><a href="~">テスト投稿</a></li>
	<li><a href="~">Hello World!</a>
	<ul class="clist2">
		<li><a href="~">C#</a></li>
		<li><a href="~">C言語</a>
		<ul class="clist3">
			<li><a href="~">C</a></li>
			<li><a href="~">C++</a></li>
			<li><a href="~">C++/CLI</a></li>
		</ul></li>
		<li><a href="~">Java</a></li>
	</ul></li>
</ul>
</div><div id="contents-bar1"></div></div>

やってみると分かりますが、一見CSSとは思えない動作をします。

IEのためだけにJavaScriptを使っていますが、それでもIEでは3階層目以降は表示されません。

base.css に記述されていますが、よほどCSSに自信がない限り全体の幅と背景色(リンク色)と各タブの幅以外はいじらない(オーバーライドしない)方が無難です。どうしてもいじりたい人のための参考URLを書いておきますが、触らない方が無難です。あまりに複雑怪奇なため、テーマとしての対応は任意です

カスタマイズ時はこちらも参照ください

コンテンツ/カレンダー

コンテンツ一覧

adiaryにはコンテンツ一覧を自動的に生成しサイドバー(等)に階層表示する機能があります。階層は任意で3階層まで指定できます。

<div class="hatena-module side-contents-list">
<div class="hatena-moduletitle">コンテンツ</div>
<div class="hatena-modulebody">
<ul class="hatena-section side-contents-list">
	<li><a href="/about.html">adiaryについて</a></li>
	<li><a href="/theme_doc/satsuki-main">メイン部</a>
	<ul class="hatena-section side-contents-list">
		<li><a href="/theme_doc/satsuki-mainh2">記事タイトル</a></li>
		<li><a href="/theme_doc/satsuki-bodyheader">記事ヘッダ</a></li>
	</ul></li>
</ul>
</div></div>

コンテンツはul階層の入れ子になっています。注意点は、他のモジュールはid指定で出力されるのに対し、コンテンツ一覧はクラス出力のみであることです。

これは理由があり、例えばこのテーマドキュメントのように「コンテンツがメインのサイト」としてadiaryを利用する場合、「日記帳の詳細設定」→「wiki設定」→「最上位コンテンツを項目化」をチェックすることで複数のモジュールをコンテンツのリストとして出力できるからです。この場合次のようになります。

<div class="hatena-module side-contents-list">
<div class="hatena-moduletitle"><a href="~">はじめに</a></div>
<div class="hatena-modulebody">
<ul class="hatena-section side-contents-list">
	<li><a href="~">テンプレートとテーマ</a></li>
</ul>
</div></div>

<div class="hatena-module side-contents-list">
<div class="hatena-moduletitle"><a href="~">satsukiテンプレート</a></div>
<div class="hatena-modulebody">
<ul class="hatena-section side-contents-list">
	<li><a href="~">ヘッダ部</a></li>
	<li><a href="~">メイン部</a>
	<ul class="hatena-section side-contents-list">
		<li><a href="~">記事タイトル</a></li>
		<li><a href="~">記事ヘッダ</a></li>
	</ul></li>
</ul>
</div></div>

<div class="hatena-module side-contents-list">
<div class="hatena-moduletitle"><a href="~">テーマ作成Tips</a></div>
<div class="hatena-modulebody">
<ul class="side-contents-list hatena-section">
</ul>
</div></div>

コンテンツに関するモジュールが複数出力されていることが分かります。コンテンツメニューの書式は普通のサイドバーモジュールと変えた方が扱いやすいです。

カレンダー

単純なようで、複雑なクラス構造をしているのがカレンダーです。

<div class="hatena-module" id="side-calendar">
<div class="hatena-moduletitle">カレンダー</div>
<div class="hatena-modulebody"><div class="side-calendarbody">
<table class="calendar" summary="calendar">
<tr class="calendar-month">
	<td class="calendar-prev-month" colspan="2">
	<a href="~/200709"><<</a></td>
	<td class="calendar-current-month" colspan="3">
	<a href="~/200710">2007/10</a></td>
	<td class="calendar-next-month" colspan="2">
	<a href="~/200711">>></a></td>
</tr>
<tr>
	<td class="calendar-sunday   w0">日</td>
	<td class="calendar-weekday  w1">月</td>
	<td class="calendar-weekday  w2">火</td>
	<td class="calendar-weekday  w3">水</td>
	<td class="calendar-weekday  w4">木</td>
	<td class="calendar-weekday  w5">金</td>
	<td class="calendar-saturday w6">土</td>
</tr>
<tr>
	<td></td>
	<td class='calendar-day w1'>1</td>
	<td class='calendar-day w2'>2</td>
	<td class='calendar-day w3 day-today'>3</td>
	<td class='calendar-day w4'>4</td>
	<td class='calendar-day w5'>5</td>
	<td class='calendar-day w6'>6</td>
</tr>
<tr>
	<td class='calendar-day w0'>7</td>
	<td class='calendar-day w1 w0 holiday' title="体育の日"><a href="~">8</a></td>
	<td class='calendar-day w2'>9</td>
	<td class='calendar-day w3'>10</td>
	<td class='calendar-day w4'>11</td>
	<td class='calendar-day w5 day-selected'><a href="~">12</a></td>
	<td class='calendar-day w6'>13</td>
</tr>
(中略)
<tr>
	<td class='calendar-day w0'>28</td>
	<td class='calendar-day w1'>29</td>
	<td class='calendar-day w2'>30</td>
	<td class='calendar-day w3'>31</td>
	<td></td>
	<td></td>
	<td></td>
</tr>
</table>
</div></div> <!-- side-calendarbody/hatena-modulebody -->
</div> <!-- hatena-module -->
クラス意味
calendar-month月ごとのリンク表示欄のクラス。Ver1.44以降~
w0~w6曜日の日曜日~土曜日に対応します。
calendar-*day曜日名のみ出力されます。
holiday祝日に出力されます。w0も出ていますがholidayでオーバーライドできます。
day-todayその日(当日)に出力されます。
day-selectedその日付の記事を単一記事表示してるとき出力されます。

カレンダーをあまり装飾しようと思わなければシンプルなのですが、同時クラス指定を駆使して多用な条件に対応しようと思い始めると非常に面倒くさくなります。*1

  • 選択している日が当日の場合("day-today day-selected")
  • 祝日を選択している場合("holiday day-today")
  • 日曜や土曜日が当日の場合("w6 day-today")
  • 祝日を選択していて、しかも当日の場合("holiday day-today day-selected")

*1 : ちなみに、かえで氏作のテーマ(初期除く)が凝って指定されています。