我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎么使用Typecho插件实现添加文章目录

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

怎么使用Typecho插件实现添加文章目录

本文小编为大家详细介绍“怎么使用Typecho插件实现添加文章目录”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么使用Typecho插件实现添加文章目录”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

注意:我使用的是Joe主题7.3,其他主题文件路径可能不一样。

添加文章标题锚点

声明 createAnchor 函数

core/functions.php 中添加如下代码:

// 添加文章标题锚点function createAnchor($obj) {  global $catalog;  global $catalog_count;  $catalog = array();  $catalog_count = 0;  $obj = preg_replace_callback('/<h([1-4])(.*?)>(.*?)<\/h\1>/i', function($obj) {    global $catalog;    global $catalog_count;    $catalog_count ++;    $catalog[] = array('text' => trim(strip_tags($obj[3])), 'depth' => $obj[1], 'count' => $catalog_count);    return '<h'.$obj[1].$obj[2].' id="cl-'.$catalog_count.'">'.$obj[3].'</h'.$obj[1].'>';  }, $obj);  return $obj;}

也可以在标题元素内添加 <a> 标签,然后该标签新增 id 属性。

createAnchor 函数主要是通过正则表达式替换文章标题H1~H4来添加锚点,接下来我们需要调用它。

调用函数

同样在 core/core.php 中的 themeInit 方法最后一行之前添加如下代码:

if ($self->is('single')) {  $self->content = createAnchor($self->content);}

现在可以查看一下文章详情页面的源代码。文章的 H1~H4 元素应该添加了诸如 cl-1cl-2 之类的 id 属性值。具体啥名不是关键,好记就行。

显示文章目录

声明 getCatalog 函数

core/functions.php 中添加如下代码:

// 显示文章目录function getCatalog() {    global $catalog;  $str = '';  if ($catalog) {    $str = '<ul class="list">'."\n";    $prev_depth = '';    $to_depth = 0;    foreach($catalog as $catalog_item) {      $catalog_depth = $catalog_item['depth'];      if ($prev_depth) {        if ($catalog_depth == $prev_depth) {          $str .= '</li>'."\n";        } elseif ($catalog_depth > $prev_depth) {          $to_depth++;          $str .= '<ul class="sub-list">'."\n";        } else {          $to_depth3 = ($to_depth > ($prev_depth - $catalog_depth)) ? ($prev_depth - $catalog_depth) : $to_depth;          if ($to_depth3) {            for ($i=0; $i<$to_depth3; $i++) {              $str .= '</li>'."\n".'</ul>'."\n";              $to_depth--;            }          }          $str .= '</li>';        }      }      $str .= '<li class="item"><a class="link" href="#cl-'.$catalog_item['count'].'" rel="external nofollow"  title="'.$catalog_item['text'].'">'.$catalog_item['text'].'</a>';      $prev_depth = $catalog_item['depth'];    }    for ($i=0; $i<=$to_depth; $i++) {      $str .= '</li>'."\n".'</ul>'."\n";     }    $str = '<section class="toc">'."\n".'<div class="title">文章目录</div>'."\n".$str.'</section>'."\n";  }  echo $str;}

getCatalog 方法通过递归 $catalog 数组生成文章目录,接下来我们需要调用它。

函数

最好将放在右侧边栏中。为此在 public/aside.php 中添加如下代码:

<?php if ($this->is('post')) getCatalog(); ?>

注意:只有文章才使用目录,独立页面那些不需要,所以加了判断。Typecho 有一些神奇的 is 语法可以方便二次开发,可以访问它的官网文档了解更多。

现在点击右侧的文章目录,可以滚动到相应的文章小标题位置了。

添加文章目录样式

可以看到,当前的文章目录还比较丑陋,我们来美化一下。在 assets/css/joe.post.min.scss 中添加如下 SCSS 代码:

.joe_aside {  .toc {    position: sticky;    top: 20px;    width: 250px;    background: var(--background);    border-radius: var(--radius-wrap);    box-shadow: var(--box-shadow);    overflow: hidden;    .title {      display: block;      border-bottom: 1px solid var(--classA);      font-size: 16px;      font-weight: 500;      height: 45px;      line-height: 45px;      text-align: center;      color: var(--theme);    }    .list {      padding-top: 10px;      padding-bottom: 10px;      max-height: calc(100vh - 80px);      overflow: auto;      .link {        display: block;        padding: 8px 16px;        border-left: 4px solid transparent;        color: var(--main);        text-decoration: none;        white-space: nowrap;        overflow: hidden;        text-overflow: ellipsis;        &:hover {          background-color: var(--classC);        }        &.active {          border-left-color: var(--theme);        }      }    }  }}

为了方便操作,将 .toc 设置成 position: sticky; 实现了吸顶定位。考虑到文章目录可能很多,为 .toc 列表添加了 overflow: auto;,如代码第 3 ~ 4 行。

由于 .joe_header(主题标头)也使用了吸顶定位,导致和文章目录有遮挡,所有加了 has_toc .joe_header 来取消页面主题标头的吸顶功能,如下代码:

.has_toc {  .joe_header {    position: relative;  }}

定位到文章

要显示文章目录当前选中项的状态,需要用到 JavaScript 给选中项添加一个 active 样式。在 assets/js/joe.post_page.js 中添加如下代码:

var headings = $('.joe_detail__article').find('h2, h3, h4, h5');var links = $('.toc .link');var tocList = document.querySelector('.tocr > .list');var itemHeight = $('.toc .item').height();var distance = tocList.scrollHeight - tocList.clientHeight;var timer = 0;// 是否自动滚动var autoScrolling = true;function setItemActive(id) {  links.removeClass('active');  var link = links.filter("[href='#" + id + "']")  link.addClass('active');}function onChange() {  autoScrolling = true;  if (location.hash) {    id = location.hash.substr(1);    var heading = headings.filter("[id='" + id + "']");    var top = heading.offset().top - 15;    window.scrollTo({ top: top })    setItemActive(id)  }}window.addEventListener('hashchange', onChange);// hash没有改变时手动调用一次onChange();

由于布局和滚动动画的影响,导致锚点定位有点偏差。我们再 setItemActive 函数中用 scrollToscrollIntoView 来纠正。另外,我们希望有锚点的链接可以直接定位,因此监听了 hashchange 事件。点击文章目录测试一下定位,再手动键入锚点测试一下,应该都没啥问题。

定位到目录

目前可以从文章目录定位到文章标题了,是单向定位,双向定位还需要实现滚动文章内容时定位到文章目录的当前项。正如我们马上能想到的,需要监听 windowscroll 事件,如下代码:

function onScroll() {  if (timer) {    clearTimeout(timer);  }  timer = setTimeout(function () {    var top = $(window).scrollTop();    var count = headings.length;    for (var i = 0; i < count; i++) {      var j = i;      // 滚动和点击时 index 相差 1,需要 autoScrolling 来区分      if (i > 0 && !autoScrolling) {        j = i - 1;      }      var headingTop = $(headings[i]).offset().top;      var listTop = distance * i / count      // 判断滚动条滚动距离是否大于当前滚动项可滚动距离      if (headingTop > top) {        var id = $(headings[j]).attr('id');        setItemActive(id);        // 如果目录列表有滑条,使被选中的下一元素可见        if (listTop > 0) {          // 向上滚动          if (listTop < itemHeight) {            listTop -= itemHeight;          } else {            listTop += itemHeight;          }          $(tocList).scrollTop(listTop)        }        break;      } else if (i === count - 1) {        // 特殊处理最后一个元素        var id = $(headings[i]).attr('id');        setItemActive(id);        if (listTop > 0) {          $(tocList).scrollTop(distance)        }      }    }    autoScrolling = false;  }, 100);}$(window).on('scroll', onScroll);

首先,在 onScroll 事件处理函数中遍历标题数组 headings, 如果滚动条滚动距离 top 大于当前标题项 item 可滚动距离 headingTop,再调用 setItemActive 函数,传入当前的标题项的 id 来判断文章目录激活状态。如果目录列表有滑条,调用 jQuery 的 scrollTop 方法滚动目录列表滑条,使被选中目录项的上下元素可见,

读到这里,这篇“怎么使用Typecho插件实现添加文章目录”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

怎么使用Typecho插件实现添加文章目录

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么使用Typecho插件实现添加文章目录

本文小编为大家详细介绍“怎么使用Typecho插件实现添加文章目录”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么使用Typecho插件实现添加文章目录”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。注意:我使
2023-07-05

如何使用Typecho插件实现添加文章目录

这篇文章主要介绍了如何使用Typecho插件实现添加文章目录的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何使用Typecho插件实现添加文章目录文章都会有所收获,下面我们一起来看看吧。注意:我使用的是Joe
2023-07-05

Typecho插件实现添加文章目录的方法详解

这篇文章主要为大家详细介绍了如何实现为Typecho插件实现添加文章目录的功能,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下
2023-02-19

怎么使用ThinkPHP实现文章添加界面

本篇内容介绍了“怎么使用ThinkPHP实现文章添加界面”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、创建数据库首先,我们需要为我们的文
2023-07-05

wordpress怎么不用插件实现文章阅读数

这篇文章主要介绍了wordpress怎么不用插件实现文章阅读数,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。wordpress不用插件实现文章阅读数一、想法一开始想到应该有什
2023-06-14

怎么使用jquery实现文件加密

本文小编为大家详细介绍“怎么使用jquery实现文件加密”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么使用jquery实现文件加密”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、什么是jqueryjQue
2023-07-05

Vue怎么使用pdf-lib实现为文件流添加水印并预览

今天小编给大家分享一下Vue怎么使用pdf-lib实现为文件流添加水印并预览的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。首
2023-07-05

怎么用VBScript实现压缩目录中的所有文件

本篇内容介绍了“怎么用VBScript实现压缩目录中的所有文件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!复制代码 代码如下:On Err
2023-06-08

Maven Web项目怎么使用Cargo插件实现自动化部署

这篇文章主要讲解了“Maven Web项目怎么使用Cargo插件实现自动化部署”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Maven Web项目怎么使用Cargo插件实现自动化部署”吧!M
2023-07-05

怎么用VBScript实现解压缩目录中的所有文件

这篇文章主要介绍了怎么用VBScript实现解压缩目录中的所有文件,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。代码如下:On Error Resume Next Dim o
2023-06-08

怎么使用Jquery插件实现跨域异步上传文件功能

这篇文章主要介绍“怎么使用Jquery插件实现跨域异步上传文件功能”,在日常操作中,相信很多人在怎么使用Jquery插件实现跨域异步上传文件功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用Jquer
2023-07-04

怎么使用vue-pdf插件实现pdf文档预览功能

这篇文章主要介绍了怎么使用vue-pdf插件实现pdf文档预览功能的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么使用vue-pdf插件实现pdf文档预览功能文章都会有所收获,下面我们一起来看看吧。vue-p
2023-07-05

使用shell命令怎么实现将当前目录下多个文件合并为一个文件

这期内容当中小编将会给大家带来有关使用shell命令怎么实现将当前目录下多个文件合并为一个文件,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1、将多个文件合并为一个文件没有添加换行符find ./ -na
2023-06-09

使用VBS脚本怎么实现遍历批量替换多目录多文件内容

使用VBS脚本怎么实现遍历批量替换多目录多文件内容?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Set WshShell = CreateObject("Wscript.She
2023-06-08

Java项目中使用 Servlet怎么实现一个文件分享功能

本篇文章为大家展示了Java项目中使用 Servlet怎么实现一个文件分享功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。项目结构src com servletdemo Do
2023-05-31

怎么使用mybatis-xmlreload实现修改xml文件再也不用重启项目

今天小编给大家分享一下怎么使用mybatis-xmlreload实现修改xml文件再也不用重启项目的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我
2023-07-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录