Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[Typecho小试牛刀]Joe主题增加文章目录(非插件方式)

[Typecho小试牛刀]Joe主题增加文章目录(非插件方式)

原创
作者头像
TDP-苏苏
修改于 2022-08-10 09:58:55
修改于 2022-08-10 09:58:55
1.6K290
代码可运行
举报
文章被收录于专栏:上云实践笔记上云实践笔记
运行总次数:0
代码可运行

背景: joe主题没有目录功能,想要 目标:能自动创建文章目录,支持显示H1-H3共3级标题;标题和目录可以联动

效果:

效果图
效果图

话不多说,上代码!

修改php文件

  • 需要修改的文件: /usr/themes/Joe/public/aside.php
  • aside.php 的合适位置增加如下代码,用于在侧边栏创建目录容器
代码语言:php
AI代码解释
复制
# 仅在文章和页面生效
<?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; ?>

增加js代码

  • 下面的js可以直接在Joe主题的设置中添加
  • 位置:控制台->外观->设置外观->全局设置->自定义js
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function get_catalogs(article_content) {
    const titleTag = ["H1", "H2", "H3"];
    let titles = [];
    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))
            });
            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 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 + '">' + catalog[i].text + '</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; //获得父级卷去的高度
            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();
}

css样式表

  • 样式表同js,也可以在Joe主题的设置中添加
  • 位置: 控制台->外观->设置外观->全局设置->自定义css
  • 以下样式表是我自己博客使用的,仅供参考
代码语言:css
AI代码解释
复制
.joe_aside__item.catalogue {
    z-index: 999;
    position: sticky;
    top: 45px;
    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
}
.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items {
    border-left: 1px solid var(--classC);
    border-bottom: 1px solid var(--background);
    padding: 15px
}
.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item {
    margin: 0;
    padding: 0;
    line-height: 26px;
    font-size: 16px
}
.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: 12px
}
.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: 12px
}
.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.php
  • 理论上也适用于其他主题,只是需要修改的文件不同

笔者为腾讯云TDP成员,点击加入腾讯云TDP

原文链接:https://nongxue.top/p/daima/60.html

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
29 条评论
热度
最新
老哥有一个BUG,那就是目录太多 滑动条就直接消失了,如果目录可以单独滑动或收缩层级就好了
老哥有一个BUG,那就是目录太多 滑动条就直接消失了,如果目录可以单独滑动或收缩层级就好了
22点赞举报
如果做到左边的话,就可以实现了。可以根据自己的需要,把它挪到左边
如果做到左边的话,就可以实现了。可以根据自己的需要,把它挪到左边
回复回复点赞举报
好嘞谢谢
好嘞谢谢
回复回复点赞举报
https://www.ylfl.xyz/typecho/index.php/archives/35/我看不懂js,求大佬帮个忙
https://www.ylfl.xyz/typecho/index.php/archives/35/我看不懂js,求大佬帮个忙
回复回复点赞举报
如果不想让addClass('active')改怎么改?因为我有两个目录,但是其中一个一旦添加active,另外一个就不添加了,但是我想让第二个添加,第一个不知道改删哪里?第一个目录不需要根据文章位置激活目录变成主题色
如果不想让addClass('active')改怎么改?因为我有两个目录,但是其中一个一旦添加active,另外一个就不添加了,但是我想让第二个添加,第一个不知道改删哪里?第一个目录不需要根据文章位置激活目录变成主题色
2121点赞举报
比如可以把css中的active全部替换为_active,然后把js中的也修改为同样的名字即可
比如可以把css中的active全部替换为_active,然后把js中的也修改为同样的名字即可
回复回复点赞举报
好的,谢谢
好的,谢谢
回复回复点赞举报
查看全部21条回复
老兄 PHP 代码的Line 2多写了个"(",另外我按你的方法配置了以后不报错也没有效果,不知道为什么
老兄 PHP 代码的Line 2多写了个"(",另外我按你的方法配置了以后不报错也没有效果,不知道为什么
22点赞举报
点文末博客原文,后面有更新
点文末博客原文,后面有更新
回复回复点赞举报
没有效果的原因找到了,我的目录等级是从H4开始的
没有效果的原因找到了,我的目录等级是从H4开始的
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
Typecho增加文章目录
本文共 175 个字数,平均阅读时长 ≈ 1分钟 修改php文件 需要修改的文件: /usr/themes/Joe/public/aside.php 在 aside.php 的合适位置增加如下代码,用
小东东
2023/03/08
3810
[Typecho小试牛刀]给Joe编辑器增加热键
笔者博客目前使用的Typecho,主题使用的Joe。 前面已经写过两篇相关的文章: [Typecho小试牛刀]Joe主题增加验证码(非插件方式) [Typecho小试牛刀]Joe主题增加文章目录(非插件方式) 本文是第三篇,折腾的对象是编辑器。 Joe主题自带编辑器,界面美观,功能也很强大,美中不足是没有热键功能。 下面就跟大家分享一下,如何给Joe编辑器增加热键。 [编辑器长这样] 预设背景 本文假设目录结构如下 Typecho安装在/www/nongxue.top目录下 Joe主题文件位于/www/no
TDP-苏苏
2022/05/31
3.7K6
[Typecho小试牛刀]给Joe编辑器增加热键
[Typecho小试牛刀]Joe主题增加验证码(非插件方式)
刚刚接触Typecho,发现Joe主题不错,摸索了两天之后,发现Joe本身不支持评论验证码,就查阅资料,修改部分Joe主题文件,增加评论验证码。
TDP-苏苏
2022/05/15
1.2K1
[Typecho小试牛刀]Joe主题增加验证码(非插件方式)
Joe主题添加文章侧边栏目录
Github 仓库链接:plugins/MenuTree at master · typecho-fans/plugins · GitHub
知识分子没文化
2023/07/01
4390
基于Memos实现哔哔和清单功能
找个页面丢入以下 html + js + css 即可。当然,得先部署个Memos
777nx
2023/05/02
5600
JS生成HTML的目录
码客说
2024/03/29
3230
一个简单的数独Demo
闲来无事,想学习点东西,而最近又在玩数独,于是乎准备使用各种技术折腾一个数独的小游戏。
拿我格子衫来
2022/01/24
2840
一个简单的数独Demo
Typecho增加首页大图
修改index.php 路径 usr/themes/Joe/index.php 代码 截图 <!--首页大图--> <div class="HeaderImg" style="back
小东东
2023/03/20
8990
Hugo博客目录放在侧边 | PaperMod主题
官方当前版本的PaperMod目录是放在顶部的,之后的版本也不知道会不会放在侧边,我个人觉得目录放在顶部不方便展示阅读进度,如果文章很长,还得翻到顶部,极其不方便。
素履coder
2022/02/17
5610
Hugo博客目录放在侧边 | PaperMod主题
使用js,html,css实现歌词滚动的效果
到此就结束了, 主要难点在于计算ul的偏移量, 和 最大偏移量, 以及边界情况考虑. 不过,只要画好图,一分析,便会清晰明了许多.
心安事随
2024/07/29
3500
使用js,html,css实现歌词滚动的效果
学会歌词滚动实现,让你的音乐页面更炫酷!
友儿
2024/08/20
2540
学会歌词滚动实现,让你的音乐页面更炫酷!
JavaScript基础②
console.log(item)//点哪里,item的值就是你点击对应的currentvalue console.log(index)//点哪里,index的值就是你点击对应的索引
ymktchic
2022/01/18
1.1K0
JavaScript基础②
Hexo-Butterfly主题魔改
本文章首发于语雀! 通过各种高科技功能同步到Hajeekn 的博客 由于每个人的博客目录都不相同,这里博客目录使用%brt%代替 本文章除 Pace wowjs 普通引入法以外,其他魔改都不适合 Butterfly3.6.0 及以上
FloatSheep
2022/04/25
2.6K0
Hexo-Butterfly主题魔改
Joe 主题美化记录
刚放入上面代码还是不够的,我的目标是用这个代替原先的页脚信息,因此需要把原来页脚的部分代码加入到<div class="site-p"></div>
公爵
2022/09/28
8800
Joe 主题美化记录
原生HTML+CSS+JS制作自己的导航主页(前端大作业,源码+步骤详解)
咕咕了好久啦,今天使用原生HTML+CSS+JS做一个很简单的个人定制的导航主页吧!
全栈程序员站长
2022/09/15
7K2
原生HTML+CSS+JS制作自己的导航主页(前端大作业,源码+步骤详解)
如何根据页面标签自动生成文章目录?分析+代码详解
文章目录功能大家再熟悉不过了吧,主要用于长篇文章、教程内:用户可以根据自己需求,点击目录进行跳转。
Mintimate
2021/10/12
5.4K3
如何根据页面标签自动生成文章目录?分析+代码详解
Joe主题加大图
1.复制代码 2.修改index.php 3.修改post.php 4.增加css文件 5.引入css文件 6.站长总结
堡主
2023/03/04
6250
Joe主题加大图
JavaScript 基本知识
内嵌式:把代码书写在一个script标签对内(这种不需要任何行为会自动执行JS代码)
全栈程序员站长
2022/11/01
2.4K0
JavaScript 基本知识
Typecho主题Joe美化记录-星泽V社
最近一直在尝试新的主题,本站可能会更改外观,在此简单记录一下这段时间对Joe的美化,防止失忆,emm...也希望能帮助到刚接触Joe这个主题的站长们。
星泽V社
2022/04/25
2.8K0
Typecho主题Joe美化记录-星泽V社
JavaScript之DOM
文档对象模型(Document Object Model,DOM)是一种用于HTML和XML文档的编程接口。它给文档提供了一种结构化的表示方法,可以改变文档的内容和呈现方式。我们最为关心的是,DOM把网页和脚本以及其他的编程语言联系了起来。DOM属于浏览器,而不是JavaScript语言规范里的规定的核心内容。
菲宇
2019/06/13
7090
JavaScript之DOM
相关推荐
Typecho增加文章目录
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验