JavaScriptから擬似クラスセレクター(:link、:hoverなど)のCSSルールを変更する方法を探しています。
CSSコードの類似物:a:hover { color: red }
JSで。
私は他のどこにも答えを見つけることができませんでした。これがブラウザでサポートされていないことを誰かが知っている場合、それも有益な結果になります。
インラインstyle = "..."属性で擬似クラスを使用できないのと同じように、セレクターがないため、特定の要素だけで擬似クラスをスタイルすることはできません。
スタイルルールを追加するなどして、スタイルシートを変更することでそれを行うことができます。
#elid:hover { background: red; }
影響を与える各要素に一意のIDがあり、選択できるようになっていると仮定します。
理論的には、必要なドキュメントは http://www.w3.org/TR/DOM-Level-2-Style/Overview.html です。つまり、既存の埋め込みまたはリンクを指定できますスタイルシート)のような構文を使用:
document.styleSheets[0].insertRule('#elid:hover { background-color: red; }', 0);
document.styleSheets[0].cssRules[0].style.backgroundColor= 'red';
IEはもちろん独自の構文を必要とします:
document.styleSheets[0].addRule('#elid:hover', 'background-color: red', 0);
document.styleSheets[0].rules[0].style.backgroundColor= 'red';
古いブラウザとマイナーなブラウザは、どちらの構文もサポートしない可能性があります。動的なスタイルシートをいじるのはめったに行われません。というのは、正しいことはめったになく、ほとんど必要なく、歴史的に面倒だからです。
私はJSでスタイルシートを操作するための有効なユースケースがあると思うので、 このための小さなライブラリ をまとめました。理由:
クロスブラウザのものに対処する関数:
addCssRule = function(/* string */ selector, /* string */ rule) {
if (document.styleSheets) {
if (!document.styleSheets.length) {
var head = document.getElementsByTagName('head')[0];
head.appendChild(bc.createEl('style'));
}
var i = document.styleSheets.length-1;
var ss = document.styleSheets[i];
var l=0;
if (ss.cssRules) {
l = ss.cssRules.length;
} else if (ss.rules) {
// IE
l = ss.rules.length;
}
if (ss.insertRule) {
ss.insertRule(selector + ' {' + rule + '}', l);
} else if (ss.addRule) {
// IE
ss.addRule(selector, rule, l);
}
}
};
私のトリックは、属性セレクターを使用することです。属性は、javascriptによって簡単に設定できます。
css
.class{ /*normal css... */}
.class[special]:after{ content: 'what you want'}
javascript
function setSpecial(id){ document.getElementById(id).setAttribute('special', '1'); }
html
<element id='x' onclick="setSpecial(this.id)"> ...
Cssをテンプレート文字列に配置するだけです。
const cssTemplateString = `.foo:[psuedoSelector]{prop: value}`;
次に、スタイル要素を作成し、スタイルタグに文字列を配置して、ドキュメントに添付します。
const styleTag = document.createElement("style");
styleTag.innerHTML = cssTemplateString;
document.head.insertAdjacentElement('beforeend', styleTag);
残りの部分は特異性によって処理されます。その後、スタイルタグを動的に削除および追加できます。これは、ライブラリの単純な代替手段であり、DOMのスタイルシート配列をいじります。ハッピーコーディング!
別の方法があります。擬似クラスを直接操作する代わりに、「ホバー」クラスや「訪問済み」クラスなど、同じものをモデル化する実際のクラスを作成します。通常の「。」でクラスをスタイルします適切なイベントが発生したときにJavaScriptを使用して要素にクラスを追加または削除できます。
JavaScriptを使用して擬似クラスルールを直接設定する代わりに、CSSファイルごとにルールを異なるように設定し、Javascriptを使用してスタイルシートをオフにし、別のスタイルシートをオンにすることができます。メソッドは A List Apart (詳細はqv。)で説明されています。
CSSファイルを次のように設定します。
<link rel="stylesheet" href="always_on.css">
<link rel="stylesheet" title="usual" href="preferred.css"> <!-- on by default -->
<link rel="alternate stylesheet" title="strange" href="alternate.css"> <!-- off by default -->
そして、JavaScriptを使用してそれらを切り替えます:
function setActiveStyleSheet(title) {
var i, a, main;
for(i=0; (a = document.getElementsByTagName("link")<i>); i++) {
if(a.getAttribute("rel").indexOf("style") != -1
&& a.getAttribute("title")) {
a.disabled = true;
if(a.getAttribute("title") == title) a.disabled = false;
}
}
}
すでに述べたように、これはブラウザーがサポートするものではありません。
スタイルを動的に思いつかない場合(つまり、データベースなどからスタイルを引き出す場合)、ページの本文にクラスを追加することでこの問題を回避できるはずです。
Cssは次のようになります。
a:hover { background: red; }
.theme1 a:hover { background: blue; }
これを変更するjavascriptは次のようになります。
// Look up some good add/remove className code if you want to do this
// This is really simplified
document.body.className += " theme1";
スタイルシートの切り替えは、その方法です。スタイルシートを動的に構築するためのライブラリがありますので、その場でスタイルを設定できます。
http://www.4pmp.com/2009/11/dynamic-css-pseudo-class-styles-with-jquery/