JavaScriptでCSSをどのように追加しますか?


154

strong { color: red }JavaScriptを使用してCSSルール(など)を追加するにはどうすればよいですか?


同じ質問(回答はクロスブラウザjQueryです)stackoverflow.com/a/266110/341744
ninMonkey

18
@monkey:これはかなり貧弱な解決策であり、実際にここで尋ねられたことを実行しません。例:新しい<strong>要素がドキュメントに追加されるとどうなるか。
nickf

回答:


115

DOMレベル2のCSSインターフェース(MDN)を使用してこれを行うこともできます。

var sheet = window.document.styleSheets[0];
sheet.insertRule('strong { color: red; }', sheet.cssRules.length);

...(自然に)IE8以前を除くすべてのもので、独自のわずかに異なる表現を使用します。

sheet.addRule('strong', 'color: red;', -1);

createElement-set-innerHTMLメソッドと比較して、これには理論的な利点があります。つまり、innerHTMLに特殊なHTML文字を入れることを心配する必要はありませんが、実際には、スタイル要素はレガシーHTMLのCDATAであり、「<」です。とにかく「&」がスタイルシートで使用されることはほとんどありません。

このようにスタイルシートに追加する前に、スタイルシートが必要です。これは、既存のアクティブなスタイルシート(外部、埋め込み、または空)にすることができます。問題はありません。存在しない場合、現時点で作成する唯一の標準的な方法はcreateElementを使用することです。


「色」..そうそう、おっと!ありがたいことに、それは単なる例でした。これにはDOMメソッドがあるのではないかと疑いました。+1
nickf 2009

14
シートはここから取得しsheet = window.document.styleSheets[0] ます(少なくとも1つの<style type = "text / css"> </ style>が必要です)。
AJP

1
おかげで、Googleが最初に示すすべての例は、これらの2行のメモリを更新するだけで済んだときに非常に大きくなりました。
ElDoRado1239 2016年

1
久しぶりのことですが、最初のテストをしたとき、私は次のようになりましたSecurityError: The operation is insecure.
user10089632

3
@ user10089632これが機能するためには、アクセスしているスタイルシートが親ドキュメントと同じホストから提供される必要があります。
ボビンス2017

225

シンプルで直接的なアプローチは、新しいstyleノードを作成してドキュメントに追加することです。

// Your CSS as text
var styles = `
    .qwebirc-qui .ircwindow div { 
        font-family: Georgia,Cambria,"Times New Roman",Times,serif;
        margin: 26px auto 0 auto;
        max-width: 650px;
    }
    .qwebirc-qui .lines {
        font-size: 18px;
        line-height: 1.58;
        letter-spacing: -.004em;
    }

    .qwebirc-qui .nicklist a {
        margin: 6px;
    }
`

var styleSheet = document.createElement("style")
styleSheet.type = "text/css"
styleSheet.innerText = styles
document.head.appendChild(styleSheet)

12
本文ではなくドキュメントの先頭に追加する必要はありませんか?
ボビンス2009

3
@bobince — HTML仕様によると、絶対に、すべてのブラウザがどこでもそれらを認識します。document.bodyまた、タイプが短く、実行が高速document.getElementsByTagName("head")[0]で、insertRule / addRuleのクロスブラウザーの問題を回避します。
Ben Blank

4
ソリューションの後には、長い「duhhhh」が続くはずです。思わなかったなんて信じられない。
ジョージマウアー

8
最近のすべてのブラウザでは、そのまま使用できますdocument.head.appendChild
Gajus 2014

2
このソリューションははるかに優れています!複数のスタイルシートがあると想像してください。@ bobinceソリューションを使用すると、新しく追加されたCSSが2番目、3番目、などによって上書きされる可能性があります。ページ上のスタイルシート。document.body.appendChild(css);あなたを使用して、新しいCSSが常に最後のルールであることを確認してください。
AvL

27

ベンブランクによるソリューションは、IE8では機能しません。

ただし、これはIE8では機能しました

function addCss(cssCode) {
var styleElement = document.createElement("style");
  styleElement.type = "text/css";
  if (styleElement.styleSheet) {
    styleElement.styleSheet.cssText = cssCode;
  } else {
    styleElement.appendChild(document.createTextNode(cssCode));
  }
  document.getElementsByTagName("head")[0].appendChild(styleElement);
}

12
古き良きIEは常に生活を楽にします
Alex W

2
あなたはに要素を追加する必要がありますhead 前に設定.cssText、またはIE6-8はなりクラッシュした場合cssCode、@、-directiveのように含まれている@import@font-face、にアップデートを参照してくださいphpied.com/dynamic-script-and-style-elements-in-iestackoverflowのを.com / a / 7952904
Han Seoul-Oh

24

新しいテキストノードを作成する代わりに使用できることを考慮して、Chris Herringのソリューションのわずかに更新されたバージョンを次に示しinnerHTMLます。

function insertCss( code ) {
    var style = document.createElement('style');
    style.type = 'text/css';

    if (style.styleSheet) {
        // IE
        style.styleSheet.cssText = code;
    } else {
        // Other browsers
        style.innerHTML = code;
    }

    document.getElementsByTagName("head")[0].appendChild( style );
}

3
要素を前に追加する必要がありますhead 設定.cssText、またはIE6-8はなりクラッシュした場合code、@、-directiveのように含まれている@import@font-face、にアップデートを参照してくださいphpied.com/dynamic-script-and-style-elements-in-iestackoverflowのを.com / a / 7952904
Han Seoul-Oh

5

最短ワンライナー

// One liner function:
const addCSS = s =>(d=>{d.head.appendChild(d.createElement("style")).innerHTML=s})(document);

// Usage: 
addCSS("body{ background:red; }")


3

要素ごとにクラスまたはスタイル属性を追加できます。

例えば:

<a name="myelement" onclick="this.style.color='#FF0';">text</a>

this.style.background、this.style.font-sizeなどを実行できる場所。これと同じメソッドalaを使用してスタイルを適用することもできます。

this.className='classname';

これをJavaScript関数で行いたい場合は、「this」ではなくgetElementByIDを使用できます。


5
イベントハンドラーを使用したインラインJavaScriptは非常に悪い考えです。JavaScriptで、できれば外部ファイルで、機能とバインディングイベントハンドラからコンテンツを分離する必要があります。
Sponsz大佐

3

<style>HTMLの先頭に追加するこの簡単な例

var sheet = document.createElement('style');
sheet.innerHTML = "table th{padding-bottom: 0 !important;padding-top: 0 !important;}\n"
+ "table ul {    margin-top: 0 !important;    margin-bottom: 0 !important;}\n"
+ "table td{padding-bottom: 0 !important;padding-top: 0 !important;}\n"
+ ".messages.error{display:none !important;}\n"
+ ".messages.status{display:none !important;} ";

document.body.appendChild(sheet); // append in body
document.head.appendChild(sheet); // append in head

ソースの動的スタイル-JavaScriptでCSSを操作する



2

これは、最後のスタイルシートリストの最後にCSSルールを追加するための私の解決策です。

var css = new function()
{
    function addStyleSheet()
    {
        let head = document.head;
        let style = document.createElement("style");

        head.appendChild(style);
    }

    this.insert = function(rule)
    {
        if(document.styleSheets.length == 0) { addStyleSheet(); }

        let sheet = document.styleSheets[document.styleSheets.length - 1];
        let rules = sheet.rules;

        sheet.insertRule(rule, rules.length);
    }
}

css.insert("body { background-color: red }");

1

もう1つのオプションは、JQueryを使用して要素のインラインスタイルプロパティを保存し、それに追加して、要素のスタイルプロパティを新しい値で更新することです。次のように:

function appendCSSToElement(element, CssProperties)
        {
            var existingCSS = $(element).attr("style");

             if(existingCSS == undefined) existingCSS = "";

            $.each(CssProperties, function(key,value)
            {
                existingCSS += " " + key + ": " + value + ";";
            });

            $(element).attr("style", existingCSS);

            return $(element);
        }

そして、新しいCSS属性をオブジェクトとして実行します。

appendCSSToElement("#ElementID", { "color": "white", "background-color": "green", "font-weight": "bold" });

これは必ずしも最も効率的な方法であるとは限りませんが(これを改善する方法についての提案を私は受け入れます。))、それは間違いなく機能します。


1

始めるのに役立つサンプルテンプレートを以下に示します

0ライブラリが必要で、JavaScriptのみを使用してHTMLとCSSの両方を挿入します。

この関数は上のユーザー@Huskyから借用したものです

Tampermonkeyスクリプトを実行し、Webサイトにトグルオーバーレイを追加したい場合に便利です(例:ノートアプリ)。

// INJECTING THE HTML
document.querySelector('body').innerHTML += '<div id="injection">Hello World</div>';

// CSS INJECTION FUNCTION
///programming/707565/how-do-you-add-css-with-javascript
function insertCss( code ) {
    var style = document.createElement('style');
    style.type = 'text/css';
    if (style.styleSheet) {
        // IE
        style.styleSheet.cssText = code;
    } else {
        // Other browsers
        style.innerHTML = code;
    }
    document.getElementsByTagName("head")[0].appendChild( style );
}

// INJECT THE CSS INTO FUNCTION
// Write the css as you normally would... but treat it as strings and concatenate for multilines
insertCss(
  "#injection {color :red; font-size: 30px;}" +
  "body {background-color: lightblue;}"
)


1

<style>ページに少なくとも1つのタグが存在することがわかっている場合は、次の関数を使用します。

CSS=function(i){document.getElementsByTagName('style')[0].innerHTML+=i};

使用法 :

CSS("div{background:#00F}");

0

これは、CSSセレクターとルールをパラメーター化し、特定のシートに代わりに追加したい場合(オプションで、CSSファイル名を指定しない場合は、CSSファイル名(大文字と小文字を区別)を取り込む)の私の汎用関数です。新しいスタイル要素を作成して既存のヘッドに追加します。新しいスタイル要素は最大で1つ作成され、将来の関数呼び出しで再利用されます)。FF、Chrome、IE9 +で動作します(まだテストされていない可能性があります)。

function addCssRules(selector, rules, /*Optional*/ sheetName) {
    // We want the last sheet so that rules are not overridden.
    var styleSheet = document.styleSheets[document.styleSheets.length - 1];
    if (sheetName) {
        for (var i in document.styleSheets) {
            if (document.styleSheets[i].href && document.styleSheets[i].href.indexOf(sheetName) > -1) {
                styleSheet = document.styleSheets[i];
                break;
            }
        }
    }
    if (typeof styleSheet === 'undefined' || styleSheet === null) {
        var styleElement = document.createElement("style");
        styleElement.type = "text/css";
        document.head.appendChild(styleElement);
        styleSheet = styleElement.sheet;
    }

    if (styleSheet) {
        if (styleSheet.insertRule)
            styleSheet.insertRule(selector + ' {' + rules + '}', styleSheet.cssRules.length);
        else if (styleSheet.addRule)
            styleSheet.addRule(selector, rules);
    }
}

-1

.cssようなjqueryで使用する$('strong').css('background','red');

$('strong').css('background','red');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<strong> Example
</strong> 


1
javascript、OPはjQueryについて何も言わない
agapitocandemor '11 / 11/19
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.