Jak dodać CSS z Javascriptem?

154

Jak dodać reguły CSS (np. strong { color: red }) Za pomocą JavaScript?

nickf
źródło
to samo pytanie (odpowiedź to crossbrowser jQuery) stackoverflow.com/a/266110/341744
ninMonkey
18
@monkey: To dość kiepskie rozwiązanie i nie robi tego, o co tutaj pytano. np .: co się stanie, jeśli <strong>do dokumentu zostanie dodany nowy element.
nickf

Odpowiedzi:

115

Możesz to również zrobić za pomocą interfejsów DOM Level 2 CSS ( MDN ):

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

... we wszystkich oprócz (naturalnie) IE8 i wcześniejszych, które używają własnego marginalnie innego sformułowania:

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

Jest to teoretyczna zaleta w porównaniu z metodą createElement-set-innerHTML polegającą na tym, że nie musisz martwić się o umieszczanie specjalnych znaków HTML w innerHTML, ale w praktyce elementami stylu są CDATA w starszym HTML i '<' i „&” są i tak rzadko używane w arkuszach stylów.

Musisz mieć arkusz stylów na miejscu, zanim będziesz mógł zacząć dodawać do niego w ten sposób. Może to być dowolny istniejący aktywny arkusz stylów: zewnętrzny, osadzony lub pusty, to nie ma znaczenia. Jeśli takiego nie ma, jedynym standardowym sposobem jego utworzenia jest w tej chwili createElement.

bobince
źródło
„kolor”… o tak, ojej! na szczęście to był tylko przykład. Podejrzewam, że może być do tego metoda DOM, dzięki! +1
nickf
14
pochodzi z sheet = window.document.styleSheets[0] (musisz mieć tam co najmniej jeden <style type = "text / css"> </style>).
AJP
1
Dzięki, wszystkie przykłady, które Google pokazuje jako pierwsze, są tak ogromne, kiedy wszystko, czego potrzebowałem, to odświeżyć pamięć w tych dwóch wierszach.
ElDoRado1239
1
Wiem, że minęło trochę czasu, ale kiedy testowałem pierwszy, dostałemSecurityError: The operation is insecure.
user10089632
3
@ user10089632 arkusz stylów, do którego uzyskujesz dostęp, musi być obsługiwany z tego samego hosta co dokument nadrzędny, aby to zadziałało.
bobince
225

Prostym i bezpośrednim podejściem jest utworzenie i dodanie nowego stylewęzła do dokumentu.

// 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
źródło
12
Czy nie powinno być dołączane do głowy dokumentu, a nie do treści?
bobince
3
@bobince - zgodnie ze specyfikacją HTML, absolutnie, ale wszystkie przeglądarki wszędzie je rozpoznają. document.bodyjest również krótszy do document.getElementsByTagName("head")[0]wpisania i szybszy do wykonania niż i pozwala uniknąć problemów z różnymi przeglądarkami w insertRule / addRule.
Ben Blank
4
Po rozwiązaniu powinno nastąpić długie „duhhhh”. Nie mogę uwierzyć, że o tym nie pomyślałem.
George Mauer,
8
We wszystkich najnowszych przeglądarkach możesz po prostu użyć document.head.appendChild.
Gajus,
2
To rozwiązanie jest znacznie lepsze! Wyobraź sobie, że masz więcej niż jeden arkusz stylów: dzięki rozwiązaniu @bobince twój nowo dodany CSS może zostać nadpisany przez drugi / trzeci / itd. arkusz stylów na stronie. Korzystając z document.body.appendChild(css);ciebie, upewnij się, że nowy CSS zawsze jest ostatnią regułą.
AvL
27

Rozwiązanie autorstwa Bena Blanka nie działałoby dla mnie w IE8.

Jednak to zadziałało w 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
źródło
12
Dobry stary IE zawsze ułatwia życie
Alex W,
2
Powinieneś dołączyć element do head poprzedniego ustawienia .cssTextlub IE6-8 ulegnie awarii, jeśli cssCodezawiera @ -directive, na przykład @importlub @font-face, zobacz Aktualizacja do phpied.com/dynamic-script-and-style-elements-in-ie i stackoverflow .com / a / 7952904
Han Seoul-Oh
24

Oto nieco zaktualizowana wersja rozwiązania Chrisa Herringa , biorąc pod uwagę, że możesz również użyć innerHTMLzamiast tworzenia nowego węzła tekstowego:

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 );
}
Ochrypły
źródło
3
Powinieneś dołączyć element do head poprzedniego ustawienia .cssTextlub IE6-8 ulegnie awarii, jeśli codezawiera @ -directive, na przykład @importlub @font-face, zobacz aktualizację do phpied.com/dynamic-script-and-style-elements-in-ie i stackoverflow .com / a / 7952904
Han Seoul-Oh
5

Najkrótsza jedna wkładka

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

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

kurczaki
źródło
3

Możesz dodawać klasy lub atrybuty stylu element po elemencie.

Na przykład:

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

Gdzie możesz to zrobić.style.background, this.style.font-size, itp. Możesz również zastosować styl używając tej samej metody ala

this.className='classname';

Jeśli chcesz to zrobić w funkcji javascript, możesz użyć metody getElementByID zamiast „this”.

mingala
źródło
5
Wbudowany JavaScript korzystający z obsługi zdarzeń to bardzo zły pomysł. Powinieneś oddzielić zawartość od funkcjonalności i powiązania obsługi zdarzeń w JavaScript - najlepiej w zewnętrznym pliku.
płk Sponsz
3

Ten prosty przykład dodania <style>nagłówka 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

Styl dynamiczny źródła - manipulowanie CSS za pomocą JavaScript

DarckBlezzer
źródło
3

YUI niedawno dodał narzędzie specjalnie do tego celu. Zobacz stylesheet.js tutaj.

Russell Leggett
źródło
Obecnie używam YUI do mojej pracy i próbowałem dowiedzieć się, jak edytować zewnętrzne arkusze stylów istniejących reguł CSS. Nie wiedziałem o tym narzędziu, wydaje się idealne! Dzięki, Russell.
Jaime,
2

Oto moje rozwiązanie, aby dodać regułę css na końcu ostatniej listy arkuszy stylów:

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
źródło
1

Inną opcją jest użycie JQuery do przechowywania właściwości stylu wbudowanego elementu, dołączenie do niej, a następnie zaktualizowanie właściwości style elementu o nowe wartości. Następująco:

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

Następnie wykonaj go z nowymi atrybutami CSS jako obiektem.

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

Może to niekoniecznie najskuteczniejsza metoda (jestem otwarty na sugestie, jak to poprawić. :)), ale zdecydowanie działa.

XtraSimplicity
źródło
1

Oto przykładowy szablon, który pomoże Ci rozpocząć

Wymaga bibliotek 0 i używa tylko javascript do wstrzykiwania HTML i CSS.

Funkcja została zapożyczona od użytkownika @Husky powyżej

Przydatne, jeśli chcesz uruchomić skrypt tampermonkey i chcesz dodać nakładkę przełączającą na stronie internetowej (np. Aplikację do notatek)

// 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
źródło
1

jeśli wiesz, że na <style>stronie istnieje co najmniej jeden tag, użyj tej funkcji:

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

stosowanie :

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

źródło
0

Oto moja funkcja ogólnego przeznaczenia, która parametryzuje selektor CSS i reguły oraz opcjonalnie przyjmuje nazwę pliku css (z uwzględnieniem wielkości liter), jeśli zamiast tego chcesz dodać do konkretnego arkusza (w przeciwnym razie, jeśli nie podasz nazwy pliku CSS, utworzy nowy element stylu i dołączy go do istniejącej nagłówka. Stworzy co najwyżej jeden nowy element stylu i użyje go ponownie w przyszłych wywołaniach funkcji). Działa z FF, Chrome i IE9 + (może też wcześniej, nieprzetestowane).

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
źródło
-1

używać .cssw Jquery, takich jak$('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
źródło
1
javascript, OP nie mówi nic o jQuery
agapitocandemor