【发布时间】:2017-05-09 06:18:02
【问题描述】:
有时我不得不以编程方式将 CSS 样式添加到 DOM(如果你需要一个理由:想象一下编写一个带有自己的样式但应该只包含一个 *.js 文件的小型 ui 小部件以便更轻松处理)。在这种情况下,我更喜欢在我的脚本代码中使用对象表示法定义样式,而不是一个混合规则、属性和标记的大字符串。
var thumbHoverStyle = {
"background-color": "rgba(211, 211, 211, 0.5)",
"cursor": "pointer"
};
对
var thumbHoverStyle = "<style> .thumb:hover { background-color: rgba(211, 211, 211, 0.5); cursor: pointer; } </style>";
这样的 css 对象可以很容易地与 JQuery's .css() function 一起使用,但是一旦我想设置 css pseudo-class 的样式(在我的示例中为:hover),麻烦就开始了。在这种情况下,我不能使用 JQuery .css() 函数,我只能在我的 DOM 中插入相应的样式标签。
var thumbHoverStyleTag = toStyleTag( { ".thumb:hover": thumbHoverStyle } );
_root.append(thumbHoverStyleTag);
我用谷歌搜索和 stackoverflowed,但找不到将我的 css 对象转换为样式标签的实用程序函数。 最后我写了自己的函数(我可能会提供它作为这个问题的答案),但我仍然想知道是否有一个库函数。 实现此目的最优雅的方法是什么?
编辑
我在 TypeScript 中的实现:
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>`);
}
使用示例:
var styleTag = toStyleTag( { ".thumb": thumbStyle, ".thumb:hover": thumbHoverStyle } );
【问题讨论】:
标签: javascript jquery html css typescript