Je cherche le code le plus simple/minimaliste possible.
En partant de:
<a class="caché" href="pix/img.jpg">ceci cela</a>

Existe-t-il un CSS permettant d'afficher l'image en infobulle au survol du lien ?
Quelquechose qui à ma connaissance n'existe pas mais ressemblerait à :
a.caché:hover ~href { display: block }

Je suppose que sans ajouter de balises (HTML) cela se fait en JavaScript mais mes compétences en webdev date d'avant la bulle du “freelance” ... merci
a écrit :
l'attribut title


Non. L'attribut title ne permet que d'afficher du simple texte. IL n'y a ni retour à la ligne, ni mise en forme, ni image, ou, plus simplement, pas de HTML.
Sans compter sur le fait que cet attribut est déconseillé en accessibilité car les lecteurs d'écran ne lisent pas toujours tous le contenu dans les mêmes conditions.

C'est une erreur courante que je croise malheureusement très régulièrement. S'il y a du HTML dans l'attribut title, les lecteurs d'écran qui le lisent vont lire le code HTML a l'état brut.
Ceux qui connaissent un minimum réussiront non sans mal à extraire l'information véhiculée, mais pour tous les autres, c'est juste un bug du site qui lit ou affiche un bout de code incompréhensible.

Pour une solution pure JavaScript, vous trouverez des scripts à profusion en faisant une recherche.
Par contre, je me demande si ce serait faisable en pur CSS, sans JavaScript, avec les derniers sélecteurs qui ont été ajoutés à la norme, en incluant bien sûr une alternative au focus pour ceux qui utilisent uniquement le clavier.
QuentinC a écrit :
Par contre, je me demande si ce serait faisable en pur CSS, sans JavaScript, avec les derniers sélecteurs qui ont été ajoutés à la norme, en incluant bien sûr une alternative au focus pour ceux qui utilisent uniquement le clavier.

La réponse est non. Il va falloir forcément du JS.
Modérateur
Bonjour QuentinC,


Si cet attribut est si mauvais, comment se fait-il qu'il soit généralisé sur tous les éléments HTML ? Or, il devrait dans ce cas être déprécié. Ce qui n'est pas le cas. Le but d'utiliser cet attribut est d'afficher simplement une infobulle.

QuentinC a écrit :

Non. L'attribut title ne permet que d'afficher du simple texte. IL n'y a ni retour à la ligne, ni mise en forme, ni image, ou, plus simplement, pas de HTML.
...
C'est une erreur courante que je croise malheureusement très régulièrement. S'il y a du HTML dans l'attribut title, les lecteurs d'écran qui le lisent vont lire le code HTML a l'état brut.

Pourquoi mettre du HTML dans la valeur d'un attribut ? Ça n'a pas de sens et c'est une belle erreur puisque le contenu ne sera pas rendu avec la mise en forme escomptée.

mdn a écrit :

Accessibilité

L'attribut title est très problématique pour :

Les personnes qui utilisent des appareils à interface tactile
Les personnes qui naviguent au clavier
Les personnes qui naviguent en utilisant des outils d'assistance comme des lecteurs d'écran ou des loupes logicielles
Les personnes souffrant de troubles musculaires ou cognitifs.

Cela est dû à une prise en charge hétérogène de la part des navigateurs. Si on souhaite avoir une bulle d'information, mieux vaudra utiliser une technique plus accessible.

source

Dans ce cas et en faisant simple, autant proposé un display none/block sur un élément infobulle et utiliser hover/focus sur l'élément appelant. Mais va falloir gérer les bords d'écran et lorsqu'il y aura un overflow hidden, ça va être sexy.

Au passage, la question est posée dans le forum général et non dans accessibilité. J'avoue que je serai tombé dans le panneau et je te remercie pour cette précision.
Modifié par niuxe (03 Aug 2024 - 15:00)
a écrit :
La réponse est non. Il va falloir forcément du JS.


Dommage. Je pensais qu'avec les dernières évolutions il y avait peut-être un moyen.

a écrit :
Pourquoi mettre du HTML dans la valeur d'un attribut ? Ça n'a pas de sens et c'est une belle erreur puisque le contenu ne sera pas rendu avec la mise en forme escomptée.


ON est bien d'accord que c'est une erreur, mais je le constate quand même de temps en temps sur les sites que je visite.

En fait ce n'est pas interdit de mettre du HTML dans un attribut data-* et de le recopier dans un élément en JS avec innerHTML. C'est tordu et pas très clean comme façon de procéder, mais ça se fait...
Par contre dans l'attribut title ça apparait au survol réellement tel quel sans aucune interprétation. ET pourtant je l'ai déjà vu.

a écrit :
Si cet attribut est si mauvais, comment se fait-il qu'il soit généralisé sur tous les éléments HTML ? Or, il devrait dans ce cas être déprécié. Ce qui n'est pas le cas. Le but d'utiliser cet attribut est d'afficher simplement une infobulle.


Tu réponds toi-même à la question en recopiant la MDN.
En fait, c'est déconseillé parce que c'est la jungle.

* Visuellement, tu na's aucun contrôle sur l'apparence et l'apparition/disparition de l'info-bulle. Donc tu peux avoir n'importe quoi: couleurs et positionnement inadaptés, contenu trop long coupé, texte trop petit, ou qui disparait trop vite, apparition aussi au focus clavier ou pas...
* Du côté des lecteurs d'écran, les contenus trop longs peuvent être coupés; suivant sur quels éléments ils se trouvent, ils peuvent être ou ne pas être lus; quand il est lu, il peut être lu soit avant, soit après le nom accessible, ou potentiellement le remplacer complètement, et tu ne peux pas savoir.

De façon plus générale, les effets de survol sont problématiques avec les écrans tactiles, vu que le concept de survol n'existe pas en tant que tel et qu'il est parfois simulé avec des combines un peu étranges.
Donc il faut les éviter ou proposer une alternative pour accéder à la même information.

a écrit :
Dans ce cas et en faisant simple, autant proposé un display none/block sur un élément infobulle et utiliser hover/focus sur l'élément appelant. Mais va falloir gérer les bords d'écran et lorsqu'il y aura un overflow hidden, ça va être sexy.


Je vais voir si je n'ai pas un script en réserve.

a écrit :

Au passage, la question est posée dans le forum général et non dans accessibilité. J'avoue que je serai tombé dans le panneau et je te remercie pour cette précision.


Pas de problème ! Il ne faut pas uniquement parler d'accessibilité dans le forum dédié. C'est une attention de tous les instants.
L'accessibilité, ça devrait être inclus, implicitement, partout, tout le temps.
sylvainsab a écrit :
Existe-t-il un CSS permettant d'afficher l'image en infobulle au survol du lien ?

Bonjour sylvainsab,
J'espère qu'il n'est pas trop tard pour vous répondre, mais je crois avoir la solution — ou tout du moins une solution — à votre problème ! Smiley biggrin
Olivier C a écrit :
La réponse est non. Il va falloir forcément du JS.

...et la bonne nouvelle, c'est que, contrairement à l'avis d'Olivier C, il n'est pas nécessaire d'utiliser du JavaScript : le CSS y suffit parfaitement ! Smiley ravi
Voici le code HTML :
Pour accéder à l'image, cliquez sur <a class="caché" href="pix/img.jpg">ceci cela<span><img src="lien_de_votre_image" ></span></a>. Survolez pour la visualiser.

Comme vous pouvez le constater, il faut un span pour englober le texte à survoler ainsi qu'un deuxième span à l'intérieur du premier pour insérer le contenu HTML que vous souhaitez faire afficher (dans votre cas, une image) : il peut s'agir de — presque — n'importe quoi ! Smiley good
Concernant le CSS, voilà la structure adéquate :
a:hover {
	position: relative;
}
a span {
	display: none;
}
a:hover span {
	display: block;
	z-index: 100;
	left: 10px;
	margin: 10px;
	position: absolute;
}

Ainsi, le contenu à afficher est caché par défaut mais est rendu visible au survol du texte concerné. Après cela, un peu de mise en page pour le placer et le tour est joué ! Smiley sourire Une précision quand même : l'attribut z-index avec la valeur 100 permet d'être certain que le contenu à afficher sera toujours au-dessus des autres éléments de la page.
QuentinC a écrit :
en incluant bien sûr une alternative au focus pour ceux qui utilisent uniquement le clavier

Si vous souhaitez également faire fonctionner cela pour un clavier, vous pouvez recopier le code avec hover en remplaçant hover par focus. Comme ceci :
a:focus{
	position: relative;
}
a:focus span {
	display: block;
	z-index: 100;
	left: 10px;
	margin: 10px;
	position: absolute;
}

QuentinC a écrit :
De façon plus générale, les effets de survol sont problématiques avec les écrans tactiles, vu que le concept de survol n'existe pas en tant que tel et qu'il est parfois simulé avec des combines un peu étranges.
Donc il faut les éviter ou proposer une alternative pour accéder à la même information.

En revanche, cette information reste factuelle : je vous conseille aussi de trouver une autre alternative pour la version mobile.

Alors, qui disait que c'était impossible ? Rien de bien sorcier ! Smiley ola

En espérant ne pas vous avoir trop ennuyé avec tout mon discours Smiley cligne et surtout, en espérant avoir répondu au mieux à votre question, sylvainsab,

Je vous prie d'agréer l'expression de mes sincères salutations,

OeilDeLynx
Modifié par OeilDeLynx (30 Aug 2024 - 15:22)
Modérateur
OeilDeLynx a écrit :
.... en espérant avoir répondu au mieux à votre question, sylvainsab,

Je vous prie d'agréer l'expression de mes sincères salutations,

OeilDeLynx

Bonjour,
Heu, pas vraiment : surcouche de HTML et toujours pas d'image à l'affiche Smiley cligne

En raccourcis, il serait possible de faire avec les variable CSS et un attribut style au moment de la création du lien:


POC:

<a class="caché" href="pix/img.jpg" style="--img:url(pix/img.jpg)">ceci cela</a>

a{
  display:inline-grid;
  place-content:center;
}
a:hover:after {
  content:var(--img);
  position:absolute;
}

ou

a{
  position:relative;
}
a:hover:after {
  content:var(--img);
  position:absolute;
   left:0;
}


Cdt
Modifié par gcyrillus (27 Aug 2024 - 20:59)
OeilDeLynx a écrit :
la bonne nouvelle, c'est que, contrairement à l'avis d'Olivier C, il n'est pas nécessaire d'utiliser du JavaScript : le CSS y suffit parfaitement ! Smiley ravi
Voici le code HTML...

Oui, sauf qu'en l'occurrence ce HTML on va pas le taper à la mano, il faut bien le générer. Alors bien sûr on peut toujours le générer côté serveur, mais il est bien mieux de déléguer ce type de tâches côté front je trouve.

Quoi qu'il en soit - côté back ou côté front - dans tous les cas il faut produire un script.
gcyrillus a écrit :
En raccourcis, il serait possible de faire avec les variable CSS et un attribut style au moment de la création du lien...

Et ! mais c'est pas mal du tout ça !
C'est dommage que l'on ne puisse pas faire un truc du style :
a:hover::after {
  content: url(attr(href));
  position: absolute;
}
Quelque chose comme ça non ?


<a href="./mon-lien">mon lien <span><img src="./mon-image.webp" /></span></a>



a {
  position:relative;
}
a span {
  display:none;
  width:260px;
  position:absolute;
  bottom:100%;
  left:50%;
  transform:translateX(-50%);
}

a span img {
  display:block;
  width:100%;
  height:auto;
}

a:hover span {
  display:block;
}


Une version un peu plus clean :
https://codepen.io/julien_sgn/pen/eYwjzZL
Modifié par Pedrothelion (28 Aug 2024 - 12:36)
Modérateur
Pedrothelion a écrit :
Quelque chose comme ça non ?

https://codepen.io/julien_sgn/pen/eYwjzZL


oui, mais complexifie le HTML et le CSS là ou un script js peut le faire à la volée sur autant de liens trouvés.
L'infobulle veut montrer un aperçu du lien, lien vers l'image. href et src ont les mêmes valeurs dans la question Smiley cligne

sylvainsab a écrit :
Je cherche le code le plus simple/minimaliste possible.
En partant de:
&lt;a class="caché" href="pix/img.jpg"&gt;ceci cela&lt;/a&gt;

Existe-t-il un CSS permettant d'afficher l'image en infobulle au survol du lien ?
Quelquechose qui à ma connaissance n'existe pas mais ressemblerait à :
a.caché:hover ~href { display: block }

Je suppose que sans ajouter de balises (HTML) cela se fait en JavaScript mais mes compétences en webdev date d'avant la bulle du “freelance” ... merci


Du coup l’idéal serait la proposition d' Olivier C si l'on pouvait directement utiliser la valeur de l'attribut href , mais il n'y a apparement qu'a partir d'une variable CSS que l'on peut réinjecter dans content une valeur de type url(xx) ;En gros , ça reste un job pour javascript pour ne pas avoir a retouché au html et feuilles de styles Smiley cligne

edit , pour finir , pour le CSS level 4 , il y aurait cette possibilité via src() qui sera le compagnon de url() avec la difference d'accepter une variable .... Cela finirait simplement en :
a:hover::after {content: src(attr(href));}

mais bon , dans les années 10 , l'idée etait de passé un type pour le contenu de l'attribut , l'idée se traduisait en : content: attr(href url)
Modifié par gcyrillus (28 Aug 2024 - 16:42)
Administrateur
Bonjour,

Wikipedia utilise un script JS pour ses besoins, et probablement assez complexe.
Je ne conseille/connais que la version pas mal accessible, qui depuis récemment est bien plus simple à mettre en place. Ce n'est de loin pas minimaliste...

Je te conseille d'implémenter un dialogue non-modal, qui apparaitrait dans ton cas aussi bien au survol qu'au clic. Cela passe par l'élément dialog avec quelques lignes de JS à base de .show() et un bouton pour que ça ait une chance de fonctionner au clavier (et sur mobile enfin au touch !) aussi bien qu'à la souris. Cela passe aussi par un bouton (OK et/ou de fermeture, dans ton cas ça ne change pas grand chose à la fonctionnalité).
Une autre implémentation débarque dans HTML pour du contenu non-interactif mais c'est trop récent : l'attribut popover, implémenté depuis 6-12 mois dans Firefox et Safari. Moins de 18 mois sur Chrome et Edge et je n'ai pas encore testé leur support dans NVDA et autres lecteurs d'écran... Bien trop récent à titre pro.
Ce n'est pas AMHA un dialogue modal ("une modale", "une popin") où le contenu en dessous n'est plus cliquable/atteignable tant qu'il est visible.
Ça pourrait être un role=tooltip (j'évite de parler de tooltip tout court car ça représente 5 choses différentes) mais ça me semble dépendant de l'usage et il y a le même écueil (cf. ci-dessous) qu'avec un dialogue non-modal (et pas de code JS prêt à l'emploi dans les Design Patterns ARIA) alors tant qu'à faire...

Ressources :
- https://developer.mozilla.org/fr/docs/Web/HTML/Element/dialog
- https://www.iamtimsmith.com/blog/dialogs-vs-modals-is-there-a-difference (la 1ère partie, ce qu'il appelle "dialog" tout court. En toute fin d'article les liens vers son dépôt et une démo).

Écueils dans tous les cas : il te faut pouvoir positionner la chose par rapport au bouton et pas par rapport à la page.
Ca passe par du positionnement relatif ou mieux Popper.js (toujours compliqué, cf. Bootstrap) pour éviter d'afficher la chose en dehors de la page (vers la gauche au bord droit, vers le haut si le bouton est en bas du viewport, etc (ça ne t'arrivera pas forcément sur desktop mais sur tablette et mobile quand le contenu est très proche du bord...si).
Wikipedia a un comportement complètement différent sur mobile : un bandeau figé en bas du viewport. Bien plus agréable pour l'utilisateur qu'un truc flottant sur une page qui scrolle au moindre scroll avec le doigt.