Come posso impostare più stili CSS in JavaScript?


189

Ho le seguenti variabili JavaScript:

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

So che posso impostarli sul mio elemento in modo iterativo in questo modo:

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

È possibile metterli tutti insieme in una volta, qualcosa del genere?

document.getElementById("myElement").style = allMyStyle 

1
Quale sarebbe allMyStylenel tuo esempio? All'inizio hai un elenco di singole variabili ...
Felix Kling,

1
font-size: 12px; sinistra: 200px; in alto: 100px
Mircea,

1
Se funzionasse, sarebbe una stringa contenente tutto il CSS da impostare: document.getElementById ("myElement"). Style = font-size: 12px; sinistra: 200px; in alto: 100px
Mircea,

@Mircea: dai un'occhiata alla mia risposta .... puoi usare cssText.
Felix Kling,

@Felix Kling questo è quello che sto cercando. Non fare molti riflui e ridisegni. Non sono sicuro che funzionerà con il mio codice, ma dovrebbe essere così! Grazie
Mircea,

Risposte:


277

Se hai i valori CSS come stringa e non ci sono altri CSS già impostati per l'elemento (o non ti interessa la sovrascrittura), usa la cssTextproprietà :

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

Questo è buono in un certo senso in quanto evita di ridipingere l'elemento ogni volta che cambi una proprietà (in qualche modo le cambi tutte in una volta).

Dall'altro lato, dovresti prima costruire la stringa.


64
document.getElementById ("myElement"). style.cssText + = ';' + cssString; restituirà un valore 'normalizzato' per element.style.cssText- la nuova stringa sostituirà le proprietà nominate esistenti con eventuali nuovi valori, aggiungendone di nuovi e lascerà il resto da solo.
Kennebec,

2
@kennebec: l'ho appena provato e hai ragione. Non lo sapevo, pensavo solo che si aggiungesse al testo già esistente. Ma in effetti sostituisce i valori ...
Felix Kling,

1
Speravo che qualcuno lo prendesse e lo usasse, non l'ho mai visto documentato. Buona risposta, comunque.
Kennebec,

33
@kennebec Ho condotto un test jsperf e ho scoperto che l'applicazione di più regole css in una sequenza rispetto all'utilizzo del metodo cssText è più veloce: jsperf.com/csstext-vs-multiple-css-rules/4
Andrei Oniga

2
@RohitTigga: una stringa contenente regole CSS. Es display: block; position: absolute;.
Felix Kling,

280

Utilizzando Object.assign :

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

Questo ti dà anche la possibilità di unire gli stili, invece di riscrivere lo stile CSS.

Puoi anche creare una funzione di scelta rapida:

const setStylesOnElement = function(styles, element){
    Object.assign(element.style, styles);
}

16
purtroppo questo metodo non è supportato da IE11 kangax.github.io/compat-table/es6/...
AndrewSilver

2
@AndrewSilver - Usa babel && una delle tante librerie polyfill per ottenere supporto per le funzionalità ES6 nei browser non compatibili.
Periata Breatta,

1
Quando usi babel, questo è il metodo da seguire! Perfetto!
nirazul,

1
@Nirazul Come si usa? Ci provo document.querySelector('html').style = Object.assign({}, document.querySelector('html').style, { color: 'red'})ma non succede nulla.
Jonathan Dion,

1
Questo sarà sufficiente, quando si espande un semplice oggetto javascript - Non è necessario assegnare nulla: Object.assign(document.querySelector('html').style, { color: 'red' });... Assicurati solo che lo stile non sia sovrascritto in un elemento inferiore. Questo è molto probabile quando lo si utilizza htmlsull'elemento.
nirazul,

51

@Mircea: è molto facile impostare più stili per un elemento in una singola istruzione. Non influisce sulle proprietà esistenti ed evita la complessità di utilizzare loop o plugin.

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

ATTENZIONE: se, in seguito, si utilizza questo metodo per aggiungere o modificare le proprietà di stile, le proprietà precedenti impostate usando 'setAttribute' verranno cancellate.


removeAttributepotrebbe tornare utile per coloro che potrebbero pensare di utilizzare setAttributeper ripristinare lo stile
che-azeh

41

Crea una funzione per occupartene e passale i parametri con gli stili che vuoi cambiare.

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

e chiamalo così

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

per i valori delle proprietà all'interno di propertyObject è possibile utilizzare le variabili ..


Stavo usando la proprietà .style ogni volta individualmente per non sovrascrivere se dovessi cambiare uno stile, ma funziona meglio, più condensato.
Dragonore,

2
La migliore soluzione, perché flessibile e utile come cssText, ma più veloce.
Simon Steinberger,

17

Una libreria JavaScript ti consente di fare queste cose molto facilmente

jQuery

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

Oggetto e for-in-loop

Oppure, un metodo molto più elegante è un oggetto di base e for-loop

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

for(i in css){
   el.style[i] = css[i];
}

2
Sì, ma su questo progetto non posso usare jQuery ... Grazie
Mircea,

devi scrivere fontsize come fontSize?
midstack

1
Sì. Le proprietà fanno distinzione tra maiuscole e minuscole, anche quando si utilizza la notazione di stringa. Dovrebbe essere fontSize: 12px.
MyNameIsKo

Direi dimensione del carattere;)
mikus

14

imposta più proprietà di stile CSS in Javascript

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

o

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

Esempio:

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

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

13

Sono appena inciampato qui e non vedo perché ci sia così tanto codice necessario per raggiungere questo obiettivo.

Aggiungi il tuo codice CSS come stringa.

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

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


1
Uso questo metodo anche perché è utile se non si hanno altri stili in linea, ma a volte causa problemi.
Любопытный,

Se si verificano problemi, solo a causa di una cattiva implementazione. Tutto dipende da come, quando e dove lo applichi al tuo codice.
Thielicious il

3

Puoi avere singole classi nei tuoi file css e quindi assegnare il nome della classe al tuo elemento

oppure puoi scorrere le proprietà degli stili come -

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

for(var prop in css) {
  document.getElementById("myId").style[prop] = css[prop];
}

Questa non è un'opzione, le variabili sono dinamiche
Mircea,

Questo non è esattamente ciò che l'utente ha chiesto, ma è probabilmente la soluzione più praticabile. +1
Ryan Kinal,

2
@Sachin "font-size" deve essere inserito come "fontSize". I nomi di stile ibridi non sono garantiti per funzionare su tutti i browser, a meno che non si usi setAttribute.
Ashwin Prabhu,

2

Non pensare che sia possibile in quanto tale.

Ma potresti creare un oggetto fuori dalle definizioni di stile e semplicemente passarci attraverso.

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

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

Per sviluppare ulteriormente, crearne una funzione:

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

setStyles(document.getElementById("myElement"), allMyStyle);

2

Utilizzando Javascript semplice, non è possibile impostare tutti gli stili contemporaneamente; devi usare linee singole per ognuna di esse.

Tuttavia, non è necessario ripetere più volte il document.getElementById(...).style.codice; crea una variabile oggetto per farne riferimento e renderai il tuo codice molto più leggibile:

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

...eccetera. Molto più facile da leggere rispetto al tuo esempio (e francamente, altrettanto facile da leggere come l'alternativa jQuery).

(se Javascript fosse stato progettato correttamente, avresti potuto usare anche la withparola chiave, ma è meglio lasciarla sola, poiché può causare alcuni problemi di spazio dei nomi)


1
Questo non è vero, puoi impostare tutti gli stili contemporaneamente tramite cssText.
Felix Kling,

2
@Felix: cssTextva bene per impostare il valore del foglio di stile in linea. Tuttavia, se hai anche delle classi o se vuoi solo sovrascrivere alcuni valori ma non tutti, può essere piuttosto difficile da usare cssText. Quindi hai ragione; puoi farlo, ma lo sconsiglio per la maggior parte dei casi d'uso.
Spudley,

1
Anche avere classi non è un argomento ... obj.topo obj.style.coloranche le giuste impostano il valore del foglio di stile in linea. E sì, nella mia risposta ho detto che si sovrascriverebbero i valori ... dipende dal contesto se è utile o meno.
Felix Kling,

1
È meglio che tu faccia obj = document.getElementById ("myElement"). Style; oppure imposta le tue proprietà obj.style.top = top.
Kennebec,

@kennebec - hmm, avrei giurato di averlo fatto. vabbè, curato. grazie per aver individuato.
Spudley,

1

La tua scommessa migliore potrebbe essere quella di creare una funzione che imposta gli stili da solo:

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

Nota che dovrai comunque usare i nomi delle proprietà compatibili con javascript (quindi backgroundColor)


1

Vedi per ... in

Esempio:

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

1

Questo è un vecchio thread, quindi ho pensato a chiunque cerchi una risposta moderna, suggerirei di usare 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);

1

Ci sono scenari in cui l'uso di CSS insieme a JavaScript potrebbe avere più senso con un simile problema. Dai un'occhiata al seguente codice:

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

Questo passa semplicemente tra le classi CSS e risolve tanti problemi legati agli stili di override. Rende anche il tuo codice più ordinato.


0

È possibile scrivere una funzione che imposterà le dichiarazioni singolarmente per non sovrascrivere le dichiarazioni esistenti che non vengono fornite. Supponiamo che tu abbia questo elenco di parametri delle dichiarazioni:

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

Potresti scrivere una funzione simile a questa:

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

che accetta un elemente un objectelenco di proprietà delle dichiarazioni di stile da applicare a quell'oggetto. Ecco un esempio di utilizzo:

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

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


0

Penso che sia un modo molto semplice per quanto riguarda tutte le soluzioni sopra:

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

0

Utilizzare il CSSStyleDeclaration.setProperty()metodo all'interno Object.entriesdell'oggetto of styles.
Con questo possiamo anche impostare la priorità ("importante") per la proprietà CSS.
Useremo i nomi delle proprietà 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>


0

Il seguente innerHtml è valido

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


0

Con ES6 + puoi usare anche i backtick e persino copiare i CSS direttamente da qualche parte:

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)


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

-1

Possiamo aggiungere la funzione di stili al prototipo del nodo:

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

Quindi, chiama semplicemente il metodo styles su qualsiasi nodo:

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

Conserverà tutti gli altri stili esistenti e sovrascriverà i valori presenti nel parametro oggetto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.