web-dev-qa-db-fra.com

Comment ajoutez-vous CSS avec Javascript?

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

125
nickf

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

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

... sur tout sauf sur (naturellement) IE, qui utilise son propre libellé légèrement différent:

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

Cela présente un avantage théorique par rapport à la méthode createElement-set-innerHTML, dans la mesure où vous n'avez pas à vous soucier de l'insertion de caractères HTML spéciaux dans le innerHTML, mais dans la pratique, les éléments de style sont CDATA dans le HTML hérité, et '<' et '&' sont rarement utilisés dans les stylesheets.

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

89
bobince

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

var css = document.createElement("style");
css.type = "text/css";
css.innerHTML = "strong { color: red }";
document.body.appendChild(css);
175
Ben Blank

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);
}
25
Chris Herring

Voici une version légèrement mise à jour de la solution Chris Herring , en tenant compte du fait que vous pouvez également utiliser innerHTML au 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 );
}
22
Husky

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

3
Russell Leggett

Cet exemple simple d'ajoutez <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

Source Style dynamique - manipuler CSS avec JavaScript

3
DarckBlezzer

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'.

3
mingala

Voici 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 }");
2
Martin Wantke

Une autre option consiste à utiliser JQuery pour stocker la propriété de style en ligne de l'élément, l'ajouter à celle-ci, puis pour 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 forcément la méthode la plus efficace (je suis ouvert aux suggestions sur la façon d'améliorer ceci. :)), mais cela fonctionne définitivement.

1
XtraSimplicity

La plus courte des doublures

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

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

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

Nécessite 0 bibliothèque et utilise uniquement le javascript pour injecter HTML et CSS.

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

Utile si vous souhaitez exécuter un script tampermonkey et que vous souhaitez ajouter une superposition de 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
//https://stackoverflow.com/questions/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
Vincent Tang

si vous connaissez au moins une balise <style> dans la page, utilisez cette fonction:

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

utilisation:

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

Voici ma fonction polyvalente 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 à la place (sinon, si vous ne fournissez pas de fichier CSS, il créera un nouvel élément de style et l’ajoutera à la tête existante (il créera au plus un nouvel élément de style et le réutilisera lors de futurs appels de fonctions). 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);
    }
}
0
Jon