Typecho提供了一个标签云示例,但真心太难看啦,网络上搜索了一圈,差不多都是引用的那几行代码。让我们 DIY 一个,只需会一点儿 PHP 和 css 就能做得很漂亮,实现自动调节大小的彩色标签。TypechoTips之前有给大家分享过一篇类似实现彩色标签云的方法,见:Typecho 代码实现侧边栏添加彩色云标签,不过今天分享的这个更加完善。
载入标签对象
Typecho给我们留一个很好用的接口:
<?php $this->widget('Widget_Metas_Tag_Cloud', 'sort=name&ignoreZeroCount=1&desc=0&limit=30')->to($tags); ?>
参数说明
sort:排序方式,可以选 mid,name,count;
ignoreZeroCount:是否忽略文章数为 0 的;
desc:是否降序输出;
limit:输出数目。
这其实是构造了一个标签对象链表。之后我们就可以开心地使用tags对象了,通过next()方法,可以遍历所有标签。具体参见后面的完整代码。
随机颜色
通过设置标签链接的style来改变颜色
color:#<?php echo substr(md5(rand()), 0, 6); ?>
固定颜色
如果你希望每次打开博客,标签云的颜色是固定的,试试
color:#<?php echo substr(md5($tags->name), 0, 6); ?>
对标签名做哈希来生成颜色,这样同一标签的颜色就是给定的了。如果你觉得生成的颜色不好看,试试改成md5($tags->name.'abc')
,这里abc可以是任意字符。
字体大小
想根据文章数量调整标签文字大小,让内容多的标签显示得更大?没问题。
font-size:<?php echo log($tags->count)*50+100; ?>%;
或者这样更好,把字体大小输出为整数:
font-size:<?php printf("%u%%", log($tags->count)*50+100); ?>
如果某标签下条目数特别多,50应该改成一个较小的数。你可以先试试 100/log(N) 是否合适,再稍做调整。
完整代码
<style>.widget-list-tag li{display:inline-block;list-style:none;font-family:monospace;margin:1px;padding:1px;}</style>
<?php $this->widget('Widget_Metas_Tag_Cloud', 'sort=name&ignoreZeroCount=1&desc=0&limit=30')->to($tags); ?>
<ul class="widget-list widget-list-tag">
<?php if($tags->have()): ?>
<?php while ($tags->next()): ?>
<li><a style="font-size:<?php printf("%u%%", log($tags->count)*50+100); ?>; color:#<?php echo substr(md5($tags->name.'rand'), 0, 6); ?>;" href="<?php $tags->permalink(); ?>" title="<?php $tags->count(); ?> 个话题"><?php $tags->name(); ?></a></li>
<?php endwhile; ?>
<?php else: ?>
<li><?php _e('没有任何标签'); ?></li>
<?php endif; ?>
</ul>