Manchmal bin ich gezwungen, CSS-Stile programmgesteuert zum DOM hinzufügen (wenn Sie einen Grund brauchen: Stellen Sie sich vor, ein kleines Ui Widget, das mit einem eigenen Styling kommt aber nur aus einem bestehen soll einzelne * .js Datei für leichtere Handhabung). In diesem Fall bevorzuge ich die Definition des Stils in meinem Skriptcode mit Objektnotation anstelle einer großen Zeichenfolge, die Regeln, Eigenschaften und Markup mischt.Konvertieren CSS-Objekt in Style-Tag
var thumbHoverStyle = {
"background-color": "rgba(211, 211, 211, 0.5)",
"cursor": "pointer"
};
gegen
var thumbHoverStyle = "<style> .thumb:hover { background-color: rgba(211, 211, 211, 0.5); cursor: pointer; } </style>";
Eine solche CSS-Objekt kann leicht mit JQuery's .css() function verwendet werden, aber der Ärger beginnt, sobald ich einen css pseudo-class stylen möchte (in meinem Beispiel: Hover). In diesem Fall kann ich die JQuery-Funktion .css()
nicht verwenden und ich falle zurück, um ein entsprechendes style-Tag in mein DOM einzufügen.
var thumbHoverStyleTag = toStyleTag({ ".thumb:hover": thumbHoverStyle });
_root.append(thumbHoverStyleTag);
ich gegoogelt und stackoverflowed konnte aber nicht eine Nutzenfunktion finden, die mein CSS-Objekt in einen Stil-Tag konvertiert. Am Ende schrieb ich meine eigene Funktion (und ich werde es wahrscheinlich als Antwort auf diese Frage bereitstellen), aber ich möchte immer noch wissen, ob es eine Bibliotheksfunktion dafür gibt. Was ist die eleganteste Methode, dies zu erreichen?
bearbeiten
Meine Implementierung in Typoskript:
function appendPxIfNumber(value: any): string
{
return (typeof value === "number") ? "" + value + "px" : value;
}
function toStyleTag(rulesObj: any)
{
var combinedRules: string = "";
for (var selector in rulesObj)
{
var cssObject = rulesObj[selector];
var combinedProperties = "";
for (var prop in cssObject) {
var value = cssObject[prop];
combinedProperties += `${prop}: ${appendPxIfNumber(value)};` + "\n";
}
combinedRules += ` ${selector} {${combinedProperties}}` + "\n";
}
return $(`<style>${combinedRules}</style>`);
}
Anwendungsbeispiel:
var styleTag = toStyleTag({ ".thumb": thumbStyle, ".thumb:hover": thumbHoverStyle });
Oh schön, ich habe nicht daran gedacht, mit 'JSON stringify' mein CSS-Objekt in einen CSS-String zu konvertieren. – Martin