2017-09-15 4 views
0

Après avoir utilisé SO et trouvé beaucoup de réponses pour nourrir mon processus d'apprentissage, il est temps pour moi (et parce que je n'ai pas encore trouvé de réponse à mon problème) de vous demander votre aide. J'apprends PUG depuis quelques jours, et j'essaie d'utiliser "chaque" itération pour créer un diaporama html/css (suivant le projet de (merde, ne trouve plus le git, trop de projets basés sur ce)). Désolé. Voici le code carlin j'ai fait:PUG jouant avec l'index

.slideshow 
    each val, index in ['img-1.jpg', 'img-2.jpg', 'img-3.jpg'] 
    input(type="radio" name="ss" id='ss-img-' + index).ss-bullet 
    .ss-img 
     img(src=val) 
     label(for='ss-img-' + *index*).ss-nav-prev Image précédente 
     label(for='ss-img-' + *index*).ss-nav-next Image suivante 

(.classes sont seulement pour un style plus tard des boutons/balles)

Et ce que je suis en train d'obtenir, en html:

<div class="slideshow"> 
     <input class="ss-bullet" type="radio" name="ss" id="ss-img-0"> 
     <div class="ss-img"><img src="img/img-1.jpg"> 
     <label class="ss-nav-prev" for="ss-img-2">Image précédente</label> 
     <label class="ss-nav-next" for="ss-img-1">Image suivante</label> 
     </div> 
     <input class="ss-bullet" type="radio" name="ss" id="ss-img-1"> 
     <div class="ss-img"><img src="img/img-2.jpg"> 
     <label class="ss-nav-prev" for="ss-img-0">Image précédente</label> 
     <label class="ss-nav-next" for="ss-img-2">Image suivante</label> 
     </div> 
     <input class="ss-bullet" type="radio" name="ss" id="ss-img-2"> 
     <div class="ss-img"><img src="img/img-3.jpg"> 
     <label class="ss-nav-prev" for="ss-img-1">Image précédente</label> 
     <label class="ss-nav-next" for="ss-img-0">Image suivante</label> 
     </div> 
    </div> 

Bien sûr, comme vous tous remarqué, la partie manquante dans l'index :

label(for='ss-img-' + *index*) 

partie. Est-ce que quelqu'un peut m'apprendre s'il vous plaît comment itérer l'index pour compléter ceci? (une autre chose que vous avez probablement remarqué est que je suis encore nouveau pour javascript, et français) Merci!

+0

Que voulez-vous dire exactement «itérer l'indice? L'enlèvement des astérisques dans ce cas n'est-il pas suffisant? – gandreadis

+0

Hoy @gandreadis, Oui le * astérisque * ne fait que polluer le code ... s'il est supprimé, "index" retourne juste le nombre d'éléments dans la séquence. Ce que j'essaie de faire est de retourner l'index précédent et suivant. Donc pour le premier, quelque chose comme: 'index--' et le second 'index ++'. J'ai essayé ça sans succès. –

+0

Ahhh, maintenant je comprends. Voir ma réponse pour une solution possible :) – gandreadis

Répondre

0

Donc, ce que vous avez besoin est un peu simple de l'arithmétique circulaire (wrap-around) (voir aussi des réponses à this SO question):

- var arrayLength = 3; 
label(for='ss-img-' + ((index + arrayLength - 1) % arrayLength)).ss-nav-prev Image précédente 
label(for='ss-img-' + ((index + 1) % arrayLength)).ss-nav-next Image suivante 
+0

Merci, cela me rapproche déjà de mes besoins. En passant, lorsque j'ajoute votre code, les premier et dernier éléments retournent des valeurs étranges (respectivement: 8 qui n'existent pas, et 3 qui est au dessus du nombre maximum pour l'index). [link] (http://jsbin.com/eqenag/1/edit) En regardant le code interessant de @Roko C. Buljan trouvé dans le lien que vous m'avez donné. Ce sera mon cours de jour. –

0

donc avec votre code ajouté:

.slideshow 
    each val, index in ['img-1.jpg', 'img-2.jpg', 'img-3.jpg'] 
    input(type="radio" name="ss" id='ss-img-' + index) 
    .ss-img 
     img(src=val) 
     label(for='ss-img-' + ((index + val.length - 1) % val.length)) Image précédente 
     label(for='ss-img-' + ((index + 1) % val.length)) Image suivante 

I « m obtenir ceci:

<div class="slideshow"> 
     <input type="radio" name="ss" id="ss-img-0"> 
     <div class="ss-img"><img src="img-1.jpg"> 
     <label for="ss-img-8">Image précédente</label> 
     <label for="ss-img-1">Image suivante</label> 
     </div> 
     <input type="radio" name="ss" id="ss-img-1"> 
     <div class="ss-img"><img src="img-2.jpg"> 
     <label for="ss-img-0">Image précédente</label> 
     <label for="ss-img-2">Image suivante</label> 
     </div> 
     <input type="radio" name="ss" id="ss-img-2"> 
     <div class="ss-img"><img src="img-3.jpg"> 
     <label for="ss-img-1">Image précédente</label> 
     <label for="ss-img-3">Image suivante</label> 
     </div> 
    </div> 

(enlevé les classes pour le rendre plus clair) Comme vous pouvez le voir, les premier et dernier éléments ne bouclent pas encore comme prévu. Seul celui du milieu a raison. (Et désolé d'utiliser 'réponse' au lieu de 'commentaire', je n'ai pas trouvé un moyen d'écrire plusieurs lignes de code ...) Merci encore pour votre aide!

+0

Mais, vous n'avez pas vraiment inclus mon code: La première ligne de mon extrait est importante! En ce moment, vous mesurez simplement la longueur de chaque chaîne de nom de fichier – gandreadis

+0

Wat één newbie suis-je ... Merci, avec la variable ajoutée, ça fonctionne très bien.Maintenant j'ai juste besoin de rendre 'arrayLength' égal au nombre d'éléments dans la chaîne (et non la longueur de la chaîne de nom de fichier, bien sûr ...) au lieu de devoir le définir avec un nombre. Une idée? –

+0

Vous pouvez définir ce tableau d'images plus tôt dans le code, à l'aide d'un extrait JS incorporé ('- var images = [...]'), et passer par-dessus ('each val, index in images'). Ensuite, au lieu de 'arrayLength', utilisez' images.length' lors de la récupération de la longueur du tableau. – gandreadis

0

Voici le code carlin final pour celui qui veut l'utiliser:

.slideshow 
    - var imgs = ['img/img-1.jpg', 'img/img-2.jpg', 'img/img-3.jpg', 'img/img-4.jpg', 'img/img-5.jpg', 'img/img-6.jpg'] 
    each img, index in imgs 
    input(type="radio" name="ss" id=('ss-img-' + index) checked=(index === 0)).ss-bullet 
    .ss-img 
     img(src=img) 
     label(for='ss-img-' + ((index + imgs.length - 1) % imgs.length)).ss-nav-prev Image précédente 
     label(for='ss-img-' + ((index + 1) % imgs.length)).ss-nav-next Image suivante