WordPress 的评论模板部分都会定义一个$oddcomment函数用来实现评论的样式交替变换,采取交替样式可以使列表有一定分区度,便于浏览。我稍稍总结了下,分别通过javascript, phpCSS三种方式进行实现,其中CSS实现方法还几乎处于理想状态,仅供参考。

实现方法之Javascript篇

假设我们有个id名为 list 的无序列表ul,其下有5项item (li)。我们可以用getElementByIdgetElementsByTagName先找到这些item,然后通过for循环筛选出奇数项并赋予class值。再通过CSS定义该奇数项class样式从而达到交替样式的目的。javascript代码如下:

 function alterItem() {
 var list=document.getElementById('list');
 var items=list.getElementsByTagName('li'); 
 for (var i=0;i<items.length;i++) {
   if(i%2==0)
   items[i].className='odd'; 
   }
 }

 window.onload=alterItem; 

最后用通过CSS定义 .odd样式就行了。

实现方法之PHP篇

此方法来源于WordPress论坛的这篇日志。我曾经在PP的sidenotes部分就是用这种方法实现交替背景的(WP的comment部分已经有oddcomment函数了,无须再费周折),我直接照搬原来PP theme里的sidenotes部分代码。

<?php query_posts('category_name=sidenotes&showposts=3'); ?>
     <?php while (have_posts()) : the_post(); ?>
     <div id="p<?php the_ID(); ?>" class="<?=($i%2)?"even":"odd";$i++;?>">
     <a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php strip_tags(the_title()); ?>" class="title"><?php the_title(); ?></a>
     <?php the_content(); ?>
     </div>
<?php endwhile;>		

注意其中加粗部分,先在模板文件顶部插入如下代码<?$i;?>,然后在class里加入这句判断语句就够了<?=($i%2)?"even":"odd";$i++;?>。学过C语言的都知道这是个if..else判断语句的缩写形式– If (Expression) ? true : false,如果满足表达式,则执行? 部分,否则执行 : 部分。也就是说,满足 $i%2等于0,即$i为偶,则赋予class为even值,然后$i 加一,滚动到下一item上进行第二次判断。

实现方法之CSS篇

CSS2有个:nth-child的选择器,这是个非常非常强大的选择器,你可以定义Element:nth-child(3)来找到为其父元素下的第三个子元素,你也可以定义Element:nth-child(odd) 或者Element:nth-child(even) 来查找其父元素下的奇偶子元素,甚至可以用Element:nth-child(3n+2) 来找到其父元素下的第3n+2个元素( n=0,1,2…)。通过CSS方法定义那太简单了!

ul#list li:nth-child(odd) {background:#000;color:#fff}

ul#list li:nth-child(even) {background:#fff;color:#000;}

不过,这么好的方法…目前只有linux下的konqueror浏览器支持(注:Konqueror是目前唯一100%通过CSS3所有选择器测试的浏览器),好在Opera已经开始落实支持该选择器的工作了。

我个人比较喜欢这种cutting edge的方式! 如果你想让你的网站/blog做的更先锋的话就用这种方式吧!

顺带说句: 其实linux下的konqueror是款相当棒的浏览器,他们对CSS的支持一向都是做的最棒的(目前还有个opacity没解决),连multiple-backgrounds他们都支持了!

No Responses So Far

Leave a Reply ↓