51

我一直在将 Jekyll 用于静态站点(以便于维护),并且一直停留在以下功能:

这是我的链接栏:

<ul id="links">
    <li class="first"><a class="active" href="/">Home</a></li>
    <li><a href="./associate.html">Associate With Us</a></li>
    <li><a href="./media.html">Media</a></li>
    <li><a href="./clients.html">Clients</a></li>
    <li class="last"><a  href="./contact.html">Contact Us</a></li>
</ul>       

该类active处理着色。我想要的是这个类由 jekyll 应用,具体取决于使用液体/YAML 设置的一些变量。

有什么简单的方法可以解决这个问题吗?

由于该栏对所有页面都是通用的,因此它现在处于默认布局中。我可以通过使用 Javascript 来检测 url,并进行突出显示,但想知道 Jekyll 中是否有任何方法可以做到这一点。

4

10 回答 10

54

我在 Jekyll 中设置的两页中执行此操作。

我要做的第一件事是在 _config.yml 中创建一个包含所有页面信息的条目:

# this goes inside _config.yml. Change as required
navigation:
- text: What we do
  url: /en/what-we-do/
- text: Who we are
  url: /en/who-we-are/
- text: Projects
  url: /en/projects/
  layout: project
- text: Blog
  url: /en/blog/
  layout: post

然后,在我的主布局上,我使用该信息来生成导航链接。在每个链接上,我将链接的 url 与当前页面的 url 进行比较。如果它们相等,则页面处于活动状态。否则,他们不是。

有几个特殊情况:所有博客文章都必须突出显示“博客”链接,并且首页(英语和西班牙语)不得出现导航栏。对于这两种情况,我都依赖于博客文章和首页具有特定布局的事实(请注意,yaml 上的“博客”和“项目”链接有一个名为“布局”的额外参数)

导航代码生成如下:

{% unless page.layout == 'front' %}
  <ul class="navigation">
    {% for link in site.navigation %}
      {% assign current = nil %}
      {% if page.url == link.url or page.layout == link.layout %}
        {% assign current = 'current' %}
      {% endif %}

      <li class="{% if forloop.first %}first{% endif %} {{ current }} {% if forloop.last %}last{% endif %}">
        <a class="{{ current }}" href="{{ link.url }}">{{ link.text }}</a>
      </li>
    {% endfor %}
  </ul>
{% endunless %}

我仍然要记得每次添加新页面时都在 _config.yaml 中添加一个条目,然后重新启动 Jekyll,但现在这种情况很少发生。

认为导航 yaml 可以进入名为“导航”或类似内容的 _include 中,但我没有尝试在其中使用 yaml,所以我不知道它是否会起作用。就我而言,由于我有一个多语言站点,因此将所有内容都包含在配置中会更容易(缺少翻译更容易发现)

我希望这有帮助。

于 2011-06-16T08:26:39.350 回答
53

作为对另一个工作的进一步扩展,这里有一种方法可以让它index.html在你所有漂亮的 URL 上都没有湿漉漉的显示:

---
navigation:
 - text: Home
   url: /
 - text: Blah
   url: /blah/
---
{% assign url = page.url|remove:'index.html' %}
{% for link in page.navigation %}
<li {% if url == link.url %}class="active"{% endif %}>
    <a href="{{link.url}}" title="{{link.title}}">{{link.text}}</a>
</li>
{% endfor %}

黄金在assign获取页面 URL 的语句中(它自然包括 index.html,然后将其剥离以匹配 page.navigation 漂亮的 URL。

于 2013-06-20T13:47:26.847 回答
18

自从问题首次出现以来,这可能是一项新功能,但我发现这都可以在一个文件中完成:

  1. 将导航定义为 yaml 标头中的变量
  2. 使用液体循环变量

所以在我的_layouts/base.html我有:

---
navigation:
- text: Home
  url: /index.html
- text: Travel
  title: Letters home from abroad
  url: /travel.html
---

<ul>
    {% for link in page.navigation %}
    <li {% if page.url == link.url %}class="current"{% endif %}>
       <a href="{{link.url}}" title="{{link.title}}">{{link.text}}</a></li>
    {% endfor %}
</ul>

这会在Home页面上生成:

<ul>
    <li class="current"><a href="/index.html" title="">Home</a></li>
    <li><a href="/travel.html" title="Letters home from abroad">Travel</a></li>
</ul>

这在Travel页面上:

<ul>
    <li><a href="/index.html" title="">Home</a></li>
    <li class="current"><a href="/travel.html" title="Letters home from abroad">Travel</a></li>
</ul>
于 2013-01-22T04:23:40.990 回答
12

我需要一些简单的东西,这就是我所做的。

在我的前面事项中,我添加了一个名为active

例如

---
layout: generic
title:  About
active: about
---

我有一个包含以下部分的导航

    <ul class="nav navbar-nav">
        {% if page.active == "home" %}
            <li class="active"><a href="#">Home</a></li>
        {% else %}
            <li><a href="/">Home</a></li>
        {% endif %}
        {% if page.active == "blog" %}
            <li class="active"><a href="#">Blog</a></li>
        {% else %}
            <li><a href="../blog/">Blog</a></li>
        {% endif %}
        {% if page.active == "about" %}
            <li class="active"><a href="#">About</a></li>
        {% else %}
            <li><a href="../about">About</a></li>
        {% endif %}
    </ul>

这对我有用,因为导航中的链接数量非常窄。

于 2013-09-11T17:56:08.693 回答
4

所有页面上的相同导航

在阅读了所有这些答案后,我想出了一个新的、更易于维护的解决方案:

  1. 添加{% include nav.html %}到您的_layouts/layout.html文件中
  2. 将文件添加nav.html到您的_includes文件夹
  3. 将以下内容添加到您的nav.html文件中。它将确定您的链接是否在当前页面上,并添加一个类active以及index.html从您的链接中删除。它还可以与GitHub Pages 分支/repo-name所需的子文件夹一起使用。gh-pages

    <nav>
        <ul class="nav">
            {% assign url = page.url|remove:'index.html' %}
            {% for link in site.navigation %}
                {% assign state = '' %}
                {% if page.url == link.url %}
                    {% assign state = 'active ' %}
                {% endif %}
                <li class="{{ state }}nav-item">
                    <a href="{% if page.url == link.url %}{{ site.baseurl }}{% else %}{{ site.baseurl }}{{ link.url }}{% endif %}" title="{{ link.title }}">{{ link.text }}</a>
                </li>
            {% endfor %}
        </ul>
    </nav>
    
  4. 然后将导航链接数组添加到您的_config.yml文件中,如下所示。注意正确的缩进,因为 YAML 对此非常挑剔(Jekyll 也是如此)。

    navigation:
          - text: Home
            title: Back to home page
            url: /index.html
          - text: Intro
            title: An introduction to the project
            url: /intro.html 
          - text: etc.
            title: ...
            url: /foo.html 
    

仅在主页上导航 - 为他人“返回”

假设您的“主页”index.html页面(所有其他页面上的页面:_config.htmlnavigation

<nav>
    <ul class="grid">
        {% assign url = page.url | remove:'/index.html' %}
        {% assign home = site.navigation.first %}
        {% if url == empty %}
            {% for link in site.navigation %}
                {% assign state = '' %}
                {% if page.url == link.url %}
                    {% assign state = 'active ' %}
                {% endif %}
                {% if home.url != link.url %}
                    <li class="{{ state }}nav-item">
                        <a href="{% if page.url == link.url %}{{ site.baseurl }}{% else %}{{ site.baseurl }}{{ link.url }}{% endif %}" title="{{ link.title }}">{{ link.text }}</a>
                    </li>
                {% endif %}
            {% endfor %}
        {% else %}
            <li class="nav-item active">
                <a href="{{ home.url }}" title="{{ home.title }}">{{ home.text }}</a>
            </li>
        {% endif %}
    </ul>
</nav>
于 2013-07-13T16:07:15.640 回答
3

这对我有用(对不起非英文代码):

<nav>
  <a href="/kursevi" {% if page.url == '/kursevi/' %} class="active"{% endif %}>Kursevi</a>
  <a href="/radovi" {% if page.url == '/radovi/' %} class="active"{% endif %}>Radovi</a>
  <a href="/blog" {% if page.url == '/blog/' %} class="active"{% endif %}>Blog</a>
  <a href="/kontakt" {% if page.url == '/kontakt/' %} class="active"{% endif %}>Kontakt</a>
</nav>
于 2017-03-07T12:50:52.437 回答
2

导航突出显示逻辑是我在服务器端做的最后一件事。我宁愿坚持使用 JS/jQuery 的漂亮、干净和不显眼的方法(如果这个选项适合你)。

  1. 需要突出显示的元素放在一个常见的布局中,如下所示:

    <nav>
      <a id="section1" href="#">Section 1</a>
      <a id="section2" href="#">Section 2</a>
      <a id="section3" href="#">Section 3</a>
    </nav>
    
  2. 在您的页面中(甚至在嵌套布局中)您放置一个元素data-ref="#section1"(事实上,任何 jQuery 选择器都可以使用)。

  3. 现在,将以下 JS 片段(显示为 jQuery,但任何框架都可以)包含在<head>

    $(function() {
      $("[data-ref]").each(function() {
        $($(this).attr("data-ref")).addClass("current");
      });
    });
    

这种方法很好,因为它不对底层架构、框架、语言和模板引擎做任何假设。

更新:正如一些人指出的那样,您可能希望省略将$(function() { ... })脚本绑定到 DOM 就绪事件的部分——只需将脚本下推到<body>.

于 2013-05-16T14:47:57.827 回答
2

我采用了一种简单的 CSS 方法。首先,在前面添加一个标识符...

---
layout: page
title: Join us
permalink: /join-us/
nav-class: join <-----
---

将此作为课程添加到<body> 的导航中...

<body class="{{ page.nav-class }}">

<li class="{{ page.nav-class }}">...</a></li>

然后将这些链接到 CSS 中的所有页面,例如:

.about .about a,
.join .join a,
.contact .contact a {
color: #fff;
}

主要缺点是您需要对样式规则进行硬编码。

于 2016-01-05T19:44:22.583 回答
2

添加到化身的解决方案,最简单的 jQuery 代码行是这样的:

    $( "a[href='{{ page.url | remove: "index.html" }}']" ).addClass("current");

非常适合我。

于 2015-12-02T13:09:14.833 回答
2

使用 Jekyll 3.4.3,这有效:

<ul>
    {% for my_page in site.pages %} 
        {% if my_page.title %}
            <li {% if my_page.url == page.url %} class="active" {% endif %}>
                <a href="{{ my_page.url | relative_url }}">{{ my_page.title | escape }}
                </a>
            </li>
        {% endif %} {% endfor %}
</ul>
于 2017-03-30T13:41:40.863 回答