Wie kann ich mehrere CSS-Stile in JavaScript festlegen?

189

Ich habe die folgenden JavaScript-Variablen:

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

Ich weiß, dass ich sie iterativ wie folgt auf mein Element setzen kann:

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

Ist es möglich, sie alle auf einmal zusammenzusetzen, so etwas?

document.getElementById("myElement").style = allMyStyle 
Mircea
quelle
1
Was wäre allMyStylein Ihrem Beispiel? Am Anfang haben Sie eine Liste einzelner Variablen ...
Felix Kling
1
Schriftgröße: 12px; links: 200px; oben: 100px
Mircea
1
Wenn dies funktionieren würde, wäre es eine Zeichenfolge, die das gesamte einzustellende CSS enthält: document.getElementById ("myElement"). Style = font-size: 12px; links: 200px; oben: 100px
Mircea
@Mircea: Schau dir meine Antwort an .... du kannst sie benutzen cssText.
Felix Kling
@ Felix Kling das ist was ich suche. Nicht viele Rückflüsse und Neulackierungen. Ich bin nicht sicher, ob es mit meinem Code funktioniert, aber das sollte es sein! Vielen Dank
Mircea

Antworten:

273

Wenn Sie die CSS-Werte als Zeichenfolge haben und für das Element noch kein anderes CSS festgelegt ist (oder Sie sich nicht für das Überschreiben interessieren), verwenden Sie die cssTextEigenschaft :

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

Dies ist in gewissem Sinne gut, da vermieden wird, dass das Element jedes Mal neu gestrichen wird, wenn Sie eine Eigenschaft ändern (Sie ändern sie alle irgendwie "auf einmal").

Auf der anderen Seite müssten Sie zuerst die Zeichenfolge erstellen.

Felix Kling
quelle
64
document.getElementById ("myElement"). style.cssText + = ';' + cssString; gibt einen 'normalisierten' Wert für element.style.cssText zurück - die neue Zeichenfolge ersetzt vorhandene benannte Eigenschaften durch neue Werte, fügt neue hinzu und lässt den Rest in Ruhe.
kennebec
2
@kennebec: Hab es einfach versucht und du hast recht. Ich wusste das nicht, ich dachte nur, dass es an den bereits vorhandenen Text angehängt wird. Aber es ersetzt tatsächlich die Werte ...
Felix Kling
1
Ich hoffte, jemand würde das bekommen und es benutzen - ich habe es nie dokumentiert gesehen. Gute Antwort übrigens.
kennebec
33
@kennebec Ich habe einen jsperf-Test durchgeführt und festgestellt, dass das Anwenden mehrerer CSS-Regeln in einer Sequenz im Gegensatz zur Verwendung der cssText-Methode schneller ist: jsperf.com/csstext-vs-multiple-css-rules/4
Andrei Oniga
2
@RohitTigga: Eine Zeichenfolge, die CSS-Regeln enthält. ZB display: block; position: absolute;.
Felix Kling
276

Verwenden von Object.assign :

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

Auf diese Weise können Sie auch Stile zusammenführen, anstatt den CSS-Stil neu zu schreiben.

Sie können auch eine Verknüpfungsfunktion erstellen:

const setStylesOnElement = function(styles, element){
    Object.assign(element.style, styles);
}
Laimis
quelle
16
Leider wird diese Methode von IE11 nicht unterstützt. kangax.github.io/compat-table/es6/…
AndrewSilver
2
@AndrewSilver - Verwenden Sie babel && eine der vielen Polyfill-Bibliotheken, um Unterstützung für ES6-Funktionen in nicht kompatiblen Browsern zu erhalten.
Periata Breatta
1
Wenn Sie babel verwenden, ist dies die richtige Methode! Perfekt!
Nirazul
1
@ Nirazul Wie benutzt man es? Ich versuche document.querySelector('html').style = Object.assign({}, document.querySelector('html').style, { color: 'red'})aber nichts passiert.
Jonathan Dion
1
Dies reicht aus, wenn Sie ein einfaches Javascript-Objekt erweitern. Sie müssen überhaupt nichts zuweisen: Object.assign(document.querySelector('html').style, { color: 'red' });... Stellen Sie nur sicher, dass der Stil nicht in einem niedrigeren Element überschrieben wird. Dies ist sehr wahrscheinlich, wenn Sie es für das htmlElement verwenden.
Nirazul
51

@Mircea: Es ist sehr einfach, mehrere Stile für ein Element in einer einzelnen Anweisung festzulegen. Dies wirkt sich nicht auf die vorhandenen Eigenschaften aus und vermeidet die Komplexität von Loops oder Plugins.

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

VORSICHT: Wenn Sie diese Methode später zum Hinzufügen oder Ändern von Stileigenschaften verwenden, werden die vorherigen Eigenschaften, die mit 'setAttribute' festgelegt wurden, gelöscht.

SCHAFT
quelle
removeAttributekönnte für diejenigen nützlich sein, die daran denken könnten, setAttributeden Stil zurückzusetzen
che-azeh
40

Erstellen Sie eine Funktion, um sich darum zu kümmern, und übergeben Sie die Parameter mit den Stilen, die Sie ändern möchten.

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

und nenne es so

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

Für die Werte der Eigenschaften im propertyObject können Sie Variablen verwenden.

Gabriele Petrioli
quelle
Ich habe die .style-Eigenschaft jedes Mal einzeln verwendet, um nicht zu überschreiben, wenn ich einen Stil ändern würde, aber dies funktioniert besser und komprimierter.
Dragonore
1
Beste Lösung, weil so flexibel und nützlich wie cssText, aber schneller.
Simon Steinberger
17

Mit einer JavaScript-Bibliothek können Sie diese Dinge sehr einfach erledigen

jQuery

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

Objekt und eine For-in-Schleife

Oder eine viel elegantere Methode ist ein grundlegendes Objekt und eine for-Schleife

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

for(i in css){
   el.style[i] = css[i];
}
Harmen
quelle
2
Ja, aber für dieses Projekt kann ich jQuery nicht verwenden ... Danke
Mircea
Müssen Sie Schriftgröße als Schriftgröße schreiben?
Midack
1
Ja. Bei Eigenschaften wird zwischen Groß- und Kleinschreibung unterschieden, auch wenn die Zeichenfolgennotation verwendet wird. Es sollte fontSize sein: 12px.
MyNameIsKo
Ich würde sagen Schriftgröße;)
Mikus
14

Legen Sie mehrere CSS-Stileigenschaften in Javascript fest

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

oder

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

Beispiel:

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

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

Ich bin gerade hier reingestolpert und verstehe nicht, warum so viel Code erforderlich ist, um dies zu erreichen.

Fügen Sie Ihren CSS-Code als Zeichenfolge hinzu.

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

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

Thielicious
quelle
1
Ich verwende diese Methode auch, weil sie nützlich ist, wenn Sie keine anderen Inline-Stile haben, aber manchmal Probleme verursacht.
20бопытный
Wenn Probleme auftreten, dann nur aufgrund einer schlechten Implementierung. Es hängt alles davon ab, wie, wann und wo Sie es auf Ihren Code anwenden.
Thielicious
3

Sie können einzelne Klassen in Ihren CSS-Dateien haben und dann Ihrem Element den Klassennamen zuweisen

oder Sie können die Eigenschaften von Stilen wie folgt durchlaufen:

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

for(var prop in css) {
  document.getElementById("myId").style[prop] = css[prop];
}
Sachin Shanbhag
quelle
Das ist keine Option, da die Variablen dynamisch sind
Mircea
Dies ist nicht genau das, was der Benutzer gefragt hat, aber es ist höchstwahrscheinlich die praktikabelste Lösung. +1
Ryan Kinal
2
@Sachin "font-size" muss als "fontSize" mit einem Kamel versehen sein. Es wird nicht garantiert, dass hyphnierte Stilnamen in allen Browsern funktionieren, es sei denn, Sie verwenden setAttribute.
Ashwin Prabhu
2

Glaube nicht, dass es als solches möglich ist.

Sie können jedoch ein Objekt aus den Stildefinitionen erstellen und diese einfach durchlaufen.

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

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

Um sich weiterzuentwickeln, machen Sie eine Funktion dafür:

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

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

Mit einfachem Javascript können Sie nicht alle Stile gleichzeitig festlegen. Sie müssen für jede einzelne Zeile einzelne Zeilen verwenden.

Sie müssen den document.getElementById(...).style.Code jedoch nicht immer wieder wiederholen . Wenn Sie eine Objektvariable erstellen, um darauf zu verweisen, wird Ihr Code viel lesbarer:

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

...etc. Viel einfacher zu lesen als Ihr Beispiel (und ehrlich gesagt genauso einfach zu lesen wie die jQuery-Alternative).

(Wenn Javascript richtig entworfen worden wäre, hätten Sie auch das withSchlüsselwort verwenden können, aber das sollte am besten in Ruhe gelassen werden, da es einige böse Namespace-Probleme verursachen kann.)

Spudley
quelle
1
Das stimmt nicht, Sie können alle Stile gleichzeitig über einstellen cssText.
Felix Kling
2
@Felix: cssTexteignet sich gut zum Festlegen des Inline-Stylesheet-Werts. Wenn Sie jedoch auch Klassen haben oder nur einige, aber nicht alle Werte überschreiben möchten, kann die Verwendung recht schwierig sein cssText. Du hast also recht; Sie können es tun, aber ich würde für die meisten Anwendungsfälle dagegen empfehlen.
Spudley
1
Klassen zu haben ist kein Argument ... obj.topoder obj.style.colorlegt nur den Inline-Stylesheet-Wert fest. Und ja, in meiner Antwort habe ich gesagt, dass man die Werte überschreiben würde ... es hängt vom Kontext ab, ob es nützlich ist oder nicht.
Felix Kling
1
Machen Sie besser das obj = document.getElementById ("myElement"). Style; oder setzen Sie Ihre Eigenschaften obj.style.top = top.
kennebec
@kennebec - hmm, hätte schwören können, dass ich das getan habe. na ja, bearbeitet. Danke fürs Erkennen.
Spudley
1

Am besten erstellen Sie eine Funktion, mit der Sie Stile selbst festlegen können:

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

Beachten Sie, dass Sie weiterhin die Javascript-kompatiblen Eigenschaftsnamen verwenden müssen (daher backgroundColor)

Ryan Kinal
quelle
1

Siehe für .. in

Beispiel:

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

Dies ist ein alter Thread, daher habe ich für jeden, der nach einer modernen Antwort sucht, die Verwendung von Object.keys () vorgeschlagen.

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

Es gibt Szenarien, in denen die Verwendung von CSS neben Javascript bei einem solchen Problem möglicherweise sinnvoller ist. Sehen Sie sich den folgenden Code an:

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

Dies wechselt einfach zwischen CSS-Klassen und löst so viele Probleme im Zusammenhang mit überschreibenden Stilen. Es macht Ihren Code sogar aufgeräumter.

che-azeh
quelle
0

Sie können eine Funktion schreiben, mit der Deklarationen einzeln festgelegt werden, um vorhandene Deklarationen, die Sie nicht angeben, nicht zu überschreiben. Angenommen, Sie haben diese Objektparameterliste mit Deklarationen:

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

Sie könnten eine Funktion schreiben, die so aussieht:

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

Dies erfordert eine elementund eine objectEigenschaftsliste von Stildeklarationen, die auf dieses Objekt angewendet werden sollen. Hier ist ein Anwendungsbeispiel:

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

Ich denke, dies ist ein sehr einfacher Weg in Bezug auf alle oben genannten Lösungen:

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

Verwenden Sie die CSSStyleDeclaration.setProperty()Methode innerhalb Object.entriesdes Objekts of styles.
Damit können wir auch die Priorität ("wichtig") für die CSS-Eigenschaft festlegen.
Wir werden CSS-Eigenschaftsnamen "Hypen-Case" verwenden.

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

Ist das unten stehende innerHtml gültig?

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.
quelle
0

Mit ES6 + können Sie auch Backticks verwenden und das CSS sogar direkt von irgendwoher kopieren:

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

Wir können dem Node-Prototyp eine Styles-Funktion hinzufügen:

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

Rufen Sie dann einfach die Styles-Methode auf einem beliebigen Knoten auf:

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

Alle anderen vorhandenen Stile und Überschreibungswerte, die im Objektparameter vorhanden sind, bleiben erhalten.

bewundernhodzic
quelle