您可以使用less(或其他具有客户端支持的预处理器)。我从来没有做过这样的事情,但这很有可能,可能适合你。
如果您从未使用过CSS预处理器,那么在继续操作之前,您可能需要先关注该主题。
基本的想法是将变量用于任何要管理员可修改的数据。这些将被持久化在服务器端(可能在数据库中),然后用于生成一个单独的“变量”较少的文件。需要注意的是,因为less
需要这个文件来编译,必须生成并保存到磁盘:
/* variables.less */
@mainContentWidth: 55%;
然后有可能的,某种生成的映射的JavaScript/JSON映射,这将被用来填充表单控件:
/* variables.js */
window.LESSVARS = {
// `type` here totally just an idea, but the idea is that a "percentage"
// field might be controlled with a slider, etc.
mainContentWidth: { value: "55%", type: "percentage" }
}
对于你的CSS的其余部分,无论您使用的较少的其他功能是你的,但这里的关键部分是,你使用你定义的变量适用:
/* styles.less */
@import "variables.less";
#MainContent { width: @mainContentWidth; }
一般公众将永远不会看到任何这一点,因为他们将送达编译styles.css
这使它一起,简单地说:
<link rel="stylesheet" type="text/css" href="styles.css">
但管理,而另一方面,将接收未编译少和映射JavaScript对象,这将被用来建立表单控件和维护状态:
<link rel="stylesheet/less" type="text/css" href="variables.less" />
<link rel="stylesheet/less" type="text/css" href="styles.less" />
<script src="variables.js" type="text/javascript"></script>
<script src="less.js" type="text/javascript"></script>
现在,当管理员操纵而不是用jQuery的内联样式表单控件,你不是更新通过less.modifyVars
页面:
// something like this, which updates the less variable state and then
// sends it to less which will recompile the CSS. Note that this is
// just a simple example. In the real version you'd probably want to
// track changes, etc.
function setVar(name, value) {
LESSVARS[name].value = val;
var o = {};
o['@'+name] = value;
less.modifyVars(o);
}
// which you'd then call on form control change
setVar('mainContentWidth', '30%');
最后,一旦管理员想要保存更改,他们就会提交更改后的状态以进行保存。这可能是整个LESSVARS
对象或只是跟踪的更改。在服务器端,您将存储这些更改并触发variables.less
的重写和styles.less
的重新编译。
由于css规则的排序顺序而不简单...进行内联更改,例如使用'$完成。css()'具有最高优先级。所以,如果有相同的选择器有4个其他规则......很难知道文件中要更改什么。并改变'#MainContent'共享一个规则,而不是与'#Sidebar'相关的维度...添加'width'可能会使整个布局搞砸 – charlietfl
我正在考虑像素修正百分比和相应地调整其他元素来填充'我的JavaScript/jQuerry代码中的'空白'。我只需要将所有这些更改保存到CSS中,同时保持所有这些不变。所以如果我改变了一个元素的宽度,我就会覆盖它的宽度,它是邻居,但是我会独自留下它们的背景色,文本字体等所有其他元素的所有其他属性。 – KrisRogo