Pages :
Bonjour,

gcyrillus a écrit :
oui, la fonction .focus() est une bonne piste .


D'accord.
Dans le code html j'ai inclus une petite déclaration javascript.

<figure>
<img tabindex="0" src="im//pr/2128G.jpg" alt="" width="77" height="75" loading="lazy" />
<img src="im//pr/2128G.jpg" alt="" loading="lazy" />
<img tabindex="0" src="im/mu/2128-1G.webp" alt="" width="100" height="75" loading="lazy" decoding="async" />
<img src="im/mu/2128-1G.webp" alt="" loading="lazy" decoding="async" />
<img tabindex="0" src="im/mu/2128-2G.webp" alt="" width="100" height="75" loading="lazy" decoding="async" />
<img src="im/mu/2128-2G.webp" alt="" loading="lazy" decoding="async" />
<img tabindex="0" src="im/mu/2128-3G.webp" alt="" width="100" height="75" loading="lazy" decoding="async" />
<img src="im/mu/2128-3G.webp" alt="" loading="lazy" decoding="async" />
</figure>

<script type="text/javascript">
const foc = document.querySelector('img[src$="2128-2G.webp"] + img');
foc.focus ();
</script>
<script src="dp/pop_ferme.js"></script>


Cela ne marche pas, c'est toujours la première grande image qui est affichée.

J'ai aussi essayé :

const foc = document.querySelector('img:not([tabindex])[src$="2128-2G.webp"]');


Ne marche pas mieux.

Vois-tu l'erreur ?
Modifié par boteha_2 (27 Jul 2025 - 15:16)
Raffi-dcb a écrit :
J'utilise boostrap également et c'est vrai que c'est très pratique et très simple à prendre en main Smiley smile


Je veux bien te croire mais l'approche quasiment 100 % CSS est intéressante.
Modérateur
boteha_2 a écrit :
Bonjour,



D'accord.
Dans le code html j'ai inclus une petite déclaration javascript.

&lt;figure&gt;
&lt;img tabindex="0" src="im//pr/2128G.jpg" alt="" width="77" height="75" loading="lazy" /&gt;
&lt;img src="im//pr/2128G.jpg" alt="" loading="lazy" /&gt;
&lt;img tabindex="0" src="im/mu/2128-1G.webp" alt="" width="100" height="75" loading="lazy" decoding="async" /&gt;
&lt;img src="im/mu/2128-1G.webp" alt="" loading="lazy" decoding="async" /&gt;
&lt;img tabindex="0" src="im/mu/2128-2G.webp" alt="" width="100" height="75" loading="lazy" decoding="async" /&gt;
&lt;img src="im/mu/2128-2G.webp" alt="" loading="lazy" decoding="async" /&gt;
&lt;img tabindex="0" src="im/mu/2128-3G.webp" alt="" width="100" height="75" loading="lazy" decoding="async" /&gt;
&lt;img src="im/mu/2128-3G.webp" alt="" loading="lazy" decoding="async" /&gt;
&lt;/figure&gt;

&lt;script type="text/javascript"&gt;
const foc = document.querySelector('img[src$="2128-2G.webp"] + img')
foc.focus ();
&lt;/script&gt;
&lt;script src="dp/pop_ferme.js"&gt;&lt;/script&gt;


Cela ne marche pas, c'est toujours la première grande image qui est affichée.

J'ai aussi essayé :

const foc = document.querySelector('img:not([tabindex])[src$="2128-2G.webp"]');


Ne marche pas mieux.

Vois-tu l'erreur ?


Bonjour, à première vue, foc ici cible une balise image sans attribut tabindex , donc qui ne peut pas prendre le focus. Smiley cligne

Cdt
Merci de ta réponse rapide.

Ok, j'ai change comme suit :

<figure>
<img tabindex="0" src="im//pr/2128G.jpg" alt="" width="77" height="75" loading="lazy" />
<img tabindex="1" src="im//pr/2128G.jpg" alt="" />
<img tabindex="0" src="im/mu/2128-1G.webp" alt="" width="100" height="75" loading="lazy" decoding="async" />
<img tabindex="1" src="im/mu/2128-1G.webp" alt="" loading="lazy" decoding="async" />
<img tabindex="0" src="im/mu/2128-2G.webp" alt="" width="100" height="75" loading="lazy" decoding="async" />
<img tabindex="1" src="im/mu/2128-2G.webp" alt="" loading="lazy" decoding="async" />
<img tabindex="0" src="im/mu/2128-3G.webp" alt="" width="100" height="75" loading="lazy" decoding="async" />
<img tabindex="1" src="im/mu/2128-3G.webp" alt="" loading="lazy" decoding="async" />
</figure>

<script type="text/javascript">
const foc = document.querySelector('img[src$="2128-2G.webp"] + img');
foc.focus ();
</script>
<script src="dp/pop_ferme.js"></script>


J'ai mis à jour tous les sélecteurs CSS basés sur Smiley tabindex , à présent [tabindex="0"].

Mais cela ne marche toujours pas, c'est toujours la première grande image qui est affichée...
Modifié par boteha_2 (27 Jul 2025 - 15:37)
Hello,

J'ai ajouté :

foc.addEventListener ('load', (event) => {foc.focus ()});


Donc code complet :

<script type="text/javascript">
const foc = document.querySelector('img[src$="2128-2G.webp"] + img');
foc.addEventListener ('load', (event) => {foc.focus ()});
</script>
<script src="dp/pop_ferme.js"></script>


Ne marche toujours pas...

Idem avec :

foc.addEventListener ('load', function () {foc.focus ()});

Modifié par boteha_2 (27 Jul 2025 - 16:07)
Hello,

Dans ton codepen il me semble que tu donnes le focus à des grandes images sans tabindex.

Par ailleurs pour mon besoin qui est simplement d'identifier la grande image cliquée et lui laisser le focus je ne comprends pas à quoi sert la modale.
Ce n'est pas une critique mais ce code me dépasse gravement.
noteha_2 a écrit :
Donc code complet :

<script type="text/javascript">
const foc = document.querySelector('img[src$="2128-2G.webp"] + img');
foc.addEventListener ('load', (event) => {foc.focus ()});
</script>
<script src="dp/pop_ferme.js"></script>


Ne marche toujours pas...


L'erreur ne concerne pas javascript.
C'est simplement qu'il faut affecter le focus non pas à la grande image mais à sa vignette qui est son frère aîné.

Ce code tout simple est suffisant :
document.querySelector('img[src$="2128-2G.webp"]').focus ();


Et je peux virer les tabindex="1" dont je n'ai pas besoin.

Reste le dernier problème soulevé dans le post précédent.
Modérateur
boteha_2 a écrit :
Hello,

Dans ton codepen il me semble que tu donnes le focus à des grandes images sans tabindex.

Par ailleurs pour mon besoin qui est simplement d'identifier la grande image cliquée et lui laisser le focus je ne comprends pas à quoi sert la modale.
Ce n'est pas une critique mais ce code me dépasse gravement.


oups non, j'ai intervertit les noms de variables, désolé , du coup c’était pas clair, noms de variables corrigées pour la clareté .

Fonctionnement:
Le script récupère la class de la vignette active au mousedown de la grande image affichée, puis rempli et ouvre la modale.
En refermant la modale, le script remet le focus sur l'image via sa class. (tu peut extraire une autre valeur que la class (id,src, sa position, etc. ) , j'ai pris className pour l'exemple).

* Les vignettes ont toutes un tabindex="0" qui permet de leur donner le focus et afficher la grande image via CSS.
* Les grandes n'ont que l'écouteur mousedown et declenche les actions javascript pour l'affichage de la modale.

La modale sert à afficher la grande image de la vignette active , le script ici se contente de cloner la grande pour la démo(une copie), tu peut reprendre ta méthode et afficher ton image haute résolution au nom partiellement similaire.
la modale me semble plus appropriée, par exemple depuis un téléphone , et ne demandera pas l'autorisation au visiteur d'ouvrir une popup Smiley cligne

Si tu as d'autres questions et remarques, n’hésite pas , le forum est là pour ça.

Cdt

Rappel: Nous étions partit d'un carrousel 3 images en CSS en faisant du tabindex pour pour le focus d'une vignette et se passer de javascript. nous avons juste surchargé cette base initiale
Modifié par gcyrillus (27 Jul 2025 - 19:34)
Hello,

gcyrillus a écrit :
La modale sert à afficher la grande image , le script ici se contente de cloner la grande pour la démo(une copie), tu peut reprendre ta méthode et afficher ton image haute résolution au nom partiellement similaire. la modale me semble plus appropriée, par exemple depuis un téléphone , et ne demandera pas l'autorisation au site d'ouvrir une popup.


De moi-même je ne donne pas accès au pop-up sur les petits écrans.
Le seul intérêt du pop-up est de permettre au client d'ouvrir la page plein écran pour voir les images en grand, ce qui me semble plus efficace qu'une loupe.
Quand l'écran est petit tu restes sur le carrousel de base.

Je comprends mieux les principes de ton code, je vais essayer de m'en sortir, je te tiens informé, encore merci.
Bonjour gcyrillus,

Je m'efforce d'adapter ton code dans mon codepen mais bon, vu mon niveau assez faible en javascript cela ne fonctionne pas.

J'ai intégré dans un code qui fonctionne dans la vie réelle, je détaille :

const trouve_ca_id = document.querySelector('img.picture');

const idImg = trouve_ca_id.id.split ('X');
const ca_id = idImg[0];

// Trouve le numéro du produit dans le code html : 2158
// Fonctionne

const imaxes = document.querySelectorAll('img.picture, img[src^="im/mu/' + ca_id + '-"] + img');

// Trouve les grandes images
// Fonctionne

imaxes.forEach(imax => {

// J'ai enlevé du code qui fonctionne pour donner les paramètres à la fonction PopGrand

// Adaptateation de ton code
// Je chercje l'image par l'attribut src
// Ton code que je n'arrive pas à faire marcher...

imax.addEventListener("mousedown", function () {
    let activeImg = document.activeElement.src;

document.querySelector ( 'img[src="'+ activeImg + '"]').focus();
  
  });
 
// Et ma fonction d'ouverture du pop-up, juste pour info.
  
imax.addEventListener('mousedown', function() {PopGrand(ca_id, tist, height, img_format);});
});


Tu peux voir le code html dans le codepen.
Vois-tu l'erreur avec dans l'adaptation de ton code ?
Modifié par boteha_2 (31 Jul 2025 - 23:00)
Modérateur
Bonjour,

Dans ton codepen, idImg met le bins car il n'y a qu'une seule image avec un id Smiley smile , alors je les ai mis à l'écart.

Tu tente de donner a une vignette un focus (quelle a déjà) au moment de cliquer sur un autre élément, ça ne peut pas marcher, le focus() est aussitôt repris par cet élément cliqué.

Au mousedown, l'idée est de récupérer l'élément qui à le focus (si il y en a un et avant qu'il le perde) ,
puis de passer cette valeur (ici src) dans la fonction suivante pour en fin d'action (fermeture) renvoyer le focus sur la vignette avec l'attribut src correspondant.

Tu peut utiliser la console pour suivre les erreurs de script et tes valeurs
https://codepen.io/gc-nomade/pen/ogjBrzG?editors=1111
cdt


edit

Pour faire plus simple, il est aussi possible de stocker la valeur dans une constante plutôt que lui faire faire une course de relais

https://codepen.io/gc-nomade/pen/ZYbebzE?editors=1011

const trouve_ca_id = document.querySelector("img.picture");
const idImg = trouve_ca_id.id.split("X");
const ca_id = idImg[0];
const focused = []; // stockage de la source de la vignette précedement active
const imaxes = document.querySelectorAll(" img[tabindex] + img");
imaxes.forEach((imax) => {
  const tist = imax.alt;
  /* const idImg = imax.id.split("X");
 if (idImg.length < 3) {
    return;
  }*/
  const ca_id = idImg[0];
  const height = idImg[1];
  const img_format = idImg[2];
  
imax.addEventListener("mousedown", function () {
    let activeImg = document.activeElement.getAttribute("src");
    focused[0] = activeImg; // on sauvegarde la valeur dans la constante focused[].
    console.log(focused[0]); // voir dans la console ce que l'on récupére et si il y avait un focus()
    // Maintenant que notre valeur est stockée en mémoire, on passe à la suite
    PopGrand(ca_id, tist, height, img_format);
  });
});

function PopGrand(ca_id, tist, height, img_format) {
  if (focused[0] != null) {
    // si une valeur valide est stockée, on peut la récuperer à tous moments
    alert("src enregistré: " + focused[0]);
  }
}

Modifié par gcyrillus (01 Aug 2025 - 17:08)
Bonjour gcyrillus,

Bon ça avance de mon côté mais c'est toujours très laborieux.

J'ai fait un nouveau codepen avec le code html à peu près complet (avec les id renseignés pour toutes les grandes images) et ton code JS avec juste l'ajout de :

const mobile = window.matchMedia ('(min-width: 768px)');


Afin de bloquer l'ouverture du pop-up sur les petits écrans.

La bonne nouvelle est que j'arrive à récupérer la valeur de focused[0] dans la fonction PopGrand (ca_id, tist, height, img_format, focused);

Après toutefois avoir ajouté focused dans la liste des arguments.

La mauvaise nouvelle est que je n'arrive pas à bloquer le carrousel sur la grande image liée à focused.

J'essaye :

document.querySelector('img[src="' + focused[0] + '"]').focus ();


Mais c'est sans effet.
Pourtant c'est bien la vignette qu'il faut cibler pour bloquer la grande image correspondante.
Modérateur
boteha_2 a écrit :
Bonjour gcyrillus,

Bon ça avance de mon côté mais c'est toujours très laborieux.

J'ai fait un nouveau codepen avec le code html à peu près complet (avec les id renseignés pour toutes les grandes images) et ton code JS avec juste l'ajout de :

const mobile = window.matchMedia ('(min-width: 768px)');


Afin de bloquer l'ouverture du pop-up sur les petits écrans.

La bonne nouvelle est que j'arrive à récupérer la valeur de focused[0] dans la fonction PopGrand (ca_id, tist, height, img_format, focused);

Après toutefois avoir ajouté focused dans la liste des arguments.

La mauvaise nouvelle est que je n'arrive pas à bloquer le carrousel sur la grande image liée à focused.

J'essaye :

document.querySelector('img[src="' + focused[0] + '"]').focus ();


Mais c'est sans effet.
Pourtant c'est bien la vignette qu'il faut cibler pour bloquer la grande image correspondante.


Voici une correction possible : https://codepen.io/gc-nomade/pen/vENxzWw?editors=1011 qui applique le focus après que la grande image ai été cliqué Smiley smile
Bonjour gcyrillus,

Encore merci pour le suivi, j'espère que l'on y est presque.

Ton codepen fonctionne.

Sur mon codepen, je fais un copier-coller de ton code, cela fonctionne aussi.

Mais si j'active la fonction window.open dans PopGrand cela ne fonctionne plus, voir le codepen.

Le focus revient sur la bonne image à la fermeture du pop-up mais ce n'est pas le comportement espéré qui est :

Tu sélectionnes Vignette 2.
Tu cliques sur photo 2.
Le carrousel reste sur photo 2 // Ne marche pas
Le pop-up est ouvert avec le focus sur Vignette 2 (ce qui se passe avec le script PHP).
Si tu fermes le pop-up, tu retrouves le carrousel sur Vignette 2.

As-tu idée de la correction ?
Modifié par boteha_2 (03 Aug 2025 - 15:20)
Modérateur
boteha_2 a écrit :
Bonjour gcyrillus,

Encore merci pour le suivi, j'espère que l'on y est presque.
Le focus revient sur la bonne image à la fermeture du pop-up mais ce n'est pas le comportement espéré qui est :

Tu sélectionnes Vignette 2.
Tu cliques sur photo 2.
Le carrousel reste sur photo 2 // Ne marche pas
Le pop-up est ouvert avec le focus sur Vignette 2 (ce qui se passe avec le script PHP).
Si tu fermes le pop-up, tu retrouves le carrousel sur Vignette 2.


Le comportement est normal, lorsque la popup est ouverte, l'onglet de ton carrousel est inactif et scripts et CSS deviennent en parties inertes (ressources gérées par le navigateur).
Pour le focus, la vignette n'a pas franchement de focus non plus si le navigateur lui même n'est pas l'application qui à le focus.
En redonnant le focus à cet onglet, sans fermer la popup, ta vignette 2 est bien celle qui a le focus Smiley smile

Cdt

edit : tu devrais donner une reference à la popup pour n'en ouvrir qu'une et la rafraichir si le visiteur à oublié de la fermer, par exemple:
window.open ('popup.php?nom='+ encodeURI (ca_id+'G.'+img_format+'&tit='+tist), 'popuImg', 'popup=yes,scrollbars=yes,resizable=yes,width=420,height='+height);

Modifié par gcyrillus (03 Aug 2025 - 17:47)
gcyrillus a écrit :
Le comportement est normal, lorsque la popup est ouverte, l'onglet de ton carrousel est inactif et scripts et CSS deviennent en parties inertes (ressources gérées par le navigateur).
Pour le focus, la vignette n'a pas franchement de focus non plus si le navigateur lui même n'est pas l'application qui à le focus.
En redonnant le focus à cet onglet, sans fermer la popup, ta vignette 2 est bien celle qui a le focus.


Ne vois-tu pas une solution pour le comportement souhaité ?
Avec mes faibles connaissances Javascript je pensais qu'en la matière Javascipt pouvait faire.
Recharger toute la page avec PHP serait possible mais je m'y refuse et je suppose que tu es d'accord.
Hello,

Désolé de t'ennuyer encore...

gcyrillus a écrit :
En redonnant le focus à cet onglet, sans fermer la popup, ta vignette 2 est bien celle qui a le focus


Ben non, pas sur le codepen...

Ce serait pourtant un comportement assez sympa.

gcyrillus a écrit :
edit : tu devrais donner une reference à la popup pour n'en ouvrir qu'une et la rafraichir si le visiteur à oublié de la fermer, par exemple:


Un client peut-il vouloir ouvrir plusieurs popup ?
Il me semble que non et donc ton idée est bonne.
Là ça marche, après copier-coller de ton code.
Modifié par boteha_2 (03 Aug 2025 - 18:52)