スタイルシートつきHTMLに、他のHTMLを埋め込むにはどうすれば良いのだろう
イッテミアのブログパーツをはてなダイアリーに貼り付けるためのユーザースクリプトを作ってみた - NAT’s Programming Champloo
先日作ったこのユーザースクリプト(グリースモンキー)なのだけど、はてなダイアリーのデザイン設定によっては、うまく表示されないことが分かった。
以前作った、ニコニコ動画を埋め込むためのユーザースクリプト*1でもそうだったのだが、スタイルシートが指定されたHTMLに、他のスタイルシートが指定されているHTMLの一部を埋め込もうとすると、埋め込む先のスタイルシートの影響で、埋め込むHTMLのレイアウトが崩れることがある。
今回も薄々ありそうだと感じていたが、あっさり発生してしまった。
とりあえず今回は、埋め込むHTMLの中の<h1>を<div>に置き換えて、埋め込む先のHTMLのスタイルシートの影響を受けにくくする暫定対策をした*2。しかしそれ以外の部分は、相変わらず埋め込む先のHTMLのスタイルシートに影響されてしまう。
スタイルシートが指定されたHTMLの中に、他のスタイルシートが指定されたHTMLを、元のレイアウトを崩さずに埋め込むには、どうしたら良いのだろうか。
スタイルシートが指定されたHTMLの中で、スタイルシートが指定されていない領域を作れれば、その中に、他のスタイルシートが指定されているHTMLを埋め込めば良い。その方法として
スタイルシートが指定されたHTMLの中で、スタイルシートが指定されていない領域を作るのが駄目なら、指定されたスタイルシートのプロパティ値を全て別の値で上書きするしかない。
というわけで前置きが長くなったが、スタイルシートのプロパティ値を全て別の値で置き換えるアプローチで、スタイルシートが指定されたHTMLの中に、他のスタイルシートが指定されているHTMLの一部を埋め込む方法を考えてみることにした。
この方法を考えるのはなかなか難しそうなので、この方法をユーザースクリプトに実装するまでの手順を先に考えた。だいたい、こんな感じだろう。
- 上書きするスタイルシートのプロパティの候補を決める
- 埋め込むHTMLのスタイルシートを考慮して、上書きするスタイルシートのプロパティ値を決める
- 埋め込むHTMLに 2.を反映したHTMLを作る
- 埋め込むHTMLから 3. のHTMLを作る手順を考える
- 4.の手順をユーザースクリプトで実装する
今日は、まず 1. を考えた。
単純に考えると、全てのスタイルシートのプロパティを上書きすれば良いのだが、それはあまりにも力技なので、もうちょっと効率良くやりたい。
そこで参考になりそうなのが、はてなダイアリーに埋め込めるGoogle Gadget。これは
Firefox + Firebugを使って、はてなダイアリーの本文に埋め込んだGoogle Gadget*3が動的に設定しているスタイルシートを見てみた。どんなスタイルシートが指定されても大丈夫なように、多くのプロパティでスタイルシートを上書きしていた。だいたい、こんなプロパティが上書きされていた。
- フォント系プロパティ
- font-family
- arial,sans-serif;
- font-style
- normal
- font-weight
- (上書きせず)
- font-size
- (classによって変わる) 9px または 12px
- font-variant
- normal
- font-family
- 色系プロパティ
- color
- classによって変わる
- background
- transparent none
- color
- テキスト系プロパティ
- word-spacing
- normal
- letter-spacing
- normal
- text-decoration
- link系要素ならunderline
- vertical-align
- middle
- text-transform
- none
- text-align
- (上書きせず)
- text-indent
- 0
- line-height
- (classによって変わる)normal または 1.0
- white-space
- normal
- word-spacing
- レイアウト系プロパティ
- margin
- 0
- padding
- 0
- padding-left
- 0
- padding-right
- 0
- border
- 0
- border-collapse
- collapse
- float
- none
- clear
- none
- width
- auto
- height
- auto
- top
- auto
- bottom
- auto
- margin
スタイルシート(CSS2.1)の全てのプロパティではないのだけど、結構あるなぁ。
ひとまずこれを参考に、上書きするプロパティ値を決めていくかな。