typecho 给文章创建目录树

受益于 shortcode 短代码插件和泽泽短代码中目录树的显示样式,形成了自己实现添加文章目录的思路:

一、文章目录树的结构

<div id="toc"><div class="toc-left"><div class="toc-btn" type="button" onclick="changetoc()">></div></div><div class="TOC">目录树区域</div>
</div>

上面用到点击显示目录树的js代码为:

// 推拉toc
function changetoc() {var e = document.getElementById("toc");if (e.classList.contains("tocwidth")) {e.classList.remove("tocwidth");} else {e.classList.add("tocwidth");}
}

二、给文章目录树创建CSS样式

/* -----------------------------------
## 目录树 
------------------------------------*/
#toc {--toc-width: 260px;position: fixed;top: 0;/* right: 0px; */right: calc(-1 * var(--toc-width));height: 100vh;width: var(--toc-width);display: flex;flex-wrap: nowrap;justify-content: center;align-items: stretch;z-index: 5;transition: 0.5s;-webkit-transition: 0.5s; /* Safari */
}
.tocwidth {right: 0px !important;
}.toc-left {flex: 1 0 auto;display: flex;align-items: center;margin-left: -25px;margin-right: -25px;z-index: 6;
}
.toc-left .toc-btn {display: flex;justify-content: center;align-items: center;width: 50px;height: 50px;border-radius: 50%;background-color: var(--bd-main);cursor: pointer;box-shadow: 0 0 5px 5px rgba(0, 0, 0, 0.15);
}.toc {display: flex;flex-wrap: nowrap;height: auto;width: 100%;flex-direction: column;justify-content: center;background-color: var(--bd-main);box-shadow: 0 0 5px 5px rgba(0, 0, 0, 0.15);
}.toc > span {background-color: var(--bd-main);/*自定义背景色*/display: flex;justify-content: left;flex-wrap: wrap;font-size: larger;font-weight: bolder;text-align: left;padding: 10px;margin-bottom: 2px;margin-left: 20px;
}.toc ol {list-style-type: none;margin-left: 20px;padding: 0;display: -webkit-flex;display: flex;flex-direction: column;flex-wrap: nowrap;
}.toc ol li {flex: 0 0 auto;width: 100%;padding-left: 0px;
}.toc ol ol {padding-left: 5px;
}.toc li li {padding-left: 5px;
}.toc ol li a {display: block;padding: 5px;white-space: nowrap;text-overflow: ellipsis;overflow: hidden;
}.toc ol li a:hover {background-color: var(--bd-main);color: white;
}

三、在 function.php 中建立目录树实现函数


//生成目录树
function toc($content)
{$html = '';$dom =  new DOMDocument();libxml_use_internal_errors(true);$dom->loadHTML('<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><body>' . $content . '</body>');libxml_use_internal_errors(false);$xpath = new DOMXPath($dom);$objs = $xpath->query('//h1|//h2|//h3|//h4|//h5|//h6');if ($objs->length) {$arr = [];$html = '<div class="toc"><span>目录</span>';foreach ($objs as $n => $obj) {$obj->setAttribute('id', 'TOC' . $n);handleToc($obj, $n, $arr, $html);}foreach ($arr as $n)$html .= '</li></ol>';$html .= '</div>';$html = '<div id="toc"><div class="toc-left"><div class="toc-btn" type="button" οnclick="changetoc()">></div></div>' . $html .'</div>';}return $html;
}//处理目录树
function handleToc($obj, $n, &$arr, &$html)
{$i = str_replace('h', '', $obj->tagName);$j = end($arr);if ($i > $j) {$arr[] = $i;$html .= '<ol>';} else if ($i == $j)$html .= '</li>';else if (in_array($i, $arr)) {$html .= '</li></ol>';array_pop($arr);handleToc($obj, $n, $arr, $html);return;} else {$arr = [$i];$html .= '</li>';}$html .= '<li><a href="#TOC' . $n . '">' . $obj->textContent . '</a>';
}

四、在 post.php 中调用目录树函数

<!-- 输出文章目录 -->
<?php echo toc($this->content); ?>

五、大功告成,体验效果如下

在这里插入图片描述

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

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

相关文章

2023年Q4 Coremail管理员社区季刊发布

2023年Q4季刊新鲜出炉&#xff0c;本期内容涵盖了Coremail管理员社区Q4征稿活动、社区热门内容以及直播活动的总结。 本文为2023年Q4 Coremail管理员社区季刊精彩内容的节选&#xff0c;完整内容请上Coremail管理员社区进行查看。 1、Coremail管理员社区季刊介绍 2023 年4月&a…

【代码随想录python笔记整理】第十四课 · 链表的基础操作 2

前言:本笔记仅仅只是对内容的整理和自行消化&#xff0c;并不是完整内容&#xff0c;如有侵权&#xff0c;联系立删。 一、分析题目要求 在前面一课中&#xff0c;我们学习了链表的创建以及新元素的插入&#xff0c;并且我们学会了打印链表中的元素。这节课我们依托上节课的基础…

【论文精读】LLaMA1

摘要 以往的LLM&#xff08;Large Languages Models&#xff09;研究都遵从一个假设&#xff0c;即更多的参数将导致更好的性能。但也发现&#xff0c;给定计算预算限制后&#xff0c;最佳性能的模型不是参数最大的&#xff0c;而是数据更多的。对于实际场景&#xff0c;首选的…

IT行业风向让人琢磨不透,一端狂裁,一端狂吸收……

2024年伊始&#xff0c;全球科技行业显然又掀起了新一波的裁员潮。尽管这轮裁员潮来得不如去年年初那样猛烈&#xff0c;但依然不免令不少人感到措手不及…… 甚至有人开工第一天收到的并不是开门红包&#xff0c;而是裁员说明书&#xff1a; 以前一直以为年前被裁&#xff0c;…

PureFlash v1.9.1特性介绍

PureFlashv1.9.1版本特性主要有3个&#xff1a; 1. 支持RDMA网络 使用RDMA协议可以大大减少对CPU的消耗&#xff0c;性能提升30%以上。 PureFlash的网络配置分为存储节点间网络&#xff08;存储后端网&#xff09;和客户端网络&#xff08;前端网&#xff09;。都支持使用RD…

路坦利集群虚拟机断网处理方法

路坦利集群虚拟机断网处理方法 问题描述&#xff1a; 在路坦利集群中&#xff0c;虚拟机时不时断网&#xff0c;导致业务中断&#xff0c;临时解决办法为新增网卡配置相同IP&#xff0c;然后禁用旧网卡网络临时恢复。 注&#xff1a; 该配置必须让虚拟化平台上层交换机和宿…

LASSO算法

LASSO (Least Absolute Shrinkage and Selection Operator) 是一种回归分析的方法&#xff0c;它能够同时进行变量选择和正则化&#xff0c;以增强预测准确性和模型的解释性。LASSO通过在损失函数中加入一个L1惩罚项来实现这一点。该惩罚项对系数的绝对值进行约束。 基本概念 …

022 基于Spring Boot的校园二手交易平台(源码+数据库+10000字论文)

部分代码地址&#xff1a; https://github.com/XinChennn/xc022-Used-Trading-Platform2 基于Spring Boot的校园二手交易平台&#xff08;源码数据库10000字论文&#xff09; 一、系统介绍 基于Spring Boot的校园二手交易网站&#xff0c;方便学生处理自己的旧物&#xff0c…

springboot220基于SpringBoot+Vue的周边游平台个人管理模块的设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考。 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项目编号&…

基于Java+SSM+Jsp宿舍管理系统(源码+演示视频+包运行成功)

您好&#xff0c;我是码农小波&#xff08;wei158888&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 ❤️ 1. 毕业设计专栏&#xff0c;毕业季咱们不慌&#xff0c;上千款毕业设计等你来选。 目录 1、项目背景 2、项目演示 3、使用技术 4、系统设计 …

Windows系统安全策略设置之本地NTLM重放提权

经安全部门研究分析&#xff0c;近期利用NTLM重放机制入侵Windows 系统事件增多&#xff0c;入侵者主要通过Potato程序攻击拥有SYSTEM权限的端口伪造网络身份认证过程&#xff0c;利用NTLM重放机制骗取SYSTEM身份令牌&#xff0c;最终取得系统权限&#xff0c;该安全风险微软并…

Flask——基于python完整实现客户端和服务器后端流式请求及响应

文章目录 本地客户端Flask服务器后端客户端/服务器端流式接收[打字机]效果 看了很多相关博客&#xff0c;但是都没有本地客户端和服务器后端的完整代码示例&#xff0c;有的也只说了如何流式获取后端结果&#xff0c;基本没有讲两端如何同时实现流式输入输出&#xff0c;特此整…