freemarker中的交替表行颜色

时间:2009-02-03 07:36:53

标签: templates freemarker

使用freemarker进行备用行着色的简单方法是什么?

这真的是最好的方法吗?

<#assign row=0>
<#list items as item>
    <#if (row % 2) == 0>
        <#assign bgcolor="green">
    <#else>
        <#assign bgcolor="red">
    </#if>
    <tr style='background-color: ${bgcolor}'><td>${item}</td></tr>
    <#assign row = row + 1>
</#list>

我试过这样做:

<#assign row=0>
<#list items as item>
    <tr style='background-color: ${(row % 2) == 0 ? "green" : "blue"}'><td>${item}</td></tr>
    <#assign row = row + 1>
</#list>

但显然你不能在那里使用三元运算符。

注意:我想我之前应该提到它,但我不能使用css类或javascript,因为这个HTML会发送到电子邮件中。

8 个答案:

答案 0 :(得分:27)

class='${["odd", "even"][item_index%2]}'

答案 1 :(得分:14)

如果你有一系列的表格,你可能想要做一点功能。

<#function zebra index>
  <#if (index % 2) == 0>
    <#return "white" />
  <#else>
    <#return "#efefef" />
  </#if>
</#function>

<#assign arr=["a","b","c","d"] />
<table>
<#list arr as n>
  <tr><td bgcolor=${zebra(n_index)}>${n}</td></tr>
</#list>
</table>

和使用列表时的_index builtin使您不必自己制作和增加索引变量。

答案 2 :(得分:7)

使用freemarker,您可以使用内置的string

<#list items as item>
   <tr style='background-color: ${((item_index % 2)==0)?string("green", "blue")}'><td>${item}</td></tr>
</#list>

答案 3 :(得分:3)

嗯......好吧,这是我提出的最好的:

<#assign row=0>
<#list items as item>
    <tr style='background-color: <#if (row % 2) == 0>green<#else>red</#if>'><td>${item}</td></tr>
    <#assign row = row + 1>
</#list>

从震耳欲聋的沉默中我推断出没有更好的方法可以做到这一点。

答案 4 :(得分:1)

然后解决方案归结为:

<style>
.rowon {
 background-color:#dedede;
}

.rowoff{

}
</style>

在你的模板中:

<#list items as item>
    <tr  class="<#if item_index % 2 ==0>rowon<#else>rowoff</#if>"><td>${item}</td></tr>
</#list>

但是,如前一个回复中所述,您可以使用CSS执行此操作,但不使用此freemarker解决方案(请参阅http://www.w3.org/Style/Examples/007/evenodd):

<style>
.striped tr:nth-child(odd) {background: #eee}
.striped tr:nth-child(even) {background: #fefefe}
</style>

然后只使用行上没有类的普通表:

<table class="striped">
 <tr><td>hello</td></tr>
 <tr><td>hello</td></tr>
 <tr><td>hello</td></tr>
 <tr><td>hello</td></tr>
</table>

OR与freemarker生成的表格:

<table class="striped">
<#list items as item>
    <tr><td>${item}</td></tr>
</#list>
</table>

所以这一切都在CSS中。

答案 5 :(得分:1)

在FreeMarker 2.3.23中:

<#list items as item>
    <tr style='background-color: ${item?item_cycle('green', 'red')}'><td>${item}</td></tr>
</#list>

答案 6 :(得分:0)

使用FreeMarker,回答这个问题的方法有限,但是如果你想单独使用CSS(这仍然允许分离关注点),那么这是一种方式:

在样式表中添加以下内容:

tr.linea {
    background-color: #CC9999; color: black;
}
tr.lineb {
    background-color: #9999CC; color: black;
}

然后使用以下tr类来定义备用行

<table>
<tr class="linea"><td>One Fish</td></tr>
<tr class="lineb"><td>Two Fish</td></tr>
<tr class="linea"><td>Red Fish</td></tr>
<tr class="lineb"><td>Blue Fish</td></tr>
</table>

还有many resources可供选择。

编辑:如果您的HTML进入电子邮件,那么您无法确定客户端的电子邮件客户端是否允许您尝试将任何HTML放入其中。此时您最好的选择是使用类似于FreeMarker的方式,除非您需要删除style标记,并使用bgcolor="color"<tr>的每一行使用颜色标签

答案 7 :(得分:0)

您可以使用以下构造在FreeMarker中模拟三元运算符: $ {condition?string(result_for_true,result_for_false)}。

<#assign arr=["a","b","c","d"] />
<table>
<#list arr as n>
    <tr><td bgcolor=${((index % 2) == 0)?string("white", "#efefef")}>${n}</td></tr>
</#list>
</table>