2006年10月アーカイブ

仕事で z-index プロパティを使う機会があったんですが、なんだか上手くいかなかった。いろいろ試行錯誤してようやく思い通りの動きをしてくれたので、ここに z-index プロパティの仕様を含めたまとめを書いてみる。

まずは z-index プロパティの仕様から。引用するのが面倒なので仕様書をそのまま見てください。

簡単に仕様をまとめると、

  • position プロパティで [fixed] [absolute] [relative] のいずれかの値を持つ要素(つまり [static] 以外の値)にのみ適用される
  • z-index プロパティの [auto] はボックスの重なり順が親要素と同じになる
  • [整数] は値が大きいほど値が小さいボックスよりも前面になり、小さいほど大きい値よりも背面に配置される
  • [整数] はマイナスの値も指定できる

以上のようになる。
これを踏まえたうえで以下のサンプルを作成してみる。

HTML ソース

<div id="zindex2">
z-index の値が 2<br />
要素の順番は 1
</div>

<div id="zindex1">
z-index の値が 1<br />
要素の順番は 2
</div>

<div id="zindex0">
z-index の値が 0<br />
要素の順番は 3
</div>

CSS ソース

div#zindex0 {
position: absolute;
top: 50px;
left: 180px;
z-index: 0;
width: 200px;
height: 200px;
background: yellow;
}

div#zindex1 {
position: absolute;
top: 80px;
left: 210px;
z-index: 1;
width: 200px;
height: 200px;
background: pink;
}

div#zindex2 {
position: absolute;
top: 110px;
left: 240px;
z-index: 2;
width: 200px;
height: 200px;
background: lime;
}

想定できる結果です。z-index プロパティの値が大きくなるほど前面に配置される。仕様通りの結果です。
では次にこうしたらどうなるだろうか。

HTML ソース

<div id="zindex2">
z-index の値が 2<br />
要素の順番は 1

<div id="zindex1">
z-index の値が 1<br />
要素の順番は 2

<div id="zindex0">
z-index の値が 0<br />
要素の順番は 3

</div>

</div>

</div>

つまり各要素を入れ子にしてしまう場合。そうすると先ほどとは表示結果が違うことが分かる。これは単純な話で、position プロパティが [absolute] の時、基点がサンプル 1 とサンプル 2 では違うからだ。

position CSS辞典 - position - 要素の配置方式を指定する

absolute
包含ブロック(祖先要素のうち、もっとも近い祖先の要素にあたるブロック要素の内容領域)の各辺を基準に配置され、"top, bottom, left, right" の各プロパティで指定する絶対的な位置指定となる(祖先要素に位置指定されている要素がなければ、初期包含ブロックを基準とする)。

"absolute" の説明を補足しておくと、たとえば、一番最初の包含ブロックである初期包含ブロックは、html要素の各辺が基準になるので、スクロール分も含めてページ全体が基準になります。つまり、topプロパティ・leftプロパティはページの左上が原点に、bottomプロパティ・rightプロパティはページの右下が原点となります。html要素に対して、widthプロパティ, heightプロパティを指定することで、初期包含ブロックの横幅・高さを指定することもできます。

上記の通り、id="zindex2" は最上位の基準となる先祖要素が無いため、初期包含ブロック(html 要素)を基準に配置されている。
id="zindex1" は id="zindex2" に包含されているため、id="zindex2" を基準として配置し、同様に id="zindex0" は id="zindex1" を基準に配置されている。

しかし問題はここではない。id="zindex1" と id="zindex0" が重なり合っている点が重要である。
通常であれば id="zindex0" の上に id="zindex1" が重なるはずだが、実際は逆に id="zindex1" の上に id="zindex0" が重なっている。

要素を入れ子にしたら z-index プロパティの挙動がおかしくなったと考えられる。しかしこれは恐らく仕様通りの結果のはずです。
z-index プロパティの仕様は以下のようになっています。

'z-index'
値:  auto | <integer> | inherit
初期値:   auto
適用対象:   位置決め要素
継承:   しない
パーセント値:   N/A
メディア:  視覚メディア

仕様では z-index プロパティは継承されません。ですので、子孫要素が新たな z-index プロパティを指定しても、それが親要素を継承していないため、例え値が 0 であったとしても親要素の背面に配置されることはないのです。
つまりここでは、id="zindex1" の値が 10 であったとしても、子要素の id="zindex0" からすると値は id="zindex1" は 0 に見えるのです。

なので、対応策としては id="zindex0" の値をマイナス値にしてしまえば解決します。

div#zindex0 {
position: absolute;
top: 50px;
left: 180px;
z-index: -1;
width: 200px;
height: 200px;
background: yellow;
}

しかし何故か IE6 と Opera9 ではダメなんですが・・・仕事でやった時は上手くいったんですけどね。ちょっと事情が違うみたいなので、今度また再検証してみます。

以下独り言(何
なんとなく position プロパティが怪しい感じ。仕事でやった時は[absolute] と [relative] の組み合わせだったから、なんかその辺が絡んでるのかも。
と思って試してみたが、やっぱ違うっぽい。そもそもの考え方が違うのかなぁ。ほぼ同じような構成で再度検証してみるしかないかも。

ほぼ 1 年ぶり(最後に参加したのが Vol5 だった気がする)に CSS Nite に参加してきました。初期のころはすごい人出で立ち見でもスライドが見えないほどだったんですが、今回は立ち見はあったけどそれほど多いとは感じなかったかな。

今回のゲストは Mozilla Japan の金井さん&中野さんで、近々リリースされる Firefox2 の Web 製作者向けに絞った追加変更の具体的内容の紹介。そして Firefox3 の進捗報告&予定される実装機能の紹介でした。

すでに今回の資料が公開されていますが、簡単に Firefox2 の変更点を挙げてみる。

  • Gecko が 1.8.1 にマイナーバージョンアップ
    • 具体的な仕様変更は触れられませんでしたが、レンダリングの結果に関してはこれまでの Firefox1.5.x とはほとんど変わらないようです。
  • JavaScipt が 1.7 にメジャーバージョンアップ
    • 逆にこっちは大幅な変更らしいです。
      エンジンに関する修正は 200 件以上、DOM 周辺でさえ 60 件以上も修正されています。
  • SSL2.0 は無効。SSL3.0 & TLS1.0 も条件付で一部無効
    • SSL3.0 と TLS1.0 が無効になる条件はもじら組wiki にて一覧が載っています。
  • RSS フィードを Firefox が整形する「フィードビューア」を搭載
    • XSLT でユーザが整形した RSS は表示されない(フィードビューアが最優先になる)
  • MozSearch(OpenSearch ?) の追加
    • ユーザが記述した XML ファイルを HTML 文書から link 要素で読み込み、検索ボックスに反映させる。
      詳細は mozilla developer center参考文書があるのでそちらを参照してください。
      これは少し試してみたいので、後ほど double-team.org に追加する・・・予定。
  • ライブタイトルの追加
    • 中身は簡易 RSS みたいな感じ。詳細は同じく mozilla developer center に参考文書があるのでそちらを見てください。
      多分これは double-team.org には導入しないと思う。申し訳ないですが。

今回は Firefox3 も少し触れましたが、まだ現段階では具体的にどうなるかは見えていません。特にフロントエンド側の処理で Acid2 tset をパスできるのかどうかが個人的に見守りたいところです。
そうでなくても、もうすでに RGBA に対応してるので、いろいろ面白いことになってるみたいですが。

この回の質疑応答は珍しく盛り上がりました。個人的に「Thunderbird2 ってどうなってるの?」と伺ったところ、「これまで Firefox とリリースを同期してたが、その辺は大人の事情」みたいな回答を得ました。多分 IE7 のリリースの問題とブラウザシェアの獲得とか色々あるんでしょうけど。それも分かりますが Thunderbird も忘れないでくださいね(何

アフターパーティーでは偶然出くわしたもじら組 の某 K 氏と久々にお会いし、ついでに席も隣だったので気になっていた SVG 周りのお話を伺いました。ごにょごにょと Firefox3 ではこんな感じー、ってのが聞けたのは収穫。

と言うかえむもじらさん経由で知ったんですが、Taken SPC のエントリを見て、

MozSearch

アフタパーティでは WaSP Cafe や CSS Nite で既に面識がある方、また、初めてお会いする方ともお話ができました。 「SVG って Firefox 1.5 以来音沙汰無しなんじゃありません?」 等と突っ込まれてしまいました。

これって私ですよね?
SVG に関しては以前の記事と上記の通り、現行の Firefox1.5 がリリースされてから全然耳に入ってこなかったんですが、まあただ単に自分がアンテナ張ってなかっただけと言うのもありますが。

現在使用している RSS リーダは Livedoor Reader で、キーボードショートカットキーがあったりフィードの管理が楽なのでずっと使い続けているんですが、1つだけこれだと自分の欲望を満たせずにいます。

取得した記事を全文検索したい。

Web 型 RSS リーダの問題点は記事の保持ができないことです。 Gmail のように一人当たり数 GB も割り当てられてますが、 RSS リーダはそうもいかないのです。
理由は省略しますが、とにかく今は上記の通り全文検索がしたいのです。いくらはてなブックマークも使っているとは言え、ブックマークされなかった記事はそのまま闇に葬り去られるので、それを何とか後日ピックアップすることは出来ないかと思っているのです。
まあもっと欲を言えばブックマークした記事さえも検索できたらいいなぁ、とは思いますが。

ちなみに「それ Plagger (以下略)」はナシです。 Plagger なんて知りません。 Perl も PHP も スクリプト言語さえ扱えない自分が plagger なんて今の時点で出来るわけないので。

と言うわけで整理します。

  • RSS で取得した記事を対象に検索をしたい。
  • Web サービス型・ローカルインストール型は問わない。
  • RSS フィードで吐き出してるのが記事の見出しと要約のみであったとしても、全文取得してくる(多分これこそ Plagger じゃないとダメかもしれない)
  • Livedoor Reader とほぼ同様のキーボードショットカットキーがあると嬉しい(カスタマイズできると尚可)

まあこんなのが世の中にあるとは思いませんが。あったらいいなぁ、と言うレベルです。ただ最低限でも全文検索はしたいです。
やっぱ難しいかなぁ。

とあるWeb技術関連セミナの交流会に参加した人から聞いた話。

Web クリエイタばかり集まったので、マークアップの話題になり、「フル CSS でマークアップできます」といったら、「自慢テラワロスw」と言われたりして不穏な空気に。そして「嘘でもテーブルレイアウトって言うもんでしょ!」とたしなめられたという。

そのセミナはフロントデザイナが中心でマークアップのリテラシーが低いそうなので(ホームページビルダーユーザ中心)、そのためだと思うが、それにしても「嘘でもテーブルレイアウトって言うもんでしょ!」はオモシロ過ぎる。

元ネタ

このブログも当然のように CSS で完全レイアウトされてるわけですが、やはり問題は外部 CSS ファイルの管理方法。管理もそうだけど、そもそもの設計方法が重要ってお話。

早水悠登氏のエントリを見て、「あー、気持ちは分かるなぁ。これって設計上の問題でも発生するんだよなぁ」とうにょうにょ思ってたんですが、じゃあ実際にどーすりゃいいのよ、ってなるとこれがまた難しい。

とりあえずこの double-team.org の CSS を例に出してみます。
まずは外部 CSS ファイルの構成から。

  • import.css(以下の CSS ファイルを読み込むための CSS ファイル)
    • elements.css(各要素を再定義&リセット用 CSS ファイル)
    • layout.css(大枠のレイアウトを定義した CSS ファイル)
    • header.css(ヘッダ部分の CSS ファイル)
    • footer.css(フッタ部分の CSS ファイル)
    • navigation.css(ナビゲーション部分の CSS ファイル)
    • contents.css(MT とは関連のないコンテンツ用の CSS ファイル)
    • entry.css(エントリ内に対する CSS ファイル)
    • entry_menu.css(エントリの日付、タイトル、タグ等の装飾用 CSS ファイル)
    • search.css( input 型とタグ型検索用 CSS ファイル)
    • sidebar.css(右側にあるボックス用 CSS ファイル)

他にも Windows 版 IE6 用の CSS ファイルがあったりしますが、そこは割愛。とりあえずこんな感じです。
こう見ると分かると思いますが、モジュールのような考え方でヘッダはこれ、エントリはこれと言った感じで、全てファイルを分けています。この考え方は昔からありましたが、最近のライフハック的な流れから定着してきました。7月にあったWeb標準の日長谷川 恭久さんロクナナの中村 享介さんと河内 正紀さんが各セッションでこれについてお話をされてました。(各セッションの内容は 「Web標準の日」のサイトにて公開されています。

関係ないですが、CSS の記述順はかなり適当です。 hail2u.net さんや 2xup.org さんのように、何かしらの規則性がある書き方は今のところなってないです。なんとなく外枠( display プロパティやボックスモデル関連)を先に記述するようには努めていますが、フォントやテキストまで下がると結構曖昧だったりします。

話を戻します。こうやってレイアウトの構造によって CSS ファイルを分けているわけですが、完全にスマートで綺麗と思われる内容には仕上がりません。(自分の場合はですが ← 言い訳)
それはなぜか。これだけ CSS ファイルを分散化しても、各 CSS ファイルにおいて共通項が存在してしまうことです。

よく分からないですね。もっと具体例を出します。
例えば各エントリのタイトル部分(本エントリでは「CSS の管理ってどうしたらいい?(主に設計に関して)」がこれに該当)は XHTML 上では h2 要素でマークアップされています。これのスタイルが記述されている CSS ファイルは entry_menu.css です。
今度は About ページの部分を見てみます。ここのタイトルは h3 要素でマークアップされています。ですが、文字サイズや色は同じです。ですがこのページはエントリされたものではありません。ただの静的 HTML 文書です。なので、この部分のスタイルは contents.css ファイルに記述されます。

しかしこれだと同一内容のスタイルが entry_menu.css と contents.css に記述されることになります。これでは意味がありません。例えばこのブログをリデザインをしようとした時、 h2 要素のスタイルを変更したとしても h3 要素のスタイルが変わらなくなってしまいます。これは非常にありえることです。サイトを設計した私でさえ見落とす可能性があるでしょう。

もちろんこうした共通部分はセレクタの複数指定で回避できます。しかしどちらか一方の CSS ファイルに記述しなければならないのですが、それがどちらに書くかが問題です。
これを解消するために別の CSS ファイル(例えば heading.css )を作成してそこに記述するのもアリですが、そうすると今度はそれに応じて他の部分も分割・統合しなければならなくなり、 CSS ファイルが肥大化していきます。もちろん細分化していけば保守管理が楽になると言う人もいるでしょうが、一般的に言えば 10 も 20 も CSS ファイルが作られていくと保守管理に支障をきたすはずです。

組織的に運営していく過程では、これはもう何かしらのガイドラインを設けれなければならないです。個人であれば自分の主義主張を通すので良いかと思いますが、やはり製作者として何かしら一般共通認識がなければならないと思います。
どうしたら正しいのかは今のところ私にも分かりません。ですが、ある一定の基準を設けなければただのカオスでしかないので、自身で独り善がりにならない程度のポリシーを持つべきなのかと思います(抽象的ですが)。

5日間の帰省も終わり、仕事に明け暮れてる毎日です。

帰省中はここに書く書く言っておきながら一切書いてなかったのはネットに繋げなかったからです。さすが田舎です。大分です。
一応親戚の家にはネットが繋がってて、無線 LAN でやってるんですが・・・これがまた恐ろしいことにセキュリティ関係が何もなされていない。パスワード制限さえもかかっていなかったです。東京じゃ考えられないですよ。
まああんな”ド”が付く田舎で盗電する輩がいるとは思いませんが。家の周りにも住宅はあるんですが、無線 LAN を使ってるのは親戚の家だけだったみたいですし。(誰かが無線 LAN 搭載してるノート PC を持っていたら終わりですが)

お土産もいろいろ買ってきました。某社長には焼酎を。たろさんには地獄ラーメンを買ってきました。喜んでくれたみたいで良かったです。
(実際のところ、地獄ラーメンって食べたことないので旨いか不味いか知らなかったりしますが)

写真とかはいつかまた今度の機会にでもあげます。そんな大して撮ってないのを今さらながら後悔してたりします。

8日から大阪・神戸・福岡・大分へ5日間かけて行ってきます。大分の実家に帰るだけなんですが、今年は夏休みが取れなかったので、今さら夏休みと言う名目の休みです。

と言うか実際にはこんな5日間も行ってる余裕が時間的にも仕事的にもどこにも無かったりしますが、そこをあえて行ってくるのはもうすでに1ヶ月前から飛行機のチケットを取っていたためです。キャンセルするとキャンセル料が発生するので、そんなんだったら無理にでも行ってこようかと。
ついでに色々と各地に散らばった友人・知人と久々に会ってくる予定です。5日の間で実家にいる期間は恐らく1日や2日とかだと思いますが・・・。

一応今回のために Flickr に登録してこのブログにいろいろと写真を上げていこうかと思ってます。旅先でテンプレートいじったりしてるかもしれません。あと異様にエントリー数が多くなるかもしれません。(基本は mixi の方でやるつもりですが、こっちでもやります。)

そしてまだ何も準備をしてない。明日1日でがんばります。

このアーカイブについて

このページには、2006年10月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2006年9月です。

次のアーカイブは2006年11月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。