28172 sujets

CSS et mise en forme, CSS3

Bonjour,

Comme déjà dit dans ma présentation, je réalise un porte folio sur la demande d'un ami. Je ne débute pas tout a fait dans le CSS mais ça peut tout de même vite me dépasser car je n'ai pas l'habitude de faire un design a mes sites, voilà maintenant que j'y suis obligé ...

La page se compose de 3 parties basiques: header, #main et footer.

header (pas div id=header mais la nouvelle balise html5 bien sûr) est collé au sommet de la page, centré et d'une largeur relative à la définition de l'écran.

footer, de même, au bas de l'écran, d'une hauteur moins importante, etc ... schéma classique, vous voyez le topo ^^

#main est le conteneur principal, largeur égale à header, hauteur relative (100 % - header.height - footer.height - margin: 20px 20px).
Il contient:
- la première page #home, c'est la seule page fixe.
- le sous-conteneur #pages.

Le sous-conteneur #pages contient:
- un menu #tabs, pour chaque pages, celui là est toujours visible à la droite de la page.
- les pages qui seront capable de se déplacer: #about, #work, #links, #contact.
par défaut ces pages sont masquées (derrière un div color #000, pas display: none).

Lors d'un clic sur un onglet, l'onglet ainsi que sa page se déplacera vers le centre, masquant #home.
Lors d'un nouveau clic sur cet onglet ouvert la page se referme.
Lors d'un clic sur un onglet fermé alors qu'un autre est ouvert, fermeture du premier puis ouverture de l'autre.
Il y aura donc une animation Javascript (probablement à l'aide de jquery (.animate()), mais je n'en suis pas encore là. J'essaye premièrement de faire une structure HTML/CSS correcte et ce n'est pas encore le cas, voilà pourquoi je suis là Smiley sweatdrop .

Voici un plan de la page lors de son chargement, aucune page annexe n'est ouverte:
upload/37991-plan1.png

Et un plan lorsqu'une page est ouverte:
upload/37991-plan2.png

J'ai fais de mon mieux pour les images, elles sont assez claires normalement.

Voici donc comment j'ai structuré ma page html:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
	<head>
		<title>Titre de la page</title>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<link rel="stylesheet" href="style.css" type="text/css" media="screen" />
		
	</head>
	<body>
	<header>
		<img src="logo.png"/>
	</header>
	<div id="main">
		
		<div class="page" id="home">
			<div class="content">
				<h2>HOME</h2>
				<p></p>
			</div>
		</div>
		
		<div id="pages">
			<ul id="tabs">
				<li id="about-tab"><img src="about.png"/></li>
				<li id="work-tab"><img src="work.png"/></li>
				<li id="links-tab"><img src="links.png"/></li>
				<li id="contact-tab"><img src="contact.png"/></li>
			</ul>
			
			<div class="page" id="about">
				<div class="content">
					<h2>ABOUT</h2>
					<p></p>
				</div>
			</div>
			
			<div class="page" id="work">
				<div class="content">
					<h2>WORK</h2>
					<p>.</p>
				</div>
			</div>
			
			<div class="page" id="links">
				<div class="content">
					<h2>LINKS</h2>
					<p></p>
				</div>
			</div>
			
			<div class="page" id="contact">
				<div class="content">
					<h2>CONTACT</h2>
					<p></p>
				</div>
			</div>
		
		</div>
		
		
		
	</div>
	<footer>
		<p>Exemple footer</p>
	</footer>
	
	<script src="http://code.jquery.com/jquery-latest.js"></script>
	<script type="text/javascript">
	var pages = new Array ('about', 'work', 'links', 'contact'), 
		nbr_pages = pages.length;
	</script>
	
	</body>
</html>


Le style:


html, body {
	height: 100%;
	overflow: hidden;
}

body {
	padding-right: 10%;
	padding-left: 10%;
	background: #000;
	color: #FFF;
	overflow: auto;
}

header, footer {
	text-align: center;
	background: #abc;
}
header {
	margin-bottom: 50px;
}
footer {
	height: 50px;
	width:100%;
	position: fixed;
	bottom: 0;
}

#main {
	margin: 0;
}

.page {
	height: 580px;
	width: 80%;
	background: #EEE;
	color: #222;
	
}

.page .content {
	margin: 20px;
	overflow: auto;
	font-size: 100%;
}

#pages {
	position: relative;
	top: -580px;
	left: 95%;
	
	padding: 0;
	
}

#pages .page {
	position: absolute;
	top: 0;
	left: 40px;
}

#tabs {
	list-style: none;
	
	padding: 0;
	margin: 0;
	
}
#tabs li {
	position: relative;
	margin: 0;
	
}


#home {
	background: #666;
	position: relative;
	z-index: 0;
	margin-left: 80px;
}

#about {
	background: #71d237;
	z-index: 5;
}
#about-tab {
	
}

#work {
	background: #f29600;
	z-index: 4;
}
#work-tab {
	
}

#links {
	background: #eb0039;
	z-index: 3;
}
#links-tab {

}

#contact {
	background: #3d97e1;
	z-index: 2;
	
}
#contact-tab {
	
}


J'ai également mis cet essai en ligne sur le serveur web: HTML / CSS .
Vous remarquerez les quelques problèmes, notamment le footer (qui est position:fixed mais a cause de #pages en position:relative il se retrouve beaucoup trop bas), les pages qui débordent vers la droite de l'écran, comme solution temporaire je place un overflow:auto à body mais j'espère que c'est temporaire, qu'il y a une meilleur solution.

Ca serait vraiment sympa que vous testiez ce code pour m'expliquer mes soucis, ce que pourrait être optimisé, comment l'optimiser, etc ... Vous me seriez d'une très grande aide !! Smiley lol
Bonjour²,

J'ai fais une nouvelle image du plan en indiquant les DIV conteneurs #main et #pages.

upload/37991-plan3.png

J'ai un peu modifié le code, j'arrive a un autre résultat intéressant mais encore loin de l'arrivée ...
Voici ce que ça donne: http://www.legreen.ch/style/style5.html

Tout ce joue essentiellement ici:

#pages {
	position: absolute;
	right: 40px;
	padding: 0;
	border: 1px solid yellow;
}

#pages .page {
	position: absolute;
	top: 0;
	left: 40px;
}

#tabs {
	list-style: none;
	
	padding: 0;
	margin: 0;
	
}
#tabs li {
	position: relative;
	margin: 0;
}


Pouvez vous m'aider ?
Modifié par ghilan (24 May 2011 - 22:16)
Bonjour,


Le style " une page " est souvent mal perçu.

j'ai essayé un petit " overflow: hidden; " sur ton #pages, et cela règle le fait que cela dépasse quand les pages sont fermées, mais cet " overflow:hidden " va malheureusement bloquer l'affichage de tes pages à la longue, si le comportement est tel que je le comprends.

Je pense qu'il te faudrait revoir ta façon de faire :
- en utilisant des " display : none; " sur tes pages. J'ai vu que tu ne le voulais pas, mais je me demande pourquoi...
- en séparant le conteneur de tes tabs et le conteneur de tes pages. tu risques d'y être obligé pour ton comportement ( il va y avoir des z-index à gérer etc... )
- en revoyant tes positionnements, tu n'as sûrement pas besoin de tant d'absolute...
Hello,

Oui j'essaye de trouver la structure idéale mais ce n'est pas évident pour moi.

Je ne peux pas utiliser le display: none parce que lorsque la page devra se déplacer vers le centre il y aura un effet pas cool d'apparition de la page. Je ne sais pas comment bien expliquer ce point mais je suis sûr que je ne me trompe pas.

Cependant j'ai eu beaucoup de nouvelles idées en relisant le tutoriel pour réaliser un menu accordéon en jQuery. Premièrement, j'utilise la fonction hide() pour masquer les pages. Deuxièmement, je vais essayer de l'adapter à l'entièreté de mes pages, de sorte que au lieu de glisser vers le centre, elles se déplient comme le menu accordéon. Ce qui serait vraiment génial et qui, j'ai le sentiment, me simplifiera la vie au niveau du CSS. (J'espère ...)

Séparer le conteneur #tabs et #pages ? Je ne sais pas si ça m'aidera vraiment Smiley decu


Merci porter de l'attention à mon problème en tout cas Smiley smile
Pfff que je galère ...

Bon j'ai a nouveau changer la structure html, maintenant le contenu des pages se retrouve dans le <li> de son onglet. Voici a quoi ça ressemble:


			<div id='main'>
				<ul id='pages'>
					<li id='about' class='page'>
						<div class='tab'>
							<img src='images/about.png'>
						</div>
						<div class='content'>
							<h2>ABOUT</h2>
							<p>Content</p>
						</div>
					</li>
					<!-- 4 fois le bloc précédent pour les autres pages, enlevés pour alléger le code -->
				</ul>
		
				<div id='home' class='page'>
					<div class='tab'>
						<!-- no tabs for Home -->
					</div>
					<div class='content'>
						<h2>HOME</h2>
						<p>Content</p>
					</div>
				</div>
			</div>


J'applique ensuite la fonction jQuery hide() sur les noeuds #pages .page .content.

Et ici l'entièreté du css (désolé de ne pas le mettre sur le serveur, demandez si nécessaire):

html, body {
	height: 100%;
}

body {
	padding-right: 10%;
	padding-left: 10%;
	overflow: auto;
	background: #000;
	color: #FFF;
}

header {
	text-align: center;
	background: #abc;
}

footer {
	text-align: center;
	background: #abc;
}

#main {
	position: relative;
	height: 100%;
	border: 1px solid red;
	margin-top: 20px;
	margin-bottom: 20px;
}

.page {
	height: 100%;
	margin-top: 5px;
	
}

.tab {
	display: inline-block;
	margin: auto;
	border-top-left-radius: 15px;
	border-bottom-left-radius: 15px;
	-webkit-border-top-left-radius: 15px;
	-webkit-border-bottom-left-radius: 15px;
	-moz-border-radius-topleft: 15px;
	-moz-border-radius-bottomleft: 15px;
}

.content {
	margin-left: 30px;
	height: auto;
}

#pages {
	position: absolute;
	right: 0;
	list-style: none;
	margin: 0;
	padding: 0;
	
}

#pages .page {
	position: static;
}

#home {
	background: #FFF;
	color: #000;
	height: 100%;
	
	margin-left: 30px;
}
#about {
	background: #71d237;
	z-index: 5;
}
#work {
	background: #f29600;
	z-index: 4;
}
#links {
	background: #eb0039;
	z-index: 3;
}
#contact {
	background: #3d97e1;
	z-index: 2;	
}


J'ai fais un screenshot de ce que j'obtiens sur Firefox:
upload/37991-legreench-.png

Comme vous voyez, c'est pas encore ça Smiley ohwell