今日のダメな人
ただいま2時45分です。
今日というには遅すぎる時間ですね。まあいいや。
前置き。
僕は自宅でハンドヘルドPCのシグマリオンを使っています。
おっきいNOKIA 9210のようなものです。と言っても余計分からないか。小さいノートPCのようなものです。
機能があまりなかったり遅い代わりにスタイラスというペンを使って画面のボタンを押したり絵を描いたりすることができます。
前置き終わり。
今日は仕事で古いノートPCのセットアップをしていました。
とりあえずブラウザが動けばよかったので、OSのCD-ROMを入れてインストーラーを走らせて、ぼんやりしたり他の仕事をしていました。
OSのインストールが終わってもろもろの設定をして、「はい」「いいえ」という同意を促すダイアログがポップアップされた時、
ほぼ無意識に液晶画面のボタンを指で押していました…。ぐにっと。
そのあとしばらくして、指の圧力で液晶の色が変わっているのを見て初めて間違った操作をしていることに気づきました。
仕事が立て込んで頭が回っていなかったとはいえ、習慣とは怖いモノだなと思った残暑厳しい8月の終わりでした。
そのノートPCは、液晶もかなりガタがきているようないつ捨てても惜しくない状態のシロモノだったので、ほとんど実害はありませんでしたが、これが買ったばかりの私物のノートPCとかだったら血の気が引いていたことでしょう。
はじめての CSS
かなり広範囲のブラウザをターゲットにしたXHTML+CSSのサイトを作っているのですが、この世からなくなってしまえ、と思うくらいIEはまともにレンダリングしてくれないですね。
せめてIE6の互換モードとIE5の表示くらいは揃えて欲しいと思いました。
テーブルの列を折りたたむ
横スクロールが出るような幅の広いテーブルを使わなければいけない時に使うといいかもしれないDHTML。
WinIE6とfirefox1で確認済み。Safariは折り畳むときにゴミが表示されるので、ちょっと使えないかも。
ソースはこんな感じ。とりあえず表示できていますというレベルなので、全然エレガントでもスマートでもありません。もっと素敵な処理方法を知っている人がいたら教えてください。
javaScript
/*
テーブルのセルの表示/非表示を切り替える
*/
function hideCell(className,idName) {
obj=document.getElementById(idName);
if(obj.className == "on"){
obj.className = "off";
changeDisplay(className,'none',idName,"+");
}else {
obj.className = "on";
changeDisplay(className,'',idName,"-");
}
}
/*
テーブルのセルの表示/非表示を切り替える(表示部分)
*/
function changeDisplay(className,visible,idName,idText) {
document.getElementById(idName).innerHTML = idText; // 切り替えボタンの表示を切り替え
var spans = document.getElementsByTagName('span');
var length = spans.length;
for (var i = 0; i < length; i++) {
var e = spans[i];
if (e.className == className) {
e.style.display = visible;
}
}
}
スタイルシートのdisplayを操作して、該当するクラス名のspanタグの表示/非表示を切り替えているだけです。
クラス名の付けられたエレメントを直接操作する方法が分からなかったので、HTML内で使用しているspanタグを全て配列に入れた後、総当たりでクラス名を判定するという非効率な方法を使っています。そのため、テーブルの行や列が増えてくるとレスポンスが目に見えて落ちてきます。
テーブルのデータ部分
<tr>
<td><span class="cell01">1</span></td>
<td><span class="cell02">..................</span></td>
<td><span class="cell03">..................</span></td>
<td><span class="cell04">..................</span></td>
<td><span class="cell05">..................</span></td>
</tr>
列ごとに異なるクラス名を付けることで、javaScript側で列を判別できるようにしています。
始めはtdタグとthタグに直接クラス名を指定していましたが、そうすると折りたたみボタンも一緒に消えてしまうので、spanタグを間に挟みました。
テーブルのヘッダー部分
<th><a href="javascript:hideCell('cell01','s01')" id="s01" class="on" title="a">-</a><span class="cell01">a</span></th>
折りたたみボタンのクラスをフラグ代わりに使っています。クラス名が「on」の時は表示、「off」の時は非表示となります。
aタグのtitle属性はなくても動作に支障ありませんが、付けておくとIEではマウスオーバーでツールチップが表示されるので、折り畳んだときでも項目名を知る事ができます。
クッキーを組み合わせると折りたたんだ状態を保持できます。後日追加する予定なので乞うご期待。
追記: (05/09/06)
クッキーの処理を追加した。といっても、書籍の関数をそのまま使ったので説明は後で。
帰省してました。
ひたすら寝て、ひたすら本と漫画を読んでました。
あと、報道ステーションを初めて最初から最後まで見ましたが、ニュースショーってこんなに演出してたっけ?と思うくらい派手に感じました。普段NHKのニュースとワールドビジネスサテライトしか見てないから余計にそう思ったのかもしれません。
常時接続の環境がなかったので、ネットでの調べものができないというのはちょっとつらかったですが、逆にひとつのものごとに集中できてこれはこれでよかったような気がします。
月に1回くらいのペースで「ネットに繋がない日」を作るのも気分転換にいいかもしれないと思った2005年の夏でした。
CSSでの段組みを考える
blogがはやりだした2年ほど前に既に語り尽くされた感のある話だが、最近とてもいい本を買っていろいろ勉強してみたので書いてみる。
オライリージャパン
売り上げランキング: 121853
amazonの書評は辛辣だったりするけど、サンプルが多いのと、現在ワーキングドラフトになっているCSS2.1について言及されている部分が多いので、これからCSSを仕事で使う人は一度目を通しておいた方がいい本だと思う。
で、段組みの方法だが、メジャーなところで以下の2通りの方法があると考えられる。
-
下のブロックの位置指定を絶対指定にして、上のブロックをずらした箇所に表示させる
利点
floatを用いた場合と違い、下のブロックが回り込まない事がない。
重なった場合は、後の要素かz-indexの値の大きい要素が優先される。欠点
絶対指定を行った下のブロックは包含ブロックから無視されるので、上のブロックよりもブロックの高さが高い(長い)場合は、それ以降の要素と重なってしまう。
両方のブロックを絶対位置で指定したサンプルを作ってみたので、興味のある人はそちらも見てほしい。 -
ブロック要素を2つ作り、上のブロックをfloatの状態にして下のブロックを回り込ませる
利点
コンテンツが重なることがない欠点
IEでは包含ブロックの幅と段組みを行う2つのブロックの幅が等しいと回り込まない場合がある。
今回作ったサンプルも、IEで下ブロックが回り込まなかったため、幅をそれぞれ29%と70%に指定している。
作ってみてわかったけど、どちらかが正解という訳ではなくて、用途によって使い分ける必要があるだろう。
メニューなどのコンテンツのボリュームが見えているものは絶対指定を使った段組みにして、コンテンツエリアのなかでさらに段組みを行う場合はfloatを使った段組みをする、など。
IEがもう少しまともな表示をしてくれると楽なんだけどなぁ。
あと、互換モードは悪夢だ...。
VIP魔法瓶
日課として、大手のメーカーのサイトをいくつか眺めていたりするんだけど、やはり世界の松下は、視点というか商売に対する姿勢がひと味違いますね。
『VIP魔法びん』沸騰浄水ジャーポット NC-SUシリーズ を発売 | ニュース | 松下電器産業株式会社
VIPって…
Perlプログラマのレベル10
自分のレベルを測る目安となるレベル10のリストを提示している。自分はPerlのプログラマではないが、レベル2あたりにあたると思う。読んでいないけどリャマ本買ったし。
自分が今いる会社でwebアプリケーションの開発というと、開発言語はJava以外あり得ないような状況になっているが、言語で開発者を限定するのではなくて、開発者のスキルでどの言語を使うかを決めた方がまっとうなんだろうな。
Flash、DreamWeaverの最新バージョンが発表される
次のバージョン名はMX2005ではなくて8になる模様。
flash 8の主な新機能は、flash-jpで邦訳されていた人がいたので引用
ドロップシャドウ、ブラー、グロウ、ベベルなどのフィルターエフェクト* 乗算、スクリーン、オーバーレイなどのブレンドモード(合成手法)* パスによって細かく設定可能なイージングコントロール* きれいになった文字レンダリング-FlashType 描画を高速化するビットマップキャッシュ 高品質なビデオCODEC On2 VP6 ビデオにアルファチャンネルが使用可能* キューポイントの設定や高度な設定など強化されたビデオ機能* ActionScriptにノーマルモード復活 携帯端末向けのオーサリング強化* などなどとなっています。(*はpro版のみ)
ビデオにアルファチャンネルが使用できるということは、マシンパワーが許せばクロマキーのようなことをflash内部でできるということだろうか。
DreamWeaverの方は英語が読めないのでツアームービーの内容しか分からないが、
- ズームツールが搭載された
- CSSを使ったレイアウト作業がより作業しやすくなった
- タグエディタでアウトラインエディタのような折り畳み表示ができるようになった
- XMLを使ったコンテンツ(スニペット?)をドラッグ&ドロップで挿入できるようになった
っぽい。ズームツールは待ち望んでいた人も多いのではないだろうか。
ウィンドウにflashをフィットさせる
ウィンドウがあるサイズ以下の場合はウィンドウにフィットした状態で表示し、それ以上のサイズの場合は既定のサイズで表示するという、変な条件があった場合の対処方法。
DOMを使えばもう少しきれいに書けると思うが、MacのIEという微妙なブラウザでも表示できるように昔ながらの方法を使った。
<script type="text/javascript"><!--
function writeFlash(){
// ウィンドウサイズの取得
if (document.all && document.getElementById && (document.compatMode=='CSS1Compat')) {
// IE6 標準モード
scrY = document.documentElement.clientHeight;
}else if(document.all){
// IE6 互換モード
scrY = document.body.clientHeight;
}else{
// それ以外
scrY = innerHeight;
}// flashサイズの設定
var flashX = 本来のサイズ;
var flashY = 本来のサイズ;
if(scrY < flashY) {
flashX = Math.round(flashX*(scrY/flashY));
flashY = scrY;
}// タグの書き出し
document.write('<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0"
width="' + flashX + '" height="' + flashY + '" id="index" align="middle">');
document.write('<param name="allowScriptAccess" value="sameDomain" />');
document.write('<param name="quality" value="high" />');
document.write('<param name="scale" value="exactfit" />');
document.write('<param name="bgcolor" value="#ffffff" />');
document.write('<param name="movie" value="hoge.swf" />');
document.write('<embed src="hoge.swf" quality="high" scale="exactfit" bgcolor="#ffffff"
width="' + flashX + '" height="' + flashY + '" name="index" align="middle" allowScriptAccess="sameDomain"
type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"></embded>');
document.write('</object>');
}
-->
</script>
headタグに上のスクリプトを書いて、bodyタグの中に下のスクリプトを書いて呼び出す。
<script><!--
writeFlash();
--!></script>
onresizeを使ってウィンドウのリサイズ時に再度ウィンドウサイズを取得してリロードすればもう少しユーザーに優しいページなるかも。

