テーブルと枠と、時々、コラム

最近web作成で<table>を使わなければならないことが多くなりました。

タグがやたらと多くなるのであまり好きではなかったのですが、表を作るには崩れにくいので便利ではあります。

でも、<table border="●" cellspacing="▲" cellpadding="■">と書くのは嫌なので、枠線やセル間隔などの制御をCSSで書くときの備忘録をまとめてみました。やはりIE6とIE7が曲者です。

 

前提条件として、table, td, thのmargin, paddingを10px、テーブルの幅を400pxとして実験。

<style type="text/css">
table,
td,
th {
	margin:10px;
	padding:10px;
}
table {
	width:400px;
}
</style>

その上で、最初に試したのがこれ。

ソース↓

<style type="text/css">
.table01 {
	border:1px solid #000;
}
</style>

<table class="table01">
	<tr>
		<td>tableに黒いborder:1px</td>
		<td>tableに黒いborder:1px</td>
	</tr>
	<tr>
		<td>tableに黒いborder:1px</td>
		<td>tableに黒いborder:1px</td>
	</tr>
</table>

結果↓

tableに黒いborder:1px tableに黒いborder:1px
tableに黒いborder:1px tableに黒いborder:1px
  • tableのborderは外側だけ

ということが分かります。

次に、中にも線を引きたいので、

ソース↓

<style type="text/css">
.table02 {
	border:1px solid #000;
}
.table02 td {
	border:1px solid #f00;
}
</style>

<table class="table02">
	<tr>
		<td>tableに黒、tdに赤いborder:1px</td>
		<td>tableに黒、tdに赤いborder:1px</td>
	</tr>
	<tr>
		<td>tableに黒、tdに赤いborder:1px</td>
		<td>tableに黒、tdに赤いborder:1px</td>
	</tr>
</table>

結果↓

tableに黒、tdに赤いborder:1px tableに黒、tdに赤いborder:1px
tableに黒、tdに赤いborder:1px tableに黒、tdに赤いborder:1px
  • 中にも線を引きたい場合はtd(th)にborderをかける
  • その際、td(th)のmarginとはtableとtd(th)の間のこと
    (ただし、IE6, IE7は余白ができない)

セル間隔は、単純にmargin, paddingだけではなく、

ソース↓

<style type="text/css">
.table03 {
	border:1px solid #000;
	border-spacing:10px 100px;
}
.table03 td {
	border:1px solid #f00;
}
</style>

<table class="table03">
	<tr>
		<td>border-spacing:20px 100px</td>
		<td>border-spacing:20px 100px</td>
	</tr>
	<tr>
		<td>border-spacing:20px 100px</td>
		<td>border-spacing:20px 100px</td>
	</tr>
</table>

結果↓

border-spacing:20px 100px border-spacing:20px 100px
border-spacing:20px 100px border-spacing:20px 100px
  • td(th)同士の間隔はborder-spacingで指定
    (ただし、IE6, IE7では指定できない)
  • この際、隣接する余白はマージンの話に書いたmarginと同じレンダリングがなされると思われる

ということなので、border-spacingを0にしてみると、

ソース↓

<style type="text/css">
.table04 {
	border:1px solid #000;
	border-spacing:0;
}
.table04 td {
	border:1px solid #f00;
}
</style>

<table class="table04">
	<tr>
		<td>border-spacing:0</td>
		<td>border-spacing:0</td>
	</tr>
	<tr>
		<td>border-spacing:0</td>
		<td>border-spacing:0</td>
	</tr>
</table>

結果↓

border-spacing:0 border-spacing:0
border-spacing:0 border-spacing:0
  • 「border-spacing」を0にしてもborder同士が隣接すると見苦しい
    (ただし、IE6, IE7 はむしろ見苦しくない)

また、最初にtableとtd(th)に内外10pxの余白を付けていたので、

ソース↓

<style type="text/css">
.table05 {
	border:1px solid #000;
	border-spacing:0;
	padding:0;
}
.table05 td {
	border:1px solid #f00;
	margin:0
}
</style>

<table class="table05">
	<tr>
		<td>tableのpaddng:0、tdのmargin:0</td>
		<td>tableのpaddng:0、tdのmargin:0</td>
	</tr>
	<tr>
		<td>tableのpaddng:0、tdのmargin:0</td>
		<td>tableのpaddng:0、tdのmargin:0</td>
	</tr>
</table>

結果↓

tableのpaddng:0、tdのmargin:0 tableのpaddng:0、tdのmargin:0
tableのpaddng:0、tdのmargin:0 tableのpaddng:0、tdのmargin:0
  • tableとtd(th)間を0にしても、おなじくborder同士の隣接は美しくない
    (この場合も、IE6, IE7 は普通に見える)

罫線の重なりは、調べた結果こうすれば、

ソース↓

<style type="text/css">
.table06 {
	border:1px solid #000;
	border-spacing:10px 100px;
	border-collapse:collapse;
}
.table06 td {
	border:1px solid #f00;
}
</style>

<table class="table06">
	<tr>
		<td>border-collapse:collapse</td>
		<td>border-collapse:collapse</td>
	</tr>
	<tr>
		<td>border-collapse:collapse</td>
		<td>border-collapse:collapse</td>
	</tr>
</table>

結果↓

border-collapse:collapse border-collapse:collapse
border-collapse:collapse border-collapse:collapse
  • 「border-collapse」を「collapse」にすればtableとtd(th),td(th)間の間隔が無くなる
    (tableのpadding, td(th)のmarginとborder-spacingは無視される。IE6,IE7も)
  • この際、borderはtableよりもth(td)の方が優先されるがIE6, IE7では外枠がtableの罫線となる
    (IE6, IE7以外ではtable>thead(tbody,tfoot)>tr>td(th)ということ?)
  • 「border-collapse」のデフォルトは「separate」

ということで、「border-collapse:collapse;」とすれば、IEでも他のブラウザでもきれいな表が作れるというのがポイントでした。


ところで、話変わって、横方向に一括でスタイルをかけたいときは<tr>をセレクトしてやればよいですが、縦方向の場合は、

ソース↓

<style type="text/css">
.table07 {
	border-collapse:collapse;
}
.table07 th,
.table07 td {
	border:1px solid #f00;
}
.table07 .col1 {
	width:20%;
	text-align:left;
	background:#fee;
}
.table07 .col2 {
	width:10%;
	text-align:right;
	background:#efe;
}
.table07 .col3 {
	width:20%;
	text-align:right;
	background:#eef;
}
.table07 .col4 {
	width:40%;
	text-align:right;
	background:#ffe;
}
</style>

<table class="table07">
	<col class="col1">
	<col class="col2">
	<col class="col3">
	<col class="col4">
	<thead>
		<tr>
			<th>col1</th>
			<th>col2</th>
			<th>col3</th>
			<th>col4</th>
		</tr
	</thead>
	<tfoot>
		<tr>
			<td>col1</td>
			<td>col2</td>
			<td>col3</td>
			<td>col4</td>
		</tr
	</tfoot>
	<tbody>
		<tr>
			<td>幅:20%</td>
			<td>幅:10%</td>
			<td>幅:20%</td>
			<td>幅:40%</td>
		<tr>
			<td>left</td>
			<td>right</td>
			<td>right</td>
			<td>right</td>
		</tr>
		<tr>
			<td>ピンク</td>
			<td>水色</td>
			<td>紫</td>
			<td>黄色</td>
		</tr>
	</tbody>
</table>

結果↓

(毎回のことですが、このブログにかかっているcssやjsの影響により、「text-align」が思い通りに表示されていませんが、ソースをテキストエディタにコピーして単独で表示させたらうまく出来ました)

col1 col2 col3 col4
col1 col2 col3 col4
幅:20% 幅:10% 幅:20% 幅:40%
left right right right
ピンク 水色 黄色

列に属性を与えるには<col>または<colgroup>が利用できる

というのが便利です。

でもやっかいなのは、<col>は空要素ということ。<colgroup>にしても、<col>を<colgroup><col><colgroup>とはさむことはできますが、trやthead(tbody, tfoot)の前に記述しなければならず、td(th)をはさむことができません。

だから、

ソース↓

<style type="text/css">
.table08 {
	border-collapse:collapse;
}
.table08 th,
.table08 td {
	border:1px solid #f00;
	width:25%; /* ← 上の例にこれを追加 */
}
.table08 .col1 {
	width:20%;
	text-align:left;
	background:#fee;
}
.table08 .col2 {
	width:10%;
	text-align:right;
	background:#efe;
}
.table08 .col3 {
	width:20%;
	text-align:right;
	background:#eef;
}
.table08 .col4 {
	width:40%;
	text-align:right;
	background:#ffe;
}
</style>

<table class="table08">
	<col class="col1">
	<col class="col2">
	<col class="col3">
	<col class="col4">
	<thead>
		<tr>
			<th>col1</th>
			<th>col2</th>
			<th>col3</th>
			<th>col4</th>
		</tr
	</thead>
	<tfoot>
		<tr>
			<td>col1</td>
			<td>col2</td>
			<td>col3</td>
			<td>col4</td>
		</tr
	</tfoot>
	<tbody>
		<tr>
			<td>幅:20% ?</td>
			<td>幅:10% ?</td>
			<td>幅:20% ?</td>
			<td>幅:40% ?</td>
		<tr>
			<td>left</td>
			<td>right</td>
			<td>right</td>
			<td>right</td>
		</tr>
		<tr>
			<td>ピンク</td>
			<td>水色</td>
			<td>紫</td>
			<td>黄色</td>
		</tr>
	</tbody>
</table>

結果↓

col1 col2 col3 col4
col1 col2 col3 col4
幅:20% ? 幅:10% ? 幅:20% ? 幅:40% ?
left right right right
ピンク 水色 黄色

ということで、やはりhtmlのコードが膨らんでしまうのがテーブルの嫌なところです。


ところで、tfootについて、
tfoot は tbody の前に書いた方がいいよ | WWW WATCH
tfoot に関するエントリーの補足 | WWW WATCH
tableのtfootの記述位置について|WEB Drawer -WEB制作に関するメモサイト-
HTMLテーブル(表)の本体部分を定義するタグ <tbody> | 初心者でもわかるホームページの作り方
などにもあるように、ユーザーエージェントは(相当な行数もの)データのすべてを読む前にtfootをレンダリングできる(user agents can render the foot before receiving all of the (potentially numerous) rows of data)という理由から、

<table>は、 <thead> <tfoot> <tbody> の順に書く方が良い

ということを最近知りました。

Filed under: ★Web制作関係  タグ: , , , , , , , , ,   charlie432 00:00  Comments (0)

JavaScriptの基本的な備忘録 2011.04.07

前の投稿の続きです。

nを正の整数とするとき、

  1. 初期状態は、テーブル1と、「テーブル2を追加する」ボタンを表示
  2. テーブルnが表示されたら、「テーブル(n+1)を追加する」ボタンも表示。ただし、n+1=6のときはアラート表示
  3. テーブルnが表示されているときは、「テーブルnを追加する」ボタンは非表示にする
  4. テーブル内に設置された「削除」ボタンで、そのテーブルを削除する(非表示にさせる)
  5. テーブルnが削除されたら「テーブルnを追加」ボタンを表示させる
  6. テーブルnが削除されているときは「テーブル(n+1)を追加」ボタンは非表示とさせる
  7. nの最大値は5

というページを作ったんですが

(1)初期状態は、テーブル1と、「テーブル2を追加する」ボタンを表示

ということで、最初非表示のものはcssでこのように。

#add1,
#add3,
#add4,
#add5,
#noMoreTable,
#table2,
#table3,
#table4,
#table5 {
	display:none;
}

ID名は「テーブル(1~5)を追加」ボタンは add1~add5、テーブル1~5は table1~table5、これ以上テーブルは追加できないことを表すボタンを「noMoreTable」としました。

htmlの基本構造を
<ボタン1>
<テーブル1>
<ボタン2>
<テーブル2>
<ボタン3>
<テーブル3>
<ボタン4>
<テーブル4>
<ボタン5>
<テーブル5>
<アラートボタン>
とし、あとはボタンを押された時の挙動をJavascriptで記述。例えば「テーブル2を追加」ボタンだったら、script部分を

function add2() {
 	document.getElementById('table2').style.display=['block'];
 	document.getElementById('add21').style.display=['none'];
 	if(document.getElementById('table3').style.display !='block')
 		{document.getElementById('add3').style.display=['block'];}
}

として、htmlを

~ onClick="add2(); ~

とすれば、クリックしたときにファンクションadd2()が実行されます。

ボタン、テーブルの表示非表示は、スタイルシートの「display」を「block」か「none」にするかで変化させるのですが、getElementByIdメソッドを利用して

document.getElementById("【オブジェクトID】").style.【プロパティ】 = ['【値】']

ここでは右辺を['【値】']と記述しましたが"【値】"でも’【値】’でもオッケー牧場です。

それと、if文の書式は条件分岐 (if構文)/JavaScript入門にあるように、

if (条件式1) {スクリプト1}
else if (条件式2) {スクリプト2}
else if (条件式3) {スクリプト3}



else {スクリプト}

ちなみに、「getElementById」があるなら「getElementsByClass」もありそうなものですが、getElementsByClass() – にぽたん研究所にもあるように、どうやら無いみたいです。

演算子については、慣れたらスラスラ書けるのでしょうが、まだその都度調べたりすることがあるので、よく使うのは覚えておきたいです。

JavaScript演算子一覧より↓

算術演算子

演算子記号
加算+
デクリメント
除算/
インクリメント++
剰余%
乗算*
減算-
単項マイナス符号-

論理演算子

演算子記号
カンマ,
条件演算子?:
等しい==
より大きい>
より大きいか等しい>=
厳密等価演算子===
等しくない!=
より小さい<
より小さいか等しい<=
論理 AND&&
論理 NOT!
論理 OR||
厳密非等価演算子!==

ビット演算子

演算子記号
ビットごとの AND&
左シフト<<
ビットごとの NOT~
ビットごとの OR|
右シフト>>
ビットごとの XOR^
右シフト>>>

代入演算子

演算子記号
代入演算子=
複合代入演算子OP=

ということで、例えば

function add2() {
 	document.getElementById('table2').style.display=['block'];
 	document.getElementById('add2').style.display=['none'];
 	if(document.getElementById('table3').style.display !=['block'])
 		{document.getElementById('add3').style.display=['block'];}
}

だったら、「table2を表示させ、add2を非表示に。table3が表示されていなかったらadd3ボタンを表示」ということになります。

 

ダイアログは、JavaScript講座 13章 JavaScriptのウィンドウ操作にあるように、

警告ダイアログ window.alert(【コメント】);
選択ダイアログ window.confirm(【コメント】);
入力ダイアログ window.prompt(【コメント】,【入力ボックスの初期値】)
一定時間後に処理させる setTimeout("【処理させる関数】",【ミリ秒】)
一定間隔で処理させる setInterval("【処理させる関数】",【ミリ秒】)
ステータスバーに文字を表示する window.status = ‘【表示させる文字】’

があります。

<input
type="button"
value="alertのサンプル。ソースは↓"
onClick="window.alert('改行したい場合は\n¥nの半角\nタブを入れたい場合は\n¥tの半角\n(\t)←括弧内がタブ')"
>

 

<input
type="button"
value="confirmのサンプル。ソースは↓"
onClick="window.confirm('「OK」ボタンをおすとtrueが返され\n「キャンセル」ボタンを押すとfalseが返される')"
>

 

<input
type="button"
value="alertとconfirmの組み合わせ。ソースは↓"
onClick="x=window.confirm('「OK」または「キャンセル」を押した後に\nその返り値を表示させます');window.alert(x);
">

以下、書くのが面倒くさくなったのでJavaScript講座 13章 JavaScriptのウィンドウ操作を参照してください。

なお、特定のIDのオブジェクトは「getElementById」で指定できましたが、
はじめてのDOM
DOM Samples /Core Node/parentNode – [Javascript] All About
を参考に、他にもまとめるとこれらがあります。

自分自身 → this
親オブジェクト → parentNode
(n+1)番目の子オブジェクト → childNode[n]
最初の子オブジェクト → firstChild
最後の子オブジェクト → lastChild
特定のタグのオブジェクト → getElementsByTagName(‘【タグ名】’)
(n+1)番目の特定のタグのオブジェクト → getElementsByTagName(‘【タグ名】’)[n]

ただし、「(n+1)番目の子オブジェクト」というのは、<br />タグも含むのと、
「display:none」のものもカウントされることに注意(たぶん。試してみた限りでは)。

↓紫色全体(div)が親

子1(p)

子2(p)

子3(p)

↑のソース↓

<div style="padding:1em;background:#99f">
	<p>子1(p)</p>
	<input type="button" value="ここを押すと自分自身(input)だけが消えます" onClick="this.style.display='none'"><p>
	<p>子2(p)</p>
	<p>子3(p)</p>
</div>

 

↓ピンク色全体(div)が親

子1(p)

子2(p)

子3(p)

↑のソース↓

<div style="padding:1em;background:#f9f">
	<p>子1(p)</p>
	<input type="button" value="私(input)を押すと親(div)が消えます。その子(p,input)も" onClick="this.parentNode.style.display='none'">
	<p>子2(p)</p>
	<p>子3(p)</p>
</div>

 

↓茶色全体(div)が親

子1(p)




子2(p)

子3(p)

子4(p)

子5(p)

子6(p)

子7(p)

↑のソース↓

【追記】実際のソースは↓から改行・空白を削除しました。ブラウザ間の挙動の差異をなくすためです(詳細は後日述べます → こちらに追記)。

<div style="padding:1em;background:#930">
	<p><em>子1(p)</em></p>
	<input type="button" value="私(input)を押すと子1(p)が白くなります(firstChild)" onClick="this.parentNode.firstChild.style.color='#fff'"><br />
	<input type="button" value="私(input)を押すと子4(p)に枠線がつきます(10番目のノード)" onClick="this.parentNode.childNodes[9].style.border='10px solid #fff'"><br />
	<input type="button" value="私(input)を押すと子7(p)の背景が白くなります(lastChild)" onClick="this.parentNode.lastChild.style.background='#fff'"><br />
	<p>子2(p)</p>
	<p><em>子3(p)</em></p>
	<p>子4(p)</p>
	<p>子5(p)</p>
	<p>子6(p)</p>
	<p>子7(p)</p>
</div>

 

idは一つしかないので「getElementById」、それ以外のものは複数あっても良いので「getElementsByTagName」なんでしょうか。

「getElementsByTagName」のサンプルがうまくいかなかったので、時間があったらさらに詳しく見てゆきたいと思います。

 

あと、実際にテキストエディタで実験したときは上手く行ったんですが、ブログに投稿すると上手くいかなかったり、ブラウザによって挙動が異なる場合があります。上のサンプルはそこまで対応出来てきません。

Filed under: ★Web制作関係  タグ: , , , , , , , , , , ,   charlie432 00:00  Comments (0)

アレをアレしたらアレがアレになるアレのアレのアレ

アレについてはいろいろアレンジできますが、今回は

「ボタンをクリックしたらボタンに応じたオブジェクトにスクリプトが実行されるJavaScriptの備忘録の前半」

です。

時間がないので、調べている過程で知ったことや、関連事項のまとめなどは後日書きます。

 

とりあえず、、、

nを正の整数とするとき、

  1. 初期状態は、テーブル1と、「テーブル2を追加する」ボタンを表示
  2. テーブルnが表示されたら、「テーブル(n+1)を追加する」ボタンも表示。ただし、n+1=6のときはアラート表示
  3. テーブルnが表示されているときは、「テーブルnを追加する」ボタンは非表示にする
  4. テーブル内に設置された「削除」ボタンで、そのテーブルを削除する(非表示にさせる)
  5. テーブルnが削除されたら「テーブルnを追加」ボタンを表示させる
  6. テーブルnが削除されているときは「テーブル(n+1)を追加」ボタンは非表示とさせる
  7. nの最大値は5

というページを作る用事があったので、こんな感じで作ってみました。

CSS↓

#add1,
#add3,
#add4,
#add5,
#noMoreTable,
#table2,
#table3,
#table4,
#table5 {
	display:none;
}

 

JavaScript↓

function add1() {
	document.getElementById('table1').style.display=['block'];
	document.getElementById('add1').style.display=['none'];
	if(document.getElementById('table2').style.display !='block')
		{document.getElementById('add2').style.display=['block'];}
}

function add2() {
	document.getElementById('table2').style.display=['block'];
	document.getElementById('add2').style.display=['none'];
	if(document.getElementById('table3').style.display !='block')
		{document.getElementById('add3').style.display=['block'];}
}

function add3() {
	document.getElementById('table3').style.display=['block'];
	document.getElementById('add3').style.display=['none'];
	if(document.getElementById('table4').style.display !='block')
		{document.getElementById('add4').style.display=['block'];}
}

function add4() {
	document.getElementById('table4').style.display=['block'];
	document.getElementById('add4').style.display=['none'];
	if(document.getElementById('table5').style.display !='block')
		{document.getElementById('add5').style.display=['block'];}
}

function add5() {
	document.getElementById('table5').style.display=['block'];
	document.getElementById('add5').style.display=['none'];
	document.getElementById('noMoreTable').style.display=['block'];
}

function del1() {
	document.getElementById('add1').style.display=['block'];
	document.getElementById('table1').style.display=['none'];
	document.getElementById('add2').style.display=['none'];
}

function del2() {
	document.getElementById('add2').style.display=['block'];
	document.getElementById('table2').style.display=['none'];
	document.getElementById('add3').style.display=['none'];
}

function del3() {
	document.getElementById('add3').style.display=['block'];
	document.getElementById('table3').style.display=['none'];
	document.getElementById('add4').style.display=['none'];
}

function del4() {
	document.getElementById('add4').style.display=['block'];
	document.getElementById('table4').style.display=['none'];
	document.getElementById('add5').style.display=['none'];
}

function del5() {
	document.getElementById('add5').style.display=['block'];
	document.getElementById('table5').style.display=['none'];
	document.getElementById('noMoreTable').style.display=['none'];
}

function noMoreTable() {
	window.alert('申し訳ございません。テーブルは最大5つまでです。')
}

 

html↓

<p><input type="button" id="add1" value="テーブル1を追加" onclick="add1();"></p>

<table border="1" id="table1">
	<tr>
		<td>テーブル1</td>
		<td><input type="button" value="削除" onclick="del1();"></td>
	</tr>
</table>

<p><input type="button" id="add2" value="テーブル2を追加" onclick="add2();"></p>

<table border="1" id="table2">
	<tr>
		<td>テーブル2</td>
		<td><input type="button" value="削除" onclick="del2();"></td>
	</tr>
</table>

<p><input type="button" id="add3" value="テーブル3を追加" onclick="add3();"></p>

<table border="1" id="table3">
	<tr>
		<td>テーブル3</td>
		<td><input type="button" value="削除" onclick="del3();"></td>
	</tr>
</table>

<p><input type="button" id="add4" value="テーブル4を追加" onclick="add4();"></p>

<table border="1" id="table4">
	<tr>
		<td>テーブル4</td>
		<td><input type="button" value="削除" onclick="del4();"></td>
	</tr>
</table>

<p><input type="button" id="add5" value="テーブル5を追加" onclick="add5();"></p>

<table border="1" id="table5">
	<tr>
		<td>テーブル5</td>
		<td><input type="button" value="削除" onclick="del5();"></td>
	</tr>
</table>

 

結果↓

テーブル1

テーブル2

テーブル3

テーブル4

テーブル5

一応できたんですが、ブログで書くとWordPressや自分でカスタマイズした機能が働いて、今ひとつ思い通りになっていません。余裕ができたらそこら辺を修正をしたいと思います。

あ、あと今後の課題として、テーブルやボタンのidは添え字1~5の配列にする、とか、最大値を任意のnにしてそのnの値はユーザー側で設定できるようにする、など。

Filed under: ★Web制作関係  タグ: , , , ,   charlie432 00:00  Comments (1)
    2012年5月
    « 4月    
     123456
    78910111213
    14151617181920
    21222324252627
    28293031