// style element or locally sourced link element
var sheet = YAHOO.util.StyleSheet(YAHOO.util.Selector.query('style',null,true));
sheet = YAHOO.util.StyleSheet(YAHOO.util.Dom.get('local'));
// OR the id of a style element or locally sourced link element
sheet = YAHOO.util.StyleSheet('local');
// OR string of css text
var css = ".moduleX .alert { background: #fcc; font-weight: bold; } " +
".moduleX .warn { background: #eec; } " +
".hide_messages .moduleX .alert, " +
".hide_messages .moduleX .warn { display: none; }";
sheet = new YAHOO.util.StyleSheet(css);
// RESULT: doesn't work in IE8 and below. Works in IE9 and other browsers.
$(document).ready(function() {
// we want to load the css as a text file and append it with a style.
$.ajax({
url:'myCss.css',
success: function(result) {
var s = document.createElement('style');
s.setAttribute('type', 'text/css');
s.innerHTML = result;
document.getElementsByTagName("head")[0].appendChild(s);
},
fail: function() {
alert('fail');
}
})
});
然后你可以让它拉一个像myCss.css这样的外部文件
.myClass { background:#F00; }
3
这是Vishwanath的解决方案略有改写评论:
function setStyle(cssRules, aSelector, aStyle){
for(var i = 0; i < cssRules.length; i++) {
if(cssRules[i].selectorText && cssRules[i].selectorText.toLowerCase() == aSelector.toLowerCase()) {
cssRules[i].style.cssText = aStyle;
return true;
}
}
return false;
}
function createCSSSelector(selector, style) {
var doc = document;
var allSS = doc.styleSheets;
if(!allSS) return;
var headElts = doc.getElementsByTagName("head");
if(!headElts.length) return;
var styleSheet, media, iSS = allSS.length; // scope is global in a function
/* 1. search for media == "screen" */
while(iSS){ --iSS;
if(allSS[iSS].disabled) continue; /* dont take into account the disabled stylesheets */
media = allSS[iSS].media;
if(typeof media == "object")
media = media.mediaText;
if(media == "" || media=='all' || media.indexOf("screen") != -1){
styleSheet = allSS[iSS];
iSS = -1; // indication that media=="screen" was found (if not, then iSS==0)
break;
}
}
/* 2. if not found, create one */
if(iSS != -1) {
var styleSheetElement = doc.createElement("style");
styleSheetElement.type = "text/css";
headElts[0].appendChild(styleSheetElement);
styleSheet = doc.styleSheets[allSS.length]; /* take the new stylesheet to add the selector and the style */
}
/* 3. add the selector and style */
switch (typeof styleSheet.media) {
case "string":
if(!setStyle(styleSheet.rules, selector, style));
styleSheet.addRule(selector, style);
break;
case "object":
if(!setStyle(styleSheet.cssRules, selector, style));
styleSheet.insertRule(selector + "{" + style + "}", styleSheet.cssRules.length);
break;
}
// Use plugins.
jss.use(camelCase())
// Create your style.
const style = {
myButton: {
color: 'green'
}
}
// Compile styles, apply plugins.
const sheet = jss.createStyleSheet(style)
// If you want to render on the client, insert it into DOM.
sheet.attach()
333
使用谷歌关闭:
你可以使用ccsom模块:
goog.require('goog.cssom');
var css_node = goog.cssom.addCssText('.cssClass { color: #F00; }');
13 回答
虽然我不确定您为什么要使用JavaScript创建CSS类,但这里有一个选项:
找到了更好的解决方案, works across all browsers.
使用document.styleSheet添加或替换规则 . 接受的答案简短而方便,但这适用于IE8,也不太常见 .
功能如下使用 .
请注意,即使函数名称是createClass,它实际上也会创建一个选择器 . 所以别忘了在你的 class 名字之前加上 . (句号) . 无需提及您也可以使用此功能创建其他选择器 .
简而言之,这是“兼容所有浏览器”(特别是IE8 / 7):
最后一位将类应用于元素:
这是一个小测试页面:https://gist.github.com/shadybones/9816763
关键的一点是,样式元素具有“styleSheet”/“sheet”属性,您可以使用它来添加/删除规则 .
有一个轻量级jQuery插件,允许生成CSS声明:jQuery-injectCSS
实际上,它使用JSS(JSON描述的CSS),但是为了生成动态css样式表,它很容易处理 .
YUI到目前为止我已经看到了最好的stylesheet utility . 我鼓励你看一下,但这里有一个味道:
显然有其他更简单的方法可以动态改变样式,例如这里建议的那些 . 如果它们对你的问题有意义,那么它们可能是最好的,但肯定有理由为什么修改css是一个更好的解决方案 . 最明显的情况是需要修改大量元素 . 另一个主要案例是如果您需要更改样式以涉及级联 . 使用dom修改元素将始终具有更高的优先级 . 它是大锤的方法,相当于直接在html元素上使用style属性 . 这并不总是预期的效果 .
从IE 9开始 . 您现在可以加载文本文件并设置style.innerHTML属性 . 所以基本上你现在可以通过ajax加载一个css文件(并获得回调),然后只需在这样的样式标签内设置文本 .
这适用于其他浏览器,不知道有多远 . 但只要你不需要支持IE8那么它就可以了 .
然后你可以让它拉一个像myCss.css这样的外部文件
这是Vishwanath的解决方案略有改写评论:
https://jsfiddle.net/xk6Ut/256/
在JavaScript中动态创建和更新CSS类的一个选项:
使用样式元素创建CSS部分
使用样式元素的ID,以便我们可以更新CSS
类
.....
...
一个可以帮助你完成任务的有趣项目是JSS .
JSS库允许您使用
.attach()
函数注入DOM / head部分 .Repl online version进行评估 .
进一步information on JSS .
一个例子:
使用谷歌关闭:
你可以使用ccsom模块:
将css节点放入文档头时,javascript代码尝试跨浏览器 .
看看答案,最明显和最直接的缺失:使用
document.write()
写出你需要的一大块CSS .这是一个例子(在codepen上查看:http://codepen.io/ssh33/pen/zGjWga):
为了搜索者的利益;如果您使用的是jQuery,则可以执行以下操作:
显然你可以将内部css改为你想要的任何东西 .
欣赏一些人更喜欢纯JavaScript,但它的工作原理非常强大,可以动态地编写/覆盖样式 .