2009-02-03 184 views
5

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將進入電子郵件消息。

回答

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

+0

_index是一個巧妙的技巧。謝謝! – itsadok 2009-06-05 10:43:46

+3

請使用「乾淨」CSS:在需要時添加相關類(class =「odd」或class =「even」),然後在CSS中相應樣式(即.even {background-color:gray;} .odd另外,在2.3.23中,如果類名是`even`和`odd`,那麼你可以編寫``。 – 2013-03-28 13:23:41

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> 

從震耳欲聾的沉默我推斷有這樣做的沒有更好的方式。

+0

你一定要明白,你可以使用CSS或JavaScript做同樣的事情:有沒有必要使用的FreeMarker? – 2009-02-04 11:35:53

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標記,並在<tr>標記中使用bgcolor="color"標記的每行顏色。

+1

現在我需要一種替代「linea」和「lineb」的方法 - 一個非常類似的問題... – itsadok 2009-02-04 12:56:15

+0

+1的電子郵件提示 – itsadok 2009-03-17 06:45:43

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> 

然後只是使用一個沒有類的普通表S於行:

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

或用freemarker的生成表:

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

所以它是所有的CSS。

6

隨着freemarker中,你可以使用string內置:

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

您可以使用以下建設FreeMarker的模擬三元運算符: $ {?條件字符串(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> 
1

在FreeMarker的2.3.23:

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