从零开始建站(五) - 文章导航目录

一、应用

这里列举几个使用文章导航目录的地方:

1.百度百科

可以看到下面百度百科为了使结构清晰,所以使用了2个目录,第一个目录就像我们写毕业论文的目录,第二个就像Word和pdf左侧的导航目录,而我这里就是使用的后者。优点就是阅读的全程都可以跳转到你想要到的位置。

2.Word、pdf中应用

打开Word的视图,点击文档结构图,就可以看到

二、思路分析

1.解决方案-偷

1.1我们先看看百度百科是如何实现的,随便找条百度百科词条,然后按F12,查看定位的html标签,比如图中的“召唤师技能”可以看到是个H3标签

1.2我们再看导航目录的标签是一个a标签,使用的<a href=”#2_3”/>做锚点跳转,关于锚点可以自行百度

2.分析步骤

因为我们使用的是vue做前端框架,所以无法使用锚点跳转,但我们可以使用scrollTop这个属性来使要跳转的H标签的设置到窗口的顶部位置

2.1在文章加载完成后,遍历所有的html标签,如是H标签就拼凑到一个容器中,来构成导航目录的内容。

2.2给上面拼凑的容器中的每个标签绑定一个onclick事件。

2.3点击导航目录后,触发点击事件,调用函数,通过ID来找到之前的H标签的dom对象,并把这个dom对象的距离body顶部的数值设置给domcument的scrollTop,这时候窗口会自动滚动到这个H标签到顶部的位置。

三、实现

1.引入jquery

1.1我们还是通过cdn方式引入:进入bootcdn然后复制jquery的标签,然后在index.html中引入

<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>

1.2在webpack.base.conf.js中添加:

externals: {

‘vue‘: ‘Vue‘,

‘vue-router‘: ‘VueRouter‘,

‘axios‘: ‘axios‘,

‘vue-resource‘: ‘VueResource‘,

‘jquery‘:‘jQuery‘

}

1.3在main.js中

import $ from ‘jquery‘

2.加载文章内容后处理

2.1构造导航目录div

<div class="navi-floder">
    <div class="navi-floder-title">文章目录</div>
    <div class="navi-floder-content"></div>
</div>

2.2加载文章内容后调用函数处理H标签,构造导航目录div中的

<div class="navi-floder-content"></div>中的子内容,这里我只筛选了一级标题和二级标题,这里有几个比较坑的地方:

2.2.1markid在两个地方中,其中一个会自动转成小写,所以我干脆都转成小写

2.2.2在处理引号的三层嵌套上,每次都很头痛,这里试了很多次才成功

loadNaviFloder:function(){
  //文章导航目录
  $("#article-content").children().each(function(index, element) {
    var tagName=$(this).get(0).tagName;
    if(tagName.substr(0,1).toUpperCase()=="H"){
      var contentH=$(this).text();//获取内容
      var markid="mark-"+tagName.toLowerCase()+"-"+index.toString();
      $(this).attr("id",markid);//为当前h标签设置id
      if(tagName.toUpperCase() == "H1"){
        $(".navi-floder-content").append(‘<hr><span class="navi-h1-class" onclick="goAnchor(\‘#‘+markid+‘\‘)">‘+ contentH +‘</span><br/>‘);
      }else if(tagName.toUpperCase() == "H2"){
        $(".navi-floder-content").append(‘<span class="navi-h2-class" onclick="goAnchor(\‘#‘+markid+‘\‘)">‘+ contentH +‘</span><br/>‘);
      }
    }
  });
}

2.3处理点击事件,这里就是关键地方

window.goAnchor = function(selector){
  var anchor = $(selector)[0];
  document.documentElement.scrollTop = anchor.offsetTop;
}

2.4调节一下导航目录的css,这个就省略了,然后看一下成果,虽然不能双向导航(就是文章滚动到某个位置,导航目录也自动选取某个标题作为活动状态),不过还是蛮可开心了。后续可以想一下,做个页面滚动监听事件,当标签是H标签的时候,判断一下

document.documentElement.scrollTop ==anchor.offsetTop如果这个相等,就把导航目录的对应的标题变换个颜色来反馈给读者当前文章的大体位置。不过实现起来感觉很麻烦啊,后面再慢慢改进。

网上有个anchorjs和autocjs都是做导航目录的,类似于封装好的框架,有兴趣的可以研究一下。

四、注意事项

我在2.2.2中的代码:var contentH=$(this).text();//获取内容,这里直接取的是H标签中的内容,所以一定要保证H标签下,不在有子标签的存在

例如这里H3标签下还有个span标签,所以这里获得的contentH就是:<span class="title-prefix">英雄联盟</span>“召唤师技能”而不是“召唤师技能”,所以我每次在富文本编辑器的时候都会把几个标题处理一下,比如直接从Word中粘贴过来是这样的格式,可以看到直接是标题1的格式,这是我们想要的,但是H1标签下面有子标签,这个时不想要的,所以要改成单纯的H1标签:

这个时候我们选中内容点击一下清除格式:可以看到下面变成了单纯的H1标签,同时可以看到字体变成Verdana,同时也没有了加粗的显示了,也就是说,直接从Word粘贴,它会在原H1标签上多做了一些多余的格式设置。

原文地址:https://www.cnblogs.com/songzhen/p/blogs-diary-5.html

时间: 2024-07-29 23:01:46

从零开始建站(五) - 文章导航目录的相关文章

外贸建站之网站导航栏菜单高亮JS实现代码分享

外贸建站之网站导航栏菜单高亮JS实现代码分享,今天客户要给CAN Clip加一个菜单高亮的效果,原本打算用PHP代码实现,但是感觉过于复杂,JS有更好的解决方案, 这里把我们开发的代码分享给大家. 1 var urlstr = location.href; 2 var urlstatus=false; 3 var urlnum = 1; 4 $("#navbar a").each(function () { 5 if ((urlstr + '/').indexOf($(this).at

你不知道的事-建站始末1【准备篇】

阅读目录 建站四部曲: 你不知道的事-建站始末1[准备篇] 你不知道的事-建站始末2[框架篇] 你不知道的事-建站始末3[实现篇] 你不知道的事-建站始末4[总结篇] 本篇目录: 写在前面 为什么要建站? 建站计划 前端总结 知识点总结 域名和服务器 关于开源 未完待续 本篇内容会有些长,希望各位看官可以认真的阅读下去,我相信肯定会有收获. 写在前面 蝴蝶眨几次眼睛,才学会飞行,夜空洒满了星星,但几颗会落地. --你不知道的事 蝴蝶眨眼睛?星星会落地?当然很多人会认为这是无稽之谈,但是有些人却认

推荐的五款市面上常用的免费CMS建站系统

我做设计也有不少年头了,很多客户或者朋友找我做网站的时候,一般问我的是用什么软件系统给他们做.大部分客户希望用的软件是免费的.所以今天给大家介绍五款我自己用过还不错的,重点是还免费的建站系统. MetInfo MetInfo这个系统是一个客户指定的,让我必须用这个系统给他做网站.于是我花了一些时间去了解这个系统.整个系统可操作性还是可以的. MetInfo的框架是基于PHP+Mysql开发的. 从界面上来说,界面简洁一目了然,比较符合现在的用户习惯,扁平化的设计还是比较吸引用户的.从功能上来说,

YouDianCMS五合一建站系统跟新|V 6.7.0 发布

6.7.0 版更新日志此版本公开了前端PHP源码(/App/Lib/Action/Home./App/Lib/Action/Wap)及其它核心源码以方便大家修改,如因PHP二次开发需要用到某处源码,本司将免费提供! [增加] 实现功能强大的数据采集功能,支持复杂数据采集.可对频道模型的任意字段设置采集规则 [增加] 实现管理员操作日志功能,能记录增.删.改.排序.导出.清除缓存等各种操作 [增加] 增加一个信息相册字段,在添加文章时可以上传多个图片的功能 [增加] 增加一个信息相关字段,可以指定

黄聪:WordPress 多站点建站教程(六):使用WP_Query、switch_to_blog函数实现获取子站点分类中的文章

首先在你使用主题的funtions.php里面添加下代码: //根据时间显示最新的分类文章内容,每个站点显示一篇内容 //$blog_id 子站点ID //$catid 分类ID wp_reset_query(); switch_to_blog($blog_id); global $post;?> $my_query2 = new WP_Query('showposts=1&order=desc&orderby=date&cat='.$catid); while ($my_q

设置帝国cms文章标题 真正符合百度建站标准

百度建站指南中有提到内容页的标题设置,标题描述清晰最好包含主站和频道信息:内容标题_频道名称_网站名称.帝国cms文章标题一般默认是内容标题_网站名称,那么如何调用当前文章的频道名称(分类名称)呢? 帝国cms已经集成了面包屑导航功能,调用方法是在需要的地方添加标签[!--newsnav--],原本想着直接放到<title></title>,但是重新生成页面之后,查看一下源代码,发现标题变成了:<title>****_<a href="/"&g

【从0开始Tornado建站】主页的登录和显示最新文章

登录只要放在主页就可以了,这里为了美观,把<form>用bootstrap的form-inline类修饰,如下样子: 前台代码如下: {%extends 'main.html'%} {%block header%} <ul class='nav nav-pills'> <li><a href='/' class='h4 text-primary'>首页</a></li> <li><a href='/member' c

【从0开始Tornado建站】发表文章和评论

先上个效果图: 这是每个用户的主页,因为是基本功能,所以用户头像,爱好等信息都还没有,在下一阶段加上.右侧"发表新文章"按钮点击后进入发表文章的页面: 之前尝试过一些开源的富文本编辑器widgEditor和百度的ueditor,总感觉太大众化,既然域名是hacker,那就用hack一些的方式,直接用裸的<textarea>然后用markdown格式就最棒了嘛,发表后的样子: 完美支持markdown,而且我测试过的所有markdown编辑器比如retext.dillinge

Drupal 7 建站学习手记(五):HTML文档流overflow的问题

背景 项目要求网站首页放Views生成的区块,并且要求有更多链接. Views生成的区块默认的更多链接只能选在列表上方和下方 下图是默认在上方的样式图: 为了美观,我将更多链接上移了若干个像素: .more-link { position: absolute; top: 10px; left: 390px; } 效果图: 问题 然而,当我在这个区块外面再套一层区块时, (比如我这里用了QuickTabs模块,实际上是一个嵌套区块) 这个更多链接怎么都不显示了: 探究 第一反应是z-index的问