2016-02-25 14 views
7

Was ist eine gute Methode, um Stile dynamisch (d. H. Der Wert von Stilen wird zur Laufzeit erstellt) auf HTML-Elemente mit JavaScript anzuwenden?CSS dynamisch mit JavaScript anwenden

Ich bin auf der Suche nach einer Möglichkeit, ein JavaScript-Widget (JS, CSS und Markup) in einer einzigen Komponente (im Grunde ein Objekt) zu packen. Die Idee wäre, dass die Komponente den Stil kapselt (so haben die Benutzer eine nette API, um sie zu modifizieren, anstatt einen enger gekoppelten Ansatz, CSS direkt zu modifizieren und Änderungen indirekt anzuwenden). Das Problem besteht darin, dass ein einzelner API-Aufruf Änderungen an mehreren Gestaltungselementen zur Folge haben könnte.

Die Art, wie ich es tun würde, ist das CSS zu konstruieren und setzen Sie die style attribute auf die richtigen Elemente (am wahrscheinlichsten mit der ID zu vermeiden, Änderungen in anderen Bereichen der Markup anwenden). Ist das eine gute Lösung? Gibt es einen besseren Weg, es zu tun?

+1

Ich würde CSS-Regeln mit JS erstellen, die Inline-Stil-Lösung impliziert, dass Sie alle Stile Attribute ändern müssen, wenn Sie eine Änderung für eine Reihe von Elementen vornehmen müssen. – Hacketo

Antwort

4

Die Art, wie ich es tun würde, ist, das CSS zu konstruieren und das style-Attribut auf die richtigen Elemente zu setzen. Zum Beispiel:

var div = document.createElement('div'); 
div.setAttribute("style", "color: blue, margin-top:5px"); 
document.body.appendChild(div); 

Dieser Code wird ein neues div-Element mit dem Stil color: blue, margin-top:5px und hängen Sie ihn an der Seite erstellen.

+1

"Die Art, wie ich es tun würde, ist das CSS zu konstruieren und den Stil attribute auf die richtigen Elemente zu setzen" – Hacketo

+1

Ich würde lieber die 'style' -Eigenschaft des DOM-Elements anstelle der' setAttribute() ', etwas wie:' div.style = 'Farbe: blau, Rand oben: 5px'' –

+0

Sind das nicht alle gleich? –

5

JQuery Mit

Verwenden Sie die CSS (Funktion) Stil auf bestehende Elemente anzuwenden, wenn Sie ein Objekt enthält Arten passieren:

var styles = { 
    backgroundColor : "#ddd", 
    fontWeight: "" 
}; 
$("#myId").css(styles); 

Sie auch einen Stil zum Zeitpunkt anwenden können mit:

$("#myId").css("border-color", "#FFFFFF"); 

Vanil la JS:

var myDiv = document.getElementById("#myId"); 
myDiv.setAttribute("style", "border-color:#FFFFFF;"); 

Mit Css:

Sie können auch eine separate CSS-Datei verwenden, um die verschiedenen Stile enthalten, innerhalb von Klassen benötigt werden, und je nach Kontext hinzugefügt oder diese Klassen auf Ihre Elemente entfernen .

in Ihrem CSS-Datei können Sie Klassen wie

haben
.myClass { 
    background-color: red; 
} 

.myOtherClass { 
    background-color: blue; 
} 

Wieder jquery verwenden, um eine Klasse zu einem Element hinzuzufügen oder zu entfernen, können Sie

$("#myDiv").addClass('myClass'); 

oder

$("#myDiv").removeClass('myClass'); 
verwenden

Ich denke, das ist ein sauberer Weg, da es Ihren Stil von Ihrer Logik trennt. Wenn die Werte Ihres CSS jedoch davon abhängen, was vom Server zurückgegeben wird, kann es schwierig sein, diese Lösung anzuwenden.

+0

Cool, das gefällt mir. Ich möchte jedoch vordefinierte CSS vermeiden, da die Benutzer wissen müssen, wie das Widget intern strukturiert ist, wodurch die Kapselung aufgehoben wird. Vielen Dank! –

0

Ich könnte Ihre Frage falsch interpretieren, aber es klingt wie Sie nach einem einfachen architektonischen Muster fragen. Sie möchten etwas, das es für jemanden, der Ihr Widget verwendet, einfacher macht, es in seine Spezifikationen zu ändern?

Wenn dies der Fall ist, dann kenne ich kein spezielles Muster, um dies ohne Verwendung von CSS zu tun.

Ich kann Ihnen sagen, dass die "Widgets", die ich am einfachsten gefunden habe, separate CSS-Dateien haben. Ich habe es ziemlich einfach gefunden, sie an meine Bedürfnisse anzupassen. Ich denke, das liegt daran, dass die Struktur der Verwendung von CSS mit HTML und Javascript bereits ein schönes, einfaches Muster ist. Ich weiß nicht, dass es etwas Besseres gibt, vor allem wenn man bedenkt, dass die HTML/CSS-Beziehung den Leuten schon sehr vertraut ist.

+0

Die Frage bezieht sich auf die Erstellung von Komponenten mit JS, die unabhängig voneinander sein können. Während das, was Sie über HTML und CSS als Standard sagen, absolut stimmt, geht es hier eher darum, Dinge so zu verpacken, dass der Zusammenhalt verbessert und die Kopplung reduziert wird. So verpackt, müssen die Benutzer des Widgets nicht wissen, welches Styling für das Erstellen des Widgets verwendet wird. Dies hat den zusätzlichen Vorteil, dass sie nicht mehr als eine einzige API benötigen, um mit ihr interagieren zu können. –

+0

Ich denke, dass Sie. ATTR ('Stil', '...') oder. CSS ('Breite, etc', '0px, etc .. ") dann verwenden möchten. –