有可能实现你想要的,因为毕竟模板引擎生成文本,上下文决定它是否应该被解释为 HTML、SVG 或 CSS。
我使用的技术有点违反直觉,因为它使用样式标签,而且我们被教导不要将 CSS 嵌入 HTML 页面,但此建议的目的是分离 HTML 和 CSS ,在我即将解释的示例中仍然是这种情况。
假设您有一个包含 4 个属性的项目集合,这些属性与您希望如何在屏幕上呈现它们有关。
- 文本:内容字符串。
- color1 和 color2 :表示 HTML 颜色的字符串。
- 梯度:布尔值;如果为真,则使用带有 color1 和 color2 的背景渐变,然后在悬停时反转渐变;如果为 false,则使用 color1 作为背景色,然后在悬停时使用 color2。
让我们使用这个模式来填充一个集合。
Items=new Collection("items");
for(var i=0;i<10;i++){
Items.insert({
text:"Item "+i,
color1:"#"+Random.hexString(6),
color2:"#"+Random.hexString(6),
gradient:Random.choice([false,true])
});
}
现在我们定义一个模板来迭代我们的集合。
<template name="itemsList">
<ul class="items-list">
{{#each items}}
{{> item}}
{{/each}}
</ul>
</template>
最有趣的部分来了:我们使用一个样式标签来定义我们的内联 CSS,它是由一个专用的子模板生成的。
itemClass 模板被传递给被迭代的项目的当前上下文。
<template name="item">
<li class="item item-{{_id}}">
<style scoped>
{{> itemClass}}
</style>
{{text}}
</li>
</template>
我们的模板根据当前项目的属性生成 CSS:条件格式终于!
由于我们使用的是 Meteor,因此您的格式也会是反应式的,这有多酷?
<template name="itemClass">
height:64px;
.item-{{_id}}{
{{#if gradient}}
background:linear-gradient(to bottom, {{color1}} 5%, {{color2}} 100%);
{{else}}
background-color:{{color1}};
{{/if}}
}
.item-{{_id}}:hover,.item-{{_id}}:focus{
{{#if gradient}}
background:linear-gradient(to bottom, {{color2}} 5%, {{color1}} 100%);
{{else}}
background-color:{{color2}};
{{/if}}
}
</template>
注意:我使用的是 style 标签的 scoped 属性,它告诉浏览器本节中定义的格式对于父元素(本例中的 li.item)是本地的,这完全有意义。
http://www.w3schools.com/tags/att_style_scoped.asp
然而,目前只有 Firefox 支持,所以在其他浏览器中,样式标签会生成普通的旧全局 CSS,我们需要一个备用:这就是为什么我用项目的 _id 装饰类名。
如果所有浏览器都支持 scoped 属性,我们可以删除 item-{{_id}} 类并直接设置 item 类的样式,它会按预期工作!