固定页眉和页内锚点与 Tripit Slate

问题描述 投票:0回答:1

这个问题是关于当这些 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"> &nbsp; </span>
    <span class="jumpleft"> Bogus Heading 2 </span>
</h2>

但是,尽管这揭示了我们的“页内”哈希链接,但它完全破坏了我们的左侧导航。由于与 Slate 的
tocify
左侧导航生成器的一些交互,以这种方式标记的任何标题都会出现如下错误: (1) 在左侧导航中隐藏其子项。 (2) 单击时,防止

jumptarget

 类将它们从顶部标题下方滚动出来。 (3) 单击后,在左侧导航栏中折叠其父项。
总而言之,我们的困境是:我们对左侧导航链接的修复导致文本内链接损坏。然而,我们对文本内链接的修复破坏了我们的左侧导航修复。

如果有人在 Tripit Slate 或

tocify

或其他框架上全局解决了这个问题,我们将非常感谢您的指点。干净的 CSS、hacky HTML 或 jivey JavaScript——我们是不可知论者。谢谢!

[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 面板)中的链接时,这些参数将控制滚动区域顶部的间距。这记录在 
javascript css-position fixed jquery-tocify-js slate-docs
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.