45

JavaScriptを使用してCSSスタイルシートを変更することは可能ですか?

私は話していません:

document.getElementById('id').style._____='.....';

私は変更について話している:

#id {
    param: value;
}

頭の中に新しいオブジェクトを作成したり、そこにスタイルタグをinnerHTMLしたりするなど、汚いこと(まだ試していません)を行う以外に、これは機能したとしても、スタイルとしていくつかの問題を引き起こします。ブロックはすでに他の場所で定義されており、ブラウザが動的に作成されたスタイルブロックをいつ/いつ解析するかはわかりませんか?

4

5 に答える 5

41

2011年現在

はい、できますが、ブラウザ間の互換性の問題に直面します。

http://www.quirksmode.org/dom/changess.html

2016年現在

ブラウザのサポートが大幅に改善されました(IE9 +を含むすべてのブラウザがサポートされています)。

  • このinsertRule()メソッドを使用すると、スタイルシートにルールを動的に追加できます。

  • を使用deleteRule()すると、スタイルシートから既存のルールを削除できます。

  • cssRulesスタイルシート内のルールには、スタイルシートの属性を介してアクセスできます。

于 2011-07-08T05:48:08.420 に答える
16

.insertRuleとの組み合わせを使用して.cssRules、IE9までさかのぼってこれを実行できます。

function changeStylesheetRule(stylesheet, selector, property, value) {
    // Make the strings lowercase
    selector = selector.toLowerCase();
    property = property.toLowerCase();
    value = value.toLowerCase();
    
    // Change it if it exists
    for(var i = 0; i < stylesheet.cssRules.length; i++) {
        var rule = stylesheet.cssRules[i];
        if(rule.selectorText === selector) {
            rule.style[property] = value;
            return;
        }
    }
  
    // Add it if it does not
    stylesheet.insertRule(selector + " { " + property + ": " + value + "; }", 0);
}

// Used like so:
changeStylesheetRule(s, "body", "color", "rebeccapurple");

デモ

于 2016-06-30T20:58:22.477 に答える
4

プログラムで一連のスタイルをオブジェクトに追加したい場合、プログラムでクラスをオブジェクトに追加する方が簡単です(このようなクラスには、CSSでスタイルが関連付けられています)。CSSで優先順位を制御できるため、新しいクラスの新しいスタイルで以前のスタイルを上書きできます。これは通常、スタイルシートを直接変更するよりもはるかに簡単で、完全にクロスブラウザで機能します。

于 2011-07-08T09:18:35.050 に答える
2

スタイルルールのプロパティを変更する

function change_css_style (titulo,selector,propiedad,valor) {        
        let i=0;
        while (i<document.styleSheets.length) {
            if (document.styleSheets[i].title==titulo) {
                let y=0;
                while (y<document.styleSheets[i].cssRules.length) {
                    if (document.styleSheets[i].cssRules[y].selectorText==selector) {                                               
                        document.styleSheets[i].cssRules[y].style[propiedad] = valor;                                                                       
                        y = document.styleSheets[i].cssRules.length;
                    } 
                    y++;
                }               
                i=document.styleSheets.length;
            } 
            i++;
        }

    }

デモ

<style title="chat_inicio">
    .contenido .mensajes {
          width: 100px;
          height: 300px;    
    }
</style>

タイトルがchat_inicioのスタイルブックをセレクター.contenido.mensajesでスタイルのプロパティを475pxに変更します

<script>
     cambiar_css_style ('chat_inicio','.contenido .mensajes','width','475px');
</script>
于 2019-12-26T11:26:40.323 に答える
2

2020

この方法のいくつかの利点:

  • スタイルシートを指定する必要はありません(ただし、許可します)。
  • 複数のスタイルを一度に追加/変更できます
  • !important属性を受け入れる
  • CSSセレクターと一致するときに余分な空白を無視します
  • 最後に一致した既存のルールを変更するか、最後に一致したスタイルシートの最後に追加します。(他の回答は、最初のルールを追加/変更しますが、その後、ルールが無効になる場合があります。)

使用法:

adjustCSSRules('#myDiv', 'width: 300px !important');

方法:

function adjustCSSRules(selector, props, sheets){

    // get stylesheet(s)
    if (!sheets) sheets = [...document.styleSheets];
    else if (sheets.sup){    // sheets is a string
        let absoluteURL = new URL(sheets, document.baseURI).href;
        sheets = [...document.styleSheets].filter(i => i.href == absoluteURL);
        }
    else sheets = [sheets];  // sheets is a stylesheet

    // CSS (& HTML) reduce spaces in selector to one.
    selector = selector.replace(/\s+/g, ' ');
    const findRule = s => [...s.cssRules].reverse().find(i => i.selectorText == selector)
    let rule = sheets.map(findRule).filter(i=>i).pop()

    const propsArr = props.sup
        ? props.split(/\s*;\s*/).map(i => i.split(/\s*:\s*/)) // from string
        : Object.entries(props);                              // from Object

    if (rule) for (let [prop, val] of propsArr){
        // rule.style[prop] = val; is against the spec, and does not support !important.
        rule.style.setProperty(prop, ...val.split(/ *!(?=important)/));
        }
    else {
        sheet = sheets.pop();
        if (!props.sup) props = propsArr.reduce((str, [k, v]) => `${str}; ${k}: ${v}`, '');
        sheet.insertRule(`${selector} { ${props} }`, sheet.cssRules.length);
        }
    }

デモ

このメソッドは3つの引数を取ります。

  • セレクター[文字列]-CSSセレクター-例:'#myDiv'
    空白は自動縮小され.myClass #myDivます(一致し.myClass #myDivます)
  • ルール[CSS文字列、オブジェクト]-例(どちらでもかまいません):
    • { border: "solid 3px green", color: "white" }
    • 'border: solid 3px green; color: white'
  • シート(オプション)[文字列、スタイルシート]
    • 空の場合、すべてのスタイルシートがチェックされます
    • 'myStyles.css'シートへの相対URLまたは絶対URL
    • document.styleSheets[1]-シートへの参照

その他の例:

adjustCSSRules('#myDiv', {width: '30px'}); // all stylesheets
adjustCSSRules('#myDiv', 'width: 30px', 'style.css'); // style.css only  
adjustCSSRules('#myDiv  .myClass', 'width: 30px', document.styleSheets[0]); // only first stylesheet
于 2020-10-16T09:55:42.463 に答える