clearfixの決定版を作る -モダンブラウザ編-
floatに起因するレイアウトくずれの多くは、floatをしかるべき場所でクリアすることによって解決する。このことを発見して以来、もっぱら空ボックスにclearを指定するという方法()を多用してきたが、HTMLにある種の不純物が混じることに居心地の悪さはずっと感じていた(「floatを繰り返すとレイアウトがくずれる」参照)。この気持ち悪さを解消してくれるのが、clearfixというテクニックだ。
基本的な発想は上記の空ボックスによるクリアと同じだが、それをHTMLには一切手を加えず、スタイルシートだけで実現しているところに大きな特徴がある。しかし、ひとくちにclearfixといっても様々なバリエーションがあり、その記述のしかたは微妙に異なる。
例えば、clearfixの提唱者ではないかと類推されるPosition Is Everything版clearfixはこう。
.clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } .clearfix {display: inline-block;} /* Hides from IE-mac \*/ * html .clearfix {height: 1%;} .clearfix {display: block;} /* End hide from IE-mac */
一方、Movable Typeのデフォルトスタイルシートでもclearfixは採用されており、該当箇所だけ取り出すとこのようになっている(赤字はPosition Is Everything版clearfixと異なる部分)。
.pkg:after { content: " "; display: block; visibility: hidden; clear: both; height: 0.1px; font-size: 0.1em; line-height: 0; } * html .pkg { display: inline-block; } /* no ie mac \*/ * html .pkg { height: 1%; } .pkg { display: block; } /* */
もちろんclearfixはこの2種類だけではない。いったいどのclearfixがベストなのか。まずは対象ブラウザをいわゆるモダンブラウザ(Firefox、Opera、Safari)に絞り込んで、clearfixの決定版を探っていきたいと思う。
検証のため共通で用意したスタイルシートとHTMLは以下の通り。
【スタイルシート】 body { margin: 0; padding: 0; width: 208px; } #wrapper { border: 1px solid #000000; padding: 3px; background: #cccccc; } #box-A { width: 100px; height: 1000px; background: #000000; float: left; } #box-B { width: 100px; height: 50px; background: #666666; float: right; }
【HTML】
clearfixについては、:after擬似要素を用いた部分がモダンブラウザ用の記述なので、そのバリエーションを以下の10種類、用意した。
CASE 1 .clearfix:after { content: "."; display: block; height: 0; visibility: hidden; clear: both; }
CASE 1は、Position Is Everything版clearfix と同じ記述。:after擬似要素にcontentを指定して、ボックス内要素の末尾にピリオドを追加、さらにそれを高さ0、不可視のブロック要素とし、clearを適用させる。最も一般的なスタイルだけに特に問題はないように思えるが、clearfixを適用させたボックスの高さをブラウザいっぱいにした時、ボトムにマージンが生じてしまうという不具合がある(ボックスを縦に積み重ねた場合は、マージンは生じない)。
以下、このCASE 1の記述をベースに、Movable Type版clearfixの設定を取り入れていく形でバリエーションを展開させていく。
CASE 2 .clearfix:after { content: "."; font-size: 0; display: block; height: 0; visibility: hidden; clear: both; }
CASE 2は、font-sizeの指定を追加した場合。ただし、Movable Type版clearfixとは変えて、0.1emでなく0とした。
CASE 3 .clearfix:after { content: "."; font-size: 0.1em; display: block; height: 0; visibility: hidden; clear: both; }
CASE 3では、Movable Type版clearfixにならい、font-sizeを0.1emとした。
CASE 4 .clearfix:after { content: "."; line-height: 0; display: block; height: 0; visibility: hidden; clear: both; }
CASE 4は、font-sizeではなく、line-heightの指定を追加した場合。
CASE 5 .clearfix:after { content: "."; font-size: 0; line-height: 0; display: block; height: 0; visibility: hidden; clear: both; }
CASE 5は、font-sizeとline-heightの指定を併記。ただし、font-sizeは0とした。
CASE 6 .clearfix:after { content: "."; font-size: 0.1em; line-height: 0; display: block; height: 0; visibility: hidden; clear: both; }
CASE 6は、Movable Type版clearfixと同様のfont-size、line-height指定を併記した場合。
CASE 7 .clearfix:after { content: "."; font-size: 0.1em; line-height: 0; display: block; height: 0.1px; visibility: hidden; clear: both; }
CASE 7では、さらにMovable Type版clearfixに近づけ、heightを0.1pxとした。
CASE 8 .clearfix:after { content: " "; display: block; height: 0; visibility: hidden; clear: both; }
CASE 8は、再び記述をCASE 1に戻した上で、追加する要素をMovable Type版clearfixにならいピリオドでなくスペースとした。
CASE 9 .clearfix:after { content: ""; display: block; height: 0; visibility: hidden; clear: both; }
CASE 9は、スペースでなく、alt="" のように空にしてみた場合。
CASE 10 .clearfix:after { content: ""; display: block; clear: both; }
最後に、CASE 10では、空なら最初から高さもないし、不可視にする必要もないから、height、visibilityの指定を削除してみた。
以上、10通りのclearfixを、Firefox(バージョン2.0)、Opera(バージョン9.2)、Safari(バージョン1.0)、3種類のブラウザで検証した結果が以下の表である。○はマージンの発生なし、×はマージンの発生あり、△もマージンが発生するが×よりは小さい。さらに、△の数字は大きいほど生じるマージンは小さい、つまり○に近いということである。
Safari Firefox Opera
CASE 1 基本形 × × ×
CASE 2 基本形+font-size:0 × ○ △
CASE 3 基本形+font-size:0.1em △1 ○ △
CASE 4 基本形+line-height:0 △2 △ ○
CASE 5 基本形+font-size:0; line-height:0 △2 ○ ○
CASE 6 基本形+font-size:0.1em; line-height:0 △3 ○ ○
CASE 7 CASE 6 のheightを0.1pxに変更 △3 ○ ○
CASE 8 基本形のピリオドをスペースに変更 ○ ○ ○
CASE 9 基本形のピリオドを空に変更 ○ ○ ○
CASE 10 CASE 9 からheight、visibilityを削除 ○ ○ ○
Safariはバージョンが少々古いので、最新版では違う結果となるかもしれないが、ここから判断する限り、3ブラウザとも表示に不具合がないのは、CASE 8、CASE 9、CASE 10の3つ。中でも、記述のシンプルさ、論理性から、CASE 10がモダンブラウザ向けclearfixの決定版といえるのではないか。しかし、最初にclearfixを考えた人はなぜcontentをスペースや空でなくピリオドにしたんだろう。
【追記】
「clearfixを考えた人はなぜcontentをスペースや空でなくピリオドにしたんだろう」という問いについては、3ping.orgさんがおおよその解答を示してくれたが(トラックバック参照)、その後やっと問題のブラウザを特定できた。contentがスペースや空だとfloatをクリアできないのは、Netscapeだった。7.1で確認しているので、それより古いバージョンでも同様だろう。ただし、ここで検証したような親ボックスにborderまたはpaddingを設定したケースでは、floatがクリアされてしまうため見逃してしまったのだ(検証ページはこちら)。とはいえ、ピリオドにして、visibilityやらfont-sizeやらline-heightやら長々と記述するのは避けたい。そこで、少々反則かもしれないが、ピリオドの代わりに1×1ピクセルの透明GIFを用いたやり方を決定版としたいと思う。
CASE 11 .clearfix:after { content: url(pixel.gif); display: block; clear: both; height: 0; }
Safari Firefox Opera
CASE 11 CASE 10のcontentを透明GIFに、height: 0 追加 ○ ○ ○
(last modified: 09/12/2008)
TrackBack
このエントリーのトラックバックURL:
http://norisfactory.com/mt/mt-tb.cgi/38
» clearfixはちゃんと考えられてた from "3ping.org"
clearfixの記述は良く考えられていました。 [read more]
(tracked on 05/26/2007)
» 俗に言う clearfix と言われるコードのバリエーション色々 from "Lucky bag::blog"
構造に手を加えずに float を clear させるためのいわゆる clearfix には結構色々とバリエーションがあったりするんで、自分が知っているパ... [read more]
(tracked on 05/27/2007)
» links for 2007-05-30 from "Web*Lav"
20 WordPress Themes That Don't Disa... [read more]
(tracked on 05/30/2007)
» clearfixを考えみた .1 from "Unit3S.JP"
作成時によく使っている魔法の呪文の様に思われているclearfixを考えてみた。 clearfixは言わずも知れたPosition Is Everythi... [read more]
(tracked on 06/09/2007)
» clearfix をダイエットさせたいのですが from "Hato-Style"
長々と呪文のようなclearfixコード。いろいろ検証してコードのダイエットに挑戦しました。今回はその途中経過っす。 [read more]
(tracked on 06/16/2007)
» Clearfix from "おっちゃんのメモ帳"
ふらふらとCSSのテクニックを探っていたらClearfixという手法を発見したのでのしておきます。 Clearfixとは親要素の背景や枠が途中から出なくな... [read more]
(tracked on 07/21/2007)
» clearfixのバリエーション from "Lepracaun's factory"
CSSで2カラムレイアウトした際に生じるfloatに関する問題について。 親ボッ... [read more]
(tracked on 08/19/2007)
» links for 2007-08-21 from "hands in hands"
スタイルシートをめぐる冒険: clearfixの決定版を作る 〓モダン... [read more]
(tracked on 08/22/2007)
» clearfixでfloat解除 from "maiの中身(ruby on railsシステム開発)"
こんにちは。最近Rubyをあんまり触ってないmaiです。 あんまり触ってなくて、Rubyについてあまり語れるほどのことが無いので、今日はstyleshee... [read more]
(tracked on 05/02/2008)
» clearfix from "CSS Lecture"
Webサイトを作るうえでclearfixを知っておかないとけっこう困ったりすると... [read more]
(tracked on 05/27/2008)
» clearfixで下マージン(スペース)が発生してしまう from "TREND SPOTTING"
普段あまり意識せず使っていたclearfixで、適用したボックスの下にマージン(... [read more]
(tracked on 01/22/2009)
2009/06/11
clearfixの決定版を作る -モダンブラウザ編-
IE6で背景が出たり消えたりする件について
IE6で背景が出たり消えたりする件について
RSS
こんにちは。maiです。
cssでレイアウトを組んでいるとIE6とは日々戦いです。
今回は、スクロールしたりリロードしたりしたときに、
IE6だけ背景が表示されないことがあるという
めんどくさいバグ(通称いないいないばあバグというらしい)の対処法について。
このバグの原因は、該当する要素のhaslayoutがfalseになっていることのようです。
haslayoutとは平たく言うと、レイアウトに関する情報を持ってるか?ということで、IEがもっているプロパティです。
持っていればhaslayoutはtrue。持っていなければfalse。単純ですね。
なので、対処法としてはバグが起こっている要素のstyleにhaslayoutがtureになるプロパティ&値を書けばOKです。
haslayoutをtrueにするプロパティと値はいくつか組み合わせがありますが、
背景がでない…で困っているのなら一番無難なwidth又はheightの値を入れます。
ハックでIE6向けにwidth:1px;とか入れてもいいですが、
幅か高さを明示すればいいだけなので、
ハックを使わず素直にwidthかheightの値を入れることをお薦めします。
ちなみに私のケースだとbackgroundだけでしたが、borderでも同じ症状が出るみたいです。
backgroundやborderを使うときは面倒でもIE6のためにwidthを書いておいた方が幸せになれそうです。
この他にもIE6でレイアウトに問題が出たときはhaslayoutをtureにしてみるといいかもしれません。
★参考資料★
haslayoutをtrueにするプロパティと値って他にどんなのがあるのー?と気になる人もいると思うので、
参考までに載せておきます。
プロパティ 値
display inline-block
height any value
float left or right
position absolute
width any value
writing-mode tb-rl
zoom any value
2009/04/24
履歴が残っている!!
昔の名前で出ています
POSTED BY xpotechi on Sunday, January 14, 2007
Wikipedia(英語)の"Index.dat"エントリーから辿って知った話だが、IE(Internet Explorer)の「ツール→インターネットオプションからブラウズの痕跡を消せる」というのは一般的に知られている事実と異なるようだ(おっと、IE7ユーザーは知っている話かもしれない)。
ブラウズしたりタイプしたURLや送信したEメールアドレス・Windows Meida Playerで再生したURLなどは、期限が来るまで、index.datという簡略データベース(というか、か、ハッシュで管理される索引ファイル)にキャッシュとして格納される。この場所は以下の通り。
Windows 9x
* \WINDOWS\Cookies\
* \WINDOWS\History\
* \WINDOWS\Temporary Internet Files\
Windows XP
* \Documents and Settings\[アカウント名]\Cookies\
* \Documents and Settings\[アカウント名]\Local Settings\History\History.IE5\
* \Documents and Settings\[アカウント名]\Local Settings\History\History.IE5\MSHist[西暦年月日と連番]\
* \Documents and Settings\[アカウント名]\Local Internet Files\Content.IE5\
* ...その他、インストールしているソフト(OfficeやOutlook)による。
問題は「消す」という操作の意味。IE7については後で述べるとして、IE6までは「消す=無効化する」だけであって、イレーズするわけではない。さらに古くなったエントリは名前を変更され、見えないファイルとして残っている(Explorerで見ても、「今日」とか「1週間前」といった表示しか行われず、通常のファイルとしては見えない。隠しファイルを表示する設定でも同じ)。またExplorerがこのファイルを掴んでいるので、セーフモードで操作するなりしないとファイル自体を消すことはできない。
自分のPCにどんな履歴が残っているのかを知るためには、いくつかのツールが存在する。
* Index Dat Spy → 見るだけ
* Index.dat QV → 見るだけ
* Index.dat Suite → Basic/Full/No-Installの3種類があるが、BasicかNo-Installが推奨されている。見るだけでなく内容をクリアしたり、リブートを経て古いindex.datを消すこともできる
IEのツール→インタネットオプションからブラウズ履歴を消し、リブートした上で、Index Dat Spyを流してみる。まず、見えないindex.datがたくさん見つかった。IE6なのにIE5という名前がついているのは、Microsoft曰く、フォーマットが変わっていないからだそう。
indexdat1
中身を見てみると、うわっ、過去の履歴がモロ入ってるやんけー。
indexdat2
MicrosoftのWindows Networking Team blogでは、「digg記事とそのWikipediaエントリーがindex.datに関して少し混乱しているように見えるので...」と補足記事を書いてくれているが、「on vista」という記述と共にVistaの話が混じっていて判り難い。ただ、
Windows Core Networking : A bit about WinInet's Index.dat:
The way we use to delete entries in the index.dat file was pretty similar, the old URL data was marked free, but was still there, at least until it was overwritten by a new entry. In IE7 we now zero out the entry.
と、URLが残ること自体は書き手であるwndpteam氏も認めている。さらに、この記事のコメントに「(Wikipedia等の指摘を)ミスリードしている。クッキーは消えるのにURLは残る。僕らはプライバシーを問題にしているのだ」という意見があり、これについて、さらにQ&Aという形で補足記事が書かれている。
Windows Core Networking : A bit about WinInet’s Index.dat – Q&A:
1) Mike: The real problem behind index.dat is that whether or not the indexes inside are still relevant or not, it keeps named urls forever. …
In IE7 and Windows Vista, deleted entries are actually zeroed out instead of just marked free till overwritten. There shouldn't be any residual URL names lying around if the entry was deleted.
IE7とWindows Vistaではゼロパターンでイレースされるみたいだ。Windows Vistaと書かれているのは何か意味があるのかな?たぶんIE7 on Windows XPでもOKだと思うのだが...。もし、IE7の改良点に関して、「IE6でも消せたが、IE7では一括で消せるようになった→便利になった」と理解しているとしたら、それは間違った解釈ということだ。根本的に違う。
さて、履歴を完全に消す選択肢は4つあることになる。
1. IE7にバージョンアップする
2. インターネット上のツールを使う(前述のIndex.dat Suiteで消すことができるが、自己責任でと書かれている)
3. Safeモードで入って手動で該当のindex.datを消す(ファイルがロックされていない)
4. Firefoxなど他のブラウザを使う
で、僕は迷わず4なわけだが(笑)、昔はIEを使っていたこともあり、古い履歴を試しに消すために2を実行。でも、保証がないツールなのでお薦めはできません。3はDOS窓操作なのでエキスパート向きかな。当然ながら放置という選択肢もある。多少の気持ち悪さは残るけどね。
最後に、フォレンジックというか、企業向けに内部監査なんかする側に立つならば、IE7以降は某ツールなどでユーザーのPCを調べてもわからないので、プロキシーやAudit用の専用ルーター設置は必須になるということ。あと、「金融商品取引法(J-SOX)対応にIE7を」というマーケティングもあるね、
/> MS殿 ( ̄ー ̄)ニヤリッ

2009/04/21
DropboxPortable
約15MBのファイルの扱い
Webページのアップロードは、3分20秒。
Web⇒PC同期は、40秒
Webからのダウンロードは、40秒
ローカルな環境は、インストールディレクトリに別途作られる。IEのお気に入り、キャッシュ等は別になる。
Webページからのアップ時に「デスクトップ」フォルダが、上記環境に無いとエラーとなる。

2009/04/20
ブログエディタで「続きを読む」リンクからフルテキストを表示させる方法
ブログエディタでIntrotextとFulltextを分割する : Joomler!.net - Decided on Joomla!
Windows Live Writerの場合
intro_full01.jpg
上部の記事の分割ボタンを押せばその線を区切りにintrotextとfulltextが分かれます。
Zoundryの場合
intro_full02.jpgInsert extended entry marker.ボタンを押せば区切り線をひかれるのでその線を境にイントロテキストとフルテキストが分かれます。
日本製のBlogWriteならもっとわかりやすくなっていて「追記編集」というタブではじめからページがわかれています。
ScribeFireはちょっとわかりません。
分割できないブログエディタでも、記事中に特定のタグを入れることで分割することは可能だと思います。もちろん対応するコードを追加しなければなりませんが。

2008/09/27
2008/09/20
Windows を無人 setup するための設定 file "unattend.txt" で指定できる option のひとつに "ProfilesDir" というのがあります。これを指定して Windows を install することにより、初期状態での user profile の path が変更されます。
ただ、"unattend.txt" の場合 "Winnt32.exe" を引数つきで呼び出さなければならないため使い勝手がよいものではありません。なので今回は CD からの起動からでも使える "winnt.sif" を利用した方法を紹介します。
- "winnt.sif" の作成
下記内容の file を作成し、FD の root に "winnt.sif" という名前で保存する
;SetupMgrTag [Data] AutoPartition=0 MsDosInitiated="0" UnattendedInstall="Yes" [Unattended] UnattendMode=ProvideDefault OemPreinstall=No TargetPath=\WINDOWS [GuiUnattended] ProfilesDir="D:\Users"
上記の例では user profile の path を "D:\Users" にしています。 "setupmgr.exe" という GUI の tool で "unattend.txt" の雛形の作成や編集ができるんですが、"ProfilesDir" は指定できないため、最終的に file を直接編集してやる必要があります。 "winnt.sif" の書式については Windows XP CD の Support 配下にある "deploy.cab" 内の documents 参照
- Install 予定 HDD の初期化
Partition Utility とかを利用し、事前に partition を作成する。 上記の例では、"C", "D" 計2つの partition が必要になる。 作成されたばかりの partition には drive letter が存在しないので、複数の partition を作成した場合には、頭から "C", "D" と順番に勝手に drive letter が割り当てられることに注意。
- Windows の install
CD から Windows を起動し、 install する。 途中青い画面が表示される前に FD をすばやく挿入し、"winnt.sif" を読み込ませる。LED が点灯するので読み込まれたかはわかるでしょう。 OS をinstall する partition を一番上にある partition に設定 (ここで format したりしないこと) し、その後は通常通り install 作業を行えば完了です。
"ProgramFilesDir" を指定すれば同様に %PROGRAMFILES% の path を変更することもできます。
また、unattended setup を利用するため当然ですが、すべての install 作業を自動化することもできます。
Windows Vista では unattended setup の方法が変わっているため下記を参照してください。 Windows Vista での unattended installation