Wie fügt man CSS mit Javascript hinzu?

154

Wie fügt man CSS-Regeln (zB strong { color: red }) mithilfe von Javascript hinzu?

nickf
quelle
gleiche Frage (Antwort ist Crossbrowser jQuery) stackoverflow.com/a/266110/341744
ninMonkey
18
@monkey: Das ist eine ziemlich schlechte Lösung und macht nicht das, was hier gefragt wurde. Beispiel: Was passiert, wenn <strong>dem Dokument ein neues Element hinzugefügt wird?
Nickf

Antworten:

115

Sie können dies auch über DOM Level 2 CSS-Schnittstellen ( MDN ) tun :

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

... auf allen außer (natürlich) IE8 und früheren Versionen, die ihre eigenen geringfügig unterschiedlichen Formulierungen verwenden:

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

Dies hat einen theoretischen Vorteil gegenüber der Methode createElement-set-innerHTML, da Sie sich keine Gedanken über das Einfügen spezieller HTML-Zeichen in innerHTML machen müssen, aber in der Praxis sind Stilelemente CDATA in Legacy-HTML und '<' und '&' werden in Stylesheets sowieso selten verwendet.

Sie benötigen ein Stylesheet, bevor Sie es wie folgt anhängen können. Das kann jedes vorhandene aktive Stylesheet sein: extern, eingebettet oder leer, es spielt keine Rolle. Wenn es keine gibt, ist die einzige Standardmethode, um sie zu erstellen, derzeit createElement.

Bobince
quelle
"Farbe" .. oh ja, oops! Zum Glück war das nur ein Beispiel. Ich vermutete, dass es dafür eine DOM-Methode geben könnte, danke! +1
Nickf
14
Blatt kommt von sheet = window.document.styleSheets[0] (Sie müssen mindestens ein <style type = "text / css"> </ style> dort haben).
AJP
1
Vielen Dank, alle Beispiele, die Google zuerst zeigt, sind so groß, dass ich nur mein Gedächtnis in diesen beiden Zeilen auffrischen musste.
ElDoRado1239
1
Ich weiß, es ist eine Weile her, aber als ich das erste getestet habe, bekam ichSecurityError: The operation is insecure.
user10089632
3
@ user10089632 Das Stylesheet, auf das Sie zugreifen, muss vom selben Host wie das übergeordnete Dokument bereitgestellt werden, damit dies funktioniert.
Bobince
225

Der einfache und direkte Ansatz besteht darin, einen neuen styleKnoten zu erstellen und dem Dokument hinzuzufügen .

// 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)
Ben Blank
quelle
12
Sollte es nicht eher am Kopf als am Körper des Dokuments angehängt werden?
Bobince
3
@bobince - Gemäß den HTML-Spezifikationen absolut, aber alle Browser erkennen sie überall. document.bodyist auch kürzer zu tippen und schneller auszuführen als document.getElementsByTagName("head")[0]und vermeidet die browserübergreifenden Probleme von insertRule / addRule.
Ben Blank
4
Auf die Lösung sollte ein langes "duhhhh" folgen. Ich kann nicht glauben, dass ich nicht daran gedacht habe.
George Mauer
8
In allen neueren Browsern können Sie nur verwenden document.head.appendChild.
Gajus
2
Diese Lösung ist weitaus besser! Stellen Sie sich vor, Sie haben mehr als ein Stylesheet: Mit der @ bobince-Lösung wird Ihr neu hinzugefügtes CSS möglicherweise durch das zweite / dritte / etc. Überschrieben. Stylesheet auf der Seite. Mit stellen document.body.appendChild(css);Sie sicher, dass das neue CSS immer die letzte Regel ist.
AvL
27

Die Lösung von Ben Blank würde in IE8 für mich nicht funktionieren.

Dies funktionierte jedoch in 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);
}
Chris Herring
quelle
12
Guter alter IE macht das Leben immer einfacher
Alex W
2
Sie sollten das Element an das Anfügen head vor Einstellung .cssTextoder IE6-8 wird abstürzen , wenn der cssCodeeine enthält @ -Richtlinie, wie @importoder @font-facefinden Sie in der Update phpied.com/dynamic-script-and-style-elements-in-ie und Stackoverflow .com / a / 7952904
Han Seoul-Oh
24

Hier ist eine leicht aktualisierte Version der Lösung von Chris Herring , die berücksichtigt, dass Sie sie auch verwenden können, innerHTMLanstatt einen neuen Textknoten zu erstellen:

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 );
}
Heiser
quelle
3
Sie sollten das Element an das Anfügen head vor Einstellung .cssTextoder IE6-8 wird abstürzen , wenn der codeeine enthält @ -Richtlinie, wie @importoder @font-facefinden Sie in der Update phpied.com/dynamic-script-and-style-elements-in-ie und Stackoverflow .com / a / 7952904
Han Seoul-Oh
5

Kürzester Einzeiler

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

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

Hühner
quelle
3

Sie können Klassen oder Stilattribute Element für Element hinzufügen.

Beispielsweise:

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

Wo können Sie this.style.background, this.style.font-size usw. ausführen? Sie können einen Stil auch mit derselben Methode anwenden

this.className='classname';

Wenn Sie dies in einer Javascript-Funktion tun möchten, können Sie getElementByID anstelle von 'this' verwenden.

Mingala
quelle
5
Inline-JavaScript mit Ereignishandlern ist eine sehr schlechte Idee. Sie sollten Ihren Inhalt von Ihren Funktionen trennen und Ereignishandler in JavaScript binden - vorzugsweise in einer externen Datei.
Oberst Sponsz
3

Dieses einfache Beispiel für das Hinzufügen <style>von HTML-Kopf

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

Quelle Dynamische Stil - Manipulation von CSS mit JavaScript

DarckBlezzer
quelle
3

YUI hat kürzlich ein spezielles Dienstprogramm hinzugefügt . Siehe stylesheet.js hier.

Russell Leggett
quelle
Ich verwende derzeit YUI für meine Arbeit und habe versucht herauszufinden, wie externe Stylesheets vorhandener CSS-Regeln bearbeitet werden. Ich wusste nichts über dieses Dienstprogramm, es scheint perfekt zu sein! Danke Russell.
Jaime
2

Dies ist meine Lösung, um eine CSS-Regel am Ende der letzten Stylesheet-Liste hinzuzufügen:

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 }");
Martin Wantke
quelle
1

Eine andere Option besteht darin, JQuery zu verwenden, um die Inline-Stileigenschaft des Elements zu speichern, an sie anzuhängen und dann die Stileigenschaft des Elements mit den neuen Werten zu aktualisieren. Wie folgt:

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);
        }

Führen Sie es dann mit den neuen CSS-Attributen als Objekt aus.

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

Dies ist möglicherweise nicht unbedingt die effizienteste Methode (ich bin offen für Vorschläge, wie dies verbessert werden kann. :)), aber es funktioniert definitiv.

XtraSimplicity
quelle
1

Hier ist eine Beispielvorlage, die Ihnen den Einstieg erleichtert

Benötigt 0 Bibliotheken und verwendet nur Javascript, um sowohl HTML als auch CSS einzufügen.

Die Funktion wurde vom Benutzer @Husky oben ausgeliehen

Nützlich, wenn Sie ein Tampermonkey-Skript ausführen und einer Website ein Umschalt-Overlay hinzufügen möchten (z. B. eine Notiz-App).

// 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;}"
)

Vincent Tang
quelle
1

Wenn Sie wissen, dass mindestens ein <style>Tag auf der Seite vorhanden ist, verwenden Sie diese Funktion:

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

Verwendung :

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

quelle
0

Hier ist meine Allzweckfunktion, die den CSS-Selektor und die Regeln parametrisiert und optional einen CSS-Dateinamen (Groß- und Kleinschreibung beachten) verwendet, wenn Sie stattdessen einem bestimmten Blatt hinzufügen möchten (andernfalls, wenn Sie keinen CSS-Dateinamen angeben, diesen erstellt ein neues Stilelement und hängt es an den vorhandenen Kopf an. Es erstellt höchstens ein neues Stilelement und verwendet es bei zukünftigen Funktionsaufrufen wieder. Funktioniert mit FF, Chrome und IE9 + (möglicherweise auch früher, ungetestet).

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);
    }
}
Jon
quelle
-1

Verwendung .cssin Jquery wie$('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> 

Zain Ali
quelle
1
Javascript, OP sagt nichts über jQuery
Agapitocandemor