美文网首页大前端
hexo-tag-cloud标签云使用与优化

hexo-tag-cloud标签云使用与优化

作者: 天問_专注于大前端技术 | 来源:发表于2021-10-22 13:39 被阅读0次

    Hexo默认主题landscape自带的tagcloud标签云不是太美观,于是在npm网站上搜索了一下,最终决定使用 hexo-tag-cloud 插件,使用了Canvas渲染,有3D效果,整体效果还是不错的。

    Hexo-标签云

    安装插件

    npm i -S hexo-tag-cloud
    

    使用

    Hexo默认使用的是ejs模板引擎,这里就以 ejs 为例。

    1. 找到 tagcloud.ejs 文件,完整路径如下:

       hexo/themes/landscape/layout/_widget/tagcloud.ejs
      

    修改为以下内容:

    <% if (site.tags.length) { %>
      <script type="text/javascript" charset="utf-8" src="<%- url_for('/js/tagcloud.js') %>"></script>
      <script type="text/javascript" charset="utf-8" src="<%- url_for('/js/tagcanvas.js') %>"></script>
      <div class="widget-wrap">
        <h3 class="widget-title"><%= __('tagcloud') %></h3>
        <div id="myCanvasContainer" class="widget tagcloud">
          <canvas width="300" height="300" id="resCanvas" style="width:100%;height:100%;">
            <%- tagcloud() %>
          </canvas>
        </div>
      </div>
    <% } %>
    
    1. hexo/themes/landscape/source/js 目录下新建 tagcloud.jstagcanvas.js 文件,内容可以打开如下链接进行复制:

    2. 整体展现如下图所示,具体交互效果可以浏览 本站 的标签云。

    天問-TagCloud

    优化

    原插件中Canvas设置的是固定宽高,虽然设置了 style="width:100%;",当屏幕宽度改变,Canvas大小看似也跟着改变了,但实际上内部widthheight的值依然没有变化,这就导致展示的Canvas会被放大或缩小变糊,影响整体美观。所以在此基础上做了一点点优化。

    • tagcloud.js 逻辑优化
    // tagcloud.js
    // 优化代码 4 start
    document.addEventListener('DOMContentLoaded', loadTagCloud)
    // 优化代码 4 end
    
    // 优化代码 3 start
    // 防抖函数
    function debounce(fn, delay){
      var timer = null;
      return function(){
        var context = this, args = arguments;
        clearTimeout(timer);
        timer = setTimeout(function(){
          fn.apply(context, args);
        }, delay);
      };
    };
    // 优化代码 3 end
    
    function loadTagCloud() {
      // console.log('tag cloud plugin rock and roll!');
    
      try {
        // 优化代码 1 start
        var $box = $('#resCanvas');
        $box.get(0).width = $box.width();
        $box.get(0).height = $box.width();
        // 优化代码 1 end
        
        // 配置参数 5 start
        TagCanvas.textFont = 'Helvetica';
        TagCanvas.textColour = '#409EFF';
        TagCanvas.textHeight = 16;
        TagCanvas.outlineColour = '#E6A23C';
        TagCanvas.maxSpeed = 0.05;
        TagCanvas.freezeActive = true;
        TagCanvas.outlineMethod = 'block';
        TagCanvas.minBrightness = 0.2;
        TagCanvas.depth = 0.92;
        TagCanvas.pulsateTo = 0.6;
        TagCanvas.initial = [0.1,-0.1];
        TagCanvas.decel = 0.5;
        TagCanvas.reverse = true;
        TagCanvas.hideTags = false;
        TagCanvas.shadow = '#fff';
        TagCanvas.shadowBlur = 3;
        TagCanvas.weight = false;
        TagCanvas.imageScale = null;
        TagCanvas.fadeIn = 500;
        TagCanvas.clickToFront = 600;
        TagCanvas.lock = false;
        // 配置参数 5 end
    
        TagCanvas.Start('resCanvas');
        TagCanvas.tc['resCanvas'].Wheel(true)
    
        // 优化代码 2 start
        $(window).resize(debounce(function() {
          $box.get(0).width = $box.width();
          $box.get(0).height = $box.width();
          TagCanvas.Start('resCanvas');
          TagCanvas.tc['resCanvas'].Wheel(true);
        }, 500));
        // 优化代码 2 end
    
      } catch(e) {
        // console.log(e);
        document.getElementById('myCanvasContainer').style.display = 'none';
      }
    };
    

    优化点

    1. Canvas的widthheight根据外层容器的宽度来设置。code:优化代码 1
    2. 使用resize监听window屏幕的大小变化,动态设置Canvas宽高,重新渲染Canvas画布。code:优化代码 2
    3. 使用debounce防抖函数,控制重新渲染Canvas的次数,提高整体性能。code:优化代码 3
    4. 使用documentDOMContentLoaded事件替换原来的window.onload事件,这样不用等待图片加载完毕再渲染Canvas,可以大大提升tagCloud的展示速度。code:优化代码 4

    优化后的js文件:

    温馨提示: 可以根据自己的主题来设置标签云中动画时间、文字大小、颜色、点击颜色、点击效果等等,具体参数如上所示code:配置参数 5

    参考文档:


    欢迎访问:个人博客地址

    相关文章

      网友评论

        本文标题:hexo-tag-cloud标签云使用与优化

        本文链接:https://www.haomeiwen.com/subject/uugcaltx.html