28172 sujets

CSS et mise en forme, CSS3

Bonjour,
Oui, mon titre est assez confus ! pourtant il résume bien mon problème:

J'ai mon body qui contient (pour simplifier) deux éléments, et je veux que lorsque le premier élément est ciblé (:target) le deuxième élément subisse des transformations dans ses propriétés. j'ai besoin de ceci pour ce site: les boutons du menu seront alors grisés (comme lors du hover) lorsque la page en question est ciblé. Voilà, je vous remercie de votre aide !
Modifié par xXjujo002Xx (09 Sep 2012 - 13:14)
Si ils sont frères, en CSS tu ne pourra pas, il faut utiliser du JS.
Modifié par jb_gfx (20 May 2012 - 17:42)
Bonsoir,

Effectivement, en l'état il n'est pas possible en CSS d’interagir sur le menu à partir des <div> servant de contenu à chaque rubrique, puisque tous ces éléments sont frères. En effet pour cibler des éléments frères en CSS, les deux seules options qui s'offrent à nous, à savoir le sélecteur d'adjacence directe (+) et le sélecteur d'adjacence indirecte (~), ne fonctionnent pas puisque l'élément sur lequel on veut agir, le menu, est situé avant les autres frères.

Comme l'a suggéré jb_gfx, on peut alors recourir à du JavaScript qui permet d'obtenir très facilement ce genre de comportement. Pour ma part je travaille avec la librairie JQuery qui facilite grandement les opérations.

HTML :
<ul id="menu">
	<li><a href="#portfolio">Portfolio</a></li>
	<li><a href="#ressources">Ressources</a></li>
	<li><a href="#contact">Contact</a></li>
</ul>
<div id="portfolio"><p>Portfolio</p></div>
<div id="ressources"><p>Ressources</p></div>
<div id="contact"><p>Contact</p></div>

Une liste non ordonnée vaut mieux qu'une simple balise <div> dépourvue de toute sémantique ! Smiley smile

CSS :
body, ul, p {
	margin: 0;
	padding: 0;
}

.actif {
	background-color: red;
}

On prépare les styles d'un lien actif du menu dans une classe "actif". J'applique un simple fond rouge pour l'exemple.

JavaScript :
$(function() {
	// Première instruction :
	$('#menu a[href="' + location.hash + '"]').addClass('actif');
	
	// Deuxième instruction :
	$('#menu a').click(function() {
		$(this).addClass('actif');
		$(this).parent().siblings().children().removeClass('actif');
	});
});


- Première instruction :

Au chargement de la page on récupère l'ancre de l'URL (s'il y en a une), on cherche le lien du menu qui contient cette valeur dans son attribut href et on lui applique la classe "actif".

Par exemple si l'URL est :
"http://web.graphiz.free.fr/[b]#portfolio[/b]"

On cherche le lien :
<a [b]href="#portfolio[/b]">Portfolio</a>

Et on lui applique la classe "actif" :
<a [b]class="actif"[/b] href="#portfolio">Portfolio</a>


- Deuxième instruction :

Au click sur un lien du menu, on lui ajoute la classe "actif" et on retire cette même classe à tous les autres liens du menu (si l'un d'entre eux en bénéficie déjà). Pour cela on doit un peu manipuler le DOM (l'arborescence du code HTML) à la recherche des éléments qui nous intéressent : les liens adjacents de celui qui a été clické.

Par exemple si on visualise le contenu de la rubrique "Portfolio", le menu est comme suit :
<ul id="menu">
	<li><a [b]class="actif"[/b] href="#portfolio">Portfolio</a></li>
	<li><a href="#ressources">Ressources</a></li>
	<li><a href="#contact">Contact</a></li>
</ul>

Maintenant, si on click sur "Ressources", le code suivant se déclenche :
$(this).parent().siblings().children().removeClass('actif');

Cette ligne barbare signifie :
- Cherche le parent (.parent) de l'élément clické (this)
- Cherche ses frères (siblings)
- Cherche leurs enfants (children)
- Ajoute-leur la classe "actif"

Ce qui donne dans notre arborescence HTML :
- Le parent de l'élément clické : une balise <li>
- Ses frères : les deux autres balises <li>
- Leurs enfants : la balise <a> que chacune englobe

En plus d'ajouter la classe "actif" au lien "Ressources", on a donc supprimé cette même classe du lien "Portfolio" :
<ul id="menu">
	<li><a href="#portfolio">Portfolio</a></li>
	<li><a [b]class="actif"[/b] href="#ressources">Ressources</a></li>
	<li><a href="#contact">Contact</a></li>
</ul>

Modifié par jeremy-p (21 May 2012 - 00:02)
Je crois avoir compris ceci mais je ne parvient pas à l'appliquer:

CSS:


#menu li {
	list-style:none;
	display:inline-block;
	margin:0;
}

#item:hover, .actif {
	background:rgba(0,0,0,0.2);
	box-shadow:inset 0 0 3px black;
	border:1px solid rgba(254,254,254,0.15);
	-webkit-transition:0.7s;
	-moz-transition:0.8s;
	-o-transition:0.7s;
}


Javascript:


$(function() {
				$('#menu a[href="' + location.hash + '"]').addClass('actif');
				$('#menu a').click(function() {
					$(this).addClass('actif');
					$(this).parent().siblings().children().removeClass('actif');
				});
			});



HTML:


<div id="menu">
			<li><a href="#portfolio" id="item" class="portfolio"></a></li>
			<li><a href="#ressources" id="item" class="ressources"></a></li>
			<li><a href="#contact" id="item" class="contact"></a></li>
		</div>


Smiley bawling
J'ai oublié de préciser qu'il faut importer la librairie JQuery dans la balise <head> de votre document HTML, et ce avant tout autre script utilisant la librairie Smiley cligne

<head>
	<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
	
	<script type="text/javascript">
	$(function() {
		$('#menu a[href="' + location.hash + '"]').addClass('actif');
		
		$('#menu a').click(function() {
			$(this).addClass('actif');
			$(this).parent().siblings().children().removeClass('actif');
		});
	});
	</script>
</head>
Par défaut, la dernière ^^

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
Attention par contre à votre code qui est invalide :

<[b]div[/b] id="menu">
	...
</[b]div[/b]>

Devrait être transformé en :
<[b]ul[/b] id="menu">
	...
</[b]ul[/b]>


Smiley cligne
J'aimerais relancer le sujet (longtemps après), le problème est à peu près le même mais l'élément qui diffère au lieu d'être l'adresse dans la barre du navigateur est l'état d'un élément en :focus (ou en Smiley langue as-focus ^^). En clair:


.post-button {
	font-size:15;
	margin:-37 0 0 549;
	opacity:0;
	position:relative;
	-webkit-transition:opacity 0.3s, margin 0.3s 0s;
	-moz-transition:opacity 0.3s, margin 0.3s 0s;
	-o-transition:opacity 0.3s, margin 0.3s 0s;
	transition:opacity 0.3s, margin 0.3s 0s;
}

.post:focus .post-button{
	margin:0 0 10 549;
	opacity:1;
	-webkit-transition:opacity 0.7s 0.1s, margin 0.3s 0s;
	-moz-transition:opacity 0.7s 0.1s, margin 0.3s 0s;
	-o-transition:opacity 0.7s 0.1s, margin 0.3s 0s;
	transition:opacity 0.7s 0.1s, margin 0.3s 0s;
}



<textarea class="post" onfocus="if(this.value=='Écrivez quelque-chose...'){this.value='';}" onblur="if(this.value==''){this.value='Écrivez quelque-chose...';}" maxlength="1000">Écrivez quelque-chose...</textarea>
<a class="button post-button">Poster</a>


Voilà voilà, merci de votre aide !!
bonsoir,

1) tu aurais du creer un nouveau fil de discussion.

2) En CSS le selecteur adjacent (frere quelconque suivant dans le flux) peut te suffire en théorie:
.post-button {
	font-size:15;
	margin:-37 0 0 549;
	opacity:0;
	position:relative;
	-webkit-transition:opacity 0.3s, margin 0.3s 0s;
	-moz-transition:opacity 0.3s, margin 0.3s 0s;
	-o-transition:opacity 0.3s, margin 0.3s 0s;
	transition:opacity 0.3s, margin 0.3s 0s;
}

.post:focus ~ .post-button{
	margin:0 0 10 549;
	opacity:1;
	-webkit-transition:opacity 0.7s 0.1s, margin 0.3s 0s;
	-moz-transition:opacity 0.7s 0.1s, margin 0.3s 0s;
	-o-transition:opacity 0.7s 0.1s, margin 0.3s 0s;
	transition:opacity 0.7s 0.1s, margin 0.3s 0s;
}

Pas forcement judicieux, il faut avoir compris qu'il faut cliquer dans la zone texte pour pouvoir envoyer le formulaire ... , en se servant de la touche tab pour passer d'element en element, ça bug Smiley smile , et puis , un imput submit est approprié ...


Je ne comprend pas l'utilité d'un lien sans attribut HREF ni ID ?

Cdt,
GC
Modifié par gc-nomade (09 Sep 2012 - 01:57)
a écrit :
1) tu aurais du creer un nouveau fil de discussion.


Je ne rien pur me défendre Smiley sweatdrop

a écrit :
2) En CSS le selecteur adjacent (frere quelconque suivant dans le flux) peut te suffire en théorie:


Ça m'intéresse beaucoup ! Je ne connaissais absolument pas ceci !!

a écrit :
Pas forcement judicieux, il faut avoir compris qu'il faut cliquer dans la zone texte pour pouvoir envoyer le formulaire ... , en se servant de la touche tab pour passer d'element en element, ça bug , et puis , un imput submit est approprié ...


Je posterais un lien vers la maquette pour que tu puisse mieux saisir le concept...

a écrit :
Je ne comprend pas l'utilité d'un lien sans attribut HREF ni ID ?


Bah, comme dis au dessus, c'est une maquette, le site n'est pas du tout fonctionnel, je m'occupe juste de la mises en forme pour l'instant.

En tout cas, ce que tu propose semble être la solution miracle ! Je n'espérais pas pouvoir faire une telle chose en full css !
Voilà l'adresse de la maquette.

Vous remarquerez vite que le site n'est absolument pas fonctionnel, vous n'aurez que l'illusion de poster un message (d'ailleurs vous ne pourrez en poster qu'un seul).

Normalement il fonctionne correctement sur webkit (ou du moins Safari), je n'ai pas encore vérifié sa comptabilité avec Firefox et Opera. Quant à IE... il aura une version sur-mesure...
Modifié par xXjujo002Xx (09 Sep 2012 - 13:14)
Salut,

Je reviens au premier message...
Pourquoi ne pas faire l'inverse ?
Mais éléments sont grisés, sauf celui qui a le ":target" ?
Comme ici ?

Du coup, pas besoin de jQuery... Smiley smile

tm