首页 > 其他分享 >Typecho Joe主题自定义目录树

Typecho Joe主题自定义目录树

时间:2024-04-06 18:56:40浏览次数:20  
标签:container 自定义 item Typecho nav Joe toc document id

1、修改主题模版

编辑Joe主题文件夹public/aside.php文件

<section id="toc" class="joe_aside__item" style="display:none;">
  <div class="joe_aside__item-title menu_title">
    <svg t="1642997936013" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2169" width="128" height="128"><path d="M838.3 895.9H197.9c-53.9 0-97.7-43.8-97.7-97.7V236.7c0-53.9 43.8-97.7 97.7-97.7h640.3c53.9 0 97.7 43.8 97.7 97.7v561.4c0.1 53.9-43.7 97.8-97.6 97.8zM197.9 203.8c-18.1 0-32.9 14.8-32.9 32.9v561.4c0 18.1 14.8 32.9 32.9 32.9h640.3c18.1 0 32.9-14.8 32.9-32.9V236.7c0-18.1-14.8-32.9-32.9-32.9H197.9z" fill="#666666" p-id="2170"></path><path d="M695.1 455.2H341.2c-17.9 0-32.4-14.5-32.4-32.4s14.5-32.4 32.4-32.4h353.9c17.9 0 32.4 14.5 32.4 32.4s-14.5 32.4-32.4 32.4zM695.1 578.2H341.2c-17.9 0-32.4-14.5-32.4-32.4s14.5-32.4 32.4-32.4h353.9c17.9 0 32.4 14.5 32.4 32.4s-14.5 32.4-32.4 32.4zM695.1 701.2H341.2c-17.9 0-32.4-14.5-32.4-32.4s14.5-32.4 32.4-32.4h353.9c17.9 0 32.4 14.5 32.4 32.4s-14.5 32.4-32.4 32.4zM379.1 281.1c-17.9 0-32.4-14.5-32.4-32.4V115.4c0-17.9 14.5-32.4 32.4-32.4s32.4 14.5 32.4 32.4v133.2c0 17.9-14.5 32.5-32.4 32.5zM657.1 281.1c-17.9 0-32.4-14.5-32.4-32.4V115.4c0-17.9 14.5-32.4 32.4-32.4s32.4 14.5 32.4 32.4v133.2c0 17.9-14.5 32.5-32.4 32.5z" fill="#666666" p-id="2171"></path></svg>
    <span class="text">目录</span>
  </div>
</section>

2、编写目录生成脚本

toc-nav.js脚本动态生成目录树,并将目录插入到元素ID是toc的标签内

// 获取文章页面h1~h6标签
const article = document.querySelector('.joe_detail__article');
const list = article.querySelectorAll('h1, h2, h3, h4, h5, h6');

// 为标题标签添加动态ID
list.forEach(element => {
    let id = element.id || ('toc-index-' + Math.random()).replace('0.', '');
    element.id = id;
});

// 生成TOC目录
const container = document.createElement('ul');
container.classList.add('toc-container');
list.forEach(item => {
    let li = document.createElement('li');
    li.classList.add('nav-item');
    li.classList.add('nav-item-' + item.tagName.toLowerCase());

    let a = document.createElement('a');
    a.setAttribute('data', '#' + item.id);
    a.innerText = item.innerText;

    li.append(a);
    container.append(li);
});

document.querySelector('#toc').append(container);

// 目录点击跳转
const tocContainer = document.querySelector('.toc-container');
tocContainer.addEventListener('click', function(event) {
    event.preventDefault();
    let id = event.target.getAttribute('data')
    document.querySelector(id).scrollIntoView({
        behavior: 'smooth',
        block: 'center',

    });

});

function removeHighLight() {
    document.querySelectorAll('#toc .active').forEach(item => {
        item.classList.remove('active');
    });
}


// 为标题添加交叉观察器
let observer = new IntersectionObserver(entries => {
    entries.forEach(entry => {
        if (entry.isIntersecting) {
            // 删除已经高亮的元素
            removeHighLight();
            let targetId = entry.target.id;
            let anchor = document.querySelector(`a[data="#${targetId}"]`);
            anchor.classList.add('active');
        }
    });
});

list.forEach(item => {
    observer.observe(item);
});

编写样式

编辑Joe主题文件夹assets/css/toc-nav.css文件

#toc {
    background: var(--background);
    padding: 15px 15px;
    top: 50px;
    position: sticky;

}

.toc-container {
    max-height: 500px;
    overflow-y: auto;
    overflow-x: hidden;
}

.nav-item a {
    text-decoration: none;
    color: var(--main);
    line-height: 30px;
}

.nav-item a:hover {
    color: var(--theme);
    text-shadow: var(--text-shadow);
    cursor: pointer;
}

.toc-container .active {
    color: var(--theme);
    text-shadow: var(--text-shadow);
}

.nav-item-h3 {
    margin-left: 10px;
}

.nav-item-h4 {
    margin-left: 20px;
}

.nav-item-h5 {
    margin-left: 30px;
}

.nav-item-h6 {
    margin-left: 40px;
}

/*,侧边栏目录导航只在文章页面生效*/
.joe_post + .joe_aside > section {
    display: none;
}
.joe_post + .joe_aside > .author {
    display: block;
}
.joe_post + .joe_aside > #toc {
    display: block !important;
}

4、应用样式和脚本

编辑Joe主题文件夹post.php文件,在<head>标签中添加以下代码

<link rel="stylesheet" href="<?php $this->options->themeUrl('assets/css/toc-nav.css'); ?>">

编辑Joe主题文件夹post.php文件,在<body>标签中尾部添加以下代码

<script src="<?php _getAssets('assets/js/toc-nav.js'); ?>"></script>

标签:container,自定义,item,Typecho,nav,Joe,toc,document,id
From: https://www.cnblogs.com/weixia-blog/p/18117749

相关文章

  • .NET 8使用日志功能以及自定义日志提供程序
    .NET8使用日志功能以及自定义日志提供程序日志级别下表列出了LogLevel值、方便的Log{LogLevel}扩展方法以及建议的用法:展开表LogLevel“值”方法描述Trace0LogTrace包含最详细的消息。这些消息可能包含敏感的应用数据。这些消息默认情况下处于禁用状态,并......
  • C语言自定义类型变量——枚举(enum)
    一.枚举的定义和声明字面意思,枚举就是一一列举,把可能的取值一一列举,在我们现实生活中有许多可以列举的事物,例如:一周七天,一年四季,性别,月份,三原色等等。当我们需要描述这些数据的时候就可以使用枚举了。其关键字为eunm.类似于结构体,联合体,定义一个枚举类型的基本形式如下:enum......
  • C语言自定义类型变量——联合体(union)
    前言:在之前的文章中我们介绍了C语言中自定义类型变量之一的结构体,本篇我们将介绍它的兄弟姐妹之一的联合体类型,何为联合体?如何声明?有什么特点?让我们一起揭开它神秘的面纱 一.何为联合体 ?1.1联合体我们知道,创建变量的过程本质上是在内存中为变量开辟一片内存空间的过程,......
  • Vue.js自定义指令
    除了默认设置的核心指令(v-model和v-show),Vue也允许注册自定义指令。下面我们注册一个全局指令v-focus,该指令的功能是在页面加载时,元素获得焦点:<body><divclass="app"><span>页面载入时,input元素自动获取焦点:</span><inputv-focust......
  • 【c语言】自定义类型:联合体(公用体)【详解】
    联合体联合体类型的声明像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型。但是编译器只为最⼤的成员分配⾜够的内存空间。联合体的特点是所有成员共⽤同⼀块内存空间。所以联合体也叫:共用体。给联合体其中⼀个成员赋值,其他成员的值也跟着变化。......
  • VisualStduio如何自定义代码片段
    什么是代码片段代码片段又叫CodeSnippet,可以用来快捷补全代码。其实我们经常使用这个功能。比如for循环,输入for会弹出这个窗口 我们选择第二个for,再按两次Tab键,编辑器就会自动生成完整的for循环代码。代码片段怎么使用注意蓝色的i方块,我们输入其他循环变量,再按下Tab键,所......
  • Android 14.0 添加自定义服务,并生成jar给第三方app调用
    1.概述在14.0系统ROM产品定制化开发中,由于需要新增加自定义的功能,所以要增加自定义服务,而app上层通过调用自定义服务,来调用相应的功能,所以系统需要先生成jar,然后生成jar给上层app调用,接下来就来分析实现的步骤,然后来实现相关的功能从而来实现所需要的功能2.关于添加系统......
  • Windows 11 RDP 设置自定义证书
    1.随便生成一个证书或者去freessl之类的地方申请一个证书2.将证书转换成pfx格式opensslpkcs12-export-inkeyprivate_key.key-incertificate.pem-certfileCACert.pem-outcertificate.pfx3.打开certlm右键个人->所有任务->导入,导入刚刚创建的pfx证书......
  • QFileDialog自定义样式设置SetStytlesheet
     voidQStockView::SlotOutputExcel(){ QFileDialogfileDilog; fileDilog.setOption(QFileDialog::DontUseNativeDialog,true); constQStringg_FileDialogQSS= ".QFileDialog" "{......
  • Qt自定义控件之Battery电池控件
    文章目录前言一、BasicBattery二、Battery控件三、效果总结前言在Qt应用程序开发中,自定义控件是一种常见的需求,开发者经常需要根据特定的需求创建定制化的控件来增强用户界面的交互性和美观性。Battery电池控件是一种常见的自定义控件,用于显示设备的电池状态。通过B......