Jekyll sélectionnez l'url de la page actuelle et le changement de sa classe
J'ai été en utilisant Jekyll pour un site statique (de sorte que son facile à maintenir), et ont été bloqués à la fonctionnalité suivante :
C'est ma barre de liens :
<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>
La active
classe gère la coloration. Ce que je veux, c'est cette classe à être appliqués par jekyll en fonction de certaines variables définies à l'aide de liquide/YAML.
Est-il un moyen facile d'aller à ce sujet?
Depuis le bar est commun à toutes les pages, il est maintenant dans la configuration par défaut. Je pourrais aller autour de par l'utilisation de Javascript pour détecter l'url, et faire la mise en évidence, mais je me demandais si il y avait un moyen de faire cela dans Jekyll.
Vous devez vous connecter pour publier un commentaire.
Je le fais en deux pages, j'ai mis en place dans Jekyll.
La première chose que je fais est la création d'une entrée à l'intérieur de _config.yml avec les informations de toutes les pages:
Puis, sur ma page principale, j'ai utiliser cette information pour générer les liens de navigation. Sur chaque lien, je compare l'url du lien avec l'url de la page en cours. Si elles sont égales, la page est active. Sinon, ils ne le sont pas.
Il y a quelques cas particuliers: tous les articles du blog doit mettre en évidence le "blog" de lien, et les premières pages (anglais et espagnol) ne doivent pas présenter à la barre de navigation. Pour les deux cas, je m'appuie sur le fait que les messages de blog et les pages de couverture ont des dispositions spécifiques (notez que le "Blog" et "Projet" liens sur le yaml ont un paramètre supplémentaire appelé "mise en page")
La navigation code est généré comme ceci:
J'ai encore le souvenir de l'ajout d'une entrée à _config.yaml à chaque fois que j'ajoute une nouvelle page, puis redémarrez Jekyll, mais il arrive très rarement maintenant.
Je pense la navigation yaml pourrait aller à l'intérieur d'un _include appelé "navigation" ou quelque chose de similaire, mais je n'ai pas essayé d'utiliser yaml à l'intérieur donc je ne sais pas si cela va fonctionner. Dans mon cas, depuis que j'ai un site multilingue, il est plus facile d'avoir tout à l'intérieur de config (traductions manquantes sont plus faciles à repérer)
J'espère que cette aide.
permalink: /
à son sommet yaml section.Comme une extension sur le travail de l'autre, voici un moyen de le faire fonctionner sans détrempé
index.html
montrant sur tous vos beaux Url:L'or est dans le
assign
déclaration qui récupère l'URL de la page (ce qui inclut naturellement les index.html et puis les bandes pour correspondre à la page.navigation assez Url.{% capture url %}{{ page.url | remove:'index.html' }}{% endcapture %}
layout.navigation
. Voir github.com/jekyll/jekyll/issues/4246|remove:'index.html' %}
à|remove:'.html' %}
supprimer la fin.html
.Cela peut être une nouvelle fonctionnalité depuis que la question est d'abord apparue, mais j'ai découvert cela peut être fait en un seul fichier:
Donc, à mon
_layouts/base.html
j'ai:Qui génère cette sur le
Home
page:Et ce sur la
Travel
page:layout.navigation
. Voir github.com/jekyll/jekyll/issues/4246|remove:'index.html' %}
à|remove:'.html' %}
supprimer la fin.html
.J'ai besoin de quelque chose de simple, c'est ce que j'ai fait.
Dans la partie avant de ma question, j'ai ajouté une variable appelée
active
par exemple
J'ai une navigation à inclure dans la section suivante
Cela fonctionne pour moi comme le nombre de liens dans la navigation sont très étroites.
Même la navigation sur toutes les pages
Après avoir lu toutes les réponses, je suis venu avec une nouvelle et plus facile à entretenir solution:
{% include nav.html %}
à votre_layouts/layout.html
fichiernav.html
fichier sur votre_includes
dossierAjoutez le contenu suivant votre
nav.html
fichier. Il permettra de déterminer si votre lien est sur la page en cours et ajouter une classe deactive
ainsi que de supprimerindex.html
à partir de votre lien. Il permettra également de travailler avec un sous-dossier comme/repo-name
, ce qui est nécessaire pour GitHubgh-pages
Pages branche.Puis ajouter de la valeur liquidative lien tableau de votre
_config.yml
fichier de la manière suivante. L'esprit du droit de l'indentation, en YAML est assez pointilleux sur qu' (Jekyll ainsi).Navigation uniquement sur "retour" pour les autres
En supposant que le lien vers votre "Maison"-page (
index.html
) est la première partie de tableau à l'intérieur de la_config.html
snavigation
tableau, vous pouvez utiliser le code suivant pour afficher la navigation à travers les différentes pages de la main/page d'accueil et un lien vers la page d'accueil sur toutes les autres pages:De Navigation mettant en évidence la logique est la dernière chose que je ferais à côté serveur. Je préfère rester avec agréable, propre et discret, à l'aide JS/jQuery (si cette option fonctionne pour vous).
Les éléments qui doivent être mis en évidence au sein d'une commune de la mise en page comme ceci:
Dans votre page (ou même dans les mises en page) vous placez un élément avec
data-ref="#section1"
(en fait, toute sélecteur jQuery de travail).Maintenant, comprennent les suivantes JS extrait de (montré que jQuery, mais aucun cadre ne) en
<head>
:Cette approche est agréable, parce qu'il ne fait pas d'hypothèse sur l'architecture sous-jacente, des cadres, des langues et des moteurs de template.
Mise à jour: Comme certaines personnes ont souligné vous pourriez omettre le
$(function() { ... })
partie qui lie le script à DOM prêt de l'événement — et il suffit de pousser le script vers le bas de votre<body>
.if-then-else
(c'est ce que tous les autres réponses suggèrent) est toujours considéré comme une odeur de code, en particulier dans les modèles où littéralement toute la logique est une visite indésirable, parce que propre document de la sémantique du code est mélangé avec de la logique branches dans un gros spaghetti balle.if-then-else
approche, vous êtes obligé de répéter ces fils de balles pour tous les mettant en évidence le contexte (ou peut-être même le copier-coller!), alors que mon approche proposée ne nécessite qu'unid
sur le lien de navigation et un autredata-ref
attribut à l'intérieur le rendu du document qui pointe vers elle.active
classe également fait négligeable à l'ensemble de document de la sémantique (leactive
classe n'est ni un cahier des charges, ni d'une convention: on peut l'appelercurrent
, certains peuvent l'appelerthis
). Le seul problème avec mon approche est jQuery, qui peut facilement être réécrite en utilisantdocument.querySelectorAll
.Avec Jekyll 3.4.3, cela fonctionne :
if page.url == whatever.url
à l'intérieur de monfor
boucle. Chose de la beauté!Cela fonctionne pour moi (désolé pour les non-code de l'anglais):
Ajoutant à la solution de l'incarné, le plus simple ligne de code avec jQuery est ceci:
Fonctionne parfaitement pour moi.
J'ai pris un simple CSS approche. Tout d'abord, ajoutez un identifiant dans la première partie...
Ajouter une classe dans
<body>
et votre nav...et
Alors le lien entre ces pour toutes les pages en CSS, e.g:
Le principal inconvénient d'être vous avez besoin de coder en dur les règles de style.