Jekyll-自动突出显示菜单栏中的当前选项卡


81

我正在使用github托管一个静态站点,并使用Jekyll生成它。

我有一个菜单栏(如<ul>),并希望将<li>与当前页面相对应的菜单分配给CSS高亮显示一个不同的类。

所以像伪代码:

<li class={(hrefpage==currentpage)?"highlight":"nothighlight"} ...>

甚至<ul>在Jekyll中生成整体。

如何在违规之外进行最小限度的更改<ul>


Answers:


116

是的,您可以这样做。
为此,我们将利用以下事实:当前页面始终由page模板中的液体变量表示:并且每个帖子/页面在其page.url属性中都有唯一的标识符。

这意味着我们只需要使用一个循环来构建导航页面,这样我们就可以检查page.url循环的每个成员。如果找到匹配项,它将突出显示该元素。开始了:

  {% for node in site.pages %}
    {% if page.url == node.url %}
      <li class="active"><a href="{{node.url}}" class="active">{{node.title}}</a></li>
    {% else %}
      <li><a href="{{node.url}}">{{node.title}}</a></li>
    {% endif %}
  {% endfor %}

这按预期工作。但是,您可能不希望所有页面都在导航栏中。为了模拟页面“分组”,您可以这样:

## Put the following code in a file in the _includes folder at: ./_includes/pages_list

{% for node in pages_list %}
  {% if group == null or group == node.group %}
    {% if page.url == node.url %}
      <li class="active"><a href="{{node.url}}" class="active">{{node.title}}</a></li>
    {% else %}
      <li><a href="{{node.url}}">{{node.title}}</a></li>
    {% endif %}
  {% endif %}
{% endfor %}
{% assign pages_list = nil %}
{% assign group = nil %}

现在可以将页面“分组”。要为页面提供一个组,您需要在页面YAML Front Matter中指定它:

---
title: blah
categories: blah
group: "navigation"
---    

最后,您可以使用新代码了!无论您需要导航到模板中的何处,只需“调用”您的包含文件并将其传递给一些页面和您要显示的组即可:

<ul>
  {% assign pages_list = site.pages %}
  {% assign group = 'navigation' %}
  {% include pages_list %}
</ul>

例子

此功能是Jekyll-Bootstrap框架的一部分。您可以查看此处概述的代码的确切文档:http : //jekyllbootstrap.com/api/bootstrap-api.html#jbpages_list

最终,您可以在网站本身中看到它的运行情况。只需查看右侧导航,您就会看到当前页面以绿色突出显示示例突出显示的导航链接


1
好问题,好答案,谢谢。也可以直接针对手动选择的选项卡列表进行修改。花了一点时间才意识到page.url包含'/',例如。“ /index.html”而不是“ index.html”
cboettig 2012年

这种方法给我带来了Jekyll错误。jekyll 2.4.0 | Error: The included file '/Users/joelglovier/project/jekyllsite/_includes/pages_list' should exist and should not be a symlink
Joel Glovier 2015年

对于应该内置在Jekyll中的东西来说太复杂了。
cameronroe

@cameronjroe尝试将.html扩展名添加到pages_list并包括扩展名
HotelCalifornia15年

48

我觉得对于最简单的导航要求,列出的解决方案过于复杂。这是一个不涉及前端,javascript,循环等的解决方案。

由于我们有权访问页面URL,因此我们可以规范化和拆分URL并针对细分进行测试,如下所示:

{% assign current = page.url | downcase | split: '/' %}

<nav>
  <ul>
    <li><a href='/about' {% if current[1] == 'about' %}class='current'{% endif %}>about</a></li>
    <li><a href='/blog' {% if current[1] == 'blog' %}class='current'{% endif %}>blog</a></li>
    <li><a href='/contact' {% if current[1] == 'contact' %}class='current'{% endif %}>contact</a></li>
  </ul>
</nav>

当然,这仅在静态片段提供描绘导航的方式时才有用。任何更复杂的事情,您都必须使用@RobertKenny演示的前端问题。


这是我一直在寻找的,但不是classs="active"吗?
Ciro Santilli郝海东冠状病六四事件法轮功2014年

@CiroSantilli六四事件法轮功如果您的CSS具有样式.active,则为是。在上面的答案中,作者说她/他的样式表中要调用的类是.current。没什么大不了的。
Brian Zelip

3
@BrianZ,这是官方消息:过多的Bootstrap
会使

对于首页,我必须设置{%if current [1] == null%}
GorvGoyl

17

类似于@ ben-foster的解决方案,但不使用任何jQuery

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

在我的面前,我添加了一个名为 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="https://stackoverflow.com/">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>

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


谢谢@SurenderLohia,我想尽可能地保持单一。
罗伯特·肯尼(RobertKenny)

16

这是我的解决方案,我认为这是突出显示当前页面的最佳方法:

_config.yml上定义导航列表,如下所示:

navigation:
  - title: blog
    url: /blog/
  - title: about
    url: /about/
  - title: projects
    url: /projects/

然后,在_includes / header.html文件中,您必须遍历列表以检查当前页面(page.url)是否类似于导航列表中的任何项目,如果是,则只需设置活动类并将其添加到<a>标签中:

<nav>
  {% for item in site.navigation %}
      {% assign class = nil %}
      {% if page.url contains item.url %}
          {% assign class = 'active' %}
      {% endif %}
      <a href="{{ item.url }}" class="{{ class }}">
          {{ item.title }}
      </a>
  {% endfor %}
</nav>

并且由于使用的是contains运算符而不是equals =运算符,因此无需编写额外的代码即可使其与诸如'/ blog / post-name /''projects / project-name / '。所以它真的很好。

PS:请不要忘记在页面上设置永久链接变量。


这是我最喜欢的解决方案,因为它意味着我可以选择页面的顺序。

我喜欢这种解决方案,但是如果您具有带有网址的导航链接,则该解决方案将不起作用,/因为所有页面网址均包含前导斜杠。以下作品: {% for link in site.navigation %} {% assign class = nil %} {% if page.url == link.url %} {% assign class = 'active' %} {% elsif page.url != '/' and page.url contains link.url %} {% assign class = 'active parent' %} {% endif %} <a href="{{link.url}}" class="{{class}}">{{link.title}}</a> {% endfor %}
JamesWilson

6

我使用了一些JavaScript来完成此任务。菜单中有以下结构:

<ul id="navlist">
  <li><a id="index" href="index.html">Index</a></li>
  <li><a href="about.html">About</a></li>
  <li><a href="projects.html">Projects</a></li>
  <li><a href="videos.html">Videos</a></li>
</ul>

此javascript代码段突出显示了当前对应的页面:

$(document).ready(function() {
    var pathname = window.location.pathname;

    $("#navlist a").each(function(index) {
        if (pathname.toUpperCase().indexOf($(this).text().toUpperCase()) != -1)
            $(this).addClass("current");
    });

    if ($("a.current").length == 0)
        $("a#index").addClass("current");
});

我个人认为这比上面的方法干净。如果要在导航中订购页面,或者默认情况下要突出显示“索引”,则上述方法开始变得难看。
Verhogen

通过将类添加到当前页面元素,这很容易上手。“接受”的答案花了大约一个小时来弄清楚如何以及为什么。感谢您的分享
Ashwin

4

我的方法是在页面的YAML前端定义一个自定义变量,并将其输出到<body>元素上:

<body{% if page.id %} data-current-page="{{ page.id }}"{% endif %}> 

我的导航链接包括链接到的页面的标识符:

<nav>
    <ul>
        <li><a href="artists.html" data-page-id="artists">artists</a></li>
        <li><a href="#" data-page-id="contact">contact</a></li>
        <li><a href="#" data-page-id="about">about</a></li>
    </ul>
</nav>

在页面前端,我们设置页面ID:

---
layout: default
title: Our artists
id: artists
---

最后一点jQuery来设置活动链接:

// highlight current page
var currentPage = $("body").data("current-page");
if (currentPage) {
    $("a[data-page-id='" + currentPage + "']").addClass("active");
}

我认为此方法非常易于遵循,并且可以轻松地对菜单项进行排序。我对Jekyll还是很陌生,因此其他方法使我有些恐惧,但是我对jQuery非常满意。对于纯粹主义者而言,可能不是100%完美,但它可以正常工作。
TheBrockEllis

如果您只需要液体溶液,可以尝试以下方法:stackoverflow.com/a/46984009/2397550
JoostS

2

您的网站导航应为无序列表。为了使列表项在激活时变亮,以下流动脚本向其添加了一个“激活”类。此类应使用CSS设置样式。要检测哪个链接处于活动状态,脚本将使用“ contains”,如下面的代码所示。

<ul>
  <li {% if page.url contains '/getting-started' %}class="active"{% endif %}>
    <a href="https://stackoverflow.com/getting-started/">Getting started</a>
  </li>
  ...
  ...
  ...
</ul>

此代码与Jekyll中的所有永久链接样式兼容。“包含”语句成功突出显示了以下URL处的第一个菜单项:

  • 入门/
  • Getting-started.html
  • Getting Started / index.html
  • 入门/子页面/
  • Getting Started / subpage.html

资料来源:http : //jekyllcodex.org/without-plugin/simple-menu/


2

这里有很多令人困惑的答案。我只是用一个if

{% if page.name == 'limbo-anim.md' %}active{% endif %} 

我直接引用该页面并将其放入我想要的类中

<li><a class="pr-1 {% if page.name == 'limbo-anim.md' %}activo{% endif %} " href="limbo-anim.html">Animación</a></li>

做完了 快。


您能否详细说明每个要素的放置位置?header.html,还是?
乔治,

1

我一直在使用page.path并关闭文件名。

<a href="https://stackoverflow.com/" class="{% if page.path == 'index.html' %}active{% endif %}">home</a>

0

很多好的答案已经在那里。

试试这个。

我稍微改变了以上答案。

_data/navigation.yaml

- name: Home
  url: /
  active: home
- name: Portfolio
  url: /portfolio/
  active: portfolio
- name: Blog
  url: /blog/
  active: blog

在页面中-> portfolio.html(对于具有相对活动页面名称的所有页面相同)

---
layout: default
title: Portfolio
permalink: /portfolio/
active: portfolio
---

<div>
  <h2>Portfolio</h2>
</div>

Navigation html part

<ul class="main-menu">
  {% for item in site.data.navigation %}
    <li class="main-menu-item">
      {% if {{page.active}} == {{item.active}} %}
        <a class="main-menu-link active" href="{{ item.url }}">{{ item.name }}</a>
      {% else %}
        <a class="main-menu-link" href="{{ item.url }}">{{ item.name }}</a>
      {% endif %}
    </li>
  {% endfor %}
</ul>

0

如果您对jekyll使用Minima主题,则只需在header.html中的class属性上添加一个三进制:

 <a {% if my_page.url == page.url %} class="active"{% endif %} href="{{ my_page.url | relative_url }}">

完整摘录:

        <div class="trigger">
        {%- for path in page_paths -%}
          {%- assign my_page = site.pages | where: "path", path | first -%}
          {%- if my_page.title -%}
          <a {% if my_page.url == page.url %} class="active"{% endif %} href="{{ my_page.url | relative_url }}">{{ my_page.title | escape }}</a>
          {%- endif -%}
        {%- endfor -%}
      </div>

将此添加到您的_config.yml

header_pages:
  - classes.markdown
  - activities.markdown
  - teachers.markdown

然后当然是您的CSS:

   a.active {
                color: #e6402a;
            }

-2

这是执行相同操作的jQuery方法

  var pathname = window.location.pathname;

  $(".menu.right a").each(function(index) {
    if (pathname === $(this).attr('href') ) {
      $(this).addClass("active");
    }
  });
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.