Como você adiciona CSS com Javascript?

154

Como você adiciona regras CSS (por exemplo strong { color: red }) usando Javascript?

nickf
fonte
mesma pergunta (resposta é crossbrowser jQuery) stackoverflow.com/a/266110/341744
ninMonkey
18
@monkey: Essa é uma solução muito ruim e, na verdade, não faz o que foi solicitado aqui. por exemplo: o que acontece se um novo <strong>elemento for adicionado ao documento.
nickf

Respostas:

115

Você também pode fazer isso usando as interfaces CSS de nível 2 do DOM ( MDN ):

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

... com exceção de (naturalmente) IE8 e anterior, que usa sua própria expressão marginalmente diferente:

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

Há uma vantagem teórica nisso em comparação com o método createElement-set-innerHTML, pois você não precisa se preocupar em colocar caracteres HTML especiais no innerHTML, mas, na prática, os elementos de estilo são CDATA no HTML herdado e '<' e 'e' raramente são usados ​​em folhas de estilo.

Você precisa de uma folha de estilo para poder anexá-la dessa maneira. Pode ser qualquer folha de estilo ativa existente: externa, incorporada ou vazia, não importa. Se não houver, a única maneira padrão de criá-lo no momento é com createElement.

bobince
fonte
"cor" .. oh sim, oops! felizmente isso foi apenas um exemplo. Suspeitei que possa haver um método DOM para isso, obrigado! +1
nickf
14
planilha vem sheet = window.document.styleSheets[0] (você precisa ter pelo menos um <style type = "text / css"> </style> lá).
AJP
1
Obrigado, todos os exemplos que o Google mostra primeiro são tão grandes quando tudo que eu precisava era refrescar minha memória nessas duas linhas.
ElDoRado1239
1
Eu sei que tem sido um tempo, mas quando eu testei o primeiro, eu tenhoSecurityError: The operation is insecure.
user10089632
3
@ user10089632 a folha de estilo que você está acessando precisa ser veiculada no mesmo host que o documento pai para que isso funcione.
22920
225

A abordagem simples e direta é criar e adicionar um novo stylenó ao documento.

// 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
fonte
12
Não deveria ser anexado à cabeça do documento e não ao corpo?
21920
3
@obince - De acordo com as especificações HTML, absolutamente, mas todos os navegadores as reconhecem em qualquer lugar. document.bodytambém é mais curto para digitar e mais rápido para executar do que document.getElementsByTagName("head")[0]evitar os problemas entre navegadores de insertRule / addRule.
11459 Ben Blank
4
A solução deve ser seguida por um longo "duhhhh". Não posso acreditar que não pensei nisso.
George Mauer
8
Em todos os navegadores recentes, você pode apenas usar document.head.appendChild.
Gajus
2
Esta solução é muito melhor! Imagine que você tem mais de uma folha de estilo: Com a solução @bobince, o seu CSS recém-adicionado pode ser substituído pelo segundo / terceiro / etc. folha de estilo na página. Usando document.body.appendChild(css);você, verifique se o novo CSS sempre é a última regra.
AVL
27

A solução de Ben Blank não funcionaria no IE8 para mim.

No entanto, isso funcionou no 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
fonte
12
O bom e velho IE sempre torna a vida mais fácil
Alex W
2
Você deve anexar o elemento para o head antes de definir .cssText, ou IE6-8 irá falhar se o cssCodecontém um @ -directive, como @importou @font-face, consulte o Update para phpied.com/dynamic-script-and-style-elements-in-ie e stackoverflow .com / a / 7952904
Han Seoul-Oh
24

Aqui está uma versão ligeiramente atualizada da solução de Chris Herring , levando em consideração que você também pode usá-lo innerHTMLem vez de criar um novo nó de texto:

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 );
}
Husky
fonte
3
Você deve anexar o elemento para o head antes de definir .cssText, ou IE6-8 irá falhar se o codecontém um @ -directive, como @importou @font-face, consulte o Update para phpied.com/dynamic-script-and-style-elements-in-ie e stackoverflow .com / a / 7952904
Han Seoul-Oh
5

Short One Liner

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

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

galinhas
fonte
3

Você pode adicionar classes ou atributos de estilo, elemento a elemento.

Por exemplo:

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

Onde você pode fazer this.style.background, this.style.font-size, etc. Você também pode aplicar um estilo usando o mesmo método ala

this.className='classname';

Se você quiser fazer isso em uma função javascript, poderá usar getElementByID em vez de 'this'.

mingala
fonte
5
O JavaScript embutido usando manipuladores de eventos é uma péssima idéia. Você deve separar seu conteúdo da sua funcionalidade e manipular manipuladores de eventos em JavaScript - de preferência em um arquivo externo.
Coronel Sponsz
3

Este exemplo fácil de adicionar <style>na cabeça do 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

Estilo dinâmico de origem - manipulando CSS com JavaScript

DarckBlezzer
fonte
3

A YUI recentemente adicionou um utilitário especificamente para isso. Veja stylesheet.js aqui.

Russell Leggett
fonte
Atualmente, estou usando o YUI para o meu trabalho e estava tentando descobrir como editar folhas de estilo externas das regras CSS existentes. Não sabia sobre este utilitário, parece perfeito! Obrigado Russell.
Jaime
2

Esta é a minha solução para adicionar uma regra css no final da última lista de folhas de estilos:

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
fonte
1

Outra opção é usar o JQuery para armazenar a propriedade de estilo em linha do elemento, anexá-lo e, em seguida, atualizar a propriedade de estilo do elemento com os novos valores. Do seguinte modo:

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

E, em seguida, execute-o com os novos atributos CSS como um objeto.

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

Esse pode não ser necessariamente o método mais eficiente (estou aberto a sugestões sobre como melhorar isso. :)), mas definitivamente funciona.

XtraSimplicity
fonte
1

Aqui está um modelo de amostra para ajudar você a começar

Requer 0 bibliotecas e usa apenas javascript para injetar HTML e CSS.

A função foi emprestada do usuário @Husky acima

Útil se você deseja executar um script tampermonkey e deseja adicionar uma sobreposição de alternância em um site (por exemplo, um aplicativo de anotações, por exemplo)

// 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
fonte
1

se você souber pelo menos uma <style>tag na página, use esta função:

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

uso:

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

fonte
0

Aqui está minha função de uso geral, que determina o seletor e as regras CSS e, opcionalmente, recebe um nome de arquivo css (diferencia maiúsculas de minúsculas) se você deseja adicionar a uma planilha específica (caso contrário, se você não fornecer um nome de arquivo CSS, ele criará um novo elemento de estilo e o anexará ao cabeçalho existente, criando no máximo um novo elemento de estilo e reutilizando-o em futuras chamadas de função). Funciona com FF, Chrome e IE9 + (talvez também anteriormente, não testado).

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
fonte
-1

use .cssno Jquery como$('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
fonte
1
javascript, OP não diz nada sobre jQuery
agapitocandemor 11/11