Comment ajouter du CSS avec Javascript?


154

Comment ajouter des règles CSS (par exemple strong { color: red }) en utilisant Javascript?


même question (la réponse est crossbrowser jQuery) stackoverflow.com/a/266110/341744
ninMonkey

18
@monkey: C'est une solution plutôt médiocre, et ne fait pas vraiment ce qui a été demandé ici. par exemple: que se passe-t-il si un nouvel <strong>élément est ajouté au document.
nickf

Réponses:


115

Vous pouvez également le faire en utilisant les interfaces CSS de niveau 2 DOM ( MDN ):

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

... sur tout sauf (naturellement) IE8 et antérieurs, qui utilise sa propre formulation légèrement différente:

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

Il y a un avantage théorique à cela par rapport à la méthode createElement-set-innerHTML, en ce que vous n'avez pas à vous soucier de mettre des caractères HTML spéciaux dans le fichier innerHTML, mais en pratique, les éléments de style sont CDATA dans l'ancien HTML, et '<' et «&» sont de toute façon rarement utilisés dans les feuilles de style.

Vous avez besoin d'une feuille de style en place avant de pouvoir commencer à y ajouter comme ceci. Cela peut être n'importe quelle feuille de style active existante: externe, incorporée ou vide, peu importe. S'il n'y en a pas, le seul moyen standard de le créer pour le moment est d'utiliser createElement.


"couleur" .. oh ouais, oups! heureusement, ce n'était qu'un exemple. Je soupçonnais qu'il pourrait y avoir une méthode DOM pour cela, merci! +1
nickf

14
feuille vient de sheet = window.document.styleSheets[0] (vous devez avoir au moins un <style type = "text / css"> </style>).
AJP

1
Merci, tous les exemples que Google montre en premier sont si énormes alors qu'il me suffisait de me rafraîchir la mémoire sur ces deux lignes.
ElDoRado1239

1
Je sais que cela fait un moment, mais quand j'ai testé le premier, j'ai euSecurityError: The operation is insecure.
user10089632

3
@ user10089632 la feuille de style à laquelle vous accédez doit être servie à partir du même hôte que le document parent pour que cela fonctionne.
bobince

225

L'approche simple et directe consiste à créer et à ajouter un nouveau style nœud au document.

// 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
Ne devrait-il pas être ajouté à la tête du document plutôt qu'au corps?
bobince

3
@bobince - Selon les spécifications HTML, absolument, mais tous les navigateurs les reconnaissent n'importe où. document.bodyest également plus court à taper et plus rapide à exécuter que document.getElementsByTagName("head")[0]et évite les problèmes inter-navigateurs de insertRule / addRule.
Ben Blank

4
La solution doit être suivie d'un long "duhhhh". Je ne peux pas croire que je n'y ai pas pensé.
George Mauer

8
Dans tous les navigateurs récents, vous pouvez simplement utiliser document.head.appendChild.
Gajus le

2
Cette solution est bien meilleure! Imaginez que vous ayez plus d'une feuille de style: avec la solution @bobince, votre CSS nouvellement ajouté peut être écrasé par le deuxième / troisième / etc. feuille de style sur la page. En utilisant document.body.appendChild(css);vous, assurez-vous que le nouveau CSS est toujours la dernière règle.
AvL

27

La solution de Ben Blank ne fonctionnerait pas dans IE8 pour moi.

Cependant, cela a fonctionné dans 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
Le bon vieux IE rend toujours la vie plus facile
Alex W

2
Vous devez ajouter l'élément au paramètre head before.cssText , ou IE6-8 plantera si le cssCodecontient une @ -directive, comme @importou @font-face, consultez la mise à jour de phpied.com/dynamic-script-and-style-elements-in-ie et stackoverflow .com / a / 7952904
Han Seoul-Oh

24

Voici une version légèrement mise à jour de la solution de Chris Herring , en tenant compte du fait que vous pouvez également l'utiliser innerHTMLau lieu de créer un nouveau nœud de texte:

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
Vous devez ajouter l'élément au paramètre head before.cssText , ou IE6-8 plantera si le codecontient une @ -directive, comme @importou @font-face, consultez la mise à jour de phpied.com/dynamic-script-and-style-elements-in-ie et stackoverflow .com / a / 7952904
Han Seoul-Oh

5

La doublure la plus courte

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

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


3

Vous pouvez ajouter des classes ou des attributs de style élément par élément.

Par exemple:

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

Où vous pouvez faire this.style.background, this.style.font-size, etc. Vous pouvez également appliquer un style en utilisant cette même méthode ala

this.className='classname';

Si vous voulez faire cela dans une fonction javascript, vous pouvez utiliser getElementByID plutôt que «this».


5
Le JavaScript en ligne utilisant des gestionnaires d'événements est une très mauvaise idée. Vous devez séparer votre contenu de vos gestionnaires d'événements de fonctionnalité et de liaison en JavaScript - de préférence dans un fichier externe.
Colonel Sponsz

3

Cet exemple simple d'ajout <style>en tête de 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

Style dynamique source - manipuler CSS avec JavaScript


3

YUI a récemment ajouté un utilitaire spécialement pour cela. Voir stylesheet.js ici.


J'utilise actuellement YUI pour mon travail et j'essayais de comprendre comment modifier les feuilles de style externes des règles css existantes. Je ne connaissais pas cet utilitaire, il semble parfait! Merci Russell.
Jaime

2

C'est ma solution pour ajouter une règle css à la fin de la dernière liste de feuilles de style:

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

Une autre option consiste à utiliser JQuery pour stocker la propriété de style en ligne de l'élément, y ajouter, puis mettre à jour la propriété de style de l'élément avec les nouvelles valeurs. Comme suit:

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

Et puis exécutez-le avec les nouveaux attributs CSS en tant qu'objet.

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

Ce n'est peut-être pas nécessairement la méthode la plus efficace (je suis ouvert aux suggestions sur la façon d'améliorer cela. :)), mais cela fonctionne définitivement.


1

Voici un exemple de modèle pour vous aider à démarrer

Nécessite 0 bibliothèques et utilise uniquement javascript pour injecter à la fois HTML et CSS.

La fonction a été empruntée à l'utilisateur @Husky ci-dessus

Utile si vous souhaitez exécuter un script tampermonkey et souhaitez ajouter une superposition à bascule sur un site Web (par exemple, une application de notes par exemple)

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

si vous savez qu'au moins une <style>balise existe dans la page, utilisez cette fonction:

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

utilisation:

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

0

Voici ma fonction à usage général qui paramètre le sélecteur CSS et les règles, et prend éventuellement un nom de fichier css (sensible à la casse) si vous souhaitez ajouter à une feuille particulière à la place (sinon, si vous ne fournissez pas de nom de fichier CSS, il créera un nouvel élément de style et l'ajoutera à l'en-tête existant. Il créera au plus un nouvel élément de style et le réutilisera lors des futurs appels de fonction). Fonctionne avec FF, Chrome et IE9 + (peut-être plus tôt aussi, non testé).

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

utiliser .cssdans Jquery comme$('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 ne dit rien sur jQuery
agapitocandemor
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.