Comment puis-je définir plusieurs styles CSS dans JavaScript?

189

J'ai les variables JavaScript suivantes:

var fontsize = "12px"
var left= "200px"
var top= "100px"

Je sais que je peux les définir sur mon élément de manière itérative comme ceci:

document.getElementById("myElement").style.top=top
document.getElementById("myElement").style.left=left

Est-il possible de les mettre tous ensemble à la fois, quelque chose comme ça?

document.getElementById("myElement").style = allMyStyle 
Mircea
la source
1
Que serait allMyStyledans votre exemple? Au début, vous avez une liste de variables uniques ...
Felix Kling
1
taille de la police: 12px; à gauche: 200px; haut: 100px
Mircea
1
Si cela fonctionnait, ce serait une chaîne contenant tout le CSS à définir: document.getElementById ("myElement"). Style = font-size: 12px; à gauche: 200px; haut: 100px
Mircea
@Mircea: Jetez un œil à ma réponse .... vous pouvez utiliser cssText.
Felix Kling
@Felix Kling c'est ce que je recherche. Ne pas faire beaucoup de refoulements et de repeints. Je ne sais pas si cela fonctionnera avec mon code, mais cela devrait être tout! Thanx
Mircea

Réponses:

277

Si vous avez les valeurs CSS sous forme de chaîne et qu'aucun autre CSS n'est déjà défini pour l'élément (ou que vous ne vous souciez pas de l'écrasement), utilisez la cssTextpropriété :

document.getElementById("myElement").style.cssText = "display: block; position: absolute";

C'est bien dans un sens car cela évite de repeindre l'élément à chaque fois que vous modifiez une propriété (vous les changez tous "à la fois" d'une manière ou d'une autre).

De l'autre côté, vous devrez d'abord créer la chaîne.

Félix Kling
la source
64
document.getElementById ("myElement"). style.cssText + = ';' + cssString; renverra une valeur «normalisée» pour element.style.cssText - la nouvelle chaîne remplacera les propriétés nommées existantes par de nouvelles valeurs, en ajoutera de nouvelles et laissera le reste seul.
kennebec
2
@kennebec: Je viens de l'essayer et vous avez raison. Je ne le savais pas, je pensais juste que cela s'ajoutait au texte déjà existant. Mais cela remplace effectivement les valeurs ...
Felix Kling
1
J'espérais que quelqu'un l'obtiendrait et l'utiliserait - je ne l'ai jamais vu documenté. Bonne réponse, au fait.
kennebec
33
@kennebec J'ai effectué un test jsperf et j'ai constaté que l'application de plusieurs règles css dans une séquence plutôt que d'utiliser la méthode cssText est plus rapide: jsperf.com/csstext-vs-multiple-css-rules/4
Andrei Oniga
2
@RohitTigga: Une chaîne contenant des règles CSS. Par exemple display: block; position: absolute;.
Felix Kling
280

En utilisant Object.assign :

Object.assign(yourelement.style,{fontsize:"12px",left:"200px",top:"100px"});

Cela vous donne également la possibilité de fusionner les styles, au lieu de réécrire le style CSS.

Vous pouvez également créer une fonction de raccourci:

const setStylesOnElement = function(styles, element){
    Object.assign(element.style, styles);
}
Laimis
la source
16
malheureusement, cette méthode n'est pas prise en charge par IE11 kangax.github.io/compat-table/es6/…
AndrewSilver
2
@AndrewSilver - Utilisez babel && l'une des nombreuses bibliothèques polyfill pour obtenir la prise en charge des fonctionnalités ES6 dans les navigateurs non compatibles.
Periata Breatta
1
Lorsque vous utilisez babel, c'est la méthode à suivre! Parfait!
nirazul
1
@Nirazul Comment l'utiliser? J'essaye document.querySelector('html').style = Object.assign({}, document.querySelector('html').style, { color: 'red'})mais rien ne se passe.
Jonathan Dion
1
Cela suffira, car vous développez un simple objet javascript - Pas besoin d'attribuer quoi que ce soit: Object.assign(document.querySelector('html').style, { color: 'red' });... Assurez-vous simplement que le style n'est pas écrasé dans un élément inférieur. Ceci est très probable lors de son utilisation sur l' htmlélément.
nirazul
51

@Mircea: Il est très facile de définir les styles multiples pour un élément dans une seule instruction. Cela n'affecte pas les propriétés existantes et évite la complexité des boucles ou des plugins.

document.getElementById("demo").setAttribute(
   "style", "font-size: 100px; font-style: italic; color:#ff0000;");

ATTENTION: si, plus tard, vous utilisez cette méthode pour ajouter ou modifier des propriétés de style, les propriétés précédentes définies à l'aide de 'setAttribute' seront effacées.

JARRET
la source
removeAttributepourrait être utile pour ceux qui pourraient envisager d'utiliser setAttributepour réinitialiser le style
che-azeh
41

Créez une fonction pour vous en occuper et transmettez-lui les paramètres avec les styles que vous souhaitez modifier.

function setStyle( objId, propertyObject )
{
 var elem = document.getElementById(objId);
 for (var property in propertyObject)
    elem.style[property] = propertyObject[property];
}

et appelle ça comme ça

setStyle('myElement', {'fontsize':'12px', 'left':'200px'});

pour les valeurs des propriétés à l'intérieur de propertyObject, vous pouvez utiliser des variables.

Gabriele Petrioli
la source
J'utilisais la propriété .style à chaque fois individuellement afin de ne pas remplacer si je devais changer un style, mais cela fonctionne mieux, plus condensé.
dragonore
2
Meilleure solution, car aussi flexible et utile que cssText, mais plus rapide.
Simon Steinberger
17

Une bibliothèque JavaScript vous permet de faire ces choses très facilement

jQuery

$('#myElement').css({
  font-size: '12px',
  left: '200px',
  top: '100px'
});

Objet et une boucle for-in

Ou, une méthode beaucoup plus élégante est un objet de base et une boucle for

var el = document.getElementById('#myElement'),
    css = {
      font-size: '12px',
      left: '200px',
      top: '100px'
    };  

for(i in css){
   el.style[i] = css[i];
}
Harmen
la source
2
Oui, mais sur ce projet je ne peux pas utiliser jQuery ... Thanx
Mircea
besoin d'écrire la taille de la police comme taille de la police?
midstack
1
Oui. Les propriétés sont sensibles à la casse, même lors de l'utilisation de la notation de chaîne. Il doit s'agir de fontSize: 12px.
MyNameIsKo
Je dirais font-size;)
mikus
14

définir plusieurs propriétés de style css en Javascript

document.getElementById("yourElement").style.cssText = cssString;

ou

document.getElementById("yourElement").setAttribute("style",cssString);

Exemple:

document
.getElementById("demo")
.style
.cssText = "margin-left:100px;background-color:red";

document
.getElementById("demo")
.setAttribute("style","margin-left:100px; background-color:red");
eyupgevenim
la source
13

Je viens de trébucher ici et je ne vois pas pourquoi il faut tant de code pour y parvenir.

Ajoutez votre code CSS sous forme de chaîne.

let styles = `
    font-size:15em;
    color:red;
    transform:rotate(20deg)`

document.querySelector('*').style = styles
a

Thielicious
la source
1
J'utilise également cette méthode car elle est utile si vous n'avez pas d'autres styles en ligne, mais cela pose parfois des problèmes.
Любопытный
Si des problèmes surviennent, alors seulement une mauvaise mise en œuvre. Tout dépend comment, quand et où vous l'appliquez à votre code.
Thielicious
3

Vous pouvez avoir des classes individuelles dans vos fichiers css, puis attribuer le nom de classe à votre élément

ou vous pouvez parcourir les propriétés des styles comme -

var css = { "font-size": "12px", "left": "200px", "top": "100px" };

for(var prop in css) {
  document.getElementById("myId").style[prop] = css[prop];
}
Sachin Shanbhag
la source
Ce n'est pas une option car les variables sont dynamiques
Mircea
Ce n'est pas exactement ce que l'utilisateur a demandé, mais c'est probablement la solution la plus viable. +1
Ryan Kinal
2
@Sachin "font-size" doit être en chameau comme "fontSize". Il n'est pas garanti que les noms de style avec trait d'union fonctionnent sur tous les navigateurs, sauf si vous utilisez setAttribute.
Ashwin Prabhu le
2

Ne pensez pas que c'est possible en tant que tel.

Mais vous pouvez créer un objet à partir des définitions de style et simplement les parcourir en boucle.

var allMyStyle = {
  fontsize: '12px',
  left: '200px',
  top: '100px'
};

for (i in allMyStyle)
  document.getElementById("myElement").style[i] = allMyStyle[i];

Pour développer davantage, faites-lui une fonction:

function setStyles(element, styles) {
  for (i in styles)
    element.style[i] = styles[i];
}

setStyles(document.getElementById("myElement"), allMyStyle);
nnevala
la source
2

En utilisant du Javascript brut, vous ne pouvez pas définir tous les styles à la fois; vous devez utiliser des lignes uniques pour chacun d'eux.

Cependant, vous n'avez pas à répéter le document.getElementById(...).style.code encore et encore; créez une variable objet pour la référencer, et vous rendrez votre code beaucoup plus lisible:

var obj=document.getElementById("myElement").style;
obj.top=top;
obj.left=left;

...etc. Beaucoup plus facile à lire que votre exemple (et franchement, tout aussi facile à lire que l'alternative jQuery).

(si Javascript avait été conçu correctement, vous auriez pu également utiliser le withmot - clé, mais il vaut mieux le laisser seul, car cela peut causer des problèmes d'espace de noms désagréables)

Spudley
la source
1
Ce n'est pas vrai, vous pouvez définir tous les styles à la fois via cssText.
Felix Kling
2
@Felix: cssTextconvient pour définir la valeur de la feuille de style en ligne. Cependant, si vous avez aussi des classes, ou si vous ne voulez remplacer que certaines valeurs mais pas toutes, cela peut être assez difficile à utiliser cssText. Alors vous avez raison; vous pouvez le faire, mais je vous le déconseille pour la plupart des cas d'utilisation.
Spudley
1
Eh bien, avoir des classes n'est pas un argument ... obj.topou obj.style.colordéfinit également la valeur de la feuille de style en ligne. Et oui, dans ma réponse j'ai dit qu'on écraserait les valeurs ... ça dépend du contexte si c'est utile ou pas.
Felix Kling
1
Vous feriez mieux de faire que obj = document.getElementById ("myElement"). Style; ou définissez vos propriétés obj.style.top = top.
kennebec
@kennebec - hmm, j'aurais juré que je l'ai fait. eh bien, édité. merci d'avoir repéré.
Spudley
1

Votre meilleur pari peut être de créer une fonction qui définit vous-même les styles:

var setStyle = function(p_elem, p_styles)
{
    var s;
    for (s in p_styles)
    {
        p_elem.style[s] = p_styles[s];
    }
}

setStyle(myDiv, {'color': '#F00', 'backgroundColor': '#000'});
setStyle(myDiv, {'color': mycolorvar, 'backgroundColor': mybgvar});

Notez que vous devrez toujours utiliser les noms de propriétés compatibles javascript (d'où backgroundColor)

Ryan Kinal
la source
1

Voir pour .. dans

Exemple:

var myStyle = {};
myStyle.fontsize = "12px";
myStyle.left= "200px";
myStyle.top= "100px";
var elem = document.getElementById("myElement");
var elemStyle = elem.style;
for(var prop in myStyle) {
  elemStyle[prop] = myStyle[prop];
}
Onkelborg
la source
1

C'est un vieux fil, donc j'ai pensé que pour tous ceux qui recherchent une réponse moderne, je suggérerais d'utiliser Object.keys ();

var myDiv = document.getElementById("myDiv");
var css = {
    "font-size": "14px",
    "color": "#447",
    "font-family": "Arial",
    "text-decoration": "underline"
};

function applyInlineStyles(obj) {
    var result = "";
    Object.keys(obj).forEach(function (prop) {
        result += prop + ": " + obj[prop] + "; ";
    });
    return result;
}

myDiv.style = applyInlineStyles(css);
dragonore
la source
1

Il existe des scénarios où l'utilisation de CSS avec javascript pourrait avoir plus de sens avec un tel problème. Jetez un œil au code suivant:

document.getElementById("myElement").classList.add("newStyle");
document.getElementById("myElement").classList.remove("newStyle");

Cela bascule simplement entre les classes CSS et résout de nombreux problèmes liés aux styles de remplacement. Cela rend même votre code plus ordonné.

che-azeh
la source
0

Vous pouvez écrire une fonction qui définira les déclarations individuellement afin de ne pas écraser les déclarations existantes que vous ne fournissez pas. Disons que vous avez cette liste de paramètres d'objet de déclarations:

const myStyles = {
  'background-color': 'magenta',
  'border': '10px dotted cyan',
  'border-radius': '5px',
  'box-sizing': 'border-box',
  'color': 'yellow',
  'display': 'inline-block',
  'font-family': 'monospace',
  'font-size': '20px',
  'margin': '1em',
  'padding': '1em'
};

Vous pourriez écrire une fonction qui ressemble à ceci:

function applyStyles (el, styles) {
  for (const prop in styles) {
    el.style.setProperty(prop, styles[prop]);
  }
};

qui prend une elementet une objectliste de propriétés de déclarations de style à appliquer à cet objet. Voici un exemple d'utilisation:

const p = document.createElement('p');
p.textContent = 'This is a paragraph.';
document.body.appendChild(p);

applyStyles(p, myStyles);
applyStyles(document.body, {'background-color': 'grey'});

jsejcksn
la source
0

Je pense que c'est un moyen très simple en ce qui concerne toutes les solutions ci-dessus:

const elm = document.getElementById("myElement")

const allMyStyle = [
  { prop: "position", value: "fixed" },
  { prop: "boxSizing", value: "border-box" },
  { prop: "opacity", value: 0.9 },
  { prop: "zIndex", value: 1000 },
];

allMyStyle.forEach(({ prop, value }) => {
  elm.style[prop] = value;
});
Jalal
la source
0

Utilisez la CSSStyleDeclaration.setProperty()méthode à l'intérieur de l' Object.entriesobjet de styles.
Nous pouvons également définir la priorité ("important") pour la propriété CSS avec ceci.
Nous utiliserons des noms de propriétés CSS "hypen-case".

const styles = {
  "font-size": "18px",
  "font-weight": "bold",
  "background-color": "lightgrey",
  color: "red",
  "padding": "10px !important",
  margin: "20px",
  width: "100px !important",
  border: "1px solid blue"
};

const elem = document.getElementById("my_div");

Object.entries(styles).forEach(([prop, val]) => {
  const [value, pri = ""] = val.split("!");
  elem.style.setProperty(prop, value, pri);
});
<div id="my_div"> Hello </div>

sivako
la source
0

Le fichier innerHtml ci-dessous est-il valide?

var styleElement = win.document.createElement("STYLE");
styleElement.innerHTML = "#notEditableVatDisplay {display:inline-flex} #editableVatInput,.print-section,i.fa.fa-sort.click-sortable{display : none !important}";

Sandeep M
la source
0

Avec ES6 +, vous pouvez également utiliser des backticks et même copier le css directement de quelque part:

const $div = document.createElement('div')
$div.innerText = 'HELLO'
$div.style.cssText = `
    background-color: rgb(26, 188, 156);
    width: 100px;
    height: 30px;
    border-radius: 7px;
    text-align: center;
    padding-top: 10px;
    font-weight: bold;
`

document.body.append($div)

V. Sambor
la source
-1
<button onclick="hello()">Click!</button>

<p id="demo" style="background: black; color: aliceblue;">
  hello!!!
</p>

<script>
  function hello()
  {
    (document.getElementById("demo").style.cssText =
      "font-size: 40px; background: #f00; text-align: center;")
  }
</script>
Razzak Romy
la source
-1

Nous pouvons ajouter une fonction de styles au prototype Node:

Node.prototype.styles=function(obj){ for (var k in obj)    this.style[k] = obj[k];}

Ensuite, appelez simplement la méthode styles sur n'importe quel nœud:

elem.styles({display:'block', zIndex:10, transitionDuration:'1s', left:0});

Il conservera tous les autres styles existants et écrasera les valeurs présentes dans le paramètre d'objet.

admirhodzique
la source