28217 sujets

CSS et mise en forme, CSS3

Bonjour Smiley biggrin

J'ai un problème avec la ligne de code suivante :
<a href="goFolder.do?p=esp_sal" class="infobulleHaut">Espace Salariés
<span class="infobulleHaut">Infobulle espace salariés</span></a>


J'ai besoin de voir le lien souligné, mais le problème, c'est que le contenu du texte qui apparait au survol du lien est souligné lui aussi.
Hors, le texte qui se trouve entre les balises span ne doit pas l'être...

Quelqu'un aurait-il une idée ?
Merci Smiley smile
Modifié par Ericf (13 Jul 2005 - 14:15)
css :
.infobulleHaut span { text-decoration: none;}
puis html :
<a href=" " class="infobulleHaut">Espace Salariés<span>Infobulle espace salariés</span></a>
NB : Tant que l'ancre <a class="infobulleHaut"> n'est pas fermée on reste dans cette classe. Donc il est inutile de l'indiquer deux fois.
Modifié par Aureance (14 Jul 2005 - 01:38)
merci.
justement si, je dois avoir cette classe 2 fois, d'où mon problème. mais j'ai contourné et fait différement Smiley biggrin
Si tu as besoin de l'indiquer deux fois, c'est que tu as défini ailleurs une classe pour toutes les spans ? Donc ta soluce à du être :
span.infobulleHaut { text-decoration: none;}
Aureance a écrit :
css :
.infobulleHaut span { text-decoration: none;}
puis html :
<a href=" " class="infobulleHaut">Espace Salariés<span>Infobulle espace salariés</span></a>


Ceci ne fonctionnera pas, car la propriété text-decoration a une particularité : appliquée à un élément en ligne (ici le <a>), elle s'étend à toute les boîtes générée par ses descendants, sans tenir compte de leurs propres valeurs de text-decoration .

Pour obtenir ce type d'effet, il faut passer par un border-bottom.
Modifié par Laurent Denis (14 Jul 2005 - 10:36)
a.infobulleHaut {
	text-decoration: none;
	border-bottom: 1px solid red;
} 
a.infobulleHaut .infospan {
	text-decoration: none;
	border-bottom: 0;
}
/* ------ partie html ----- 
<a href=" " class="infobulleHaut">Espace Salariés<span class="infospan"> Infobulle espace salariés</span></a>*/

C'est vrai que mon truc ne fonctionne pas, alors je viens d'essayer celui de Laurent Denis qui me parrait logique aussi... sans succès, hélas. Vite Ericf, comment as-tu fait ? Ca m'étonne qu'on ne puisse pas briser l'héritage dans la balise <a> ???
Aucun rapport avec l'héritage. Et le border-bottom ne s'applique pas comme ça, mais comme ceci :

<html>
<head>
<title>Untitled</title>
<style type="text/css">
<!-- 
a {
text-decoration: none;
} 
a span {
border-bottom: 1px solid;
}
-->
</style>
</head>
<body>
<p><a href="#"><span>là où je veux un soulignement</span> et là où j'en veux pas</a></p>
</body>
</html>
Finalement, j'ai tenté ceci: la span qui s'affiche au survol n'est pas soulignée quant au lien, lui il reste souligné.. Et ça marche bien.

a.infobulleHaut {
	text-decoration: underline;
}
a.infobulleHaut span {
	display: none;
}
a.infobulleHaut:hover span{
	display: block;
	text-decoration: none;
}


<a href=" " class="infobulleHaut">Espace Salariés<span>Infobulle espace salariés</span></a>

Modifié par Aureance (14 Jul 2005 - 19:59)
ah, j'avais oublié que c'était un effet voulu au survol,en effet.

Aureance : ta CSS ci-dessus ne fonctionne que dans FireFox :
- IE ignore carrément le a.infobulleHaut:hover span {... en l'absence de a.infobulleHaut:hover {...
- Opera est plus strict que Firefox sur son implémentation de text-decoration, et ne modifie pas le soulignement du span descendant au :hover, puisque le p parent reste implicitement souligné.

Pour se rapprocher du résultat attendu, il faudrait donc modifier pour:

a.infobulleHaut {
text-decoration: underline;
}
a.infobulleHaut span {
display: none;
}
a.infobulleHaut:hover {
text-decoration: none;
} 
a.infobulleHaut:hover span{
display: block;
text-decoration: none;
} 


On a alors le même comportement dans Opera et Firefox. La partie "principale" du lien perd également le soulignement au survol, mais cela ne me semble pas problématique (au contraire).
En revanche, IE butte sur le display:block du span, et le fait apparaître comme bloc en ligne.

Je n'ai pas le temps d'adapter le code ci-dessus (le border-bottom) pour l'effet de :hover, mais cela ne devrait pas être très complexe.

(cela me fait penser que cette question de la particularité du text-decoration avait été posée il y a quelques mois à... Bert Boss, co-inventeur des CSS. Il me semblait bien que le mail de celui-ci avait été reproduit sur ce forum, mais je n'en retrouve pas la trace. Quelqu'un s'en souvient ?)
Admettons, pour un exemple un peu hors-sujet mais concernant tout de même les liens soulignés, qu'on enlève le problème d'affichage de la span au survol et que pour simplifier on reste " en ligne ".
Il y a tout de même quelque chose qui m'intrigue dans tout ça : Plusieurs styles proposés avec l'unique portion de code html :
Avec les deux propositions suivantes j'obtiens le même résultat : Span soulignée, lien non souligné.

<p><a href="#"><span>là où je veux un soulignement</span> et là où j'en veux pas</a></p>

a { text-decoration: none; } 
a span { border-bottom: 1px solid #000; }
/* ou bien : */
a { text-decoration: none; } 
a span { text-decoration: underline; }

Alors que pour faire l'inverse : Span non soulignée, lien souligné, ça ne marche pas dans les deux cas...

<p><a href="#"><span>là où je ne veux pas de soulignement</span> et là où j'en veux </a></p>

a { text-decoration: none;  border-bottom: 1px solid #000;} 
a span { border-bottom: 0; }
/* ou bien : */
a { text-decoration: underline; } 
a span { text-decoration: none; }

On dirait donc que les ancres acceptent l'ajout de propriétés pour les balises insérées mais pas le retrait de certaines propriétés comme border et text-decoration. Bizarre, car il n'y a pas de difficulté avec des italiques ou des changements de graisse ou de couleur etc...

PS : petit à parte encore un "peu plus" hors-sujet.
C'est vrai, j'avais pas vu que l'exemple n'allait pas sous Opera, maintenant avec ta petite indication en plus: "ça le fait bien" comme on dit.
Sur IE-Mac, je n'ai jamais vu d'infobulles css s'afficher, mais uniquement par le biais des javascript onMouseOver.
Avec Opera-Mac, j'ai un autre problème pour des bulles css sophistiquées en trois parties ( largeur fixe avec têtière + centre extensible en hauteur + pied. Le tout avec images d'arrière plan ) l'infobulle s'affiche au survol mais ne se désaffiche pas quand j'éloigne la souris. Il faut alors que je fasse défiler un tout petit peu le navigateur pour qu'elle " s'éteigne ". Mais ce comportement est peut-être dû à la mauvaise influence d'une de mes div en position fixed...
Parfois, avec d'autres sortes de bulles ( celles des exemples Alsacréations par exemple ), Opéra ne désaffiche pas totalement la bulle et il en reste un morceau. De fait, je ne trouve pas ce navigateur très bon.

Pour finir, j'ai pas trouvé l'article de Bert Boss w3c ( il y avait beaucoup de choses en Allemand, mais la traduction en Français de Google est aussi claire que... du Chinois ! J'ai renoncé.)
Pour le premier problème : c'est une affaire de sélecteur qui ne vise pas ce qu'on croit

En effet, dans:

a { text-decoration: none;  border-bottom: 1px solid #000;} 
a span { border-bottom: 0; }

pour

<p><a href="#"><span>là où je ne veux pas de soulignement</span>
 et là où j'en veux </a></p>


... que disent exactement tes sélecteurs ?
a dit: appliquez ce style à la totalité de l'élément a, span compris donc.
a span dit: appliquez ce style à l'élément span seul

autrement dit, le deuxième sélecteur ne dit pas enlève la bordure du a dans le span, il dit le span n'a pas de bordure propre

Pour visualiser, il suffit de modifier le code en ce sens :

 a { text-decoration: none;  border-bottom: 1px solid #000;} 
 a span { border-bottom: 1px solid red; }

On voit bien alors que la bordure rouge ne remplace pas la bordure noire du lien a : elle s'ajoute au-dessus de celle-ci, car c'est la bordure de la boîte générée par le span, et non la bordure de la boîte générée par le a

En d'autres termes, la boîte d'un élément enfant ne peut pas modifier la bordure de la boîte de son parent, ce qui est assez rassurant Smiley cligne

<edit> des padding-bottom permettent de visualiser tout ça beaucoup plus facilement</>

Pour le underline, de toutes façons, il se propage aux descendants sans que ceux-ci ne puissent le modifier. Il n'y avait pas d'article de B.Boss, mais une simple réponse à un mail privé, qui avait été reproduite ici. C'était il me semble David Latapie qui avait soulevé la question.
Modifié par Laurent Denis (15 Jul 2005 - 21:08)
Donc finalement, il n'y a aucun moyen d'avoir un lien souligné dans lequel se trouverait une span non soulignée ? Alors qu'on peut aisément faire l'inverse ?
C'est à dire, pour te paraphraser ( ou parodier Smiley cligne ):
Une première proposition dira que <a> a une bordure ou un surlignage ainsi que tout élément inclu dans <a> car il ne peut modifier son parent ( et c'est rassurant )
La seconde dira que <a> n'a pas de bordure ou surlignage, mais on s'en moque, les éléments inclus pourront en avoir car il peuvent modifier leur parent dans ce cas là ( et c'est rassurant ? )
Que ce soit avec border ou text-decoration, je ne trouve pas ça rassurant.
J'aimerai vraiment qu'on me montre un exemple de span non soulignée collée dans une ancre dont lien est souligné.
Modifié par Aureance (15 Jul 2005 - 21:26)
Aureance a écrit :
Donc finalement, il n'y a aucun moyen d'avoir un lien souligné dans lequel se trouverait une [I]span non soulignée ? Que ce soit avec border ou text-decoration, je ne trouve pas ça rassurant.


souligné, non.

avec une bordure qui fait l'effet de soulignement, si. C'est le code que j'indiquais plus haut. Le voici sans la complication du :hover:

<style type="text/css">
<!-- 
a {
text-decoration: none;
}
a span {
border-bottom: 1px solid;
}
-->
</style>
</head>
<body>
<p><a href="#"><span>souligné</span> et pas souligné</a></p>
</body>

Modifié par Laurent Denis (15 Jul 2005 - 21:16)
ah, je crois que j'ai fini par percuter sur ce qui te tracasse.

Si tu veux un lien non souligné avec un morceau souligné dedans : tu mets une bordure-bottom ou un underline sur le <span> qui délimite le morceau. C'est logique et satisfaisant.

Mais si tu veux un lien souligné avec un morceau non souligné dedans, tu ne peux pas procéder directement en disant "ce span-morceau modifie la propriété souligné ou bordure de son parent". Tu vas devoir mettre en span la partie non soulignée, pour retomber en fait dans le cas précédent.

Qu'est-ce que cela a d'inquiétant ? Je m'inquiéterais pour la cohérence de CSS (et la possibilité de l'utiliser) si un descendant pouvait modifier son parent ! Smiley cligne

Exactement de la même manière, et pour la même raison: une <div> conteneur en display:none, avec un <span> contenu qui, lui, serait en display:block... ne peut pas marcher en CSS. La spécification l'indique d'ailleurs en toutes lettres pour cette propriété display. Mais je pense que là, ça te n'a jamais semblé anormal, et pour cause ! Smiley cligne
Modifié par Laurent Denis (15 Jul 2005 - 22:35)