2012/12/30
CSSのクラスの値をJavaScriptで変更する方法
jQuery に有りそうで無いのでクラスに設定したスタイルを後からJavascript変更する方法をメモ。
厳密に言うとクラスのスタイルの言うものは存在しないのでセレクタのスタイルを変更している。つまり第一引数にクラス名を指定する時はドット(.)が必須なので注意。
間単に解説すると読み込まれたCSSはブラウザ依存で以下のプロパティに保存されている。
cssRules[ ] の型は CSSStyleRule で以下のプロパティを持つ。
セレクタ文字列の正規化の方法は不明だったので複雑なセレクタを変更する場合は自力で正規化をする必要があるかもしれない。(タグ名の大文字/小文字や空白の扱いの事)
IE8以前はルールの追加方法も異る。
あと @import とか対応が必要だけどあんまり使わないから必要になるまで放置かな(^^;
function Common(){this.initialize.apply(this, arguments)};使用例:
(function(Class){
/**
* ルールのキャッシュ
* @type CSSStyleRule
*/
var classCssRuleCache = {};
/**
* セレクタに一致するルールを取得。
* <li>検索は重いのキャッシュする。
* @param {string} selectror セレクタ文字列
* @returns {CSSStyleRule} ルール
*/
Class.getCssRule = function(selector) {
if (classCssRuleCache[selector]) return classCssRuleCache[selector];
var sheets = document.styleSheets;
for (var i=0; i<sheets.length; i++) {
var rules = sheets[i].cssRules;
if (rules == null) rules = sheets[i].rules; // ForIE
for (var j=0; j<rules.length; j++) {
if (selector == rules[j].selectorText) {
classCssRuleCache[selector] = rules[j];
return rules[j];
}
}
}
return null;
}
/**
* セレクタに一致するルールを取得。
* <li>当該セレクタのルールが存在しなければ作成する。
* @param {string} selectror セレクタ文字列
* @returns {CSSStyleRule} ルール
*/
Class.getCssRuleWithDefine = function(selector) {
var rule = Class.getCssRule(selector);
if (rule) return rule;
var sheet = document.styleSheets[0];
if (sheet.insertRule) {
sheet.insertRule(selector+"{}", sheet.cssRules.length);
} else {
sheet.addRule(selector,"dummy:dummy");//forIE
}
return Class.getCssRule(selector);
}
/**
* セレクタにルールを設定。
* <li>当該セレクタのルールが存在しなければ作成する。
* @param {string} selectror セレクタ文字列
* @param {object} スタイルのマッピング 例:{textAling: "center",…}
*/
Class.setCssRule = function(selector, style) {
var rule = Class.getCssRuleWithDefine(selector);
if (rule == null) return;
for (var k in style) rule.style[k] = style[k];
}
/**
* セレクタにルールを important 付きで設定。
* <li>当該セレクタのルールが存在しなければ作成する。
* @param {string} selectror セレクタ文字列
* @param {object} スタイルのマッピング 例:{textAling: "center",…}
*/
Class.setCssRuleImportant = function(selector, style) {
var rule = Class.getCssRuleWithDefine(selector);
if (rule == null) return;
for (var k in style) rule.style.setProperty(k, style[k], 'important');
}
})(Common);
Common.getCssRule(".MyClass", {textAlign:"center", color:"red"});だけ。setCssRuleImportant()を使えば !impotant 付きになる。
厳密に言うとクラスのスタイルの言うものは存在しないのでセレクタのスタイルを変更している。つまり第一引数にクラス名を指定する時はドット(.)が必須なので注意。
間単に解説すると読み込まれたCSSはブラウザ依存で以下のプロパティに保存されている。
ブラウザ | プロパティ名 |
---|---|
IE8以前 | document.styleSheets[ ].rules[ ] |
その他 | document.styleSheets[ ].cssRules[ ] |
cssRules[ ] の型は CSSStyleRule で以下のプロパティを持つ。
型 | プロパティ名 | 説明 |
---|---|---|
string | selectorText | セレクタ文字列 |
CSSStyleDeclaration | style | スタイルセット |
セレクタ文字列の正規化の方法は不明だったので複雑なセレクタを変更する場合は自力で正規化をする必要があるかもしれない。(タグ名の大文字/小文字や空白の扱いの事)
IE8以前はルールの追加方法も異る。
ブラウザ | プロパティ名 |
---|---|
IE8以前 | addRule(selector, style[, index]) |
その他 | insertRule(rule,index) |
あと @import とか対応が必要だけどあんまり使わないから必要になるまで放置かな(^^;
2012/11/18
CSSだけでボーダーレイアウトのテンプレ
CSSだけでヘッダー、フッター、サイドを固定するのは以外と難しい。
ググっても怪しいやり方しか出てこない。(まあ IE6 のせいなんだが) つう訳でCSSだけでクロスブラウザの真っ当な(IEハック無し) ボーダーレイアウトのテンプレを書いてみた。 (但し、IE7は後方互換モード) ボーダーレイアウト: ブラウザを小さくした所: ブラウザを小さくしてもヘッダー、フッター、サイドはそのままの大きさで中央部のみ可変サイズとなる。
スクロールバーは中央部にしか出ない。 他のブラウザで動作確認。 Firefox-ESR: Safari: IE6: IE7(後方互換モード): IE8: IE6,IE8は本物でも確認した。IE7はIE-Testerのみ。 実行サンプル
まあ、JavaScriptを使えば簡単だけどレイアウトの為だけに jQuery+Plugin を使わなくて済むのは良いじゃないかと。
Border layout frame
CSS: IEハック無しです (^^)v
html,body {
height:100%;
padding:0;
margin:0;
overflow: hidden;
}
.BorderLayoutFrame {
box-sizing: border-box;
-moz-box-sizing: border-box;
display: inline-block;
position: absolute;
overflow: hidden;
zoom:1;
background: white;
}
#borderLayoutHeader {
width: 100%;
height: 80px; /* Header height */
top: 0;
border-bottom: 1px solid gray;
}
#borderLayoutFooter {
width: 100%;
height: 30px; /* Footer height */
bottom: 0;
border-top: 1px solid gray;
}
#borderLayoutLeft {
width: 200px; /* Left width */
height: 100%;
top: 0;
left: 0;
padding-top: 80px; /* Header height */
padding-bottom: 30px; /* Footer height */
border-right: 1px solid gray;
}
#borderLayoutRight {
width: 200px; /* Right width */
height: 100%;
top: 0;
right: 0;
padding-top: 80px; /* Header height */
padding-bottom: 30px; /* Footer height */
border-left: 1px solid gray;
}
#borderLayoutMain {
width: 100%;
height: 100%;
top: 0;
left: 0;
padding-top: 80px; /* Header height */
padding-left: 200px; /* Left width */
padding-right: 200px; /* Right width */
padding-bottom: 30px; /* Footer height */
}
#borderLayoutMainInner {
height: 100%;
width: 100%;
overflow: auto;
position: relative;
}
/* EOF */
ググっても怪しいやり方しか出てこない。(まあ IE6 のせいなんだが) つう訳でCSSだけでクロスブラウザの真っ当な(IEハック無し) ボーダーレイアウトのテンプレを書いてみた。 (但し、IE7は後方互換モード) ボーダーレイアウト: ブラウザを小さくした所: ブラウザを小さくしてもヘッダー、フッター、サイドはそのままの大きさで中央部のみ可変サイズとなる。
スクロールバーは中央部にしか出ない。 他のブラウザで動作確認。 Firefox-ESR: Safari: IE6: IE7(後方互換モード): IE8: IE6,IE8は本物でも確認した。IE7はIE-Testerのみ。 実行サンプル
まあ、JavaScriptを使えば簡単だけどレイアウトの為だけに jQuery+Plugin を使わなくて済むのは良いじゃないかと。
ソース
HTML:
テスト テスト テスト テスト テスト テスト テスト
テスト テスト テスト テスト テスト テスト テスト
テスト テスト テスト テスト テスト テスト テスト
テスト テスト テスト テスト テスト テスト テスト
テスト テスト テスト テスト テスト テスト テスト
テスト テスト テスト テスト テスト テスト テスト
テスト テスト テスト テスト テスト テスト テスト
テスト テスト テスト テスト テスト テスト テスト
テスト テスト テスト テスト テスト テスト テスト
テスト テスト テスト テスト テスト テスト テスト
テスト テスト テスト テスト テスト テスト テスト
テスト テスト テスト テスト テスト テスト テスト
テスト テスト テスト テスト テスト テスト テスト
テスト テスト テスト テスト テスト テスト テスト
テスト テスト テスト テスト テスト テスト テスト
テスト テスト テスト テスト テスト テスト テスト
テスト テスト テスト テスト テスト テスト テスト
テスト テスト テスト テスト テスト テスト テスト
テスト テスト テスト テスト テスト テスト テスト
テスト テスト テスト テスト テスト テスト テスト
テスト テスト テスト テスト テスト テスト テスト
テスト テスト テスト テスト テスト テスト テスト
テスト テスト テスト テスト テスト テスト テスト
テスト テスト テスト テスト テスト テスト テスト
テスト テスト テスト テスト テスト テスト テスト
テスト テスト テスト テスト テスト テスト テスト
テスト テスト テスト テスト テスト テスト テスト
テスト テスト テスト テスト テスト テスト テスト
テスト テスト テスト テスト テスト テスト テスト
テスト テスト テスト テスト テスト テスト テスト
テスト テスト テスト テスト テスト テスト テスト
テスト テスト テスト テスト テスト テスト テスト
テスト テスト テスト テスト テスト テスト テスト
テスト テスト テスト テスト テスト テスト テスト
テスト テスト テスト テスト テスト テスト テスト
テスト テスト テスト テスト テスト テスト テスト
テスト テスト テスト テスト テスト テスト テスト
テスト テスト テスト テスト テスト テスト テスト
テスト テスト テスト テスト テスト テスト テスト
テスト テスト テスト テスト テスト テスト テスト
テスト テスト テスト テスト テスト テスト テスト
テスト テスト テスト テスト テスト テスト テスト
テスト テスト テスト テスト テスト テスト テスト
Left
Right
Header
2012/10/29
タグの間の空白対策
HTMLでタグを改行区切りで記述した時に入る空白の対策メモ。
こうした時の
この隙間の事。
元ネタ:http://inspire-tech.jp/2011/06/inline_block_spaces/
幅指定がフォント依存なので厳密なケースでは使えない。
$("#xxxx").contents().each(function(){
if (this.nodeType==3) this.parentNode.removeChild(this);
});
JavaScriptが使える場合のみ。
元ネタ:http://h2ham.seesaa.net/article/117579108.htmlimg {
display: table-cell;
}
ブラウザ依存。Chromeはアウト。IEもIE7以前は teble-cell 未対応のはず。
IE8:
Firefox:
Chrome:
いままで通りか、JavaScript でやるしか無さそう。
普通形
コードの汚さを我慢すればこれが一番楽。letter-spacing:-n;
CSSの letter-spacing をマイナスにして調整する。元ネタ:http://inspire-tech.jp/2011/06/inline_block_spaces/
JavaScript
JavaScriptでテキストノードを削除する。display:table-cell;
teble-cell で出来るとの情報が有ったので試してみる。元ネタ:http://h2ham.seesaa.net/article/117579108.html
結論
現状、CSSだけでうまいことやる方法は無さげ。いままで通りか、JavaScript でやるしか無さそう。
2011/10/31
CCS だけで吹き出し。
Google Map 用の吹き出しを作ったときに画像を使ったんだけど
CSS だけでも吹き出しが作れるみたい。
三角形の所はどうすんだろうと思ったら世の中には頭の良い人が
いるもんで太い border の片側を透明にする事で実現していた。
こーいうのをコロンブスの卵って言うんだろうな。
参考サイトはこの辺、他多数。
左右の吹き出しの例が多いんだけど汎用性を考えて真中も有りにした。
CSS3 を使って影やらグラデーションやらで装飾したので下手に画像を
用意するより見栄えが良くなってしまった。
ま、やっぱり IE7 じゃ動かないんだけどね :-P
ソース:
- http://terkel.jp/archives/2009/12/css-only-speech-bubbles/
左右の吹き出しの例が多いんだけど汎用性を考えて真中も有りにした。
吹き出し
データだよーん
データだよーん
大きさは内部データのサイズに追従する。 髭の部分も任意に伸ばせる。
吹き出し
データ
だよーん だよーん だよーん だよーん
データ
だよーん だよーん だよーん だよーん
ちょっといじると三角形を片側にして左右吹き出しにもできる。
左から吹き出し
右から吹き出し
吹き出し
データだよーん
データだよーん
吹き出し
データ
だよーん だよーん だよーん だよーん
データ
だよーん だよーん だよーん だよーん
左から吹き出し
右から吹き出し