サンプルページ(Opera専用、別ウインドウで開く)
OperaはstyleSheetsオブジェクト等、スタイルシートを直接弄れるプロパティが存在しないので、グローバルなスタイルを変更するのは、既存のcssファイルを追加する以外は不可能だった(ハズ)。
そこで、動的に変更したいスタイルをデータスキームに変換してcssファイルとして追加することで、動的にスタイルを変更させてみた。
欠点は現在の値を読み取れないこと。別途適当なオブジェクトを作成して、追加する度にそのオブジェクトにも反映させるなどして、自分で見るしかない。また、追加しまくるとどんどんメモリを食うと思うので、適当なところで一旦削除する必要があると思われる。
Opera9見てると、そのうちdocument.styleSheetsが追加されそうな雰囲気だが、まあそれまでの一時しのぎってことで。
Info
- 投稿日
- 2006年4月18日
- タグ
- css、opera
- このエントリの固定リンク
- http://bmky.net/diary/log/1368.html
- ブックマークに追加する
-
- コメント
2006
0418
Tagscssopera
このエントリは、JavaScriptによるCSSの操作として新たに書き直しました。
-
俺の探し方が悪いんだろうが、JavaScriptでCSSを弄るリファレンスが中々見当たらなかったので、メモも兼ねて書く。
結構適当に書いてる部分もあるので鵜呑みにしないように。あと、Operaは知らね。
スタイルシートのルールを弄る
div内の全要素をgetElementsByTagNameで拾ってforで回してstyleに・・・ってなことをやるよりも、スタイルシート側から操作できるようになれば楽になる。
function addRule( selector, property ) {
if( document.styleSheets[0].addRule ) //IE
document.styleSheets[0].addRule( selector, "{" + property + "}" );
else if( document.styleSheets[0].insertRule ) //Mozilla
document.styleSheets[0].insertRule( selector + "{" + property + "}", document.styleSheets[0].cssRules.length );
else
return false;
}
addRule及びinsertRuleはルールの先頭に追加していく。ルールは基本的に対象が同じなら後から指定したものが有効になるので、どんどん追加していって構わない。
addRule( "div ul.hoge", "display : none" );
これでdiv以下のhogeクラスが指定されてるリスト要素にdisplay:noneを適用して表示しないようにすることができる。
addRule( "div ul.hoge", "display : block" );
あとから追加したものが有効になるので、こうすれば元に戻る。
スタイルシートのルールを取得する
設定できたなら、取得したい時もある。
function getStyleValue( selector, property ) {
property = ( property.match( /-/ ) ) ? property.camelize( ) : property;
var stylesheets = document.styleSheets[0].rules //IE
|| document.styleSheets[0].cssRules; //Mozilla
for( var i = 0, len = stylesheets.length; i < len; i++ ) {
var css = stylesheets[i];
if( css.selectorText.toLowerCase( ) == selector.toLowerCase( ) )
return css.style[ property ];
}
}
こうすることで、現在適用されているルールの値を直接取得することができる。
IEの場合、直接指定されたもののみ取得できるが、Mozillaの場合は、指定していないものはデフォルトの値が入って返ってくる
getStyleValue( "div.hoge", "background" )
IE : #668
Mozilla : rgb(136, 102, 102) none repeat scroll 0% 0%
MozillaはRGBの値が自動的に変換されるのにも気を付ける。
camelizeはハイフン+小文字アルファベットを大文字アルファベットに直す関数。deCamelizeはその逆。
String.prototype.camelize = function( ) {
return this.replace( /-([a-z])/g,
function( $0, $1 ) { return $1.toUpperCase( ) } );
}
String.prototype.deCamelize = function( ) {
return this.replace( /[A-Z]/g,
function( $0 ) { return "-" + $0.toLowerCase( ) } );
}
こげな感じに宣言しておく。
どうでもいいが、camelizeの逆の動作はdeCamelizeでいいんだろうか? 英語っつーかそこらへんの命名規則に全然詳しくないからわからん。
スタイルシートを無効にする
document.styleSheets[0].disabled = true
これだけ。インライン指定したものは有効なままなので注意。
要素に適用されているスタイルを取得する
div#hoge { margin-top : 10px }
このようにスタイルシートに記述して、該当要素を取得してstyle.marginTopの値を見ても中身は空である。インラインレベル、つまり今現在適用されているスタイルを取得したい場合は以下のようにする。
function getActiveStyle( element, property, pseudo ) {
if( element.currentStyle ) { //IE
property = ( property.match( /-/ ) ) ? property.camelize( ) : property;
return element.currentStyle[ property.camelize( ) ];
}
else if( document.defaultView.getComputedStyle ) { //Mozilla
property = ( property.match( /-/ ) == null ) ? property.deCamelize( ) : property;
return document.defaultView.getComputedStyle( element, pseudo ).getPropertyValue( property );
}
return "";
}
getActiveStyle( $( "hoge" ), "marginTop" );
getActiveStyle( $( "hoge" ), "margin-top" );
getActiveStyle( $( "hoge" ), "margin-top", ":first-line" );
こんな感じで使う。
getComputedStyleについて
getComputedStyleの第二引数は擬似要素・セレクタを取得したいときに使う。:first-lineとか:visitedとか。
IEの場合は擬似要素・セレクタの取得が不可能っぽい。currentStyle周辺を掘ってみてもそれっぽいものは見当たらなかった。
getPropertyValueについて
div { margin : 20px }
と指定してgetPropertyValueからmarginで取得しても空の文字列が返ってくる。どうやら一括指定のプロパティは指定できないようになっているらしい。
margin :
marginTop : 20px
marginRight : 20px
marginBottom : 20px
marginLeft : 20px
この場合だとこのようになってしまっているので、1方向ずつ取得しなければならない。IEのcurrentStyleならmargin指定でも問題なし。
続く
Info
- 投稿日
- 2006年3月14日
- タグ
- css、javascript
- このエントリの固定リンク
- http://bmky.net/diary/log/1342.html
- ブックマークに追加する
-
- コメント
2006
0314
Tagscssjavascript
丸角を作って1ドットの枠線だけじゃ物足りないということで改良した。
Nifty++ サンプル
- 片方だけ丸くすることが可能に。
- 枠の太さを調節可能に。ブラウザが持つ限りどこまでも。
- グラデーションを付けられるようにした。
- 内部の要素に同じ背景色と枠線を付加させたりとか
サンプルページ下部の橙色のところにマウス乗せてホイール回せば枠線が増える。キモいぐらいに。
グラデも搭載。思いっきり手抜きな実装してるにもかかわらずそれなりに見える。
あとは一々枠線や背景色設置するの激しくめどー、なのでそれなりに一括で付けられるように。
で、作ってて思ったんだが、JavaScriptでスタイル再設定とかするのは正直よろしくねーなー、と。
基本的にDOMを扱うので実際に動くのはページの読み込みが完了した後。つまり、一瞬でも設定されてない状態が表示されてから設定されることが多発するわけで、その瞬間がどーしても嫌だなーとか思うわけですよ。
まあ、内部的にはそこまでメンドイことしてないんで直接CSSに書き込んだりしてもいいとは思うが・・・それはそれでローカルソースに内容に関係ない要素一杯とかでなんかムカつくのぅ。
となると・・・やっぱりPHPあたりで生成するのが一番なのかもしれんなーとか思ったり。もしくはCSS3が標準装備されて背景画像が複数設定可能になればみんな幸せになれるんだが、一体何年後になるんだ?
Info
- 投稿日
- 2006年1月20日
- タグ
- css、javascript
- このエントリの固定リンク
- http://bmky.net/diary/log/1299.html
- ブックマークに追加する
-
- コメント
2006
0120
Tagscssjavascript
Nifty Cornersを見た後、これ利用すれば枠付きもいけるんでね? というわけで作ってみた。
サンプル
中のpaddingとかmarginとかに左右されるんで、スクリプト設置してすぐに丸角ってわけにはいかないのね。
そこらへんを解消しようと思ったが、スクリプトでさらにスタイル設定したり消したりする必要があるんで、なんか面倒になったんでやめた。がんばれば枠の太さも設定できそうだがさらにめどい。
そこまでする必要がこの枠付き丸角にあるんかね? と思ったが、CSS2だか3の丸角が結構汚いんで作る価値はあるかもしれん。
そういや作ってる時に思ったんだが、丸角になると1ドットにこだわりたくなるのは何故なんだろう? いや、美しい曲線を描くには1ドットのズレも許されないわけなんだが、ちょいと色変えてグラデかませばいいじゃんとか思いつつも単色で曲線。むぅ・・・
Info
- 投稿日
- 2006年1月17日
- タグ
- css、javascript
- このエントリの固定リンク
- http://bmky.net/diary/log/1297.html
- ブックマークに追加する
-
- コメント
2006
0117
Tagscssjavascript
- 柱リンク+Amazon広告大量なサイドバーを表示して、しばらくたってからようやくコンテンツが表示される
- 文字サイズを大きくしただけでコンテンツが遙か下方に飛ばされる
- 飛ばされるならまだしも、左サイドバーが文字サイズに合わせて膨らんで右コンテンツが覆われる
このようなページに最近やたらと遭遇する。あとは段組関係ないけどline-height指定がおかしくて行が重なってるとか。
こーゆーのを見ると、中途半端な組み方されるよかテーブルレイアウトでガチガチなほうがいいなぁと心から思った。
あと、スタイルシート無効機能、最高。正直これが無いと殺人レイアウト(font-size:9pxとか)相手に生き抜くことができんと実感した。や、Firefox使えば解決するけどね。崩れるページに遭遇する確率もアップするが。
Info
- 投稿日
- 2006年1月8日
- タグ
- css
- このエントリの固定リンク
- http://bmky.net/diary/log/1287.html
- ブックマークに追加する
-
- コメント
2006
0108
Tagscss