Typecho Joe 导航菜单目录以及搜索关键字回显主题优化版

news/2024/11/13 10:20:10/文章来源:https://www.cnblogs.com/hanzhe/p/18380975

Joe 是 Typecho 博客中一款开源免费且非常精美的主题,但是这款主题很早就停止维护了,有些功能作者并没有开发,并且在 Typecho 更新到 1.2.1 版本后还出现了一个小 BUG

Joe 主题的知名度很高,所以在原作者停止维护后很多大佬发布过自己魔改的版本,不可否认魔改后的主题 BUG 基本解决,而且也新增了很多实用的功能,但不可否认的是大佬魔改都是基于自己的想法魔改的,就我个人来看虽然魔改版修复了很多问题加了很多新功能,但有些过于花里胡哨,所以我决定自己动手改代码,在尽量不破坏原主题外观的情况下做一些小调整,本次主要调整了两点:

1. 修复(或者说适配)了 Joe 主题在 Typecho 1.2.1 版本中搜索关键字不回显的问题
2. 在文章详情页的侧边栏添加了导航目录模块,在包含目录结构的页面会显示导航目录信息,为了不影响目录展示会移除其他模块(例如人生倒计时、天气等等),在不包含目录结构的页面其他模块正常显示

该主题主要就这两点修改,其他地方基本没有改动,尽量保证 Joe 的原汁原味,我将该主题命名为 Joe 优化版,并在文章末尾给出下载地址,下载主题后可直接上传至服务器使用,不需要做任何其他操作

哪怕只有这两点您也觉得改动大,或介意使用第三方修改过的主题或其他原因也没关系,后面我会详细介绍修改步骤可自行修改

适配/修复搜索关键字回显

问题截图:

image

据猜测只有在使用 Typecho 1.2.1 以上版本才会出现这个问题,这并不是 BUG 只是主题并没有适配新版,看了一下源码后发现只是简单的取值问题而已,改几个字母就可以了,可以直接在服务器上改也可以在本地修改后上传至服务器

找到主题文件夹所在位置,编辑joe/archive.php文件,大概在25行左右可以看到他取值为_keywords,把这个值改成archiveTitle即可解决问题

image

侧边导航菜单目录

该功能并非我原创,大多数为借鉴他人的代码,自己做少量调整并整合进主题中,点此访问原作者

这个功能对我诱惑很大,去年因为这个功能我从 Typecho 转到 Halo(国产 Java 编写的网站构建工具),并且有大佬把 Joe 主题移植过去实现了导航目录,但当我真正使用 Halo 后发现生态不是很完善,性能不强且有很多细小的 BUG,兜兜转转又回到了 Typecho,并最终实现了导航目录的效果

添加侧边组件

首先编辑joe/public/aside.php文件,这个文件包含了所有侧边栏组件,在博主栏和人生倒计时中间插入下面这段代码

<?php if (($this->is('post') || $this->is('page')) : ?><section class="joe_aside__item catalogue"><div class="joe_aside__item-title"><svg class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2084" width="18" height="18"><path d="M640 192H224c-17.7 0-32-14.3-32-32s14.3-32 32-32h416c17.7 0 32 14.3 32 32s-14.3 32-32 32zM960 544H224c-17.7 0-32-14.3-32-32s14.3-32 32-32h736c17.7 0 32 14.3 32 32s-14.3 32-32 32zM640 896H224c-17.7 0-32-14.3-32-32s14.3-32 32-32h416c17.7 0 32 14.3 32 32s-14.3 32-32 32zM96 192H64c-17.7 0-32-14.3-32-32s14.3-32 32-32h32c17.7 0 32 14.3 32 32s-14.3 32-32 32zM96 544H64c-17.7 0-32-14.3-32-32s14.3-32 32-32h32c17.7 0 32 14.3 32 32s-14.3 32-32 32zM96 896H64c-17.7 0-32-14.3-32-32s14.3-32 32-32h32c17.7 0 32 14.3 32 32s-14.3 32-32 32z" p-id="2085"></path></svg><span class="text">导航目录</span><span class="line"></span></div><div class="joe_aside__item-contain"><ul class="catalogue-items"></ul></div></section>
<?php endif; ?>

刷新页面后可以看到,导航目录的雏形已经出现了

image

编写JS生成目录

接下来修改joe\assets\js\joe.post_page.min.js文件,在文件开头的第一个大括号后面添加下面这段代码

image

function get_catalogs(article_content) {let titles = [];let diffLevel = 0;let nodeNameSet = new Set();const titleTag = ["H1", "H2", "H3", "H4"];article_content.childNodes.forEach((e, index) => nodeNameSet.add(e.nodeName));for (let ttIndex in titleTag) {let item = titleTag[ttIndex];if (!nodeNameSet.has(item)) {diffLevel++} else {break}}article_content.childNodes.forEach((e, index) => {const id = "header-" + index;if (titleTag.includes(e.nodeName)) {titles.push({id: id,text: e.textContent,level: Number(e.nodeName.substring(1, 2) - diffLevel)});e.setAttribute("id", id)}});return titles
}
article_content = document.querySelector('.joe_detail__article');
if (article_content) {var catalog = get_catalogs(article_content);if (catalog.length == 0) {$('.catalogue').hide()} else {let asideArr = ['timelife', 'today', 'hot', 'newreply', 'weather', 'tags', 'flatterer'];asideArr.forEach(item => $('.joe_aside__item.' + item).remove());let catalogue = '';for (let i = 0; i < catalog.length; i++) {let node = '<li class="catalogue-item"><a href="javascript:;" id="to-' + catalog[i].id + '" to="' + catalog[i].id + '" title="' + catalog[i].text + '"><span class="dir_name">' + catalog[i].text + '</span></a>';if (i == catalog.length - 1) {catalogue += node + '</li>'} else {if (catalog[i + 1].level == catalog[i].level) {catalogue += node + '</li>'} else if (catalog[i + 1].level > catalog[i].level) {catalogue += (catalog[i + 1].level > 1) ? node + '<ul class="level-' + catalog[i + 1].level + '">' : node + '</li>'} else {if (catalog[i + 1].level - catalog[i].level == -2) {catalogue += i > 1 ? node + '</li></ul></li></ul></li>' : node + '</li></ul></li>'} else {catalogue += i > 1 ? node + '</li></ul></li>' : node + '</li>'}}}}document.querySelector('.catalogue-items').innerHTML = catalogue;$('.catalogue-item > a').on('mouseenter', function() {$(this).parent().addClass('_active')});$('.catalogue-item > a').on('mouseleave', function() {$(this).parent().removeClass('_active')});$('.catalogue-item > a').on('click', function() {document.removeEventListener("scroll", autoActive);$('.catalogue-item').removeClass('active');$(this).parent().addClass('active');let aim = document.querySelector('#' + $(this).attr('to'));let aim_top = aim.offsetTop;let aim_h = aim.clientHeight;let above_h = document.querySelector('.joe_header__above').clientHeight;let below_h = document.querySelector('.joe_header__below').clientHeight;let offset = 0;let case1 = !document.querySelector('.joe_header__above').className.includes('active');let case2 = document.getElementsByTagName("html")[0].scrollTop + above_h > aim_top;if (case1 && case2) {offset = above_h}window.scrollTo({top: aim_top - offset - below_h - 10,behavior: 'smooth'});setTimeout(() => {document.addEventListener("scroll", autoActive)}, 500)});if (catalog.length) $('.catalogue-item').eq(0).addClass('active');let autoActive = function() {let html_top = document.getElementsByTagName("html")[0].scrollTop;let contain = $(".joe_aside__item.catalogue .joe_aside__item-contain");for (let i = 0; i < catalog.length; i++) {let offset = 0;let h_id = '#' + catalog[i].id;let h_offset = document.querySelector(h_id).offsetTop;let above_h = document.querySelector('.joe_header__above').clientHeight;let below_h = document.querySelector('.joe_header__below').clientHeight;if (!document.querySelector('.joe_header').className.includes('active')) offset = above_h;if (h_offset + below_h + offset + 10 >= html_top) {$('.catalogue-item').removeClass('active');if (i > 0 && i < catalog.length - 1 && document.querySelector('#' + catalog[i].id).offsetTop > html_top + window.innerHeight * 0.2) {i--}$('#to-' + catalog[i].id).parent().addClass('active');break}}};document.addEventListener("scroll", autoActive)}
} else {$('.catalogue').hide()
}

刷新页面后可以看到,目录的基本结构已经出来了,为了其他组件不遮挡目录的显示,在有目录的页面其他侧边组件会被移除

image

编写CSS美化目录

后面就是样式问题了,接下来修改joe\assets\css\joe.post.min.css在文件末尾添加下面这段CSS

.joe_aside__item.catalogue{margin-bottom:15px;transition:top 0.35s;background:var(--background)}
.joe_aside__item.catalogue .joe_aside__item-contain{padding:0;margin:0;margin-left:10px;max-height:500px;overflow-y:auto}
.joe_aside__item.catalogue .joe_aside__item-contain::-webkit-scrollbar{width:3px}
.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items{border-left:2px solid var(--classC);padding:10px 15px}
.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item{margin:0;padding:0;line-height:26px;font-size:15px}
.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item a{position:relative;display:block;line-height:26px;color:var(--main);transition:color 0.5s}
.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item a:hover{color:var(--theme)}
.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item._active>a,.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item.active>a{color:var(--theme)}
.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item._active>a::before,.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item.active>a::before{content:"";position:absolute;left:-17px;top:0;width:2px;height:26px;background-color:var(--theme);transition:height 0.35s}
.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item .level-2>.catalogue-item,.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item .level-3 .catalogue-item{font-size:14px}
.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item .level-2 .catalogue-item._active>a::before,.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item .level-2 .catalogue-item.active>a::before,.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item .level-3 .catalogue-item._active>a::before,.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item .level-3 .catalogue-item.active>a::before{left:-34px}
.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item .level-2 .catalogue-item .level-3 .catalogue-item,.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item .level-3 .catalogue-item .level-3 .catalogue-item{font-size:14px}
.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item .level-2 .catalogue-item .level-3 .catalogue-item._active>a::before,.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item .level-2 .catalogue-item .level-3 .catalogue-item.active>a::before,.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item .level-3 .catalogue-item .level-3 .catalogue-item._active>a::before,.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item .level-3 .catalogue-item .level-3 .catalogue-item.active>a::before{left:-51px}
.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item .level-3>.catalogue-item{font-size:14px}
.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item ul{padding-left:17px}
.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items ul{display:block;list-style-type:disc}
.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item a span.dir_name{display:block;width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}

回过头来刷新页面,发现样式已经修改完成,原作者很给力CSS样式十分契合主题的风格

image

资源下载

请允许我夹带私货,自己的博客SEO太差根本没有收录,如果想下载主题请前往我的个人博客滑倒最下面下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/787513.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gdb学习记录

目录如何查看地址值查看当前函数参数多线程调试只暂停指定线程,其他线程不影响总结如何查看地址值 查看下一个地址:x/x 0x12345679 以八进制显示:x/o 0x12345678 以十进制显示:x/d 0x12345678 显示更多的地址和值:x/8xw 0x12345678(显示从该地址开始的8个字(word),每个…

UE4 CharacterMovementComponent

之前在学习网络通信时,经常需要对客户端上的行为进行预测,来降低延迟带来的比较差的体验。而UE4为角色移动提供了CharacterMovementComponent这个组件,其在移动时可以发现已经实现了客户端预测。 现在可以通过对CharacterMovementComponent进行扩展,实现我们自定义的运动模…

抖音coze接入网站实现智能在线客服

在coze.cn上创建好机器人并且可以发布为API,方便接入自己的系统 一定要先创建新令牌,再点发布,并且必须勾选,发布到API 在客服系统gofly.v1kf.com中配置 【菜单】【团队设置】【大模型设置】接口地址部分,请填写扣子的机器人ID 接口密钥部分,请填写扣子的API令牌然后…

centos9(linux): 安装clamav

一,官方网站 https://www.clamav.net/ 如图:二,安装 1,开启epel仓库 [root@blog ~]# yum install -y epel-release 2,安装clamav [root@blog ~]# yum install clamav 说明:病毒库数据较大,200多M,安装时需要等待较长时间 安装完成后查看clamav的版本: [root@blog ~]# clam…

pygame手搓五子棋

代码:#coding=utf-8import os,sys,re,time import pygame import random from win32api import GetSystemMetricspygame.init() pygame.display.set_caption("五子棋")percent = 0.6 screen_width = GetSystemMetrics(0) screen_height = GetSystemMetrics(1) windo…

网站提示404错误:页面未找到怎么办

当网站提示 404 Error 或 “页面未找到” 时,这意味着客户端尝试访问的资源在服务器上不存在或无法找到。这种情况很常见,可以通过以下几个步骤来诊断和解决问题: 常见原因URL 输入错误:这是最常见的原因之一。由于人为疏忽或输入错误,导致请求的 URL 与服务器上实际存在的…

OpenCV开发笔记(七十九):基于Stitcher类实现全景图片拼接

前言一个摄像头视野不大的时候,我们希望进行两个视野合并,这样让正视的视野增大,从而可以看到更广阔的标准视野。拼接的方法分为两条路,第一条路是stitcher类,第二条思路是特征点匹配。  本篇使用stitcher匹配,进行两张图来视野合并拼接。 Demo 两张图拼接过程步骤一:…

WPF 路由事件

一、什么是路由事件? 根据MSDN定义:功能定义:路由事件是一种可以针对元素树中的多个侦听器(而不是仅针对引发该事件的对象)调用处理程序的事件。 实现定义:路由事件是由 类的实例支持的 CLR 事件, RoutedEvent 由事件 Windows Presentation Foundation (WPF) 系统处理。…

【转载】Win11优化大小核调度(无需重启)

出处:https://bbs.saraba1st.com/2b/thread-2140520-1-1.html 打开隐藏电源管理选项: 管理员模式运行cmd,分别输入: powercfg -attributes SUB_PROCESSOR 7f2f5cfa-f10c-4823-b5e1-e93ae85f46b5 -ATTRIB_HIDE powercfg -attributes SUB_PROCESSOR 93b8b6dc-0698-4d1c-9ee4-…

【Pytorch教程】迅速入门Pytorch深度学习框架

@目录前言1.tensor基础操作1.1 tensor的dtype类型1.2 创建tensor(建议写出参数名字)1.2.1 空tensor(无用数据填充)API示例1.2.2 全一tensor1.2.3 全零tensor1.2.4 随机值[0,1)的tensor1.2.5 随机值为整数且规定上下限的tensorAPI示例1.2.6 随机值均值0方差1的tensor1.2.7 从…

AMD显卡VGA转HDMI花屏或者雪花屏解决办法

本以为是显卡或者显示屏或者转接线有问题,查阅资料后得出VGA转HDMI花屏或者雪花屏解决办法: 进入AMD控制面板。点击设置 - > 显示器 - > 覆盖 - > 禁用HDCP 即可完美解决问题。

AIGC时代,如何为“数据飞轮”提速

本文从技术角度,具体拆解DataLeap-找数助手、开发助手的实现方式,详AIGC如何为企业数智化转型赋能。更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 企业通过数智化转型实现降本增效,已经成为行业共识。而随着AIGC时代到来,企业的…