魔改笔记五:分类条及外链卡片 魔改教程 注意:由于本次魔改修改了主题内部文件,一定要注意提前备份!一定要注意提前备份!一定要注意提前备份!如果没有魔改基础建议紧跟教程,如果有任何问题可以在下方评论区提出。
分类条 我原有的分类是店长的分类卡片,但总感觉占用空间有点大,且如果分类超过三个会显示滚动条。我在网站设计中尽量避免显示滚动条,因为感觉不够美观。为了使网站更加简洁,我决定按照朋友 klcdm 的推荐,使用洪哥的分类条。然而,洪哥的分类条是纯静态的,分类需要手动添加上去,明显不符合我的懒蛋需求。因此,我决定修改洪哥的分类条,并从 hexo-theme-solitude 中提取出动态分类条的功能,以便更简洁地显示所有分类并快捷切换。
效果展示 以下是分类条的展示效果,具体效果可以在首页自行感受。
为了美观,我把横向分类的滚动条移除了,但是仍然可以移动,如果是手机的话,通过左右滑动即可拉动滚动条,但是不太明显,有需要的可以自行添加其他元素。
教程 新建文件[BlogRoot]\themes\butterfly\layout\includes\categoryBar.pug文件,写入:
1 2 3 4 5 6 7 8 9 10 11 .category-bar-items#category-bar-items(class=is_home() ? 'home' : '')   .category-bar-item(class=is_home() ? 'select' : '', id="category-bar-home")     a(href=url_for('/'))= __('博客首页')   each item in site.categories.find({ parent: { $exists: false } }).data     .category-bar-item(class=select ? (select === item.name ? 'select' : '') : '', id=item.name)       a(href=url_for(item.path))= item.name   .category-bar-item     a(href=url_for('/archives/'))= __('文章存档') div.category-bar-right   a.category-bar-more(href=url_for('/categories/'))= __('更多分类') 
以上就是该滚动条的结构,下面我们开始实现样式的定义,新建文件[BlogRoot]\themes\butterfly\source\css_layout\category-bar.styl写入以下文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 #category-bar   padding  7px  11px    background  var (--card-bg)   border-radius  8px    display  flex   white-space  nowrap   overflow  hidden   transition  0.3s    height  50px    width  100%    justify-content  space-between   user-select none    align-items  center   margin-bottom  20px    .category-bar-right      display  flex     border-radius  8px      align-items  center     .category-bar-more        margin-left  4px        margin-right  4px        font-weight  700        border-radius  8px        padding  0  8px    .category-bar-items      width  100%      white-space  nowrap     overflow-x  scroll     scrollbar-width : none     -ms-overflow -style: none     overflow-y  hidden     display  flex     border-radius  8px      align-items  center     height  30px      &::-webkit-scrollbar       display : none     .category-bar-item        a          padding  .1rem  .5rem          margin-right  6px          font-weight  700          border-radius  8px          display  flex         align-items  center         height  30px        &.select          a            background  #3eb8be            color  var (--btn-color) 
在pug文件中,所有的颜色我都尽量使用了butterfly主题自带的变量进行了替代,确保大部分人可以正常显示。
然后将其添加到不同的位置,比如我这里实现了添加到分类页面等位置,配合上pjax可以做到无刷更新,效果很好,打开文件[BlogRoot]\themes\butterfly\layout\category.pug,添加其中两行代码,去掉加号即为正常缩进:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 extends includes/layout.pug block content   if theme.category_ui == 'index'     include ./includes/mixins/post-ui.pug     #recent-posts.recent-posts.category_ui +      #category-bar.category-bar +        include includes/categoryBar.pug       +postUI       include includes/pagination.pug   else     include ./includes/mixins/article-sort.pug     #category       <div id="categories-chart" data-parent="true" style="height: 300px; padding: 10px;"></div>       .article-sort-title= _p('page.category') + ' - ' + page.category       +articleSort(page.posts)       include includes/pagination.pug 
注意上方的修改,需要将配置文件中,分类页面的主题改成index,否则不会显示。
下面我们将其添加到主页,打开文件[BlogRoot]\themes\butterfly\layout\index.pug文件,添加下面两行
1 2 3 4 5 6 7 8 9 10 extends includes/layout.pug block content   include ./includes/mixins/post-ui.pug   #recent-posts.recent-posts +    #category-bar.category-bar +      include includes/categoryBar.pug     +postUI     include includes/pagination.pug 
然后就是实现点击切换后,高亮部分跟随分类页面走的部分,为了和主题融合我还是修改源码,打开[BlogRoot]\themes\butterfly\source\js\main.js,添加js函数,比如我添加到了778行左右,switchComments函数的上面:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21     const setCategoryBarActive = () => {     const categoryBar = document.querySelector ("#category-bar ");     const currentPath = decodeURIComponent(window.location .pathname );     const isHomePage = currentPath === GLOBAL_CONFIG.root ;     if (categoryBar) {         const categoryItems = categoryBar.querySelectorAll (".category-bar-item ");         categoryItems.forEach (item => item.classList .remove ("select"));         const activeItemId = isHomePage ? "category-bar-home" : currentPath.split ("/" ).slice (-2 , -1 )[0 ];         const activeItem = document.getElementById (activeItemId);         if (activeItem) {             activeItem.classList .add ("select");         }     } }; 
然后再在引用部分执行这个函数,在同一个文件,找到下面的函数并添加函数的调用,位置看下方注释:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 window.refreshFn  = function () {   initAdjust()   if (GLOBAL_CONFIG_SITE.isPost ) {     GLOBAL_CONFIG.noticeOutdate  !== undefined && addPostOutdateNotice()     GLOBAL_CONFIG.relativeDate .post  && relativeDate(document.querySelectorAll ('#post-meta  time '))   } else {     GLOBAL_CONFIG.relativeDate .homepage  && relativeDate(document.querySelectorAll ('#recent-posts  time '))     GLOBAL_CONFIG.runtime  && addRuntime()     addLastPushDate()     toggleCardCategory()     setCategoryBarActive()      // 自己加的,用于切换类别栏目   } 
最后,hexo三件套,应该就能看到效果了!请根据自己的需要进行定制化。
本文参考 https://blog.liushen.fun/posts/a64defb4/