这个问题是关于当这些 URL 是跳转目标时,获取散列 URL(如
mydomain.com/somepage#SomeAnchor
)从固定页面标题下滚动出来。这是这个已回答的问题的一个分支 – 但我想知道是否有人已经得到了在 Tripit Slate 文档发布框架上充分工作的答案?
这个基于 Slate 的网站不是我们的,但它显示了我们的困境:
如果单击左侧导航中的链接,中心文本列会滚动 到您选择的标题。一切都好。
但是请尝试单击正文中的链接。例如,来自 http://buddycloud.com/api#accounts,点击
push notification
关联。您滚动到一个完全不同的副标题。您要求的目标
实际上有焦点,但它隐藏在顶部导航栏下方。 (向上滚动并
你会看到的。)我们的 left-nav 链接可以正常工作,就像 buddycloud 网站的一样。感谢 Sidnicious' 4086107 回答,我们在所有标题上方放置了一个不可见的伪元素,这是由 Nicolas Gallagher 设计的。这是 CSS 类:
.jumptarget::before {
content:"";
display:block;
height:85px; /* fixed header height*/
margin:-85px 0 0; /* negative fixed header height */
}
以下是我们如何将其应用到我们的标题中:
## <span class="jumptarget" id="SomeAnchorName"> SomeHeading </span>
这对于左侧导航来说效果很好。从 css-tricks 中,我们了解到为什么它对于“页内”散列链接仍然失败:
当链接包含哈希时,如下所示:
...浏览器窗口将滚动...到最小 使该元素完全可见的可能位置。 ...与齐平 浏览器窗口的上边缘。这可以是......,在这种情况下 固定位置,保持在顶部标题,有很大问题。<a href="#section-two">Section Two</a>
确实,我们的固定顶部导航看起来很像 buddycloud 的(我们的是 82 像素高)。我们的页内哈希链接隐藏在它下面,就像他们的一样。
有两个重要的例外:首先,如果目标“散列”URL 驻留在与出站链接相同的 markdown 文件中,则目标会从固定标题下清晰地看到,就像左侧导航链接一样。 (在源端,Slate 将所有内容存储为 .md
文件。)这定位了问题:链接目标仅隐藏
,其中 Slate 必须遍历到单独 目标
.md
文件,然后连接 #<SomeAnchorName>
完成 URL。
其次,我们已经发现了一个黑客,可以获取所有“页内”哈希链接以清除我们的顶部标题。这涉及到使用两个跨度在 HTML 中对标题进行双重标记。第一个是一个空的虚拟跨度,它位于实际标题文本上方以欺骗滚动行为。 (它用我们上面的
jumptarget
类标记。)在标题本身上,我们应用一个带有类的单独跨度,这纠正了第一个 hack 中的左缩进。双标记看起来像这样:
<h2>
<span class="jumptarget" id="bogusN"> </span>
<span class="jumpleft"> Bogus Heading 2 </span>
</h2>
但是,尽管这揭示了我们的“页内”哈希链接,但它完全破坏了我们的左侧导航。由于与 Slate 的 tocify
左侧导航生成器的一些交互,以这种方式标记的任何标题都会出现如下错误: (1) 在左侧导航中隐藏其子项。 (2) 单击时,防止 jumptarget
类将它们从顶部标题下方滚动出来。 (3) 单击后,在左侧导航栏中折叠其父项。
总而言之,我们的困境是:我们对左侧导航链接的修复导致文本内链接损坏。然而,我们对文本内链接的修复破坏了我们的左侧导航修复。如果有人在 Tripit Slate 或
tocify
[2016 年 7 月 13 日更新:] 这是我们的开发人员添加到
layout.erb
的脚本,用于清除链接目标被持久标头隐藏。我们正在测试它是否适用于所有链接。非常欢迎评论:
<script>
var container = $('.page-wrapper .content');
var body = $('body');
var headerHeightPixels = 85;
container.on('click', function(event) {
var target = $(event.target);
if (target.is('a') && target.attr('href').charAt(0) === '#') {
setTimeout(function() {
$('body').scrollTop($('body').scrollTop() - headerHeightPixels)
}, 0);
}
});
</script>
Tocify 具有可设置的参数,当您单击左侧面板(由 tocify.js 生成的 ToC 面板)中的链接时,这些参数将控制滚动区域顶部的间距。这记录在