在使用Github和Jekyll部署个人博客的时候,当增加树形目录(Table of content,TOC)时,锚点跳转的位置正好被Bootstarp的顶部导航栏遮挡住了一部分,从而导致在使用TOC的时候跳转的时候显示的位置有一定的偏差。

锚点定位偏移问题描述

当我们为博客设置了一个固定位置的导航栏时,Markdown为页面其他内容生成的锚链接,即TOC结构。当点击锚链接时,页面就会跳转到相应的位置,且该锚链接的起始位置会缩进到最上方,从而导致部分内容由于被导航栏遮住而不能正常显示。如下表所示:

  点击:http://foo.com/#bar
  错误 (but the common behavior):         正确:
  +---------------------------------+      +---------------------------------+
  | BAR///////////////////// header |      | //////////////////////// header |
  +---------------------------------+      +---------------------------------+
  | Here is the rest of the Text    |      | BAR                             |
  | ...                             |      |                                 |
  | ...                             |      | Here is the rest of the Text    |
  | ...                             |      | ...                             |
  +---------------------------------+      +---------------------------------+

然而,我们实际期望的结果应该如右图所示。为解决这一问题,上网查了一下,发现大致有三种解决方法:

1.生成一个伪锚链接

在TOC脚本生成header的时候,为其添加一个div的class,

<h1><a class="anchor" name="barlink">Bar</a></h1>

然后,在css中设置样式:

/* 具体padding高度可以根据你导航栏的高度来设定 */
.anchor{padding-top:50px;}

事实上,这个方法困扰我挺长时间,然后也没有实现锚链接的偏移效果。

2.巧用margin和padding解决问题

首先,尝试给“文章”添加外边距,

margin-top:50px;

到这里,可以发现并没有任何的变化,由此可以得出结论:锚点定位跟外边距没有关系。

随后,给“文章”添加内边距,

padding-top:50px;

瞬间感觉整个世界都好了,但是锚点定位虽然准了,但是会多出来内边距部分。由此可知,锚点定位跟内边距有关。 最后,使用margin与padding相结合

padding-top:50px;
margin-top:-50px;

来解决锚点定位和多出来的内边距问题。本博客就是使用这种方法来解决的问题

3.使用JS跳转来修正高度

这种方法的主要思路就是每次点击TOC中的目录时,都相应地往下滚动一定的高度,

var shiftWindow = function() { scrollBy(0, -50) };
if (location.hash) shiftWindow();
window.addEventListener("hashchange", shiftWindow);

这种方法,虽然也能解决问题,也在本博客上加以验证,但是稳定性欠佳,有时甚至无法实现正确的跳转。

修改结果截图

Drawing