<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>http://webcolors.fr/</id>
  <title>Blog WebColors</title>
  <updated>2010-03-20T19:10:00Z</updated>
  <link rel="alternate" href="http://webcolors.fr"/>
  <link rel="self" href="http://webcolors.fr/blog/feed.xml"/>
  <author>
    <name>Ga&#235;l Deest et Caroline Gaudreau</name>
    <uri>http://webcolors.fr/blog</uri>
  </author>
  <entry>
    <id>tag:webcolors.fr,2010-03-20:/blog/2010/3/20/menus-avec-animations-jquery/</id>
    <title type="html">Menus avec animations JQuery </title>
    <published>2010-03-20T19:10:00Z</published>
    <updated>2010-03-25T15:57:14Z</updated>
    <link rel="alternate" href="http://webcolors.fr/blog/2010/3/20/menus-avec-animations-jquery/"/>
    <content type="html">&lt;p&gt;Voici quelques exemples de menus avec animation JQuery. La pr&#233;sentation des menus se fera avec sous-menus car ceux-ci peuvent ajouter &#224; la complexit&#233; du code.&lt;/p&gt;
&lt;h2&gt;Exemple 1 :Menu avec animation Easing&lt;/h2&gt;
&lt;div class='logos-browsers'&gt;
&lt;img class=&quot;logo-browser&quot; alt=&quot;Internet Explorer 6&quot;  src=&quot;/assets/images/layout122009/blog/logo-ie6.jpg&quot; /&gt;&lt;img class=&quot;logo-browser&quot; alt=&quot;Internet Explorer 7&quot;  src=&quot;/assets/images/layout122009/blog/logo-ie7.jpg&quot; /&gt;&lt;img class=&quot;logo-browser&quot; alt=&quot;Internet Explorer 8&quot;  src=&quot;/assets/images/layout122009/blog/logo-ie8.jpg&quot; /&gt;&lt;img class=&quot;logo-browser&quot; alt=&quot;logo Firefox&quot;  src=&quot;/assets/images/layout122009/blog/logo-firefox.jpg&quot; /&gt;&lt;img class=&quot;logo-browser&quot; alt=&quot;logo Opera&quot;  src=&quot;/assets/images/layout122009/blog/logo-opera.png&quot; /&gt;&lt;img class=&quot;logo-browser&quot; alt=&quot;logo Safari&quot;  src=&quot;/assets/images/layout122009/blog/logo-safari.jpg&quot; /&gt;&lt;img class=&quot;logo-browser&quot; alt=&quot;logo Chrome&quot;  src=&quot;/assets/images/layout122009/blog/logo-chrome.png&quot; /&gt;
&lt;/div&gt;
&lt;div id='exemple1'&gt;
&lt;ul id='exemple-menu-1'&gt;
&lt;li class='sous-menu'&gt;
&lt;ul class='list-sous-menu' id='menu-accueil'&gt;
&lt;li&gt;
&lt;a class=&quot;menu-anim&quot; href=&quot;#&quot;&gt;Accueil&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href=&quot;#&quot;&gt;Sous-menu-1&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href=&quot;#&quot;&gt;Sous-menu-2&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href=&quot;#&quot;&gt;Sous-menu-3&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href=&quot;#&quot;&gt;Sous-menu-5&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href=&quot;#&quot;&gt;Sous-menu-6&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class='sous-menu'&gt;
&lt;ul class='list-sous-menu' id='menu-tarifs'&gt;
&lt;li&gt;
&lt;a class=&quot;menu-anim&quot; href=&quot;#&quot;&gt;Tarifs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href=&quot;#&quot;&gt;Sous-menu-1&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href=&quot;#&quot;&gt;Sous-menu-2&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href=&quot;#&quot;&gt;Sous-menu-3&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href=&quot;#&quot;&gt;Sous-menu-5&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href=&quot;#&quot;&gt;Sous-menu-6&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class='sous-menu'&gt;
&lt;ul class='list-sous-menu' id='menu-contact'&gt;
&lt;li&gt;
&lt;a class=&quot;menu-anim&quot; href=&quot;#&quot;&gt;Contact&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href=&quot;#&quot;&gt;Sous-menu-1&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href=&quot;#&quot;&gt;Sous-menu-2&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href=&quot;#&quot;&gt;Sous-menu-3&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href=&quot;#&quot;&gt;Sous-menu-5&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href=&quot;#&quot;&gt;Sous-menu-6&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Menu tr&#232;s symatique avec petite animation easing vers le bas lorsque le curseur est sur le bouton principal.Ce menu n&#233;cessite le t&#233;l&#233;chargement du plugin JQuery Easing disponible &#224; cette adresse : &lt;a title=&quot;JQuery Easing&quot; href=&quot;http://plugins.jquery.com/project/Easing&quot;&gt;http://plugins.jquery.com/project/Easing&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Code&lt;/h3&gt;
&lt;h4&gt;HTML&lt;/h4&gt;
&lt;script class='brush: html' type='syntaxhighlighter'&gt;
&lt;![CDATA[
    &lt;div id=&quot;exemple1&quot;&gt;
    	&lt;ul id=&quot;menu&quot;&gt;
    		&lt;li class=&quot;sous-menu&quot;&gt;
    			&lt;ul class=&quot;list-sous-menu&quot; id=&quot;menu-accueil&quot;&gt;
    				&lt;li&gt;&lt;a class=&quot;menu-anim&quot; href=&quot;#&quot;&gt;Accueil&lt;/a&gt;&lt;/li&gt;
    				&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Sous-menu-1&lt;/a&gt;&lt;/li&gt;
    				&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Sous-menu-2&lt;/a&gt;&lt;/li&gt;
    				&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Sous-menu-3&lt;/a&gt;&lt;/li&gt;
    				&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Sous-menu-4&lt;/a&gt;&lt;/li&gt;
    				&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Sous-menu-5&lt;/a&gt;&lt;/li&gt;
    			&lt;/ul&gt;
    		&lt;/li&gt;
    		&lt;li class=&quot;sous-menu&quot;&gt;
    			&lt;ul class=&quot;list-sous-menu&quot; id=&quot;menu-tarifs&quot;&gt;
    				&lt;li&gt;&lt;p&gt;&lt;a class=&quot;menu-anim&quot; href=&quot;#&quot;&gt;Tarifs&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
    				&lt;li&gt;Item 1&lt;/li&gt;
    				&lt;li&gt;Item 2&lt;/li&gt;
    				&lt;li&gt;Item 3&lt;/li&gt;
    				&lt;li&gt;Item 4&lt;/li&gt;
    				&lt;li&gt;Item 5&lt;/li&gt;
    			&lt;/ul&gt;
    		&lt;/li&gt;
    	&lt;/ul&gt;
    &lt;/div&gt;
]]&gt;
&lt;/script&gt;
&lt;h4&gt;CSS&lt;/h4&gt;
&lt;script class='brush: css' type='syntaxhighlighter'&gt;
&lt;![CDATA[
    	#exemple1{
    		//Tr&#232;s important si nous ne voulons pas que le menu pousse lorsqu'il s'&#233;tend.
    		position:absolute;
    		
    		//Pour &#234;tre certain que le menu sera toujours au dessus des autres &#233;l&#233;ments.
    		z-index: 10;
    	}
    	
    	#menu a{
    		text-decoration: none;
    		color: white;
    	}
    
    	#menu li.sous-menu{
    		//Pour transformer la liste principale en liste horizontale.
    		float:left;
    		list-style-type: none;
    	}
    
    	#menu ul{
    		margin:0;
    		padding:0;
    		list-style-type:none;
    		text-align:center;
    	 }
    
    	.list-sous-menu li{
    		margin-bottom: 10px;
    	}
    
    
    	#menu ul li ul {
    		display:none;
    	 }
    
    	.list-sous-menu{
    		background-color: green;
    		width: 125px;
    		
    		//Tr&#232;s important pour cacher les sous-menus.
    		overflow: hidden; height: 20px; display: block;
    	}
    	
    	
    	//Les images de fond, pas n&#233;cessaire.
    	#menu-accueil{
    		background-image: url('bgr-menu-home.png');
    	}
    
    	#menu-tarifs{
    		background-image: url('bgr-menu-what.png');
    	}
    
    	#menu-contact{
    		background-image: url('bgr-menu-contact.png');
    	}
]]&gt;
&lt;/script&gt;
&lt;h4&gt;Javascript&lt;/h4&gt;
&lt;script class='brush: javascript' type='syntaxhighlighter'&gt;
&lt;![CDATA[
    $(document).ready(function(){
    
    	//When mouse rolls over
    	$(&quot;.list-sous-menu&quot;).mouseover(function(){
    		$(this).stop().animate({height:'233px'},{queue:false, duration:600, easing: 'easeOutBounce'})
    	});
    
    	//When mouse is removed
    	$(&quot;.list-sous-menu&quot;).mouseout(function(){
    		$(this).stop().animate({height:'20px'},{queue:false, duration:600, easing: 'easeOutBounce'})
    	});
    
    });
]]&gt;
&lt;/script&gt;
&lt;h2&gt;Example 2 : Menu avec animation Kwicks&lt;/h2&gt;
&lt;div class='logos-browsers'&gt;
&lt;img class=&quot;logo-browser&quot; alt=&quot;Internet Explorer 6&quot;  src=&quot;/assets/images/layout122009/blog/logo-ie6.jpg&quot; /&gt;&lt;img class=&quot;logo-browser&quot; alt=&quot;Internet Explorer 7&quot;  src=&quot;/assets/images/layout122009/blog/logo-ie7.jpg&quot; /&gt;&lt;img class=&quot;logo-browser&quot; alt=&quot;Internet Explorer 8&quot;  src=&quot;/assets/images/layout122009/blog/logo-ie8.jpg&quot; /&gt;&lt;img class=&quot;logo-browser&quot; alt=&quot;logo Firefox&quot;  src=&quot;/assets/images/layout122009/blog/logo-firefox.jpg&quot; /&gt;&lt;img class=&quot;logo-browser&quot; alt=&quot;logo Opera&quot;  src=&quot;/assets/images/layout122009/blog/logo-opera.png&quot; /&gt;&lt;img class=&quot;logo-browser&quot; alt=&quot;logo Safari&quot;  src=&quot;/assets/images/layout122009/blog/logo-safari.jpg&quot; /&gt;&lt;img class=&quot;logo-browser&quot; alt=&quot;logo Chrome&quot;  src=&quot;/assets/images/layout122009/blog/logo-chrome.png&quot; /&gt;
&lt;/div&gt;
&lt;div id='exemple2'&gt;
&lt;ul class='menu-kwicks'&gt;
&lt;li id='kwick1'&gt;
&lt;ul&gt;
&lt;li&gt;Accueil&lt;/li&gt;
&lt;li class='sous-menu'&gt;&lt;a href=&quot;#&quot;&gt;Qui sommes nous?&lt;/a&gt;&lt;/li&gt;
&lt;li class='sous-menu'&gt;&lt;a href=&quot;#&quot;&gt;Notre vision&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li id='kwick2'&gt;
&lt;ul&gt;
&lt;li&gt;Prestations&lt;/li&gt;
&lt;li class='sous-menu'&gt;&lt;a href=&quot;#&quot;&gt;Enseignement&lt;/a&gt;&lt;/li&gt;
&lt;li class='sous-menu'&gt;&lt;a href=&quot;#&quot;&gt;Produits&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li id='kwick3'&gt;
&lt;ul&gt;
&lt;li&gt;Tarifs&lt;/li&gt;
&lt;li class='sous-menu'&gt;&lt;a href=&quot;#&quot;&gt;Enseignement&lt;/a&gt;&lt;/li&gt;
&lt;li class='sous-menu'&gt;&lt;a href=&quot;#&quot;&gt;Produits&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li id='kwick4'&gt;
&lt;ul&gt;
&lt;li&gt;Contact&lt;/li&gt;
&lt;li class='sous-menu'&gt;&lt;a href=&quot;#&quot;&gt;Coordonn&#233;es&lt;/a&gt;&lt;/li&gt;
&lt;li class='sous-menu'&gt;&lt;a href=&quot;#&quot;&gt;Facebook&lt;/a&gt;&lt;/li&gt;
&lt;li class='sous-menu'&gt;&lt;a href=&quot;#&quot;&gt;Twitter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;Menu fa&#231;on Kwicks. Ce plugin JQuery est une copie de ce que nous pouvons trouver dans Mootools. Vous pouvez le t&#233;l&#233;charger &#224; l'adresse suivante : &lt;a title=&quot;JQuery Kwicks&quot; href=&quot;http://www.jeremymartin.name/projects.php?project=kwicks&quot;&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Code&lt;/h3&gt;
&lt;h4&gt;HTML&lt;/h4&gt;
&lt;script class='brush: html' type='syntaxhighlighter'&gt;
&lt;![CDATA[
    	&lt;div id=&quot;exemple2&quot;&gt; 
    		&lt;ul class=&quot;menu-kwicks&quot;&gt; 
    			&lt;li id=&quot;kwick1&quot;&gt;
    				&lt;ul&gt;
    					&lt;li&gt;Accueil&lt;/li&gt;
    					&lt;li class=&quot;sous-menu&quot;&gt;&lt;a href=&quot;#&quot;&gt;Qui sommes nous?&lt;/a&gt;&lt;/li&gt;
    					&lt;li class=&quot;sous-menu&quot;&gt;&lt;a href=&quot;#&quot;&gt;Notre vision&lt;/a&gt;&lt;/li&gt;
    				&lt;/ul&gt;
    			&lt;/li&gt; 
    			&lt;li id=&quot;kwick2&quot;&gt;
    				&lt;ul&gt;
    					&lt;li&gt;Prestations&lt;/li&gt;
    					&lt;li class=&quot;sous-menu&quot;&gt;&lt;a href=&quot;#&quot;&gt;Enseignement&lt;/a&gt;&lt;/li&gt;
    					&lt;li class=&quot;sous-menu&quot;&gt;&lt;a href=&quot;#&quot;&gt;Produits&lt;/a&gt;&lt;/li&gt;
    				&lt;/ul&gt;
    			&lt;/li&gt; 
    			&lt;li id=&quot;kwick3&quot;&gt;
    				&lt;ul&gt;
    					&lt;li&gt;Tarifs&lt;/li&gt;
    					&lt;li class=&quot;sous-menu&quot;&gt;&lt;a href=&quot;#&quot;&gt;Enseigneent&lt;/a&gt;&lt;/li&gt;
    					&lt;li class=&quot;sous-menu&quot;&gt;&lt;a href=&quot;#&quot;&gt;Produits&lt;/a&gt;&lt;/li&gt;
    				&lt;/ul&gt;
    			&lt;/li&gt; 
    			&lt;li id=&quot;kwick4&quot;&gt;
    				&lt;ul&gt;
    					&lt;li&gt;Contact&lt;/li&gt;
    					&lt;li class=&quot;sous-menu&quot;&gt;&lt;a href=&quot;#&quot;&gt;Coordonn&#233;es&lt;/a&gt;&lt;/li&gt;
    					&lt;li class=&quot;sous-menu&quot;&gt;&lt;a href=&quot;#&quot;&gt;Facebook&lt;/a&gt;&lt;/li&gt;
    					&lt;li class=&quot;sous-menu&quot;&gt;&lt;a href=&quot;#&quot;&gt;Twitter&lt;/a&gt;&lt;/li&gt;
    				&lt;/ul&gt;
    			&lt;/li&gt; 
    		&lt;/ul&gt; 
    	&lt;/div&gt;
]]&gt;
&lt;/script&gt;
&lt;h4&gt;CSS&lt;/h4&gt;
&lt;script class='brush: css' type='syntaxhighlighter'&gt;
&lt;![CDATA[
    #exemple2 .kwicks {
    	list-style: none;
    	position: relative;
    	margin: 0;
    	padding: 0;
    	text-align: left;
    }
    #exemple2 .kwicks li{
    	display: block;
    	overflow: hidden;
    	padding: 0;
    	cursor: pointer;
    }
    
    #exemple2 .kwicks li{
    	float: left;
    	width: 60px;
    	height: 100px;
    	margin-right: 5px;
    }
    
    #exemple2 .kwicks li ul{
    	border:0;
    	margin:0;
    	padding:0;
    	float:none;
    }
    
    #exemple2 .kwicks li ul li{
    	height: 25px;
    	width: 150px;
    }
    
    #exemple2 .sous-menu
    {
    	//Pour avoir les sous-menus d&#233;call&#233;s vers la droite.
    	margin-left: 60px;
    }
    
    #exemple2 #kwick1 { 
    	background-color: #53b388;
    
    }
    #exemple2 #kwick2 {
    	background-color: #5a69a9;
    
    }
    #exemple2 #kwick3 {
    	background-color: #c26468;
    
    }
    #exemple2 #kwick4 { 
    	background-color: #bf7cc7;
    	margin-right: none;
    }
]]&gt;
&lt;/script&gt;
&lt;h4&gt;JavaScript&lt;/h4&gt;
&lt;script class='brush: javascript' type='syntaxhighlighter'&gt;
&lt;![CDATA[
    $().ready(function() {
    	$('#example1 .kwicks').kwicks({
    			max: 205,
    			spacing:  5});
    });
]]&gt;
&lt;/script&gt;
&lt;h2&gt;Exemple 3 :Menu avec animation simple&lt;/h2&gt;
&lt;div class='logos-browsers'&gt;
&lt;img class=&quot;logo-browser&quot; alt=&quot;Internet Explorer 6 non compatible&quot;  src=&quot;/assets/images/layout122009/blog/logo-ie6-non.jpg&quot; /&gt;&lt;img class=&quot;logo-browser&quot; alt=&quot;Internet Explorer 7 non compatible&quot;  src=&quot;/assets/images/layout122009/blog/logo-ie7-non.jpg&quot; /&gt;&lt;img class=&quot;logo-browser&quot; alt=&quot;Internet Explorer 8&quot;  src=&quot;/assets/images/layout122009/blog/logo-ie8.jpg&quot; /&gt;&lt;img class=&quot;logo-browser&quot; alt=&quot;logo Firefox&quot;  src=&quot;/assets/images/layout122009/blog/logo-firefox.jpg&quot; /&gt;&lt;img class=&quot;logo-browser&quot; alt=&quot;logo Opera&quot;  src=&quot;/assets/images/layout122009/blog/logo-opera.png&quot; /&gt;&lt;img class=&quot;logo-browser&quot; alt=&quot;logo Safari&quot;  src=&quot;/assets/images/layout122009/blog/logo-safari.jpg&quot; /&gt;&lt;img class=&quot;logo-browser&quot; alt=&quot;logo Chrome&quot;  src=&quot;/assets/images/layout122009/blog/logo-chrome.png&quot; /&gt;
&lt;/div&gt;
&lt;div id='exemple3'&gt;
&lt;ul id='liste-menu'&gt;
&lt;li id='menu-1'&gt;&lt;a class=&quot;bouton-menu&quot; href=&quot;#&quot;&gt;Menu 1&lt;/a&gt;&lt;/li&gt;
&lt;li id='menu-2'&gt;&lt;a class=&quot;bouton-menu&quot; href=&quot;#&quot;&gt;Menu 2&lt;/a&gt;&lt;/li&gt;
&lt;li id='menu-3'&gt;&lt;a class=&quot;bouton-menu&quot; href=&quot;#&quot;&gt;Menu 3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class='sous-menu' id='sous-menu-1'&gt;
&lt;ul class='sous-menu-liste'&gt;
&lt;li&gt;Sous-menu 1&lt;/li&gt;
&lt;li&gt;Sous-menu 2&lt;/li&gt;
&lt;li&gt;Sous-menu 3&lt;/li&gt;
&lt;li&gt;Sous-menu 4&lt;/li&gt;
&lt;li&gt;Sous-menu 5&lt;/li&gt;
&lt;li&gt;Sous-menu 6&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class='sous-menu' id='sous-menu-2'&gt;
&lt;ul class='sous-menu-liste'&gt;
&lt;li&gt;Sous-menu 1&lt;/li&gt;
&lt;li&gt;Sous-menu 2&lt;/li&gt;
&lt;li&gt;Sous-menu 3&lt;/li&gt;
&lt;li&gt;Sous-menu 4&lt;/li&gt;
&lt;li&gt;Sous-menu 5&lt;/li&gt;
&lt;li&gt;Sous-menu 6&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class='sous-menu' id='sous-menu-3'&gt;
&lt;ul class='sous-menu-liste'&gt;
&lt;li&gt;Sous-menu 1&lt;/li&gt;
&lt;li&gt;Sous-menu 2&lt;/li&gt;
&lt;li&gt;Sous-menu 3&lt;/li&gt;
&lt;li&gt;Sous-menu 4&lt;/li&gt;
&lt;li&gt;Sous-menu 5&lt;/li&gt;
&lt;li&gt;Sous-menu 6&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Menu avec une petite animation JQuery. Malheureusement ce menu ne fonctionne pas correctement sous IE6 et IE7 &#224; cause du bug des z-index. Vous pouvez le faire, mais le carr&#233; de sous-menu ne pourra appara&#238;tre en dessous des liens du menu....ce qui est moins beau.&lt;/p&gt;
&lt;h3&gt;Code&lt;/h3&gt;
&lt;h4&gt;HTML&lt;/h4&gt;
&lt;script class='brush: html' type='syntaxhighlighter'&gt;
&lt;![CDATA[
    &lt;div id=&quot;exemple-3&quot;&gt;
    	&lt;ul id=&quot;liste-menu&quot;&gt;
    		&lt;li id=&quot;menu-1&quot; &gt;&lt;a class=&quot;bouton-menu&quot; href=&quot;#&quot;&gt;Menu 1&lt;/a&gt;&lt;/li&gt;
    		&lt;li id=&quot;menu-2&quot;&gt;&lt;a class=&quot;bouton-menu&quot; href=&quot;#&quot;&gt;Menu 2&lt;/a&gt;&lt;/li&gt;
    		&lt;li id=&quot;menu-3&quot;&gt;&lt;a class=&quot;bouton-menu&quot; href=&quot;#&quot;&gt;Menu 3&lt;/a&gt;&lt;/li&gt;
    	&lt;/ul&gt;
    	&lt;div id=&quot;sous-menu-1&quot; class=&quot;sous-menu&quot;&gt;
    		&lt;ul class=&quot;sous-menu-liste&quot;&gt;
    			&lt;li&gt;Sous-menu 1&lt;/li&gt;
    			&lt;li&gt;Sous-menu 2&lt;/li&gt;
    			&lt;li&gt;Sous-menu 3&lt;/li&gt;
    			&lt;li&gt;Sous-menu 4&lt;/li&gt;
    			&lt;li&gt;Sous-menu 5&lt;/li&gt;
    			&lt;li&gt;Sous-menu 6&lt;/li&gt;
    		&lt;/ul&gt;
    	&lt;/div&gt;
    	&lt;div id=&quot;sous-menu-2&quot; class=&quot;sous-menu&quot;&gt;
    		&lt;ul class=&quot;sous-menu-liste&quot;&gt;
    			&lt;li&gt;Sous-menu 1&lt;/li&gt;
    			&lt;li&gt;Sous-menu 2&lt;/li&gt;
    			&lt;li&gt;Sous-menu 3&lt;/li&gt;
    			&lt;li&gt;Sous-menu 4&lt;/li&gt;
    			&lt;li&gt;Sous-menu 5&lt;/li&gt;
    			&lt;li&gt;Sous-menu 6&lt;/li&gt;
    		&lt;/ul&gt;
    	&lt;/div&gt;
    	&lt;div id=&quot;sous-menu-3&quot; class=&quot;sous-menu&quot;&gt;
    		&lt;ul class=&quot;sous-menu-liste&quot;&gt;
    			&lt;li&gt;Sous-menu 1&lt;/li&gt;
    			&lt;li&gt;Sous-menu 2&lt;/li&gt;
    			&lt;li&gt;Sous-menu 3&lt;/li&gt;
    			&lt;li&gt;Sous-menu 4&lt;/li&gt;
    			&lt;li&gt;Sous-menu 5&lt;/li&gt;
    			&lt;li&gt;Sous-menu 6&lt;/li&gt;
    		&lt;/ul&gt;
    	&lt;/div&gt;
    &lt;/div&gt;
]]&gt;
&lt;/script&gt;
&lt;h4&gt;CSS&lt;/h4&gt;
&lt;script class='brush: css' type='syntaxhighlighter'&gt;
&lt;![CDATA[
    #exemple3 .bouton-menu{
    	background-color: red;
    }
    
    #exemple3 #liste-menu {
    	margin-top: 10px;
    	float:left;
    }
    
    #exemple3  #liste-menu li{
    	position:relative;
    }
    
    #exemple3 .sous-menu li{
    	list-style: none;
    }
    
    #exemple3 .sous-menu{
    	width: 0px;
    	height: 0px;
    	display:none;
    	background-color: red;
    	position:absolute;
    	overflow:hidden;
    }
    
    #exemple3 #sous-menu-1{
    	z-index: 1;
    	left:5px;
    }
    
    #exemple3 #sous-menu-2{	
    	z-index: 1;
    	left:75px;
    }
    
    #exemple3 #sous-menu-3{	
    	z-index: 1;
    	left:135px;
    }
    
    #exemple3 .sous-menu-liste{
    	padding: 40px;
    	list-style: none;
    	width: 200px;
    	height: 250px;
    }
    
    #exemple3 .sous-menu-1 ul{
    	margin: 40px;
    }
    
    #exemple3 #menu{
    	width: 500px;
    }
    
    #exemple3 #liste-menu{
    	padding: 10px;
    	display:block;
    	background-color: red;
    }
    
    #exemple3 #liste-menu li{
    	display: inline;
    	list-style-type: none;
    	margin-left: 10px;
    }
    
    #exemple3 #liste-menu li a{
    	text-decoration: none;
    	color: white;
    }
]]&gt;
&lt;/script&gt;
&lt;h4&gt;JavaScript&lt;/h4&gt;
&lt;script class='brush: javascript' type='syntaxhighlighter'&gt;
&lt;![CDATA[
    $().ready(function() {
    	$(&quot;.bouton-menu&quot;).click(function()
    	{
    		var id = $(this).parent().attr('id');
    		if($(&quot;#sous-&quot; + id).width() &gt; 0)
    		{
    		  $(&quot;#sous-&quot; + id).animate({ 
    		    width: 0,
    			height: 0
    		  }, 800, function() {
    			$(&quot;#&quot; + id).css(&quot;z-index&quot;,&quot;1&quot;);
    		  });
    		}
    		else
    		{
    		  $(this).parent().css(&quot;z-index&quot;,&quot;2&quot;);
    		  $(&quot;#sous-&quot; + id).animate({ 
    		    width: 200,
    			height: 250
    		  }, 800 );
    		}
    	});
    });
]]&gt;
&lt;/script&gt;
</content>
  </entry>
  <entry>
    <id>tag:webcolors.fr,2010-02-05:/blog/2010/2/5/jquery-live-des-evenements-pour-vos-elements-crees-dynamiquement/</id>
    <title type="html">jQuery Live: Des &#233;v&#233;nements pour vos &#233;l&#233;ments cr&#233;&#233;s dynamiquement</title>
    <published>2010-02-04T23:00:00Z</published>
    <updated>2010-02-17T09:58:43Z</updated>
    <link rel="alternate" href="http://webcolors.fr/blog/2010/2/5/jquery-live-des-evenements-pour-vos-elements-crees-dynamiquement/"/>
    <content type="html">&lt;p&gt;Dans mes projets, il m'est souvent arriv&#233; d'ajouter dynamiquement avec jQuery des &#233;l&#233;ments &#224; une page web, auxquels je souhaitais dynamiquement assigner des &#233;v&#233;nements JavaScript. Une des solutions consisterait &#224; appeler &#224; chaque fois la m&#233;thode &lt;em&gt;bind()&lt;/em&gt; sur les objets cr&#233;&#233;s. Un des inconv&#233;nients de cette technique, c'est qu'il est alors n&#233;cessaire de s&#233;lectionner uniquement l'&#233;l&#233;ment nouvellement cr&#233;&#233; - ou l'on risque d'ajouter plusieurs fois le m&#234;me gestionnaire d'&#233;v&#233;nement &#224; tous les &#233;l&#233;ments similaires de la page ! Cet article pr&#233;sente une solution plus astucieuse.&lt;/p&gt;
&lt;p&gt;La librairie jQuery propose une m&#233;thode extr&#234;mement utile, la m&#233;thode &lt;em&gt;live()&lt;/em&gt;. Elle permet de d&#233;finir un gestionnaire d'&#233;v&#233;nement valable pour &lt;strong&gt;tous&lt;/strong&gt; les &#233;l&#233;ments correspondant &#224; un s&#233;lecteur donn&#233;, &lt;em&gt;y compris ceux qui n'existent pas encore&lt;/em&gt; au moment o&#249; la m&#233;thode &lt;em&gt;live()&lt;/em&gt; est appel&#233;e.&lt;/p&gt;
&lt;h2&gt;Exemple&lt;/h2&gt;
&lt;p&gt;Nous int&#233;grons &#224; notre page le code HTML suivant:&lt;/p&gt;
&lt;script class='brush: html' type='syntaxhighlighter'&gt;
&lt;![CDATA[
    &lt;div id=&quot;jquery-example&quot;&gt;
    	&lt;p&gt;Ajouter un &#233;l&#233;ment&lt;/p&gt;
    &lt;/div&gt;
]]&gt;
&lt;/script&gt;
&lt;p&gt;Et ajoutons un &#233;v&#233;nement &lt;em&gt;live&lt;/em&gt; &#224; chacun des paragraphes contenus dans la div &lt;em&gt;#jquery-example&lt;/em&gt;:&lt;/p&gt;
&lt;script class='brush: javascript' type='syntaxhighlighter'&gt;
&lt;![CDATA[
    $(function() {
    	$('#jquery-example').live('click', function() {
    		$('#jquery-example').append('&lt;p&gt; Ajouter un &#233;l&#233;ment&lt;/p&gt;');
    	})
    })
]]&gt;
&lt;/script&gt;
&lt;p&gt;Et c'est tout. Chaque clic sur un paragraphe ajoutera un nouveau paragraphe &#224; la div &lt;em&gt;#jquery-example&lt;/em&gt;, et l'on pourra cliquer sur ces nouveaux paragraphes pour produire le m&#234;me r&#233;sultat, sans devoir faire quoi que ce soit de plus.&lt;/p&gt;
&lt;p&gt;&#192; bient&#244;t.&lt;/p&gt;
&lt;h2&gt;D&#233;monstration&lt;/h2&gt;
&lt;script type='text/javascript'&gt;
  //&lt;![CDATA[
    $(function() {
    	$('#jquery-example').live('click', function() {
    		$('#jquery-example').append('&lt;p style=&quot;background-color: yellow; margin-bottom: 3px&quot;&gt; Ajouter un &#233;l&#233;ment&lt;/p&gt;');
    	})
    })
  //]]&gt;
&lt;/script&gt;
&lt;div id='jquery-example'&gt;
&lt;p style='background-color: yellow; margin-bottom: 3px'&gt;Ajouter un &#233;l&#233;ment&lt;/p&gt;
&lt;/div&gt;
</content>
  </entry>
  <entry>
    <id>tag:webcolors.fr,2010-01-31:/blog/2010/1/31/top-5-techniques-css-janvier-2010/</id>
    <title type="html">Top 5 - Techniques CSS - Janvier 2010</title>
    <published>2010-01-30T23:00:00Z</published>
    <updated>2010-03-25T15:39:05Z</updated>
    <link rel="alternate" href="http://webcolors.fr/blog/2010/1/31/top-5-techniques-css-janvier-2010/"/>
    <content type="html">&lt;p&gt;WebColors se propose de partager chaque trimestre des techniques CSS utiles, afin d'aider les webmasters dans leur cr&#233;ation de site internet. Ces astuces sont compatibles avec tous les principaux navigateurs y compris l'indomptable Internet Explorer 6.&lt;/p&gt;
&lt;h2&gt;Num&#233;ro 5 : Transformer une liste en menu horizontal&lt;/h2&gt;
&lt;p&gt;Pour cr&#233;er un menu en HTML, le meilleur choix reste la balise liste. Celle-ci rend le code plus clair, et s&#233;mantiquement plus correct (c'est &#224; dire que ce qui est conceptuellement une liste est repr&#233;sent&#233; par l'&#233;l&#233;ment appropri&#233;).&lt;/p&gt;
&lt;h3&gt;Exemple&lt;/h3&gt;
&lt;h4&gt;HTML&lt;/h4&gt;
&lt;script class='brush: html' type='syntaxhighlighter'&gt;
&lt;![CDATA[
    &lt;ul id=&quot;menu&quot;&gt;
    	&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Accueil&lt;/a&gt;&lt;/li&gt;
    	&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Prestations&lt;/a&gt;&lt;/li&gt;
    	&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Tarifs&lt;/a&gt;&lt;/li&gt;
    	&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Contact&lt;/a&gt;&lt;/li&gt;
    	&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Mentions l&#233;gales&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
]]&gt;
&lt;/script&gt;
&lt;h4&gt;CSS&lt;/h4&gt;
&lt;script class='brush: css' type='syntaxhighlighter'&gt;
&lt;![CDATA[
    #menu li{
    	display: inline;
    	list-style-type: none;
    	padding-right: 20px;
    }
]]&gt;
&lt;/script&gt;
&lt;p&gt;Nous utilisons la propri&#233;t&#233; &lt;em&gt;inline&lt;/em&gt; pour rendre la liste horizontale, la propri&#233;t&#233; &lt;em&gt;list-style-type: none&lt;/em&gt; pour masquer les puces et attribuons aux &#233;l&#233;ments un peu de &lt;em&gt;padding&lt;/em&gt; pour les s&#233;parer les uns des autres.&lt;/p&gt;
&lt;h3&gt;Num&#233;ro 4 : Dimensions min-height/min-width pour Internet Explorer 6&lt;/h3&gt;
&lt;h4&gt;Probl&#233;matique&lt;/h4&gt;
&lt;p&gt;Notre ami Internet Explorer 6 n'interpr&#233;tant pas forc&#233;ment le CSS comme on s'y attendrait, il est souvent n&#233;cessaire d'utiliser des techniques peu avouable poru arriver &#224; ses fins. C'est notamment le cas pour sp&#233;cifier la dimension minimale d'un objet.&lt;/p&gt;
&lt;script class='brush: css' type='syntaxhighlighter'&gt;
&lt;![CDATA[
    .objet {
    	min-height: 400px;
    	height: auto !important;
    	height: 400px;
    }
]]&gt;
&lt;/script&gt;
&lt;h4&gt;Pourquoi cette technique fonctionne-t-elle?&lt;/h4&gt;
&lt;p&gt;Contrairement aux autres navigateurs, Internet Explorer 6 ignore l'instruction &lt;em&gt;!important&lt;/em&gt;, ainsi que les propri&#233;t&#233;s &lt;em&gt;min-height&lt;/em&gt; et &lt;em&gt;min-width&lt;/em&gt;. La seule ligne qu'il prendra en compte dans notre CSS sera donc :&lt;/p&gt;
&lt;script class='brush: css' type='syntaxhighlighter'&gt;
&lt;![CDATA[
    height: 400px;
]]&gt;
&lt;/script&gt;
&lt;p&gt;Seulement, il l'interpr&#232;te comme un &lt;em&gt;min-height&lt;/em&gt;, soit le comportement d&#233;sir&#233;. La propri&#233;t&#233; &lt;em&gt;!important&lt;/em&gt; emp&#234;che les autres navigateurs de consid&#233;rer la valeur &lt;em&gt;&quot;height: 400px&quot;&lt;/em&gt; puisque celle-ci ne peut &#234;tre &#233;cras&#233;e. Et voil&#224;!&lt;/p&gt;
&lt;h3&gt;Num&#233;ro 3 : Une position absolute &#224; l'int&#233;rieur d'un objet&lt;/h3&gt;
&lt;p&gt;Il est parfois utile de positionner un objet par rapport &#224; son parent, qui peut &#233;ventuellement &#234;tre un flottant. La propri&#233;t&#233; position: absolute permet de placer un objet par rapport &#224; son plus proche parent positionn&#233;. Une technique tr&#232;s facile et utile consiste donc &#224; attribuer la valeur position: relative au parent de l'objet que l'on souhaite positionner afin de pouvoir le placer n'importe o&#249; par rapport &#224; celui-ci.&lt;/p&gt;
&lt;h4&gt;Exemple&lt;/h4&gt;
&lt;p&gt;Dans notre exemple, nous mettrons en sc&#232;ne trois objets. Deux carr&#233;s, en flottant, seront plac&#233;s l'un &#224; c&#244;t&#233; de l'autre (en noir et en gris). Un troisi&#232;me (en rouge) devrait se placer en absolute &#224; &lt;em&gt;l'int&#233;rieur&lt;/em&gt; du carr&#233; noir, positionn&#233; par rapport &#224; celui-ci. Les dimensions et les couleurs sont seulement utilis&#233;es pour appuyer l'exemple.&lt;/p&gt;
&lt;h5&gt;HTML&lt;/h5&gt;
&lt;script class='brush: html' type='syntaxhighlighter'&gt;
&lt;![CDATA[
    &lt;div id=&quot;object-gris&quot;&gt;
    	&amp;nbsp;
    &lt;/div&gt;
    &lt;div id=&quot;object-noir&quot;&gt;
    	&lt;div id=&quot;object-rouge&quot;&gt;
    		&amp;nbsp;
    	&lt;/div&gt;
    &lt;/div&gt;
]]&gt;
&lt;/script&gt;
&lt;h5&gt;CSS&lt;/h5&gt;
&lt;script class='brush: css' type='syntaxhighlighter'&gt;
&lt;![CDATA[
    #object-gris
    {
    	background-color: gray;
    	height: 100px;
    	width: 100px;
    	float:left;
    }
    
    #objet-noir {
    	position: relative;
    	float:left;
    	background-color: black;
    	height: 100px;
    	width: 100px;
    }
    
    #objet-rouge {
    	position: absolute;
    	top: 20px;
    	left: 15px;
    	background-color: red;
    	height: 10px;
    	width: 10px;
    }
]]&gt;
&lt;/script&gt;
&lt;h4&gt;R&#233;sultat&lt;/h4&gt;
&lt;div class='resultat'&gt;
&lt;div id='object-gris' style='background-color: gray; height: 100px; width: 100px; float:left;'&gt;
&amp;nbsp;
&lt;/div&gt;
&lt;div id='object-noir' style='position: relative; float:left; background-color: black; height: 100px; width: 100px;'&gt;
&lt;div id='object-rouge' style='position: absolute; top: 20px; left: 15px; background-color: red; height: 10px; width: 10px;'&gt;
&amp;nbsp;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;Num&#233;ro 2 : Overflow: auto en simulation pour un clear:both&lt;/h3&gt;
&lt;p&gt;Votre design est complexe et compos&#233; de plusieurs objets flottants, notamment d'une barre verticale sur le c&#244;t&#233; de l'&#233;cran, appel&#233;e &quot;sidebar&quot; (comme sur le site de WebColors). L'utilisation de l'instruction clear: both est de ce fait prohib&#233;e au sein du contenu, car l'&#233;l&#233;ment vis&#233; se retrouverait tout en bas de la page, en dessous de votre &quot;sidebar&quot;. Comment, donc, s'assurer que les objets floats ne d&#233;bordent pas de l'objet qui les contient ?&lt;/p&gt;
&lt;script class='brush: css' type='syntaxhighlighter'&gt;
&lt;![CDATA[
    #object
    {
    	overflow: auto;
    	width: 100%;
    }
]]&gt;
&lt;/script&gt;
&lt;h3&gt;Num&#233;ro 1 : Sticky footer&lt;/h3&gt;
&lt;p&gt;Comment faire un design classique comportant un en-t&#234;te, un corps et un pied-de-page tout en &#233;vitant que, en pr&#233;sence d'un contenu modeste, le pied-de-page ne se retrouve... au milieu de la page ?&lt;/p&gt;
&lt;p&gt;La solution: la technique &lt;b&gt;Sticky Footer&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;La technique est simple : il suffit que notre div pied-de-page soit pr&#233;c&#233;d&#233;e d'une autre contenant l'en-t&#234;te et le corps de page, ainsi qu'une autre div, que nous appellerons &quot;push&quot;, qui poussera notre pied-de-page lorsque n&#233;cessaire.&lt;/p&gt;
&lt;p&gt;Le CSS ressemble &#224; ceci :&lt;/p&gt;
&lt;script class='brush: css' type='syntaxhighlighter'&gt;
&lt;![CDATA[
    * {
    	margin: 0;
    }
    
    html, body {
    	height: 100%;
    }
    
    .contenu {
    	min-height: 100%;
    	height: auto !important;
    	height: 100%;
    	margin: 0 auto -50px; 
    }
    
    .pied_de_page, .push {
    	height: 50px;
    }
]]&gt;
&lt;/script&gt;
</content>
  </entry>
  <entry>
    <id>tag:webcolors.fr,2010-01-12:/blog/2010/1/12/tutoriel-nanoc-un-compilateur-de-sites-internet-statiques-1-3/</id>
    <title type="html">Tutoriel Nanoc : Un compilateur de sites internet statiques (1/3)</title>
    <published>2010-01-11T23:00:00Z</published>
    <updated>2010-01-25T12:48:28Z</updated>
    <link rel="alternate" href="http://webcolors.fr/blog/2010/1/12/tutoriel-nanoc-un-compilateur-de-sites-internet-statiques-1-3/"/>
    <content type="html">&lt;h2&gt;1 Introduction&lt;/h2&gt;
&lt;p&gt;Il est vrai que les sites statiques se font rares. Pas la moindre page web, semble-t-il, dont le contenu ne soit discr&#232;tement souffl&#233; par une base de donn&#233;es, et l'on aura beau jeu de d&#233;clarer leur temps achev&#233;. C'est aller un peu vite en besogne, au regard du double co&#251;t que pr&#233;sentent les sites dynamiques:&lt;/p&gt;
&lt;ul class='enum'&gt;
&lt;li&gt;En ressources, d'abord, qu'un syst&#232;me de cache efficace peut n&#233;anmoins all&#233;ger, au prix d'une plus grande complexit&#233;.&lt;/li&gt;
&lt;li&gt;En s&#233;curit&#233;, tout code ex&#233;cut&#233; dynamiquement pr&#234;tant le flanc aux attaques, dont le risque impose d'infinies pr&#233;cautions au programmeur et &#224; l'administrateur syst&#232;me.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;C'est, pour bon nombre de sites, un mal n&#233;cessaire. Mais pas pour tous.&lt;/p&gt;
&lt;p&gt;En effet, le caract&#232;re &lt;strong&gt;dynamique&lt;/strong&gt; d'un site n'a parfois pour seule raison d'&#234;tre que de simplifier la vie du webmaster. C'est notamment le cas lorsque le contenu est essentiellement &lt;strong&gt;statique&lt;/strong&gt;, &#233;dit&#233; via une interface en ligne, et qu'aucune interaction n'est pr&#233;vue avec les visiteurs du site, comme un syst&#232;me de commentaires ou un forum.&lt;/p&gt;
&lt;p&gt;Il est alors possible de g&#233;n&#233;rer ce contenu sur l'ordinateur du webmaster au moyen d'un compilateur de site tel que Nanoc, sans aucun travail de la part du serveur, contournant ainsi les deux inconv&#233;nients mentionn&#233;s plus haut. Nous verrons d'ailleurs que la flexibilit&#233; d'un tel outil justifierait sans eux son utilisation.&lt;/p&gt;
&lt;p&gt;Nanoc &#233;tant un outil en ligne de commande &#233;crit et extensible en Ruby, cet article pr&#233;suppose une certaine familiarit&#233; avec:&lt;/p&gt;
&lt;ul class='enum'&gt;
&lt;li&gt;Le langage Ruby.&lt;/li&gt;
&lt;li&gt;L'utilisation de la console sous Linux / Mac OS X.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;2 Installation de Nanoc&lt;/h2&gt;
&lt;p&gt;Comme pour beaucoup de logiciels et librairies Ruby, la m&#233;thode d'installation la plus simple reste le gestionnaire de paquet RubyGems:&lt;/p&gt;
&lt;script class='brush: bash' type='syntaxhighlighter'&gt;
&lt;![CDATA[
    # (sudo) gem install nanoc3
]]&gt;
&lt;/script&gt;
&lt;p&gt;La commande suivante permettra n&#233;anmoins aux jedis, aux inconscients et aux curieux d'en r&#233;cup&#233;rer la derni&#232;re version depuis le d&#233;p&#244;t officiel:&lt;/p&gt;
&lt;script class='brush: bash' type='syntaxhighlighter'&gt;
&lt;![CDATA[
    # git clone git://github.com/ddfreyne/nanoc.git
]]&gt;
&lt;/script&gt;
&lt;p&gt;Si l'une ou l'autre de ces m&#233;thodes &#233;choue, c'est sans doute que le logiciel n&#233;cessaire (RubyGems ou git) vous fait d&#233;faut.&lt;/p&gt;
&lt;h2&gt;3 Nanoc: Concepts et d&#233;finitions&lt;/h2&gt;
&lt;h3&gt;3.1 Structure d'un site Nanoc&lt;/h3&gt;
&lt;p&gt;Un site internet Nanoc est repr&#233;sent&#233; par un r&#233;pertoire dot&#233; d'une certaine structure. La commande &lt;strong&gt;nanoc create_site&lt;/strong&gt; permet de cr&#233;er le squelette d'un projet:&lt;/p&gt;
&lt;script class='brush: bash' type='syntaxhighlighter'&gt;
&lt;![CDATA[
    # nanoc3 create_site tutoriel_nanoc
    			create  config.yaml
    			create  Rakefile
    			create  Rules
    			create  content/index.yaml
    			create  content/index.html
    			create  layouts/default.yaml
    			create  layouts/default.html
    Created a blank nanoc site at 'tutoriel_nanoc'. Enjoy!
]]&gt;
&lt;/script&gt;
&lt;p&gt;
Nous reviendrons en d&#233;tail sur la nature et la fonction de chacun de ces fichiers et r&#233;pertoires. Comme je vous sais impatient, en voici un survol:
&lt;/p&gt;
&lt;ul class='enum'&gt;
&lt;li&gt;&lt;strong&gt;config.yaml&lt;/strong&gt;: d&#233;finit les &lt;strong&gt;sources de donn&#233;es&lt;/strong&gt; du site (syst&#232;me de fichiers, delicious, twitter), les emplacements (comme le r&#233;pertoire de sortie), l'adresse du site (utilis&#233;e par certains plugins), etc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rakefile&lt;/strong&gt;: permet d'automatiser certaines t&#226;ches avec 'rake', &#233;quivalent Ruby de 'make'. Nous ne nous en occuperons pas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rules&lt;/strong&gt; instruit Nanoc sur:
&lt;ul&gt;
&lt;li&gt;la m&#233;thode de compilation &#224; employer pour chaque &#233;l&#233;ment (compilation).&lt;/li&gt;
&lt;li&gt;le fichier de destination (routage).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;content/&lt;/strong&gt;: les &#233;l&#233;ments &#224; compiler (ou si vous pr&#233;f&#233;rez, le &quot;code source&quot;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;layouts/&lt;/strong&gt;: les layouts disponibles.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&#192; ce stade, il est essentiel de d&#233;finir la notion cl&#233; de Nanoc, celle d'&lt;strong&gt;&#233;l&#233;ment&lt;/strong&gt; (ou en anglais, &lt;strong&gt;item&lt;/strong&gt;).&lt;/p&gt;
&lt;h3&gt;3.2 La notion d'&#233;l&#233;ment&lt;/h3&gt;
&lt;p&gt;Dans Nanoc, l'objet central n'est pas la page, mais l'&#233;l&#233;ment. Un &#233;l&#233;ment est conceptuellement un ensemble de donn&#233;es susceptibles de poss&#233;der plusieurs repr&#233;sentations. Dans un blog par exemple, la liste des articles peut &#234;tre vue comme un &#233;l&#233;ment, car elle est souvent propos&#233;e simultan&#233;ment:&lt;/p&gt;
&lt;ul class='enum'&gt;
&lt;li&gt;En &lt;strong&gt;HTML&lt;/strong&gt;, pour visualisation dans un navigateur Web.&lt;/li&gt;
&lt;li&gt;En &lt;strong&gt;XML&lt;/strong&gt;, au format Atom ou RSS, pour consultation dans un agr&#233;gateur.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ce qui signale &#224; Nanoc l'existence d'un &#233;l&#233;ment, c'est la pr&#233;sence dans le r&#233;pertoire &lt;strong&gt;content/&lt;/strong&gt; d'un fichier de m&#233;tadonn&#233;es, ou attributs, au format &lt;a href=&quot;http://fr.wikipedia.org/wiki/YAML&quot; title=&quot;YAML&quot;&gt;YAML&lt;/a&gt;. Ce fichier peut tr&#232;s bien &#234;tre vide mais je vous conseille d'y d&#233;finir toutes sortes de donn&#233;es pouvant servir &#224; g&#233;n&#233;rer le r&#233;sultat final, comme le titre, l'auteur, la liste des mots-cl&#233;s, etc.&lt;/p&gt;
&lt;p&gt;Chaque &#233;l&#233;ment poss&#232;de un &lt;strong&gt;identifiant&lt;/strong&gt; (identifier) unique qui le caract&#233;rise lors du processus de compilation. L'identifiant d'un &#233;l&#233;ment d&#233;coule naturellement de l'emplacement du fichier YAML correspondant dans le r&#233;pertoire &lt;strong&gt;content/&lt;/strong&gt;. Donnons quelques exemples de cette transformation desquels la r&#232;gle g&#233;n&#233;rale appara&#238;tra clairement:&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;Emplacement&lt;/th&gt;
&lt;th&gt;Identifiant&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;content/index.yaml&lt;/td&gt;
&lt;td&gt;/&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;content/contact.yaml&lt;/td&gt;
&lt;td&gt;/contact/&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;content/notre-entreprise.yaml&lt;/td&gt;
&lt;td&gt;/notre-entreprise/&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;content/blog.yaml&lt;/td&gt;
&lt;td&gt;/blog/&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;content/blog/2005.yaml&lt;/td&gt;
&lt;td&gt;/blog/2005/&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;Pour &#233;viter toute confusion, remarquons tout de m&#234;me que:&lt;/p&gt;
&lt;ul class='enum'&gt;
&lt;li&gt;Le fichier &lt;strong&gt;content/index.yaml&lt;/strong&gt; d&#233;finit l'&#233;l&#233;ment &lt;strong&gt;/&lt;/strong&gt;, et non l'&#233;l&#233;ment &lt;strong&gt;/index/&lt;/strong&gt;, ce qui constitue l'unique exception &#224; la r&#232;gle g&#233;n&#233;rale.&lt;/li&gt;
&lt;li&gt;L'identifiant se termine toujours par &lt;strong&gt;/&lt;/strong&gt;, comme un chemin de r&#233;pertoire.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Les diverses repr&#233;sentations d'un &#233;l&#233;ment, enfin, sont figur&#233;es par autant de fichiers de m&#234;me nom et de m&#234;me emplacement que la liste des attributs, except&#233;e l'extension. Aussi, et pour reprendre notre exemple initial du blog, &#224; l'&#233;l&#233;ment &lt;em&gt;/blog/&lt;/em&gt; d&#233;fini par le fichier &lt;em&gt;content/blog.yaml&lt;/em&gt; pourront &#234;tre attach&#233;es les repr&#233;sentations &lt;em&gt;content/blog.html&lt;/em&gt; et &lt;em&gt;content/blog.xml&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Notons enfin, comme nous le verrons dans une prochaine partie, que l'identifiant d'un &#233;l&#233;ment n'&#233;quivaut nullement &#224; son emplacement final, bien qu'il s'agisse du comportement par d&#233;faut. Le &lt;strong&gt;routage&lt;/strong&gt;, que nous &#233;tudierons alors, offre &#224; ce sujet une totale libert&#233;.&lt;/p&gt;
&lt;h3&gt;2.3 Layouts&lt;/h3&gt;
&lt;p&gt;Les pages d'un m&#234;me site poss&#232;dent presque toujours une structure commune. La notion de layout, qui n'est pas propre &#224; Nanoc, permet de factoriser cette structure, &#233;vitant ainsi la redondance et facilitant la propagation des changements. Nous &#233;tudierons les layouts dans la prochaine partie.&lt;/p&gt;
&lt;h3&gt;2.4 Compilation et auto-compilation&lt;/h3&gt;
&lt;p&gt;Avant de mettre en ligne un site internet Nanoc, il convient de le compiler:&lt;/p&gt;
&lt;script class='brush: bash' type='syntaxhighlighter'&gt;
&lt;![CDATA[
    tutoriel_nanoc# nanoc3 co
    Loading site data...
    Compiling site...
    			create  [0.01s]  output/index.html
    Site compiled in 0.02s.
]]&gt;
&lt;/script&gt;
&lt;p&gt;Le r&#233;pertoire &lt;strong&gt;output/&lt;/strong&gt; est alors cr&#233;&#233; ou mis &#224; jour automatiquement.&lt;/p&gt;
&lt;p&gt;En phase de d&#233;veloppement, plut&#244;t que de recompiler en permanence votre projet pour visualiser les changements, vous souhaiterez sans doute utiliser l'&lt;strong&gt;auto-compilateur&lt;/strong&gt;. Il s'agit en fait d'un serveur HTTP charg&#233; de cr&#233;er &#224; la vol&#233;e les fichiers demand&#233;s. La commande suivante permet d'en d&#233;marrer l'ex&#233;cution:&lt;/p&gt;
&lt;script class='brush: bash' type='syntaxhighlighter'&gt;
&lt;![CDATA[
    tutoriel_nanoc# nanoc3 aco
    [2010-01-11 17:26:28] INFO  WEBrick 1.3.1
    [2010-01-11 17:26:28] INFO  ruby 1.8.7 (2009-06-12) [i686-darwin10]
    [2010-01-11 17:26:58] INFO  WEBrick::HTTPServer#start: pid=262 port=3000
    ...
]]&gt;
&lt;/script&gt;
&lt;p&gt;Pour voir votre site internet, il suffit alors de visiter la page: &lt;a href=&quot;http://localhost:3000/&quot;&gt;http://localhost:3000/&lt;/a&gt;. Enthousiasmant, non ?&lt;/p&gt;
&lt;p&gt;L'auto-compilateur &#233;coute par d&#233;faut sur le port TCP 3000, mais il est toujours possible de lui en assigner un autre:&lt;/p&gt;
&lt;script class='brush: bash' type='syntaxhighlighter'&gt;
&lt;![CDATA[
    tutoriel_nanoc# nanoc3 aco -p 8080
]]&gt;
&lt;/script&gt;
&lt;p&gt;Dans les prochaines parties de notre tutorial, nous supposerons que votre autocompilateur est en &#233;coute sur le port 3000.&lt;/p&gt;
&lt;p&gt;Un dernier conseil concernant l'auto-compilation: n'oubliez pas que les &#233;l&#233;ments ne sont cr&#233;&#233;s qu'en cas de n&#233;cessit&#233;: il est donc prudent, avant de publier votre site, de proc&#233;der &#224; une compilation manuelle, afin de ne rien oublier !&lt;/p&gt;
&lt;h2&gt;3 La prochaine fois...&lt;/h2&gt;
&lt;p&gt;Nous n'avons fait qu'effleurer la surface de Nanoc: vous br&#251;lez sans doute d'en d&#233;couvrir plus. Patience !&lt;/p&gt;
&lt;p&gt;Dans la deuxi&#232;me partie de ce tutoriel, nous manipulerons pages, &#233;l&#233;ments et layouts. Nous montrerons comment les m&#233;tadonn&#233;es et le plugin &lt;strong&gt;Nanoc3::Helpers::Capturing&lt;/strong&gt; permettent de cr&#233;er des layouts vraiment flexibles.&lt;/p&gt;
&lt;p&gt;Dans une troisi&#232;me partie, nous l&#232;verons le voile sur les r&#232;gles de routage et de compilation, nous pr&#233;senterons les filtres et explorerons un autre plugin bien utile: &lt;strong&gt;Nanoc3::Helpers::XMLSitemap&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Il sera alors temps de vous laisser faire vos armes par vous-m&#234;mes... et exp&#233;rimenter pour d&#233;couvrir toute la puissance de Nanoc.&lt;/p&gt;
</content>
  </entry>
</feed>
