博客园目录制作

一、目录整合

  一直想为自己的博客园文章做个目录导航,此前为了省劲儿想套用别人现成的,但效果不是特别理想,还是决定自己动手做一个适合自己的。目录效果就在右边,这其实是借鉴layui官网文档目录导航的样式和功能。制作过程就不再细讲了,这里主要讲如何将这个目录整合到你的文章中(建议先看该注意事项,若不能接受可直接退出节省时间)。

1.1 页首 HTML 代码

  步骤比较简单,具体的图我就不贴了,首先就是将下面这行代码粘贴至 博客园后台-->设置-->页首 HTML 代码中。

<link rel="stylesheet" href="https://blog-static.cnblogs.com/files/liuguo/createDir.css">

 1.2

  接下来就是将下面的代码粘贴至 博客园后台-->设置-->页脚 HTML 代码中。

 <script src="https://blog-static.cnblogs.com/files/liuguo/createDir.js"></script>
    <script>
      window.onload = function() {
            var id = "cnblogs_post_body";
            var elem = document.getElementById(id);
      //页面不包含名为cnblogs_post_body的id或屏幕宽度小于450时不生成目录
          if (!elem || screen.width < 450) return false;
            createDir(id, {
                h2: "h2",
                h3: "h3"
            });
            drag();
            a();
        }
    </script>

 1.3 注意事项

  经过以上两步操作,目录的引入工作就算完成了,但这里仍有一些事情需要注意:

  (1)目录兼容性:该目录不兼容移动设备如平板,手机(手机端不会生成该目录)等,已知兼容谷歌,火狐和windows 10的Edge(其他浏览器没有测试),谷歌渲染出来的可能有点怪,莫名的比火狐和Edge的要大上一点,这可能和博客使用的模板样式设定有关(我使用的模板在谷歌上有水平滚动条,火狐,IE则没有)。

  (2)目录获取:该目录只支持二级体系,具体是对哪些标签获取,可根据传入参数而改变,默认为H2和H3标签。

  (3)界面美化:目录的美观与否与文章的排版有一定的关系,所以一定注意文章排版的美观。另外目录对获取的文字有截取功能,防止文字过长影响美感,限制的最大文字长度为20个汉字,超出文本将用“···”替换,目录对高度也有限制,超出高度会追加竖直滚动条。

  (4)二次制作:建议大家把相应的Js和Css文件下载并上传到自己的博客园文件中,这样当我把文件删除时不会影响到大家的使用体验。另外,Js文件中有大量的注释,如果大家对该目录不满意可以根据注释尝试对其二次制作。

1.4 致谢

  在制作目录导航的过程中,我也参观了不少优秀的制作目录导航的博文,也受到了一定程度的启发。非常感谢这些文章,下面将文章链接贴上。

二、知识总结

  看似是一个简单的小功能,但由于前段基础薄弱,制作这个也确实花费了我不少的时间,下面对制作过程中收获的知识点进行总结。

2.1 HTML5的锚点问题

  相较于HTML4只能通过a标签的name属性设置锚点而言,HTML5设置锚点的方式更加灵活,它是使用id属性设置锚点(无论什么标签,只要有id属性都可以),这样以来就不需要再去嵌套a标签做锚点了,跳转也更加灵活方便。

2.2 浏览器渲染页面的两种模式

  W3C标准推出以后,浏览器都开始采纳新标准,但为了兼容以前的页面,浏览器保留了旧的渲染模式。区分这两种渲染模式的方式就是HTML头部的doctype声明,当浏览器能正常识别doctype声明时为Standars mode(标准模式),当页面没有doctype声明或浏览器无法识别doctype时采用Quirks mode(怪异模式)。

  这两种模式的主要区别如下:

  在Standars mode中: 元素真正的宽度 = margin-left   +   border-left-width   +   padding-left   + width   +   padding-right   +   border-right-width   +   margin-right; 

  在Quirks mode中: width则是元素的实际宽度,内容宽度 = width   -   (margin-left   +   margin-right   +   padding-left   +   padding-right   +   border-left-width   +   border-right-width)

  在Js中可以通过window.top.document.compatMode来查看浏览器对当前页面的渲染模式,结果BackCompat对应怪异模式,CSS1Compat对应标准模式。

  在JQuery中使用 $.boxModel 和 $.support.boxModel 来查看渲染模式。

2.3 Js中if 里的逻辑表达式

  js中的数据类型有undefined,boolean,number,string,object等5种,前4种为原始类型,第5种为引用类型。若 if() 逻辑(表达式)判断里面的值是一个字符串, 如 user.id 是一串字符, 那据下列情况判断出的逻辑值就是:

  字符串是否为空?即 “” 与 “   ”的区别(若其长度为 0,逻辑值为 false;其长度 > 0,逻辑值为 true)。

  字符串是否被赋值?(若未赋值,即为undefined,或赋予空值,逻辑值为 false;否则,逻辑值为 true)。

  如果 id="0",表明字符串长度为 1, 结果,逻辑判断值为 true。

  如果 id= 0 ,则认定 id 是个 number 型, 结果,逻辑判断值为 false。

  如果 id= false ,则认定 id 是个 boolean 型的数据, 结果,逻辑判断值为 false。

  如果 id= null ,则认定 id 是个 object 型(引用型)的数据, 结果,逻辑判断值为 false。

2.4 Js中的闭包概念

  概念:内部函数总是可以访问其所在的外部函数中声明的参数变量,即使在其外部函数被返回(寿命终结)了之后。

  为加深对这句话的理解,下面给出两个例子帮助理解。

//案例1
function outerFn(){
  var i = 0; 
  function innerFn(){
      i++;
      console.log(i);
  }
  return innerFn;
}
var inner = outerFn();  //每次外部函数执行的时候,都会开辟一块内存空间,外部函数的地址不同,都会重新创建一个新的地址
inner();
inner();
inner();
var inner2 = outerFn();
inner2();
inner2();
inner2();   //1 2 3 1 2 3

//===========案例2===========
function fun(n,o) {
    console.log(o);
    return {
         fun:function(m) {
               return fun(m,n);
         }
    };
}
var a = fun(0);  //undefined
a.fun(1);  //0  
a.fun(2);  //0  
a.fun(3);  //0  
var b = fun(0).fun(1).fun(2).fun(3);   //undefined  0  1  2
var c = fun(0).fun(1);  
c.fun(2);  
c.fun(3);  //undefined  0  1  1

   结论:闭包找到的是同一地址中父级函数中对应变量最终的值。

2.4 致谢

  关于闭包等有关知识点,我也找到了一些讲的很好的博客,同样非常感谢这些文章,下面给出链接。

 

 

  

posted @ 2020-05-23 21:39  又要起名字呀  阅读(365)  评论(3编辑  收藏  举报