[jekyll] Jekyll-메뉴 모음에서 현재 탭을 자동으로 강조 표시

나는 github를 사용하여 정적 사이트를 호스팅하고 Jekyll을 사용하여 생성합니다.

메뉴 모음 ( <ul>)이 있고 <li>현재 페이지에 해당하는 CSS 강조 표시를 위해 다른 클래스를 할당하고 싶습니다 .

그래서 유사 코드 :

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

또는 <ul>Jekyll 에서 전체 를 생성 할 수도 있습니다.

위반 사항이 아닌 최소한의 변경으로 어떻게이 작업을 수행 할 수 <ul>있습니까?



답변

네, 할 수 있습니다.
이를 위해 우리는 현재 페이지가 page템플릿에서 항상 liquid 변수로 표현된다는 사실 과 각 게시물 / 페이지의 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

마지막으로 웹 사이트 자체에서 작동하는 모습을 볼 수 있습니다. 오른쪽 탐색을 보면 현재 페이지가 녹색으로 강조 표시된 것을 볼 수 있습니다. 강조 표시된 탐색 링크의 예


답변

가장 간단한 탐색 요구 사항은 나열된 솔루션이 지나치게 복잡하다고 생각합니다. 다음은 전면 문제, 자바 스크립트, 루프 등을 포함하지 않는 솔루션입니다.

페이지 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가 시연 한 것과 같은 머리말을 사용해야합니다.


답변

@ 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>

내비게이션의 링크 수가 매우 좁기 때문에 이것은 나를 위해 작동합니다.


답변

다음은 현재 페이지를 강조하는 가장 좋은 방법이라고 생각하는 내 솔루션입니다.

다음 과 같이 _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>

그리고 equals = 연산자 대신 contains 연산자를 사용하기 때문에 ‘/ blog / post-name /’ 또는 ‘projects / project-name / 과 같은 URL에서 작동하도록 추가 코드를 작성할 필요가 없습니다. . 그래서 정말 잘 작동합니다.

추신 : 페이지에 퍼머 링크 변수 를 설정하는 것을 잊지 마십시오 .


답변

이를 위해 약간의 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>

이 자바 스크립트 스 니펫은 현재 해당 페이지를 강조합니다.

$(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");
});


답변

내 접근 방식은 페이지의 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");
}


답변

웹 사이트의 탐색은 순서가없는 목록이어야합니다. 목록 항목이 활성 상태 일 때 밝게 표시되도록하기 위해 다음 액체 스크립트는 ‘활성’클래스를 추가합니다. 이 클래스는 CSS로 스타일을 지정해야합니다. 활성화 된 링크를 감지하기 위해 스크립트는 아래 코드에서 볼 수 있듯이 ‘포함’을 사용합니다.

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

이 코드는 Jekyll의 모든 영구 링크 스타일과 호환됩니다. ‘contains’문은 다음 URL에서 첫 번째 메뉴 항목을 성공적으로 강조 표시합니다.

  • 시작하기/
  • getting-started.html
  • getting-started / index.html
  • 시작하기 / 하위 페이지 /
  • getting-started / subpage.html

출처 : http://jekyllcodex.org/without-plugin/simple-menu/