11540 sujets

JavaScript, DOM et API Web HTML5

Bonjour à toutes et tous,

après de nombreuses recherches infructueuses, j'en viens à demander de l'aide à la communauté, pour un problème qui semble simple, mais qui me casse la tête !

Donc, de manière basique, j'ai un menu avec des items sous forme de liste <ul> et j'aimerais qu'au clic de l'internaute, mes items <li> changent de couleurs de fond.

Pour mieux me faire comprendre, je laisse ici le bout de code sur lequel je planche en ce moment. Si quelqu'un connait une solution à mon problème, un grand merci d'avance !

Mon javascript :


<script type="text/javascript" src="http://code.jquery.com/jquery-1.7.2.js"></script>
<script type="text/javascript">	
		$(function(){		
			$("#reglement-bouton").css({
				backgroundColor:"#2e2e2e"
			});
			
			$("#menu li.bouton").click(function(){				
				$clicked = $(this);				
				// le bouton n'est pas encore "transformé" ni n'ont plus animé
				if ($clicked.css("backgroundColor") != "#be2830" && $clicked.is(":not(animated)")) {					
					$clicked.animate({
						backgroundColor:"#be2830"						
					}, 600 );					
					// chaque bouton doit avoir un id de type "xx-bouton" et la cible un id de type "xx" 
					var idToLoad = $clicked.attr("id").split('-');					
					// on cherche dans le contenu la div visible à laquelle on applique un fadeOut
					$("#contenu").find("div:visible").fadeOut("fast", function(){
						// une fois le fadeOut accompli, on fait un fadeIn à la div active
						$(this).parent().find("#"+idToLoad[0]).fadeIn();
					})
				}				
				// on remet les autres boutons au style par défaut
				$clicked.siblings(".bouton").animate({
					backgroundColor:"#2e2e2e"
				}, 600 );				
			});
		});		
</script>


Mon CSS :


<style type="text/css">
body {
	background-color: #FFF;
}
#menu {
	width:150px;
	margin: 20px 0;
	color:#fff;
	}
.bouton {
	width:150px;
	margin-bottom:8px;	
	padding:8px;
	}
.bouton li {
	font-size:16px;
	text-transform:uppercase;
	}
#activite-bouton {
	background:#be2830;
	}	
#reglement-bouton {
	background:#2e2e2e;
	}
#contenu {
	width:500px;
	height:100px;
	}
</style>


Et mon html :


<h1>changement des couleurs des div</h1>
<div id="menu">
    <ul>
    	<li id="activite-bouton" class="bouton">activité</li>
    	<li id="reglement-bouton" class="bouton">règlement</li>
    </ul>
</div>
<div id="contenu">			
     <div id="activite">
	<h2>Mes activités</h2>
	<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus tincidunt dignissim porta. Sed porta, mauris non interdum mollis, sem ligula fringilla erat, id aliquet felis lectus at arcu. Aenean auctor viverra facilisis. Aenean sit amet ligula ut arcu accumsan vulputate. Aliquam gravida tellus eget lectus condimentum convallis. Mauris viverra ut diam at convallis. Sed felis dui, laoreet vel lorem eget, rutrum tempor eros.</p>
	</div>			
	<div id="reglement">
		<h2>Mon règlement</h2>
		<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus tincidunt dignissim porta. Sed porta, mauris non interdum mollis, sem ligula fringilla erat, id aliquet felis lectus at arcu. Aenean auctor viverra facilisis. Aenean sit amet ligula ut arcu accumsan vulputate. Aliquam gravida tellus eget lectus condimentum convallis. Mauris viverra ut diam at convallis. Sed felis dui, laoreet vel lorem eget, rutrum tempor eros.</p>
	</div>
</div>
Hmmm...

J'n'ai pas pris le temps de simplifier votre code, mais un simple :


$("#menu li.bouton").css("background-color","#000");
$(this).css("background-color","#be2830");


sur le clic des boutons suffirait, non ?

Tous en noir, puis celui sur lequel on clique en rouge.

edit : j'ai omis l'animation sur le bouton car pour faire un animate sur un backgroundColor il vous faudrait :
https://github.com/jquery/jquery-color
Modifié par Manhattan (12 Jun 2013 - 16:03)
oui !!!! un grand grand merci ! j'ai trafiqué un peu mon code avec votre piste, du coup ça donne ça :

$(function(){
			$("#menu li#reglement-bouton").css("background-color","#2e2e2e");
			
			$("#menu li.bouton").click(function(){				
				$clicked = $(this);				
				// le bouton n'est pas encore "transformé" ni n'ont plus animé
				if ($clicked.css("background-color") != "#be2830" && $clicked.is(":not(animated)")) {					
					
					$(this).css("background-color","#be2830", 600);
								
					// chaque bouton doit avoir un id de type "xx-bouton" et la cible un id de type "xx" 
					var idToLoad = $clicked.attr("id").split('-');					
					// on cherche dans le contenu la div visible à laquelle on applique un fadeOut
					$("#contenu").find("div:visible").fadeOut("fast", function(){
						// une fois le fadeOut accompli, on fait un fadeIn à la div active
						$(this).parent().find("#"+idToLoad[0]).fadeIn();
					})
				}				
				// on remet les autres boutons au style par défaut
				$clicked.siblings(".bouton").css(
					"background-color","#2e2e2e"
		
				, 600 );				
			});
		});		



et ça fonctionne exactement comme je l'espérais !

encore merci ! Smiley smile
Cette ligne m'intrigue :
$(this).css("background-color","#be2830", 600);


.css() ne prend normalement que 2 valeurs en entrée : l'attribut et sa valeur.

Z'êtes sur de ne pas avoir une ptite erreur ? Smiley rolleyes
En fait, animate sur background-color a été implémenté dans Jquery UI.
Il y a aussi le lien que je vous ai proposé.

Ensuite, est ce que ça vaut le coup de charger une librairie supplémentaire ou un pluggin juste pour des boutons... A voir Smiley smile
oui, c'est pourquoi je me dirige plutôt vers une solution sans l'animation qui ne me parait pas primordiale.

Et encore merci pour tout !