Bonsoir à tous,

EN BREF :
Pour généraliser le problème : si l'on change via Javascript la valeur d'une propriété CSS d'un élément (par exemple la couleur d'une balise <a> en bleu), est-il normal que si l'on a une feuille de style en parallèle son contenu pour ce même élément (un a.class:hover {color: red}) ne soit plus pris en compte si le Javascript a eu l'occasion de la modifier une fois auparavant?

EN DETAIL :

Je viens de rencontrer un petit souci relatif à la modification d'une propriété de style via Javascript : css ne reprend plus le dessus quand c'est à son tour de jouer.

Je m'explique :

J'ai un tableau, avec deux colonne.

<td id="gauche">
<a href="#">lien1</a>
<a href="#">lien2</a>
<a href="#">lien3</a>
<a href="#">lien4</a>
<a href="#">lien5</a>
</td>
<td id="droit">
<a href="#">lien1</a>
<a href="#">lien2</a>
<a href="#">lien3</a>
<a href="#">lien4</a>
<a href="#">lien5</a>
</td>


Le but recherché ?

Avoir deux colonnes de liens, dont seulement ceux de la 2ème colonne ont une image en background (simulation d'une puce). Lorsque que l'on passe sur les liens de la colonne DROIT, l'image se déplace de 5px sur la droite. Lorsque que l'on passe sur les liens de GAUCHE, l'image (du lien de la colonne DROIT) se déplace de 5px sur la gauche.

Exemple pratique:

(gauche)Lien1 * Lien1(droit) <-- sans évènement
(gauche)Lien1 *Lien1(droit) <-- onmouseover colonne DROIT
(gauche)Lien1* Lien1(droit) <-- onmouseover colonne GAUCHE


Pour cela, une feuille CSS, pour que les liens DROIT possède une image:

td#DROIT a {
background-position: 5px 50%;
background-image: url('image.png');
}
td#DROIT a:hover {
background-position: 10px 50%;
color: red;
}


Donc quand je passe sur un lien de la cellule DROIT, l'image se déplace de 5px vers la droite. Parfait !

Pour la celulle gauche, j'ai recours au Javascript. Au chargement de la page, je crée des évènements "onmouseover" pour chaque lien de la colonne GAUCHE, et leur affecte une fonction qui va modifier la position de l'image dans la colonne DROIT.

// ELEMENT étant le lien se situant juste en face, dans la colonne DROIT
ELEMENT.style.backgroundPosition='0px 50%';


Ca marche parfaitement aussi. Avec un onmouseout également, pour redonner à l'image sa position d'origine, à savoir "5px 50%".

Là où le problème se pose, c'est que la colonne DROIT marche parfaitement si je passe ma souris dessus sans être aucunement passé sur le lien en face dans la la colonne GAUCHE.

En effet, dès que je suis passé sur un lien de la colonne GAUCHE, et que je passe sur celui de DROIT (qui a été modifié via JS quand je passais sur le GAUCHE) la feuille CSS ne modifie plus la position du background. J'ai ajouté dans ma feuille un
color: red
pour voir si la feuille ne répondait plus pour ce lien, mais la couleur du texte change, c'est simplement le
background-position: 10px 50%;
qui ne se déclenche plus (à cause de la modification en JS quand je suis passé sur le lien GAUCHE).

Pour agrémenter ce test, j'ai ajouté dans mon JS
ELEMENT.style.color='blue';

Maintenant, la feuille ne me recolore plus le texte de la colonne DROIT en 'red' quand je passe dessus (après être passé sur celui de GAUCHE)

Cela est-il normal ? Est-ce un bug où m'y prendrais-je mal ? J'espère qu'il y a une solution en tout cas Smiley smile

Merci.
Modifié par EureKa (06 Dec 2006 - 09:18)
Salut

Tu n'aurais pas un exemple en ligne ? Ou à la rigueur un schéma ? Parce que là, franchement, j'ai du mal à réaliser.
Oublions un peu mon cas alors (trop précis j'avoue, c'était dans le cas ou quelqu'un aurait une idée d'alternative), et essayons cela :

<a href="javascript:changecolor();">
Cliquer ici change la couleur de la balise A ci dessous
</a>

<a id="lien" href="#">Lien</a>

<script>
function changecolor() {
	document.getElementById('lien').style.color= 'blue';
}
</script>

<style>
a#lien:hover {
	color: red;
}
</style>



Nous avons deux liens. Si l'on passe sur le second, sa couleur passe à RED (et reprend sa couleur d'origine quand on retire la souris).
Si maintenant nous cliquons sur le premier, il va affecter la couleur BLUE au second, en couleur constante. Et dès lors.. la propriété CSS du lien ne fonctionne plus, quand on y passe la souris.

Voilà l'idée.

(En attendant, j'ai affecté des onmouseover/onmouseout en Javascript pour les deux types de liens, cela fonctionne mais j'aurais préféré ne pas avoir recours à cela)
Modifié par EureKa (01 Dec 2006 - 03:09)
Modérateur
Hmmm il est tard, je suis fatigué, alors je vais peut-être dire une bétise. Smiley zzzz

En faisant ceci :


document.getElementById('lien').style.color= 'blue';


C'est comme si tu écrivais un style inline dans la balise du lien. En fait, c'est exactement ce qui se passe :


<a id="lien" style="color:blue">Mon lien</a>


Comme les styles inlines ont la priorité sur la feuille de styles, alors c'est ce style inline qui est utilisé. Il faudrait peut-être que tu arrive à retirer le style inline dynamiquement via Javascript par la suite, bien que je trouve que le changement de class est beaucoup plus approprié la plupart du temps.

Pour consulter le code source HTML après l'exécution du Javascript, tu peux installer l'extension Firefox View Source Chart. Par exemple, si Javascript crée des éléments HTML dynamiquement, ou modifie des attributs, tu peux voir ce que ton navigateur interprète vraiment comme code source HTML. C'est l'une des meilleurs extensions que j'ai vu.
Modifié par Tony Monast (01 Dec 2006 - 03:58)
Très bien vu, pour une propriété aux valeurs sans suffixe (comme une couleur) cela marche.

En revanche pour les valeurs prenant des suffixes (%, px, ...), Javascript semble ajouter ce détail par lui-même lorsque l'on veut n'affecter aucune valeur à la propriété.

Par exemple, dans :
ELEMENT.style.backgroundPosition='';
JS va lui même établir la valeur "0% 0%", n'effaçant donc pas le système "inline" dont tu parles.

Reste à trouver une idée de solution pour effacer totalement la valeur de cette propriété.
Modifié par EureKa (01 Dec 2006 - 04:11)
Tony Monast a écrit :
Pour consulter le code source HTML après l'exécution du Javascript, tu peux installer l'extension Firefox View Source Chart.
L'extension Web Developer le permet aussi (mais peut-être avec moins de fonctionnalités) : View Source > View Generated Source.

A part ça, je partage l'avis de Tony Monast : un changement de classe permet d'éviter ce genre de problèmes, et en plus de ne pas disperser la présentation entre les CSS et le Javascript.
Merci pour ces détails intéressants.

Cela dit le changement de classe (via .className) en JS est excessivement lent. Il est intéressant pour un changement peu fréquent, mais pour un jeu de onmouseover/onmouseout qui peut être effectué dans la foulée par l'utilisateur au gré de sa souris ça devient on-ne-peut plus contraignant car saccadé et pas vraiment instantané.

Ceci dit, la méthode du className est à garder sous la main au cas échéant. Merci également pour le lien de cet add-on.

Si quelqu'un, passant par ici, à une idée pour effacer totalement la valeur d'une propriété CSS créée via JS pour que celle affectée par défaut par une feuille de style puisse être considérée à nouveau, n'hésitez pas !
EureKa a écrit :
Cela dit le changement de classe (via .className) en JS est excessivement lent. Il est intéressant pour un changement peu fréquent, mais pour un jeu de onmouseover/onmouseout qui peut être effectué dans la foulée par l'utilisateur au gré de sa souris ça devient on-ne-peut plus contraignant car saccadé et pas vraiment instantané.
Est-ce que tu as un exemple en ligne qui illustre tes propos ? Ca m'intéresse.
EureKa a écrit :
En attendant, j'ai affecté des onmouseover/onmouseout en Javascript pour les deux types de liens, cela fonctionne mais j'aurais préféré ne pas avoir recours à cela


Mais pourquoi donc ?
Eldebaran, je t'ai glissé un exemple en MP. S'il n'est pas significatif, je pourrais dès le semaine prochaine reconcevoir la même page de test que celle que j'avais faite pour physiquement bencher.


clb56, étant donné la structure de ma page, je suis obligé de scanner 20 balises <A> en JS, et affecter à 10 d'entres elles des onmouseover/onmouseout.

S'il est possible de réinitialiser une propriété de style créée par JS, je n'en aurait finalement que 5 à scanner et à qui affecter ces évènements. Pour les autres liens, la feuille de style suffirait et serait certainement plus rapide.

Je ne cherche pas à "chipoter" en soit, j'aimerais juste essayer d'atteindre une optimisation minimale, car ma page va s'alourdir considérablement avec ce qui l'attend.

S'il existe une solution, ce sera cela de gagné, et un bon apprentissage pour les prochains 'coding' à venir.

Bon week-end Smiley cligne
Modérateur
bonjour,

j'espere que tu passe un bon week-end ..

je viens de lire ton post que je trouve interessant.

quelques questions .
.. tu parle de puce et de liens , pourquoi ne pas se servir d'un ul li a ?.

... as tu creuser le css du coté des "selecteurs" adjacent ? (a priori IE7 y est receptif). resterais alors quand même a trouvé quelque chose pour IE6 et inferieur.

.... est-il possible de fusionner tes 2 cellules et "d'emmeler" les liens , pour les disposés en flottant.

.... as tu pensé a display:list-item; pour avoir la possibilité de gerer les "puces" en "dynamique css" dans IE avec :hover ?.

et derniere question, accepterez tu d'utiliser un "commentaire anti-gecko " ?

Peut-etre bancale, a tester sur d'autre plate-formes ou version et voir comment "safari" reagit.

une page test en reprenant des reponses positives aux questions que je te pose.

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>puces sauteuses</title>
<style type='text/css'>

html , body , table , td {
border-collapse:collapse;
margin:0;
padding:0;
height:100%;
width:100%;

}
ul {width:300px;margin:0 auto;padding:0;list-style-type:none;}
ul li {width:150px;}
ul li a {
display:list-item;
list-style-type:square;
list-style-position:inside;
padding:0 1em ;
margin:0 0.5em;
position:relative;
z-index:0;
background:#fff;
text-decoration:none;

}
ul li.gauche  a {
direction:rtl;
position:relative;
z-index:0;
margin:0 -2em;
list-style-type:circle;
}
.gauche {float:left;

}
.droite {float:right;
}

a:hover {
position:relative;
z-index:2;
}

.gauche a:hover {z-index:10;}

</style>

<style type="text/css">
<!-- la section suivante est cachée a firefoxe , mozilla , flock et  ? ...-->

<!-------------------------------------------------------------->
ul li.gauche  a {
margin:0 -1em ;
list-style-position:outside;
}

.gauche a:hover {
position:relative;
z-index:2;
list-style-position:inside;
margin:0;
right: -2em;
text-align:right;
z-index:10;
}

<-->
<!-- fin section cachée aux gecko -->
</style>
</head>
<body>
	<table>
		<tr>
			<td>
				<ul>
					<li class="gauche"><a href="#"  > lien 0 </a></li>
					<li class="droite"><a href="#"  > lien 1 </a></li>
					<li class="gauche"><a href="#"  > lien 2 </a></li>
					<li class="droite"><a href="#"  > lien 3 </a></li>
					<li class="gauche"><a href="#"  > lien 4 </a></li>
					<li class="droite"><a href="#"  > lien 5 </a></li>
					<li class="gauche"><a href="#"  > lien 6 </a></li>
					<li class="droite"><a href="#"  > lien 7 </a></li>
					<li class="gauche"><a href="#"  > lien 8 </a></li>
					<li class="droite"><a href="#"  > lien 9 </a></li>
				</ul>
			</td>
		</tr>
	</table>
</body>
</html>


Je classe ça encore dans la categorie "bidouilles" , car pas de retour encore negatifs sur ce commentaire "anti-gecko" ... d'ailleurs , a part une ou 2 allusions que j'ai deja faites a ce sujet sur le forum , je n'ai encore rien trouvé sur le net qui en parle , le decrit , critique son usage en bien ou en mal ou explique la raison de ce bug.

Il est utilisable a l'interieur d'une balise style pour ne pas "polluer" l'affichage " dans les autres navigateurs.

++
Bonjour !

Pour l'heure, voilà l'idée (voir la source au besoin), avec les deux méthodes en cours (la 1ère modifiant les style directement en JS, l'autre via className) : des puces qui font se gratter le front

Merci gcyrillus (Excellent Week-end même, en espérant qu'il fut de même pour toi Smiley smile ), l'idée est intéressante. Je suis ouvert à tout, hormis les selecteurs "adjacents" qui engendreraient une incompatibilité à combler (doublons de code donc, à moins que celle des adjacents soient vraiment plus intéssante).

La gestion de la liste à puce est plutôt pas mal là, on ne soupçonne pas la manière dont elle travaille en ne regardant que la page, bien vu :] Je vais potasser cela, mais bien peur qu'il y ait quelques contraintes Smiley ohwell En tout cas merci.
Modérateur
bonsoir,

:) , mon weekend commence ce soir Smiley langue , avec les enfants demain !.

en voyant ta page en ligne , ce que tu recherche me semble beaucoup plus claire.

les selecteur adjacent ne seront pas d'utilités , ni les bidouilles a la broc , avec un simple a:hover , une class , un padding , un text-align , le background et un positionnement relatif , il est possible d'approché ton but si il n'est pas atteint.

Ce qui facilite beaucoup la chose , c'est la "puce" en position "centrale" par defaut.

je met donc en ligne une page test avec 3 images : la puce centrale , la gauche et la droite . l'ensemble du css est dans l'entête , jai repris tes 2 cellules . Cela me semble simple et solide , dans le sens ou les rêgles css utilisées sont depuis longtemps bien supporté par les navigateurs ... enfin je n'ai que win xp pour testé.

http://gcyrillus.free.fr/essai/puce-gauche-droite.html

++
Bonjour,

Merci beaucoup gcyrillus, c'est exactement l'idée de rendu que je désirais.

J'ai fait quelques modifications:
- Utilisation d'une seule image. (au passage, existe-t-il une possibilité DIRECTE via "background-position" d'aligner une image à droite d'une balise avec un padding rien que pour elle, une forme de "100% - Npx" ?)
- changement du 'right' en 'margin-right', ce qui semblait poser des soucis avec IE dans l'utilisation des z-index (et permettre ainsi l'utilisation d'images avec transparence, en imposant une couleur de fond pour les liens (celle de la page par exemple)
- pas mal de petit changement au final, mais l'ensemble reste basé sur une utilisation de la position relative, plutôt symaptique.

Je te remercie pour avoir pris le temps de faire quelques exemples au cours de ce post, le résultat est là : satisfaction d'avancer Smiley smile

Exemple de rendu : Ici

Code, s'il y a des personnes qui désirent parvenir à cela (le lien ci-dessus ne sera pas intemporel) :
L'image utilisée à une largeur de 15px, toutes les données de positionnement dans le code sont donc de 16 (largeur + 1px) et 32 (16*2) pîxels (à adapter au besoin pour une largeur supérieure)

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>puces sauteuses</title>
<style type='text/css'>

body, ul a {
	background-color: #ffffff;
}

* {
	border-collapse: collapse;
	margin: 0;
	padding: 0;
}

html , body , table {
	height: 100%;
	width: 100%;
}

td {
	width: 50%;
}

ul {
	width: 100%;
	list-style-type:none;
}

ul.gauche  {
	text-align: right;
	margin-right: -16px;
	float: right;
}

ul a  {
	display:block;
	position: relative;
	padding: 0 32px;
	background-repeat: no-repeat;
	color: green;
	text-decoration: none;
}

.gauche a  {
	background-image: url(puce_mem.png);
	background-position: center right;
	z-index: 1;
}

.gauche a:hover  {
	margin-right: 16px;
	padding-right: 16px;
}

.droite a:hover  {
	background-image: url(puce_mem.png);
	background-position: 16px;
	z-index: 1;
}

</style>
</head>
<body>
	<table>
		<tr>
			<td>
				<ul class="gauche">
					<li >
					     <a href="#"> lien 0 </a>
					</li>
					<li >
					     <a href="#"> lien 1 </a>
					</li>
					<li >
					     <a href="#"> lien 2 </a>
					</li>
					<li >
					     <a href="#"> lien 3  </a>
					</li>
					<li >
					     <a href="#"> lien 4 </a>
					</li>
				</ul>
			</td>
			<td>
				<ul class="droite">
					<li >
					     <a href="#"> lien 5 </a>
					</li>
					<li >
					     <a href="#"> lien 6 </a>
					</li>
					<li >
					     <a href="#"> lien 7 </a>
					</li>
					<li >
					     <a href="#"> lien 8  </a>
					</li>
					<li >
					     <a href="#"> lien 9 </a>
					</li>
				</ul>
			</td>
		</tr>
	</table>
</body>
</html>
NB: pour une gestion avec plusieurs images, le code de gcyrillus est plus adapté :')
Modérateur
bonsoir/bonjour.

Oui , c'est vrai , les pages test ne sont pas forcement la pour toujours .

Alors pour eviter toute confusion , la page que j'ai produit a prendre evntuellement en reference est:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>puces sauteuses</title>
<style type='text/css'>

html , body , table , td {
	border-collapse:collapse;
	margin:0;
	padding:0;
	height:100%;
	width:100%;
	background:#ccc;
}
#gauche  {
	text-align:right;
	position:relative;
	right:-30px;

}
td {
	width:50%;
}
ul {
	margin:0;
	padding:0;
	list-style-type:none;
}




ul li a  {
	text-decoration:none;
	display:block;
	padding:0 30px;
	position:relative;
}
#gauche a  {
	background: url(pucc.gif) right center no-repeat;
}
#gauche a:hover  {
	z-index:1;
	background: url(pucg.gif) right center no-repeat;



}
 a:hover  {
	z-index:0;
	background: url(pucd.gif) left center no-repeat;
}



</style>
</head>
<body>
	<table>
		<tr>
			<td>
				<ul id="gauche">

					<li >
					     <a href="#"> lien 0 </a>
					</li>
					<li >
					     <a href="#"> lien 1 </a>
					</li>
					<li >

					     <a href="#"> lien 2 </a>
					</li>
					<li >
					     <a href="#"> lien 3  </a>
					</li>
					<li >
					     <a href="#"> lien 4 </a>

					</li>
				</ul>
			</td>
			<td>
				<ul>
					<li >
					     <a href="#"> lien 5 </a>
					</li>

					<li >
					     <a href="#"> lien 6 </a>
					</li>
					<li >
					     <a href="#"> lien 7 </a>
					</li>
					<li >

					     <a href="#"> lien 8  </a>
					</li>
					<li >
					     <a href="#"> lien 9 </a>
					</li>
				</ul>
			</td>

		</tr>
	</table>
</body>
</html>


La demarche de base de cette page repose sur le position:relative; et des images de fond de 30px de large (padding laterales de même valeur).

Le positionement relatif permet de déplacé visuellement un element sur une page . De cette façon on superpose les 2 listes

En prenant en compte la differene d'affichage de ff et opera ou ff et IE , la serie de lien a droite ne reçoit pas d'image en background par defaut.
Afin d'eviter qu'elle ne recouvre celle de la liste de gauche et de cacher ainsi l'effet de roll over dans opera/IE.

FF fait l'opposer , la liste se trouvant a drote va s'afficher au dessus de la liste de gauche, le z-index efficace dans ff permettra de voir la puce des lien de droite s'afficher au dessus des puces de liens de gauches. le z-index n'a aucun interet dans opera/IE.

Pour le reste , il n'y a pas de raison particuliere , ce n'est qu'une mise en forme sans arriere pensée ou besoin specifique pour tel ou tel navigateur.

les images du test: upload/2857-pucg.gif upload/2857-pucc.gif upload/2857-pucd.gif

Le padding , deplacement a droite est a réglé en fonction de la taille de l'image a utilisé ,au minimum , ou de la zone dans laquelle vous souhaitez effectué cette effet de rollover.

GC
++