<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>slDesign &#187; HTML / CSS</title>
	<atom:link href="http://sldesign.openwab.com/category/tutos/html-css/feed/" rel="self" type="application/rss+xml" />
	<link>http://sldesign.openwab.com</link>
	<description>Web, Dév &#38; More...</description>
	<lastBuildDate>Wed, 13 Oct 2010 10:09:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
		<item>
		<title>Tutoriel HTML 5 : R&#233;aliser une lecteur vid&#233;o personnalis&#233;</title>
		<link>http://sldesign.openwab.com/2010/09/14/tutoriel-html-5-raliser-une-lecteur-vido-personnalis/</link>
		<comments>http://sldesign.openwab.com/2010/09/14/tutoriel-html-5-raliser-une-lecteur-vido-personnalis/#comments</comments>
		<pubDate>Tue, 14 Sep 2010 11:43:19 +0000</pubDate>
		<dc:creator>Steve Leherpeux</dc:creator>
				<category><![CDATA[HTML / CSS]]></category>
		<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Vidéo]]></category>

		<guid isPermaLink="false">http://sldesign.openwab.com/2010/09/14/tutoriel-html-5-raliser-une-lecteur-vido-personnalis/</guid>
		<description><![CDATA[Depuis la sortie de HTML5 il est possible d&#8217;insérer et de manipuler de nombreux médias dans vos pages WEB, vous pouvez entre autre insérer un lecteur vidéo. C’est un réel plus pour les développeurs Web. Nous allons donc voir comment intégrer un lecteur vidéo et comment le personnaliser afin d’obtenir le même design quelque soit [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fsldesign.openwab.com%2F2010%2F09%2F14%2Ftutoriel-html-5-raliser-une-lecteur-vido-personnalis%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fsldesign.openwab.com%2F2010%2F09%2F14%2Ftutoriel-html-5-raliser-une-lecteur-vido-personnalis%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="lecteur-html5-splash-screen" border="0" alt="lecteur-html5-splash-screen" align="left" src="http://sldesign.openwab.com/wp-content/uploads/2010/09/lecteurhtml5splashscreen.jpg" width="276" height="219" /> Depuis la sortie de HTML5 il est possible d&#8217;insérer et de manipuler de nombreux médias dans vos pages WEB, vous pouvez entre autre insérer un lecteur vidéo. C’est un réel plus pour les développeurs Web.</p>
<p>Nous allons donc voir comment intégrer un lecteur vidéo et comment le personnaliser afin d’obtenir le même design quelque soit le navigateur.</p>
<p><strong>Information sur le document :</strong> </p>
<ul>
<li>Version : 0.1 </li>
<li>Date de publication : 14-09-2010 </li>
<li>Date de révision : NC </li>
</ul>
<p> <span id="more-950"></span><br />
<h2>Introduction</h2>
<p>Avant de commencer vous trouverez sur le site du &quot;W3C l&#8217;ensemble des informations portant sur la balise l&#8217;intégration de vidéo. Ces informations sont disponibles à l&#8217;adresse suivante : <a title="Site W3C - Spécification de la balise video [Ouverture dans une nouvelle fenêtre]" href="http://www.w3.org/TR/2008/WD-html5-20080610/video.html#video" target="_blank">http://www.w3.org/TR/2008/WD-html5-20080610/video.html#video</a> </p>
<p>Je tiens également à vous rappeler que l&#8217;intégration de vidéo via la balise &#8216;&lt;video&gt;&lt;/video&gt; n&#8217;est pas supporté par l&#8217;ensemble des navigateurs&#8230; et plus encore compliqué, les navigateurs ne supportent pas tous le même format de vidéo&#8230; </p>
<h3>Théorie&#8230;</h3>
<p>L&#8217;intégration de vidéo en HTML 5 se fait avec la balise &quot;&lt;video&gt;&quot;. Cette balise supporte différents attributs : </p>
<ul>
<li><strong>src :</strong>La source de la vidéo </li>
<li><strong>poster :</strong> La source d&#8217;une image qui sera affichée si le navigateur ne supporte pas la balise &quot;video&quot; </li>
<li><strong>autoplay :</strong>Démarrage automatique de la vidéo [Défaut = false] </li>
<li><strong>start :</strong> Début de la vidéo </li>
<li><strong>loopstart :</strong> Début de la lecture en boucle </li>
<li><strong>loopend :</strong> Fin de la lecture en boucle </li>
<li><strong>end :</strong> La vidéo est à la fin </li>
<li><strong>playcount :</strong> Nombre de fois à lire </li>
<li><strong>controls :</strong> Affiche ou non les contrôles </li>
<li><strong>width :</strong> Largeur du lecteur </li>
<li><strong>zq</strong> hauteur du lecteur </li>
</ul>
<p>Les attributs src, autoplay, start, loopstart, loopend, end, playcount, et sont des attributs commun à tous les éléments de type &quot;Médias&quot;. </p>
<h2>Les étapes</h2>
<h3>Etape 1 &#8211; Création du document de base</h3>
<p>Nous utiliserons ici une simple page Web : </p>
<pre class="brush:html">&lt;!DOCTYPE html&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;&gt;
&lt;title&gt;Mon lecteur Vidéo HTML5&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;!-- Contenu Ici --&gt;
&lt;/body&gt;
&lt;/html&gt;
		</pre>
<h3>Etape 2 &#8211; Intégration de la vidéo</h3>
<p>Nous allons intégrer une vidéo simple dans un premier temps. Saisissez le code ci-dessous dans votre page WEB : </p>
<pre class="brush:html;first-line:8">&lt;video width=&quot;854&quot; height=&quot;480&quot; src=&quot;http://mirror.bigbuckbunny.de/peach/bigbuckbunny_movies/big_buck_bunny_480p_stereo.ogg&quot;&gt;
&lt;/video&gt;
		</pre>
<p>Le résultat est le suivant : </p>
<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="1.1-base-lecteur" border="0" alt="1.1-base-lecteur" src="http://sldesign.openwab.com/wp-content/uploads/2010/09/1.1baselecteur.jpg" width="629" height="386" /> </p>
<p>Si vous cliquez avec le bouton droit de votre souris sur le lecteur, vous verrez apparaître un menu contextuel</p>
<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="1.2-firefox-contextuel-menu" border="0" alt="1.2-firefox-contextuel-menu" src="http://sldesign.openwab.com/wp-content/uploads/2010/09/1.2firefoxcontextuelmenu.jpg" width="398" height="299" /> </p>
<h3>Etape 3 &#8211; Etendre le lecteur</h3>
<p>Nous allons maintenant étendre notre lecteur avec les attributs de base.</p>
<pre class="brush:html;first-line:8">	&lt;video
	width=&quot;854&quot;
	height=&quot;480&quot;
	src=&quot;http://mirror.bigbuckbunny.de/peach/bigbuckbunny_movies/big_buck_bunny_480p_stereo.ogg&quot;
	autoplay
	poster=&quot;img/poster.jpg&quot;
	controls &gt;
    &lt;/video&gt;
	</pre>
<p>Nous avons ici simplement ajouter les contrôles et une image et activé l&#8217;autoplay</p>
<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="1.3-lecteur-avancé" border="0" alt="1.3-lecteur-avancé" src="http://sldesign.openwab.com/wp-content/uploads/2010/09/1.3lecteuravanc.jpg" width="641" height="401" /> </p>
<h2>Création d’un lecteur vidéo HTML personnalisé:</h2>
<p>Comme vous venez de le voir l&#8217;intégration du player est très simple mais limitée. En effet, le design de votre player dépend du navigateur et ce dernier n’est pas forcement adapté au design de votre site. Heureusement, nous allons pouvoir utiliser javascript ; en effet, les navigateurs sont gérés côté client donc, c&#8217;est votre navigateur qui intègre ce player. Nous allons donc pouvoir utiliser javascript pour agrémenter notre player.</p>
<p>&#160;</p>
<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Player par défaut des différents navigateurs" border="0" alt="Player par défaut des différents navigateurs" src="http://sldesign.openwab.com/wp-content/uploads/2010/09/videosplayerbrowsers.jpg" width="640" height="323" /> </p>
<p>Je vais dans cet article utiliser la bibliothèque jQuery que j&#8217;ai intégrée depuis Google Api. et j’ai également intégré la bibliothèque <a title="Site Web jQuery-ui [Nouvelle fenêtre]" href="http://jqueryui.com/" target="_blank">jQuery-ui</a>. Je vais également créer un Plugin <a title="Site Web jQuery [Nouvelle fenêtre]" href="http://jquery.com/" target="_blank">jQuery</a>. Le code ci-dessous vous montre l&#8217;initialisation jQuery ainsi que la liaison avec mon plugin.</p>
<p>J&#8217;ai également ajouté un dossier &quot;themes&quot; ainsi qu&#8217;un dossier &quot;themes/default/&quot; qui vont héberger nos fichiers de styles. Vous trouverez ci-dessous la structure de notre projet : </p>
<pre class="brush:html">&lt;!DOCTYPE html&gt;
&lt;head&gt;
	&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;&gt;
	&lt;title&gt;owPlayer - HTML 5 Web video Player&lt;/title&gt;
	&lt;link href=&quot;themes/default/jquery-ui.css&quot; type=&quot;text/css&quot; rel=&quot;stylesheet&quot;/&gt;
	&lt;link href=&quot;themes/default/style.css&quot; type=&quot;text/css&quot; rel=&quot;stylesheet&quot;/&gt;
	&lt;script type=&quot;text/javascript&quot; src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js&quot;&gt;&lt;/script&gt;
	&lt;script type=&quot;text/javascript&quot; src=&quot;jquery-ui.min.js&quot;&gt;&lt;/script&gt;
	&lt;script type=&quot;text/javascript&quot; src=&quot;owPlayer.js&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p class="info">Ce tutoriel n&#8217;a pas pour but de vous expliquer le développement d &#8216;un plugin jQuery. Malgré tout, j’ai essayé de commenter le plus précisément possible le code de cette extension. Si vous ne vous sentez pas à l&#8217;aise avec jQuery et le développement de plugin, voici quelques ressources :&#160; <br />- Tutoriel sur l’édition de plugin jQuery [<a title="Tutoriel Français sur la création de Plugin jQuery" href="http://www.lesintegristes.net/2008/01/14/jquery-codez-branche/" target="_blank">Lien</a>] </p>
<p>- Tutoriel en Anglais [<a title="Tutoriel sur la création de plugin jquery en anglais" href="http://www.sitepoint.com/blogs/2009/07/22/how-to-develop-a-jquery-plugin/" target="_blank">lien</a>] </p>
<p></p>
<p>&#160;<img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="1.4-structure-fichiers" border="0" alt="1.4-structure-fichiers" src="http://sldesign.openwab.com/wp-content/uploads/2010/09/1.4structurefichiers.jpg" width="182" height="166" /> </p>
<p>&#160;</p>
<h3>Théorie</h3>
<p>Avant de commencer, il est utile de comprendre le fonctionnement et les attributs d’un lecteur vidéo HTML 5. Le lecteur HTML dépend de l’interface “Media Element”. Vous trouverez l’ensemble des informations relative à cette interface à l’adresse suivante : <a title="Documentation HTML 5 - W3C - media-element" href="http://www.w3.org/TR/2010/WD-html5-20100624/video.html#media-element" target="_blank">http://www.w3.org/TR/2010/WD-html5-20100624/video.html#media-element</a></p>
<p>Lorsque vous initialisez l’élément ‘&lt;video&gt;’ vous avez accès à différents attributs. </p>
<p><strong>Les éléments</strong> </p>
<ul>
<li><strong>readyState&#160; :</strong> Status de la video (Prete ou pas) </li>
<li><strong>seeking :</strong> Retourne un intervalle de temps ; ceci permet de gérer un statut d’avancement </li>
<li><strong>currentTime :</strong> Retourne la position actuelle </li>
<li><strong>startTime :</strong> Retourne la position de départ </li>
<li><strong>duration :</strong> Durée de la vidéo </li>
<li><strong>paused : </strong>Status de la vidéo en pause </li>
<li><strong>defaultPlaybackRate :</strong> Vitesse de lecture par défaut </li>
<li><strong>playbackRate :</strong> Vitesse de lecture </li>
<li><strong>TimeRange played :</strong> Retourne la durée jouée &#8211; intervalle </li>
<li><strong>TimeRange seekable :</strong> Temps restant &#8211; intervalle </li>
<li><strong>ended :</strong> Retourne vrai si la fin de la vidéo est atteinte </li>
<li><strong>autoplay :</strong> Lecture automatique </li>
<li><strong>loop :</strong> Relire la video </li>
<li><strong>play :</strong> Jouer la vidéo </li>
<li><strong>pause : </strong>Mettre la vidéo en pause </li>
<li><strong>controls :</strong> Affiche les contrôles </li>
<li><strong>volume :</strong> Volume du player </li>
<li><strong>muted :</strong> Eteindre le son </li>
</ul>
<p>Comme vous le voyez, nous disposons de différents attributs que nous allons pouvoir utiliser pour réaliser notre player. Javascript et dans notre cas jQuery vont nous permettre d’accéder et de manipuler nos données.</p>
<h3>Etape par étape : </h3>
<h4>Etape 1 &#8211; Initialisation du plugin jQuery</h4>
<p>La première étape consiste à initialiser notre plugin jQuery. J&#8217;ai decidé d&#8217;appeler ce plugin owPlayer </p>
<p class="info">Penser utiliser un nom unique à votre plugin afin d&#8217;assurer la compatibilité avec d&#8217;autres plugin </p>
<p>Le code ci-dessous vous montre l&#8217;initialisation du plugin : </p>
<pre class="brush:javascript">(function($) {

	$.fn.owPlayer = function(uri, options) {

		// Initialisation des options par defaut
		var defaults = {};

		// On étend les options avec les valeurs par défaut
		var options = $.extend(defaults, options);

		this.each(function(){
			$owPlayer = $(this);

		});
	};
})(jQuery);</pre>
<p>Ce code nous permet simplement d&#8217;initialiser notre plugin. Pour le moment la variable &#8216;default&#8217; permettant de définir nos options par défaut est vide mais nous le compléterons ultérieurement. </p>
<h4>Etape 2 &#8211; Chargement des feuilles de style </h4>
<p>Notre extension va nous permettre de changer de thème en le spécifiant simplement dans les options ; nous devons donc charger les feuilles de style dynamiquement. </p>
<pre class="brush:javascript;first-line:22">//Chargement des éléments de style
var cssThemeFile = options.theme;
$('&lt;link href=&quot;themes/'+options.theme+'/style.css&quot; type=&quot;text/css&quot; rel=&quot;stylesheet&quot;/&gt;').appendTo('head');
$('&lt;link href=&quot;themes/'+options.theme+'/jquery-ui.css&quot; type=&quot;text/css&quot; rel=&quot;stylesheet&quot;/&gt;').appendTo('head');</pre>
<h4>Etape 3 &#8211; Construction du wrapper et des contrôles</h4>
<p>Cette étape consiste simplement à construire notre interface. Nous aurions pû réaliser cette étape directement dans notre page HTML mais j&#8217;ai opté pour une génération interne à mon plugin. </p>
<p>Le code ci-dessous nous permet de créer un conteneur principal : </p>
<pre class="brush:javascript;first-line:">//Création du conteneur principal
$owPlayerWrapper = '&lt;div class=&quot;owPlayerWrapper&quot;&gt;&lt;/div&gt;';
$owPlayer.wrap($owPlayerWrapper);
$('.owPlayerWrapper').width(options.width);</pre>
<p>Le code ci-dessous nous permet de réaliser notre conteneur qui accueillera nos contrôles: </p>
<pre class="brush:javascript;first-line:33">//Création du panel de contôles
$owPlayerControls = '';
$owPlayerControls += '&lt;div class=&quot;owPlayerControls ui-widget-header&quot;&gt;&lt;/div&gt;';
$owPlayer.after($owPlayerControls);</pre>
<p>Ce code permet d&#8217;insérer un conteneur juste derrière notre balise &quot;&lt;video&gt; </p>
<p>Reste à insérer nos contrôles (boutons et autres éléments) à l&#8217;intérieur de ce conteneur </p>
<pre class="brush:javascript;first-line:42">// Création des contrôles
var $owPlayerControls = '';
$owPlayerControls += '&lt;a class=&quot;owPlayerControl owPlayerBtPlay ui-icon ui-icon-play&quot; href=&quot;#&quot; title=&quot;Play/Pause&quot;&gt;Play / Pause&lt;/a&gt;';
$owPlayerControls += '&lt;div class=&quot;owPlayerControl owPlayerSeeker&quot;&gt;&lt;/div&gt;';
$owPlayerControls += '&lt;div class=&quot;owPlayerControl owPlayerTimer&quot;&gt;00:00&lt;/div&gt;';
$owPlayerControls += '&lt;div class=&quot;owPlayerSoundBox&quot;&gt;&lt;a class=&quot;owPlayerControl owPlayerBtSound ui-icon ui-icon-volume-on&quot; href=&quot;#&quot; title=&quot;Mute&quot;&gt;Mute / Unmute&lt;/a&gt;';
$owPlayerControls += '&lt;a class=&quot;owPlayerControl owPlayerBtSoundTrigger ui-icon ui-icon-signal&quot; href=&quot;#&quot; title=&quot;Volume&quot;&gt;Volume&lt;/a&gt;';
$owPlayerControls += '&lt;div class=&quot;owPlayerControl owPlayerSoundSlider&quot;&gt;&lt;/div&gt;&lt;/div&gt;';
$($owPlayerControls).appendTo('.owPlayerControlsContener');</pre>
<p>Voici la liste de ces contrôles et leurs rôles : </p>
<ul>
<li><strong>owPlayerBtPlay :</strong> Bouton lecture / pause </li>
<li><strong>owPlayerSeeker :</strong> Il s&#8217;agit de la barre d&#8217;avancement </li>
<li><strong>owPlayerTimer :</strong> Le timer &quot;00:00&quot; </li>
<li><strong>owPlayerSoundBox : </strong>Conteneur pour la gestion du son </li>
<li><strong>owPlayerBtSound : </strong>Son on/off </li>
<li><strong>owPlayerSoundTrigger : </strong>Bouton déco pour l&#8217;affichage du slider pour le son </li>
<li><strong>owPlayerSoundSlider : </strong>Slider pour le son </li>
</ul>
<h4>Etape 4 &#8211; Bouton Play / Pause</h4>
<p>Maintenant que nous venons de réaliser nos différents contrôles, il faut leur assigner des fonctions. </p>
<p>Commencons par le bouton &quot;owPlayerBtPlay&quot; ; ce bouton va nous permettre de jouer l&#8217;animation ou de la mettre sur pause. Nous l&#8217;avons vu plus haut, ce qui déclanche la video est l&#8217;action &quot;play&quot;. </p>
<pre class="brush:javascript;first-line:53">	/** Bt Play */
		$('.owPlayerBtPlay').click(function() {
			if ($owPlayer.attr('paused') == false) {
				$owPlayer[0].pause();
				$(this).removeClass('ui-icon-play').addClass('ui-icon-pause');
			} else {
				$owPlayer[0].play();
				$(this).removeClass('ui-icon-pause').addClass('ui-icon-play');
			}
		});</pre>
<p>Quelques informations : Ce code permet de vérifier si le lecteur est en pause ou non. Le cas échéant, si le lecteur est en pause, on déclanche la lecture. </p>
<h4>Etape 5 &#8211; Gestion du son</h4>
<p>Nous allons maintenant nous occuper du son, nous avons deux éléments importants : </p>
<ul>
<li>Le bouton On / Off </li>
<li>Le slider permettant de régler le volume </li>
</ul>
<p>Dans un premier temps, occupons nous du bouton permettant d&#8217;activer / désactiver le son : </p>
<pre class="brush:javascript;first-line:114">	/** Bouton pour le son */
		//@TODO Récupérer la valeur du son lors du Mute pour le récupérer lors de l'unmute
		$('.owPlayerBtSound').click(function(){
			if($owPlayer.attr('muted') == true){
				//Activation du son - le slider passe à 50
				$('.owPlayerSoundSlider').slider('value', '50');
				$(this).removeClass('ui-icon-volume-off').addClass('ui-icon-volume-on');
			}else{
				//Desactivation du son
				$owPlayer.attr('muted', true);
				$('.owPlayerSoundSlider').slider('value', '0');
				$(this).removeClass('ui-icon-volume-on').addClass('ui-icon-volume-off');
			}
		});</pre>
<p>Cette action permet d&#8217;eteindre ou d&#8217;activer le son à travers le slider que nous verrons par la suite. </p>
<p>Le slider nous permet de gérer le volume du son. Pour réaliser ce slider, j&#8217;utilise l&#8217;extension “<a title="Documentation jQuery-ui slider [Nouvelle fenêtre]" href="http://jqueryui.com/demos/slider/" target="_blank">jQuery-ui &quot;slider()</a>&quot; </p>
<pre class="brush:javascript;first-line:130">	/** Slider pour le son */
	//Cache le slider à l'initialisation
	$('.owPlayerSoundSlider').hide();

	//Action pour afficher le slider
	$('.owPlayerSoundBox').hover(function() {
		$('.owPlayerSoundSlider').show();
	}, function() {
		$('.owPlayerSoundSlider').hide();
	});

	//Action du slider
	$('.owPlayerSoundSlider').slider( {
		orientation : &quot;vertical&quot;,
		value:0.50,
		range:&quot;min&quot;,
		max:1,
		step:0.05,
		animate:true,
		slide : function(e, ui) {
			$owPlayer.attr('muted', false);
			video_volume = ui.value;
			$owPlayer.attr('volume', ui.value);
		}
	});</pre>
<p>Il s&#8217;agit ici simplement de lier notre slider à l&#8217;attribut &quot;volume&quot; du player. </p>
<h4>Etape 6 &#8211; Gestion du seeker</h4>
<p>Deux éléments encore. Le timer qui nous permet d&#8217;afficher le temps écoulé et le slider nous permettant de naviguer au sein même de la vidéo </p>
<p>Gestion du timer : Il s&#8217;agit ici de récupérer le temps et la position de lecture ; nous devons pour cela utiliser un &quot;écouteur&quot; </p>
<pre class="brush:javascript;first-line:">	//Durée totale de la vidéo
		var video_duration = $owPlayer.attr('duration');

		//Fonction de convertion pour le timer
		var gTimeFormat=function(seconds){
			var m=Math.floor(seconds/60)&lt;10?&quot;0&quot;+Math.floor(seconds/60):Math.floor(seconds/60);
			var s=Math.floor(seconds-(m*60))&lt;10?&quot;0&quot;+Math.floor(seconds-(m*60)):Math.floor(seconds-(m*60));
			return m+&quot;:&quot;+s;
		};

		/** Gestion du Timer */
		var seekUpdate = function() {
			var currenttime = $owPlayer.attr('currentTime');
			if(!seeksliding) $('.owPlayerSeeker').slider('value', currenttime);
			$('.owPlayerTimer').text(gTimeFormat(currenttime));
		};

		//Mise à jour des informations
		$owPlayer.bind('timeupdate', seekUpdate);	

		//Affichage du texte
		$('.owPlayerTimer').text(' / '+gTimeFormat(video_duration));</pre>
<p>La fonction jQuery &quot;Bind&quot; permet de mettre en continu le timer de notre lecteur. Au par avant, j&#8217;ai juste créé une fonction &quot;gTimeFormat&quot; qui permet de convertir notre temps en minutes/secondes </p>
<p>Dernière étape, le slider pour la navigation au sein même de la vidéo. </p>
<pre class="brush:javascript;first-line:85">	/** Slider pour le seeker */

		//Initialise la variable du slider
		var seeksliding;

		var createSeek = function() {
			if($owPlayer.attr('readyState')) {
				var video_duration = $owPlayer.attr('duration');
				$('.owPlayerSeeker').slider({
					value: 0,
					step: 0.01,
					orientation: &quot;horizontal&quot;,
					range: &quot;min&quot;,
					max: video_duration,
					animate: true,
					slide: function(){
						seeksliding = true;
					},
					stop:function(e,ui){
						seeksliding = false;
						$owPlayer.attr(&quot;currentTime&quot;,ui.value);
					}
				});
			} else {
				setTimeout(createSeek, 150);
			}
		};

		createSeek();</pre>
<p>Cette fonction &quot;createSeek()&quot; permet de réaliser un slider pour naviguer au sein même de la vidéo. Lors de l&#8217;arrêt du slider, il y a une recherche de la position.</p>
<h4>Etape 7 &#8211; Appel du plugin</h4>
<p>La derniere étape consiste à initialiser notre plugin dans notre page HTML. L&#8217;opération est simple, un simple &quot;$([selecteur]).owPlayer([url],[options]);&quot; permet de réaliser cette opération. Vous aurez bine évidement pris soin d&#8217;intégrer le plugin et les différentes bibliothèques au par avant.</p>
<p>Le code ci-dessous vous montre cette intégration : </p>
<pre class="brush:html">&lt;!DOCTYPE html&gt;
&lt;head&gt;
    &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;&gt;
	&lt;title&gt;owPlayer - HTML 5 Web video Player&lt;/title&gt;
	&lt;script type=&quot;text/javascript&quot; src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js&quot;&gt;&lt;/script&gt;
	&lt;script type=&quot;text/javascript&quot; src=&quot;jquery-ui.min.js&quot;&gt;&lt;/script&gt;
	&lt;script type=&quot;text/javascript&quot; src=&quot;owPlayer.js&quot;&gt;&lt;/script&gt;
	&lt;script type=&quot;text/javascript&quot;&gt;
		$(document).ready(function(){
			$('.owPlayer').owPlayer('http://mirrorblender.top-ix.org/peach/bigbuckbunny_movies/big_buck_bunny_480p_stereo.ogg',{});
		});
	&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
	&lt;h3&gt;owPlayer::&lt;/h3&gt;
	&lt;video class=&quot;owPlayer&quot;&gt;&lt;/video&gt;
&lt;/body&gt;
&lt;/html&gt;
		</pre>
<h2>&#160;</h2>
<h2>Résultat final</h2>
<p>Cette capture vous montre le résultat final. Ce résultat et bien évidement le même sur Firefox, Chrome ou Safari (non testé sur les autres navigateurs)</p>
<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="lecteur-final" border="0" alt="lecteur-final" src="http://sldesign.openwab.com/wp-content/uploads/2010/09/lecteurfinal.jpg" width="649" height="388" /> </p>
<h2>Conclusion</h2>
<p>Vous venez de voir qu&#8217;il n&#8217;est pas si compliqué que cela de rendre votre lecteur vidéo complètement personnalisé. Malheureusement, la compatibilité n&#8217;est pas encore au rendez-vous et faudra encore pour quelques temps compter sur les lecteurs Flash&#8230;. </p>
<p>Cet exemple n&#8217;est qu&#8217;un bribe de ce qu&#8217;il est possible de réaliser, il est possible d&#8217;étendre ce lecteur en y insérant de nouvelles fonctions : </p>
<ul>
<li>Playliste </li>
<li>Changement de thèmes dynamiques </li>
<li>Navigation de Playliste –Next / Prev </li>
<li>Gestion des différents navigateurs </li>
</ul>
<p>Dans les prochaines versions, j’aurai l’occasion d’améliorer cette extension et de gérer ces différentes fonctions.</p>
<p class="info">N’hésitez pas à laisser vos commentaires / remarques pour les éventuelles questions afin de faire évoluer cet article.</p>
<p>Vous trouverez-ci dessous les codes complets de l&#8217;application ainsi qu&#8217;un fichier zip téléchargeable.</p>
<h5>Code javascript : owPlayer.js </h5>
<pre class="brush:javascript">(function($) {

	$.fn.owPlayer = function(uri, options) {

		// Initialisation des options par defaut
		var defaults = {
			autoplay : false,
			width : 854,
			height : 480,
			theme : 'default',
			poster : null
		};

		// On étend les options avec les valeurs par défaut
		var options = $.extend(defaults, options);

		this.each(function() {
			$owPlayer = $(this);

			// Chargement de la video
				$owPlayer.attr('src', uri);

				// Chargement des éléments de style
				var cssThemeFile = options.theme;
				$(
						'&lt;link href=&quot;themes/' + options.theme + '/style.css&quot; type=&quot;text/css&quot; rel=&quot;stylesheet&quot;/&gt;')
						.appendTo('head');
				$(
						'&lt;link href=&quot;themes/' + options.theme + '/jquery-ui.css&quot; type=&quot;text/css&quot; rel=&quot;stylesheet&quot;/&gt;')
						.appendTo('head');

				// Création du conteneur principal
				$owPlayerWrapper = '&lt;div class=&quot;owPlayerWrapper&quot;&gt;&lt;/div&gt;';
				$owPlayer.wrap($owPlayerWrapper);
				$('.owPlayerWrapper').width(options.width);

				// Création du panel de contôles
				$owPlayerControlsContener = '';
				$owPlayerControlsContener += '&lt;div class=&quot;owPlayerControlsContener ui-widget-header&quot;&gt;&lt;/div&gt;';
				$owPlayer.after($owPlayerControlsContener);

				// Création des contrôles
				var $owPlayerControls = '';
				$owPlayerControls += '&lt;a class=&quot;owPlayerControl owPlayerBtPlay ui-icon ui-icon-play&quot; href=&quot;#&quot; title=&quot;Play/Pause&quot;&gt;Play / Pause&lt;/a&gt;';
				$owPlayerControls += '&lt;div class=&quot;owPlayerControl owPlayerSeeker&quot;&gt;&lt;/div&gt;';
				$owPlayerControls += '&lt;div class=&quot;owPlayerControl owPlayerTimer&quot;&gt;00:00&lt;/div&gt;';
				$owPlayerControls += '&lt;div class=&quot;owPlayerSoundBox&quot;&gt;&lt;a class=&quot;owPlayerControl owPlayerBtSound ui-icon ui-icon-volume-on&quot; href=&quot;#&quot; title=&quot;Mute&quot;&gt;Mute / Unmute&lt;/a&gt;';
				$owPlayerControls += '&lt;a class=&quot;owPlayerControl owPlayerBtSoundTrigger ui-icon ui-icon-signal&quot; href=&quot;#&quot; title=&quot;Volume&quot;&gt;Volume&lt;/a&gt;';
				$owPlayerControls += '&lt;div class=&quot;owPlayerControl owPlayerSoundSlider&quot;&gt;&lt;/div&gt;&lt;/div&gt;';
				$($owPlayerControls).appendTo('.owPlayerControlsContener');

				// Action des boutons et initialisation des sliders
				/** Bt Play */
				$('.owPlayerBtPlay').click(
						function() {
							if ($owPlayer.attr('paused') == false) {
								$owPlayer[0].pause();
								$(this).removeClass('ui-icon-play').addClass(
										'ui-icon-pause');
							} else {
								$owPlayer[0].play();
								$(this).removeClass('ui-icon-pause').addClass(
										'ui-icon-play');
							}
						});

				// Durée totale de la vidéo
				var video_duration = $owPlayer.attr('duration');

				// Fonction de convertion pour le timer
				var gTimeFormat = function(seconds) {
					var m = Math.floor(seconds / 60) &lt; 10 ? &quot;0&quot;
							+ Math.floor(seconds / 60) : Math
							.floor(seconds / 60);
					var s = Math.floor(seconds - (m * 60)) &lt; 10 ? &quot;0&quot;
							+ Math.floor(seconds - (m * 60)) : Math
							.floor(seconds - (m * 60));
					return m + &quot;:&quot; + s;
				};

				/** Gestion du Timer */
				var seekUpdate = function() {
					var currenttime = $owPlayer.attr('currentTime');
					if (!seeksliding)
						$('.owPlayerSeeker').slider('value', currenttime);
					$('.owPlayerTimer').text(gTimeFormat(currenttime));
				};

				$owPlayer.bind('timeupdate', seekUpdate);

				$('.owPlayerTimer').text(' / ' + gTimeFormat(video_duration));

				/** Slider pour le seeker */

				// Initialise la variable du slider
				var seeksliding;

				var createSeek = function() {
					if ($owPlayer.attr('readyState')) {
						var video_duration = $owPlayer.attr('duration');
						$('.owPlayerSeeker').slider( {
							value : 0,
							step : 0.01,
							orientation : &quot;horizontal&quot;,
							range : &quot;min&quot;,
							max : video_duration,
							animate : true,
							slide : function() {
								seeksliding = true;
							},
							stop : function(e, ui) {
								seeksliding = false;
								$owPlayer.attr(&quot;currentTime&quot;, ui.value);
							}
						});
						// $video_controls.show();
					} else {
						setTimeout(createSeek, 150);
					}
				};

				createSeek();

				/** Bouton pour le son */
				// @TODO Récupérer la valeur du son lors du Mute pour le
				// récupérer lors de l'unmute
				$('.owPlayerBtSound').click(function() {
					if ($owPlayer.attr(&quot;muted&quot;) == true) {
						// Activation du son - le slider passe à 100
						$('.owPlayerSoundSlider').slider('value', '50');
						$(this).removeClass('ui-icon-volume-off').addClass(
								'ui-icon-volume-on');
					} else {
						// Desactivation du son
						$owPlayer.attr('muted', true);
						$('.owPlayerSoundSlider').slider('value', '0');
						$(this).removeClass('ui-icon-volume-on').addClass(
								'ui-icon-volume-off');
					}
				});

				/** Slider pour le son */
				$('.owPlayerSoundSlider').hide();
				$('.owPlayerSoundBox').hover(function() {
					$('.owPlayerSoundSlider').show();
				}, function() {
					$('.owPlayerSoundSlider').hide();
				});

				$('.owPlayerSoundSlider').slider( {
					orientation : &quot;vertical&quot;,
					value : 0.50,
					range : &quot;min&quot;,
					max : 1,
					step : 0.05,
					animate : true,
					slide : function(e, ui) {
						$owPlayer.attr('muted', false);
						video_volume = ui.value;
						$owPlayer.attr('volume', ui.value);
					}
				});

			});
	};
})(jQuery);	</pre>
<h5>Code HTML : index.html</h5>
<pre class="brush:html">&lt;!DOCTYPE html&gt;
&lt;head&gt;
    &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;&gt;
	&lt;title&gt;owPlayer - HTML 5 Web video Player&lt;/title&gt;
	&lt;script type=&quot;text/javascript&quot; src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js&quot;&gt;&lt;/script&gt;
	&lt;script type=&quot;text/javascript&quot; src=&quot;jquery-ui.min.js&quot;&gt;&lt;/script&gt;
	&lt;script type=&quot;text/javascript&quot; src=&quot;owPlayer.js&quot;&gt;&lt;/script&gt;
	&lt;script type=&quot;text/javascript&quot;&gt;
		$(document).ready(function(){
			$('.owPlayer').owPlayer('http://mirrorblender.top-ix.org/peach/bigbuckbunny_movies/big_buck_bunny_480p_stereo.ogg',{});
		});
	&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
	&lt;h3&gt;owPlayer::&lt;/h3&gt;
	&lt;video class=&quot;owPlayer&quot;&gt;&lt;/video&gt;
&lt;/body&gt;
&lt;/html&gt;
	</pre>
<h5>Code CSS : style.css</h5>
<pre class="brush:css">/**
 * owPlayer stylesheet file
 * Extend jQuery-ui stylesheet
 * @author slDesign
 * @version 0.1
 */

.owPlayer{
	margin:0;
	padding:0
}
.owPlayerControlsContener{
	height:24px;
	z-index:100;
	margin-top:-5px;
}

.ui-icon{
	border:1px solid #ccc;
	padding:1px;

}
.owPlayerControl{
	float:left;
	margin:1px 8px;
}

.owPlayerSeeker{
	width:500px;
	height:4px;
}

.owPlayerSoundBox *{
	margin:0;
}
.owPlayerSoundSlider{
	height:300px;
	float:left;
	margin-top:-90px;
}</pre>
<h3>&#160;</h3>
<h3>Remerciements : </h3>
<p>Merci à l’équipe de Big Buck Bunny pour la vidéo [<a title="Site Internet de Big Buck Bunny" href="http://www.bigbuckbunny.org/" target="_blank">site</a>] [<a title="Licence de diffusion et d&#39;utilisation de la vidéo Big Buck Bunny" href="http://www.bigbuckbunny.org/index.php/about/" target="_blank">licence</a>]. Cette vidéo a été réalisée sous Blender</p>
<p>Merci à <a href="http://dev.opera.com/author/36658182">Cristian-Ionut Colceriu</a> pour son article initial qui m’a aidé à rédigé celui-ci</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://sldesign.openwab.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://sldesign.openwab.com/2010/09/14/tutoriel-html-5-raliser-une-lecteur-vido-personnalis/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
<enclosure url="http://mirrorblender.top-ix.org/peach/bigbuckbunny_movies/big_buck_bunny_480p_stereo.ogg" length="166825767" type="audio/ogg" />
		</item>
		<item>
		<title>Support HTML 5 &#8211; La solution pour gérer la compatibilté des navigateurs</title>
		<link>http://sldesign.openwab.com/2010/08/08/support-html-5-la-solution-pour-gerer-la-compatibilte-des-navigateurs/</link>
		<comments>http://sldesign.openwab.com/2010/08/08/support-html-5-la-solution-pour-gerer-la-compatibilte-des-navigateurs/#comments</comments>
		<pubDate>Sun, 08 Aug 2010 07:26:21 +0000</pubDate>
		<dc:creator>Steve Leherpeux</dc:creator>
				<category><![CDATA[HTML / CSS]]></category>
		<category><![CDATA[Compatibilité]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[navigateurs]]></category>

		<guid isPermaLink="false">http://sldesign.openwab.com/?p=802</guid>
		<description><![CDATA[HTML 5,  CSS 3 c&#8217;est bien beau, ça rend bien service et c&#8217;est sympa&#8230; malheureusement, tout n&#8217;est pas parfait au pays des rêves car de nombreux utilisateurs (vos lecteurs et utilisateurs) ne peuvent pas profiter de ces nouveaux attributs HTML et CSS. Il est important de penser &#171;&#160;utilisateurs&#160;&#187;. Les modifications apportées par HTML 5 et [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fsldesign.openwab.com%2F2010%2F08%2F08%2Fsupport-html-5-la-solution-pour-gerer-la-compatibilte-des-navigateurs%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fsldesign.openwab.com%2F2010%2F08%2F08%2Fsupport-html-5-la-solution-pour-gerer-la-compatibilte-des-navigateurs%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><img class="alignleft size-full wp-image-803" style="margin: 5px;" title="Navigateurs Web" src="http://sldesign.openwab.com/wp-content/uploads/2010/08/navigateurs-splash-screen.jpg" alt="Navigateurs Web" width="276" height="161" />HTML 5,  CSS 3 c&#8217;est bien beau, ça rend bien service et c&#8217;est sympa&#8230; malheureusement, tout n&#8217;est pas parfait au pays des rêves car de nombreux utilisateurs (vos lecteurs et utilisateurs) ne peuvent pas profiter de ces nouveaux attributs HTML et CSS.</p>
<p>Il est important de penser &laquo;&nbsp;utilisateurs&nbsp;&raquo;. Les modifications apportées par HTML 5 et CSS 3 ne sont pas encore implémentées par tous les navigateurs. Ne pouvant pas forcer tout le monde à utiliser un seul navigateur, il faut s&#8217;efforcer de prendre en compte cet compatibilité.</p>
<p>Comment pouvons nous vérifier cette compatibilité, comment savoir quel navigateur est compatible avec tel attribut HTML ou CSS ? C&#8217;est ce que je vous propose de voir dans cet article.</p>
<p><span id="more-802"></span></p>
<hr class="clear_all" />
<h2>Solution Javascript</h2>
<p>Une des première solution consiste à utiliser javascript pour vérifier</p>
<pre class="brush:html">&lt;script&gt;
   alert( 'pattern' in document.createElement('input') ) // boolean;
&lt;/script&gt;
</pre>
<p>Si vous mettez ce simple script sur votre page, vous déclencherez une alerte &laquo;&nbsp;true&nbsp;&raquo; ou &laquo;&nbsp;false&nbsp;&raquo; selon les navigateurs.</p>
<div id="attachment_805" class="wp-caption alignnone" style="width: 532px"><img class="size-full wp-image-805" title="Alerte sur un navigateur supportant l'attribut Pattern" src="http://sldesign.openwab.com/wp-content/uploads/2010/08/valid-navigateur.jpg" alt="Alerte sur un navigateur supportant l'attribut Pattern" width="522" height="212" /><p class="wp-caption-text">Alerte sur un navigateur supportant l&#39;attribut Pattern</p></div>
<div id="attachment_806" class="wp-caption alignnone" style="width: 388px"><img class="size-full wp-image-806" title="Alerte sur un navigateur ne supportant pas l'attribut Pattern - IE7" src="http://sldesign.openwab.com/wp-content/uploads/2010/08/navigateur-non-compatible.jpg" alt="Alerte sur un navigateur ne supportant pas l'attribut Pattern" width="378" height="131" /><p class="wp-caption-text">Alerte sur un navigateur ne supportant pas l&#39;attribut Pattern</p></div>
<p>C&#8217;est un moyen simple mais assez contraignant de vérifier la compatibilité de tel ou tel attribut&#8230;</p>
<h2>Commentaires conditionnels</h2>
<p>Les commentaires conditionnels sont un mécanisme propre à Internet Explorer Windows, qui permettent d&#8217;inclure dans une page (X)HTML, de manière valide, du code qui ne sera lu et interprété que par Internet Explorer, ou par l&#8217;une ou l&#8217;autre de ses versions.</p>
<p>Techniquement, il s&#8217;agit de simples commentaires HTML, qui seront compris comme tels par la plupart des navigateurs. Cependant, le contenu de ces commentaires a une syntaxe spéciale, qui permet à Internet Explorer de savoir s&#8217;il doit interpréter le contenu du commentaire ou bien l&#8217;ignorer.</p>
<pre class="brush:html">&lt;!--[if gte IE 6]&gt; pour IE 6.0 et version plus récentes &lt;![endif]--&gt;

&lt;!--[if IE 5.0]&gt; pour IE 5.0 &lt;![endif]--&gt;

&lt;!--[if IE 5.5000]&gt; pour IE 5.5 &lt;![endif]--&gt;

&lt;!--[if IE 6]&gt; pour IE 6.0 &lt;![endif]--&gt;

&lt;!--[if IE 7]&gt; pour IE 7.0 &lt;![endif]--&gt;

&lt;!--[if IE 8]&gt; pour IE 8.0 &lt;![endif]--&gt;

&lt;!--[if gte IE 7]&gt; pour IE 7 et supérieur &lt;![endif]--&gt;

&lt;!--[if lt IE 7]&gt; pour IE inférieur à IE 7 &lt;![endif]--&gt;

&lt;!--[if lte IE 6]&gt; pour IE 5.0, IE 5.5 et IE 6.0 mais pas IE7.0 &lt;![endif]--&gt;
</pre>
<p>Cette technique a le mérite d&#8217;exister, surtout lorsque l&#8217;on connait les différences qu&#8217;il existe entre IE et les autres navigateurs mais, elle ne s&#8217;applique que à Internet Explorer et elle devient vite lourde à gérer&#8230;</p>
<h2>Class Modernizr</h2>
<p>Modernizr ajoute classes à l&#8217;élément</p>
<p>qui vous permettent de cibler les fonctionnalités du navigateur spécifique dans votre feuille de style. Vous n&#8217;avez pas réellement besoin d&#8217;écrire du Javascript pour l&#8217;utiliser.</p>
<h3>Initialisation :</h3>
<p>Il suffit de lier la bibliothèque dans votre doument HTML :</p>
<pre class="brush:html">&lt;head&gt;
	&lt;script type="text/javascript" src="medias/modernizr-1.5.min.js"&gt;&lt;/script&gt;
&lt;/head&gt;
</pre>
<p>Voici un exemple concret concernant l&#8217;attribut &laquo;&nbsp;border-radius&nbsp;&raquo; qui n&#8217;est pas disponible sur IE&#8230; Eh bien, avec Modernizr vous pouvez accomplir tout cela! La syntaxe est très intuitive, aussi:</p>
<h4>Code HTML</h4>
<pre class="brush:html">&lt;div class="radius"&gt;
	&lt;p&gt;&lt;span&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur mattis fermentum quam, ut feugiat dui ornare eu. Aenean vitae purus eget nunc sagittis sollicitudin eget a lorem.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
</pre>
<h4>Feuille de style CSS :</h4>
<pre class="brush:css">	.radius p span{
	-moz-border-radius: 5px;
	-webkit-border-radius: 5px;
	display:block;
	width:300px;
}

.borderradius p span{
	border:1px solid #cc3300;
}

.no-borderradius p span{
	border:1px solid #000;
}
</pre>
<p>L&#8217;opération est simple, vous déclarer une class &laquo;&nbsp;.[mon attribut]&nbsp;&raquo; ou &laquo;&nbsp;.no-[mon atribut]&nbsp;&raquo; dans votre feuille de style pour gérer les différentes compatibilité&#8230;</p>
<div id="attachment_807" class="wp-caption alignnone" style="width: 330px"><img class="size-full wp-image-807" title="Border Radius sous firefox" src="http://sldesign.openwab.com/wp-content/uploads/2010/08/border-radius-firefox.jpg" alt="Border Radius sous firefox" width="320" height="98" /><p class="wp-caption-text">Border Radius sous firefox</p></div>
<div id="attachment_808" class="wp-caption alignnone" style="width: 334px"><img class="size-full wp-image-808" title="Border radius sous IE" src="http://sldesign.openwab.com/wp-content/uploads/2010/08/border-radius-ie.jpg" alt="Border radius sous IE" width="324" height="97" /><p class="wp-caption-text">Border radius sous IE après mise en forme via &quot;.no-borderradius&quot;</p></div>
<p>Il est également possible d&#8217;appliquer des conditions sur des éléments javascript. Voici un exemple concernant &laquo;&nbsp;localStorage&nbsp;&raquo;</p>
<pre class="brush:js">&lt;script&gt;
	if (Modernizr.localstorage){
		// Utilisez tous les avantages de localStorage
	} else {
		// Passez par les Cookies
	}
&lt;/script&gt;
</pre>
<p>Cette bibliothèque ne répond surement pas à toutes les problématiques mais elle mérite que l&#8217;on s&#8217;y arrette. Elle est simple d&#8217;utilisation et bien documentée</p>
<p>Pour télécharger &laquo;&nbsp;Modernizr&nbsp;&raquo;, rendez-vous sur le site de l&#8217;auteur : <a title="Site de Modernizr" href="http://www.modernizr.com/" target="_blank">http://www.modernizr.com/</a>.</p>
<h2>Conclusion</h2>
<p>Il n&#8217;existe pas de solution parfaite, cela dit, vous disposez de différentes techniques qui vous permettrons d&#8217;adapter vos pages Web sur tous les navigateurs. Vous pouvez également orienter vos utilisateurs à utiliser un autre navigateur.</p>
<pre class="brush:html">&lt;script&gt;
 $(document).ready(function(){
 if ($.browser.msie) {
 $("#topMsg").html("Votre navigateur n'est pas compatible avec ce site, certaines fonctiionalités et styles seront desactivés. Changer pour &lt;a href=\"http://www.mozilla-europe.org/fr/firefox/\"&gt;firefox&lt;/a&gt; ou &lt;a href=\"http://www.apple.com/fr/safari/\"&gt;Safari&lt;/a&gt; ?");
 }
 });
 &lt;/script&gt;
-----
&lt;p id="topMsg"&gt;

 &lt;/p&gt;</pre>
<p>A bientôt&#8230;</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://sldesign.openwab.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://sldesign.openwab.com/2010/08/08/support-html-5-la-solution-pour-gerer-la-compatibilte-des-navigateurs/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Formulaires HTML5 &#8211; Quoi de neuf ?</title>
		<link>http://sldesign.openwab.com/2010/08/07/formulaires-html5-quoi-de-neuf/</link>
		<comments>http://sldesign.openwab.com/2010/08/07/formulaires-html5-quoi-de-neuf/#comments</comments>
		<pubDate>Sat, 07 Aug 2010 08:37:05 +0000</pubDate>
		<dc:creator>Steve Leherpeux</dc:creator>
				<category><![CDATA[HTML / CSS]]></category>
		<category><![CDATA[Formulaires]]></category>
		<category><![CDATA[HTML 5]]></category>
		<category><![CDATA[Tutoriel]]></category>

		<guid isPermaLink="false">http://sldesign.openwab.com/?p=789</guid>
		<description><![CDATA[Nouveautés HTML 5 &#8211; Formulaires et champs de formulaires Petite introduction aux formulaires HTML 5&#8230; Je vous propose de voir en images et en code les différentes modifications apportées par les nouveaux attributs HTML 5. Introduction : HTML 5 apporte son lot de nouveautés également sur les formulaires. Il est important de prendre en considération [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fsldesign.openwab.com%2F2010%2F08%2F07%2Fformulaires-html5-quoi-de-neuf%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fsldesign.openwab.com%2F2010%2F08%2F07%2Fformulaires-html5-quoi-de-neuf%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><a href="http://sldesign.openwab.com/wp-content/uploads/2010/08/spash-screen.jpg"><img class="size-full wp-image-792 alignleft" style="margin: 5px;" title="Nouveautés HTML 5 - Splash Screen" src="http://sldesign.openwab.com/wp-content/uploads/2010/08/spash-screen.jpg" alt="Nouveautés HTML 5 - Splash Screen" width="275" height="206" /></a>Nouveautés HTML 5 &#8211; Formulaires et champs de formulaires<br />
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript">
        </script></p>
<p>Petite introduction aux formulaires HTML 5&#8230; Je vous propose de voir en images et en code les différentes modifications apportées par les nouveaux attributs HTML 5.<br />
<span id="more-789"></span></p>
<hr class="clear_all" />
<h2>Introduction :</h2>
<p>HTML 5 apporte son lot de nouveautés également sur les formulaires. Il est important de prendre en considération ces modifications car elles vont permettre un meilleur échange entre les utilisateurs et éditeurs de contenu. Elles sont également là pour nous rendre service et optimiser le WEB de demain.</p>
<p class="info">Information : A ce jour, ces nouveautés ne sont compatible qu&#8217;avec les navigateurs &laquo;&nbsp;WEBKIT&nbsp;&raquo; (Safari et Google Chrome).</p>
<h2>Placeholder attribut :</h2>
<p>Cet attribut permet d&#8217;insérer dans votre champ un exemple de texte à saisir qui a la propriété de disparaître au focus. Ceci remplace l&#8217;utilisation de javascript pour réaliser cette opération&#8230;</p>
<h4>Avant&#8230;</h4>
<pre class="brush:html">	&lt;script&gt;
		$(document).ready(function(){
			$('.placeholder').focus(function(){

				if($(this).val() == $(this).attr('alt')){
					$(this).val('');
				};
			});
			$('.placeholder').blur(function(){
				if($(this).val() == ""){
					$(this).val($(this).attr('alt'));
				}
			});

		});
	&lt;/script&gt;
	&lt;form&gt;
		&lt;input type="text" class="placeholder" name="first-name" alt="John" value="John"/&gt;&lt;br/&gt;
		&lt;input type="text" class="placeholder" name="last-name"  alt="Doe" value="Doe"/&gt;&lt;br/&gt;
		&lt;input type="submit" name="submit" value="Save"/&gt;
	&lt;/form&gt;
</pre>
<h4>Après&#8230;</h4>
<pre class="brush:html">	&lt;form&gt;
	&lt;input type="text" name="first-name" placeholder="John"/&gt;&lt;br/&gt;
	&lt;input type="text" name="last-name" placeholder="Doe"/&gt;&lt;br/&gt;
	&lt;input type="submit" name="submit" value="Save"/&gt;
	&lt;/form&gt;
</pre>
<h2>Autofocus</h2>
<p>cet attribut permet de sélectionner un champ en particulier au chargement de la page</p>
<h4>Avant&#8230;</h4>
<pre class="brush:html">	&lt;script&gt;
		$(document).ready(function(){
			$('.selectedInput').focus();
		});
	&lt;/script&gt;
	&lt;form&gt;
	&lt;input type="text" name="first-name" placeholder="John"/&gt;&lt;br/&gt;
	&lt;input class="selectedInput" type="text" name="last-name" autofocus/&gt;&lt;br/&gt;
	&lt;/form&gt;
</pre>
<h4>Après&#8230;</h4>
<pre class="brush:html">        	&lt;form&gt;
	&lt;input type="text" name="first-name" placeholder="John"/&gt;&lt;br/&gt;
	&lt;input type="text" name="last-name" autofocus/&gt;&lt;br/&gt;
	&lt;/form&gt;
</pre>
<div id="attachment_793" class="wp-caption alignnone" style="width: 300px"><img class="size-full wp-image-793" title="Exemple HTML 5 Autofocus" src="http://sldesign.openwab.com/wp-content/uploads/2010/08/autofocus.jpg" alt="Exemple HTML 5 Autofocus" width="290" height="87" /><p class="wp-caption-text">Exemple HTML 5 Autofocus</p></div>
<h2>Attribut Required</h2>
<p>Permet de spécifier si un attribut est obligatoire. Si le champ reste vide au submit, il sera mis en évidence.</p>
<h4>Avant&#8230;</h4>
<pre class="brush:html">		 	&lt;script&gt;
		 		$(document).ready(function(){
					$(".verifForm").click(function(){
						if($(".required").val() == ""){
							alert("Vous devez remplir tous les champs...");
							return false;
						}
					});
				});
		 	&lt;/script&gt;
		 	&lt;form&gt;
		 		&lt;label&gt;Nom d'utilisateur : &lt;/label&gt;&lt;br/&gt;
		 		&lt;input class="required" type="text" name="username" value=""/&gt;&lt;br/&gt;
				&lt;label&gt;Mot de passe : &lt;/label&gt;&lt;br/&gt;
				&lt;input class="required" type="text" name="password" value=""/&gt;&lt;br/&gt;
				&lt;label&gt;Prénom : &lt;/label&gt;&lt;br/&gt;
				&lt;input type="text" name="subname" value=""/&gt;&lt;br/&gt;
				&lt;input class="verifForm" type="submit" name="submit" value="Save"/&gt;
		 	&lt;/form&gt;
</pre>
<h4>
<div id="attachment_795" class="wp-caption alignnone" style="width: 694px"><img class="size-full wp-image-795" title="Aperçu Required avant HTML5" src="http://sldesign.openwab.com/wp-content/uploads/2010/08/required-before.jpg" alt="Aperçu Required avant HTML5" width="684" height="284" /><p class="wp-caption-text">Aperçu Required avant HTML5</p></div></h4>
<h4>Après&#8230;</h4>
<pre class="brush:html">		 	&lt;form&gt;
		 		&lt;label&gt;Nom d'utilisateur : &lt;/label&gt;&lt;br/&gt;
		 		&lt;input required="required" type="text" name="username" value=""/&gt;&lt;br/&gt;
				&lt;label&gt;Mot de passe : &lt;/label&gt;&lt;br/&gt;
				&lt;input required="required" type="text" name="password" value=""/&gt;&lt;br/&gt;
				&lt;label&gt;Prénom : &lt;/label&gt;&lt;br/&gt;
				&lt;input type="text" name="subname" value=""/&gt;&lt;br/&gt;
				&lt;input type="submit" name="submit" value="Save"/&gt;
		 	&lt;/form&gt;
</pre>
<h2>
<p><div id="attachment_794" class="wp-caption alignnone" style="width: 324px"><img class="size-full wp-image-794" title="Résultat attribut HTML5 Required" src="http://sldesign.openwab.com/wp-content/uploads/2010/08/required-after.jpg" alt="Résultat attribut HTML5 Required" width="314" height="300" /><p class="wp-caption-text">Résultat attribut HTML5 Required</p></div></h2>
<h2>Champ email &amp; url</h2>
<p>Permet de spécifier un type de champ email ou url et execute des vérifications</p>
<h4>Avant&#8230;</h4>
<pre class="brush:html">        &lt;script&gt;
        	function isValidEmailAddress(emailAddress) {
				var pattern = new RegExp(/^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/i);
				return pattern.test(emailAddress);
			}
			function isValidUrlAddress(urlAdress) {
				var pattern = new RegExp(/http:\/\/[A-Za-z0-9\.-]{3,}\.[A-Za-z]{3}/);
				return pattern.test(urlAdress);
			}
            $(document).ready(function(){
            	$('.mail').blur(function(){
					if (!isValidEmailAddress($(this).val())) {
						alert("Email non valide !");
						return false;
					};
				});

				$('.url').blur(function(){
					if(!isValidUrlAddress($(this).val())){
						alert("URL non valide !");
						return false;
					}
				});
            });
        &lt;/script&gt;
		&lt;form&gt;
					&lt;label&gt;News Letter : &lt;/label&gt;&lt;br/&gt;
					&lt;input class="mail" type="text" placeholder="YouMail@provider.com" required /&gt;&lt;br/&gt;
					&lt;label&gt;Votre site Web : &lt;/label&gt;&lt;br/&gt;
					&lt;input class="url" type="text" name="yourWebSite" placeholder="www.yoursite.com"/&gt;&lt;br/&gt;
					&lt;input  type="submit" name="submit" value="Inscription"/&gt;
				&lt;/form&gt;
</pre>
<h4>
<p><div id="attachment_796" class="wp-caption alignnone" style="width: 747px"><img class="size-full wp-image-796" title="Check mail avant HTML5" src="http://sldesign.openwab.com/wp-content/uploads/2010/08/check-mail-before.jpg" alt="Check mail avant HTML5" width="737" height="262" /><p class="wp-caption-text">Check mail avant HTML5</p></div>
<div id="attachment_797" class="wp-caption alignnone" style="width: 726px"><img class="size-full wp-image-797" title="Check URL avant HTML5" src="http://sldesign.openwab.com/wp-content/uploads/2010/08/check-url-before.jpg" alt="Check URL avant HTML5" width="716" height="297" /><p class="wp-caption-text">Check URL avant HTML5</p></div>
<p>Après&#8230;</h4>
<pre class="brush:html">				&lt;form&gt;
					&lt;label&gt;News Letter : &lt;/label&gt;&lt;br/&gt;
					&lt;input type="email" placeholder="YouMail@provider.com" required /&gt;&lt;br/&gt;
					&lt;label&gt;Votre site Web : &lt;/label&gt;&lt;br/&gt;
					&lt;input type="url" name="yourWebSite" placeholder="www.yoursite.com"/&gt;&lt;br/&gt;
					&lt;input  type="submit" name="submit" value="Inscription"/&gt;
				&lt;/form&gt;
</pre>
<div id="attachment_798" class="wp-caption alignnone" style="width: 277px"><img class="size-full wp-image-798" title="Résultat Champ de type Mail HTML5" src="http://sldesign.openwab.com/wp-content/uploads/2010/08/check-mail-after.jpg" alt="Résultat Champ de type Mail HTML5" width="267" height="209" /><p class="wp-caption-text">Résultat Champ de type Mail HTML5</p></div>
<p class="info">Les messages d&#8217;erreurs seront directement gérés par les navigateurs.</p>
<p>Il est également possible d&#8217;utiliser l&#8217;attribut &laquo;&nbsp;pattern&nbsp;&raquo; qui vous permettra de spécifier la structure des données saisies en lieu et place d&#8217;un REGEX javascript :</p>
<pre class="brush:html">&lt;input type="text" name="username" placeholder="Nom d'utilisateur" pattern="[A-Za-z]{4,10}"/&gt;</pre>
<p>Si vous êtes familier avec les expressions régulière vous aurez compris que le format accepté devra contenir uniquement des lettres de 4 à 10 caractères.</p>
<h3>Les nouveaux types de champs :</h3>
<p>Voici les différentes valeurs pouvant être attribuées :</p>
<ul>
<li> tel</li>
<li> search</li>
<li> url</li>
<li> email</li>
<li> datetime</li>
<li> date</li>
<li> month</li>
<li> week</li>
<li> time</li>
<li> datetime-local</li>
<li> number</li>
<li> range</li>
<li> color</li>
</ul>
<h2>Conclusion</h2>
<p>Certes ces nouveautés ne sont encore applicable que sur les navigateurs &laquo;&nbsp;WEBKIT&nbsp;&raquo; mais il est clair que ces nouveaux attributs seront disponible sous peu pour les navigateurs Mozilla (voir IE&#8230;). Alors n&#8217;hésitez pas à utiliser ces nouveaux attributs dès maintenant.</p>
<p>Lien : <a title="Documentation W3C sur les formulaires" href="http://www.w3.org/TR/html401/interact/forms.html#h-17.4" target="_blank">Documentation W3C</a></p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://sldesign.openwab.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://sldesign.openwab.com/2010/08/07/formulaires-html5-quoi-de-neuf/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Speed tuts : local storage ou la sauvegarde locale</title>
		<link>http://sldesign.openwab.com/2010/08/06/speed-tuts-local-storage-ou-la-sauvegarde-locale/</link>
		<comments>http://sldesign.openwab.com/2010/08/06/speed-tuts-local-storage-ou-la-sauvegarde-locale/#comments</comments>
		<pubDate>Fri, 06 Aug 2010 07:42:35 +0000</pubDate>
		<dc:creator>Steve Leherpeux</dc:creator>
				<category><![CDATA[HTML / CSS]]></category>
		<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[HTML 5]]></category>
		<category><![CDATA[localStorage]]></category>
		<category><![CDATA[SpeedTuts]]></category>
		<category><![CDATA[Tutoriel]]></category>

		<guid isPermaLink="false">http://sldesign.openwab.com/?p=780</guid>
		<description><![CDATA[HTML 5 nous apporte de nombreuses et belles surprises dont un fait l&#8217;objet de ce tutoriel : &#171;&#160;localStorage&#160;&#187;. A vrai dire, cette fonctionnalité ne fait pas parti officiellement de HTML 5 mais y est lié indirectement. Le principe est simple, cette fonctionnalité vous permet de sauvegarder l&#8217;ensemble de vos données saisies en locale ; que [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fsldesign.openwab.com%2F2010%2F08%2F06%2Fspeed-tuts-local-storage-ou-la-sauvegarde-locale%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fsldesign.openwab.com%2F2010%2F08%2F06%2Fspeed-tuts-local-storage-ou-la-sauvegarde-locale%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>HTML 5 nous apporte de nombreuses et belles surprises dont un fait l&#8217;objet de ce tutoriel : &laquo;&nbsp;localStorage&nbsp;&raquo;. A vrai dire, cette fonctionnalité ne fait pas parti officiellement de HTML 5 mais y est lié indirectement.</p>
<p>Le principe est simple, cette fonctionnalité vous permet de sauvegarder l&#8217;ensemble de vos données saisies en locale ; que vous rafraichissiez la page ou que vous quittiez votre navigateur et le relancez sur la même page, vos données seront sauvegardées.</p>
<p>Nous allons voir dans ce tutoriel la façon d&#8217;implémenter &laquo;&nbsp;localStorage&nbsp;&raquo;.</p>
<p><span id="more-780"></span></p>
<hr class="clear_all" />
<h2>I &#8211; Introduction &amp; prérequis</h2>
<p>Avant de commencer, vous devez connaître le HTML 5 ainsi que l&#8217;utilisation du framework javascript jQuery.</p>
<p>Page de base :</p>
<pre class="brush:html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
 &lt;head&gt;
 &lt;meta name="generator" content="HTML Tidy, see www.w3.org"&gt;
 &lt;meta http-equiv="Content-Type" content= "text/html; charset=UTF-8"&gt;
 &lt;title&gt;Tutoriel local storage&lt;/title&gt;
 &lt;script type="text/javascript" src= "http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"&gt;
 &lt;/script&gt;

 &lt;/head&gt;
 &lt;body&gt;

 &lt;/body&gt;
&lt;/html&gt;</pre>
<p>Vous trouverez ci-dessous la page qui nous servira de base pour ce tutoriel et qui intègre la bibliothèque jQuery</p>
<h2>II &#8211; Création d&#8217;un contenu éditable</h2>
<p>Un des nouveaux attributs de HTML 5 est &laquo;&nbsp;contenteditable&nbsp;&raquo;. Cet attribut vous permet de réaliser des éléments éditables par les utilisateurs. Pour mettre en place cet attribut</p>
<h4>Code HTML &#8211; zone de saisie :</h4>
<pre class="brush:html">	&lt;h5&gt;Todo Liste&lt;/h5&gt;
	&lt;ul class="editable" id="todoListe" contenteditable="true"&gt;
	    &lt;li&gt;
	    &lt;/li&gt;
	&lt;/ul&gt;
	&lt;p&gt;
	    &lt;button id="clearStorage"&gt;
	        Effacer mon localStorage
	    &lt;/button&gt;
	&lt;/p&gt;
</pre>
<div id="attachment_786" class="wp-caption alignnone" style="width: 246px"><img class="size-full wp-image-786" title="Liste éditable" src="http://sldesign.openwab.com/wp-content/uploads/2010/08/2.1-localstorage-content-editable.jpg" alt="Liste éditable" width="236" height="130" /><p class="wp-caption-text">Liste éditable</p></div>
<p>Jusque là, c&#8217;est bien mais lorsque vous quittez votre navigateur ou si vous rafraichissez votre page, le contenu ne sera pas sauvegardé&#8230; Comment faire sans pour autant poster nos données ?</p>
<h2>Utilisation de javascript</h2>
<p>Pour sauvegarder nos données, nous allons utiliser la propriété &laquo;&nbsp;localStorage&nbsp;&raquo; qui nous permettra de sauvegarder nos données en locale sans l&#8217;utilisation de cookies. Vous trouverez ci dessous le code javascript commenté qui nous permettra de réaliser cette opération.</p>
<h4>Code javascript :</h4>
<pre class="brush:js;first-line=14;">&lt;script type="text/javascript"&gt;
$(function(){
	var editable = document.getElementById('todoListe');

	//Action réalisée au focus
	$(editable).blur(function(){
		//Sauvegarde des données saisies dans un variable 'myStorage'
		localStorage.setItem('myStorage', this.innerHTML);
	});

	//Récupération de nos données en cas de chargement...
	if (localStorage.getItem('myStorage')) {
		editable.innerHTML = localStorage.getItem('myStorage');
	};

	//Fonction pour affacer le localStorage
	$('#clearStorage').click(function(){
		localStorage.clear();
		location.reload() ;
	});
});
&lt;/script&gt;
</pre>
<p>Une fois cette opération réalisée, sauvegardez votre fichier puis saisissez plusieurs lignes dans votre liste et sortez du focus. Vous pouvez maintenant fermer votre navigateur et le relancer ou encore rafraichir votre page, les données saisies seront sauvegardées.</p>
<h2>Code complet et ressources :</h2>
<h4>Code complet du tutoriel :</h4>
<pre class="brush:html">&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"&gt;
&lt;html&gt;
    &lt;head&gt;
        &lt;meta name="generator" content="HTML Tidy, see www.w3.org"&gt;
        &lt;meta http-equiv="Content-Type" content= "text/html; charset=UTF-8"&gt;
        &lt;title&gt;Tutoriel local storage&lt;/title&gt;
        &lt;script type="text/javascript" src= "http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"&gt;
        &lt;/script&gt;
        &lt;style type="text/css"&gt;
            .editable {
                background: #f5f5f5;
                border: 1px solid #000;
            }
        &lt;/style&gt;
        &lt;script type="text/javascript"&gt;
            $(function(){
                var editable = document.getElementById('todoListe');
                //Action réalisée au focus
                $(editable).blur(function(){
                    //Sauvegarde des données saisies dans un variable 'myStorage'
                    localStorage.setItem('myStorage', this.innerHTML);
                });

                //Récupération de nos données en cas de chargement...
                if (localStorage.getItem('myStorage')) {
                    editable.innerHTML = localStorage.getItem('myStorage');
                };

                //Fonction pour affacer le localStorage
                $('#clearStorage').click(function(){
                    localStorage.clear();
                    location.reload();
                });
            });
        &lt;/script&gt;
    &lt;/head&gt;
    &lt;body&gt;
    	&lt;h5&gt;Todo Liste&lt;/h5&gt;
            &lt;ul class="editable" id="todoListe" contenteditable="true"&gt;
                &lt;li&gt;
                &lt;/li&gt;
            &lt;/ul&gt;
            &lt;p&gt;
                &lt;button id="clearStorage"&gt;
                    Effacer mon localStorage
                &lt;/button&gt;
            &lt;/p&gt;
    &lt;/body&gt;
&lt;/html&gt;
</pre>
<h3>Compatibilité</h3>
<p>Au moment ou je vous parle, cette implémentation est compatible avec les navigateurs et versions suivantes (windows):</p>
<ul>
<li>Chrome 4 +</li>
<li>Firefox 3.6 +</li>
<li>IE 8 +</li>
<li>Opéra 10 +</li>
<li>Safari 4 +</li>
</ul>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://sldesign.openwab.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://sldesign.openwab.com/2010/08/06/speed-tuts-local-storage-ou-la-sauvegarde-locale/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Tutoriel CSS : 3D Transform</title>
		<link>http://sldesign.openwab.com/2010/07/27/tutoriel-css-3d-transform/</link>
		<comments>http://sldesign.openwab.com/2010/07/27/tutoriel-css-3d-transform/#comments</comments>
		<pubDate>Tue, 27 Jul 2010 07:36:25 +0000</pubDate>
		<dc:creator>Steve Leherpeux</dc:creator>
				<category><![CDATA[HTML / CSS]]></category>
		<category><![CDATA[3D]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[CSS3]]></category>

		<guid isPermaLink="false">http://sldesign.openwab.com/?p=690</guid>
		<description><![CDATA[Le version 3 de CSS nous a apporté son lot de nouveauté ; parmi les plus connues et plus utilisées on peut citer &#171;&#160;Corner radius&#160;&#187; ou encore les dégradés mais une nouvelle propriété très intéressante va vous permettre une encore plus grande liberté : la propriété &#171;&#160;transform&#160;&#187;. De la 3D en CSS ? Je n&#8217;irai [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fsldesign.openwab.com%2F2010%2F07%2F27%2Ftutoriel-css-3d-transform%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fsldesign.openwab.com%2F2010%2F07%2F27%2Ftutoriel-css-3d-transform%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><img class="alignleft size-full wp-image-732" style="margin: 5px;" title="CSS Effet 3D - Cube Final" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/cube-final.jpg" alt="CSS Effet 3D - Cube Final" width="199" height="222" />Le version 3 de CSS nous a apporté son lot de nouveauté ; parmi les plus connues et plus utilisées on peut citer &laquo;&nbsp;Corner radius&nbsp;&raquo; ou encore les dégradés mais une nouvelle propriété très intéressante va vous permettre une encore plus grande liberté : la propriété &laquo;&nbsp;transform&nbsp;&raquo;.</p>
<p><em><strong>De la 3D en CSS ?</strong></em></p>
<p>Je n&#8217;irai pas jusqu&#8217;à dire qu&#8217;il s&#8217;agit de 3D mais plutot d&#8217;effet 3D au même titre que nous pouvons réaliser ces effets avec un logiciel de graphisme.</p>
<p>Nous verrons dans cet article comment réaliser un cube en effet 3D.<span id="more-690"></span></p>
<hr class="clear_all" />
<h1>I &#8211; Introduction</h1>
<p>Avant toute chose, il est nécessaire de prendre en compte la comptabilité. L&#8217;utilisation de la propriété CSS 3D transform n&#8217;est compatible qu&#8217;avec Firefox 3.5+ [<code>-moz-transform] (documentation)</code> et Safari 3.2+<code>[-webkit-transform](documentation).</code></p>
<p>Travaillant essentiellement sur Firefox, je ne m'aventurerai pas dans les détails de Safari mais il n'y a pas d'énormes différences...</p>
<h2>1°) Prérequis</h2>
<ul>
<li>Connaissances HTML / CSS</li>
<li>Vous vous souvenez de vos cours de géométrie ?</li>
<li>Un éditeur CSS / HTL</li>
</ul>
<h2>2°) Un peu de théorie...</h2>
<p>http://www.w3.org/TR/css3-3d-transforms/</p>
<p><strong>Rotation d'un objet : </strong>-moz-transform:  rotate(angle);</p>
<p>Exemple :</p>
<p>-moz-transform:  rotate(30);</p>
<pre><img class="size-full wp-image-691 " title="Propritét CSS Transform rotate - Rotation d'un div de 30°" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/1.2.1-css-transform-rotate.jpg" alt="Propritét CSS Transform rotate - Rotation d'un div de 30°" width="318" height="284" />
<div class="mceTemp">
<dl id="attachment_691" class="wp-caption alignnone" style="width: 328px;">
<dd class="wp-caption-dd">Figure 1.2.1 - Propritét CSS Transform rotate - Rotation d'un div de 30°</dd>
</dl>
</div>

<strong>Redimensionnement 2D axe X et Y d'un objet :</strong> -moz-transform:  scale(sx[, sy]);</pre>
<p>Si [sy] n'est pas renseigné, il aura la même valeur de [sx]</p>
<p>Modifier la perspective : -moz-transform: skew(ax,[ay]);</p>
<p>Permet de modifier l'axe de perspective, vous pouvez également utilsier skewX(deg) et skewY(deg) pour les utiliser indépendament.</p>
<p>Exemple : -moz-transform: skewY(30deg);</p>
<p>Parlons maintenant de la propriété "transform:matrix", il faut comprendre dans Matrix la traduction "matrice". Nous avons une forme géométrique qui est constituée de différents points [a,b,c,d] que nous pouvons manipuler.</p>
<pre>-moz-transform:  matrix(a, c, b, d, tx, ty)

/* Where a, b, c, d construit la transformation de la matrice
   ┌     ┐
   │ a b │
   │ c d │
   └     ┘
   and tx, ty are the translate values.  */
</pre>
<p>Quelques exemples :</p>
<p>.matrix {<br />
width: 200px;<br />
height: 100px;<br />
background: #f5f5f5;<br />
-moz-transform:matrix(1,0,0.6,1,15em,0);<br />
}</p>
<p>Rendu (figure 1.2.3)</p>
<div id="attachment_696" class="wp-caption alignnone" style="width: 303px"><img class="size-full wp-image-696 " title="Rendu de la proprité transform:matrix" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/1.2.3-css3D-matrix1.jpg" alt="Rendu de la proprité transform:matrix" width="293" height="113" /><p class="wp-caption-text">Figure 1.2.3 - Rendu de la proprité transform:matrix</p></div>
<p>Exemple 2 - Retournement d'objet</p>
<p>.matrix {<br />
width: 200px;<br />
height: 100px;<br />
background: #ff8000;<br />
-moz-transform:matrix(-1,0,1.2,1,20em,12em);<br />
}</p>
<p>Résultat (figure 1.2.4) :</p>
<div id="attachment_697" class="wp-caption alignnone" style="width: 391px"><img class="size-full wp-image-697" title="Résultat transform:matrix - retournement d'objet" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/1.2.4-css3D-matrix2.jpg" alt="Résultat transform:matrix - retournement d'objet" width="381" height="147" /><p class="wp-caption-text">Figure 1.2.4 - Résultat transform:matrix - retournement d&#39;objet</p></div>
<p>Exemple 3 : Reflexion</p>
<p>-moz-transform: matrix(1, 0, 0, -1, 0, 0);</p>
<div id="attachment_699" class="wp-caption alignnone" style="width: 218px"><img class="size-full wp-image-699" title="Exemple transform:matrix - Reflexion" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/1.2.5-css3D-reflexion-sample.jpg" alt="Exemple transform:matrix - Reflexion" width="208" height="388" /><p class="wp-caption-text">Figure 1.2.5 - Exemple transform:matrix - Reflexion</p></div>
<p>Autres exemples (non-shématisés) :</p>
<p>Rotation 90° sur la gauche : -moz-transform:matrix(0,-1,1,0,0,0);</p>
<h1>II - Création d'un cube 3D</h1>
<h2>1°) Code HTML de base</h2>
<p>Il faut tout d'abord créer 3 blocs qui nous permettrons de simuler notre cube. Ces 3 blocs seront encadrés par un div global.</p>
<p>Code HTML du cube</p>
<pre class="brush:html">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&gt;
&lt;title&gt;Tutoriel CSS 3D&lt;/title&gt;
&lt;base href="http://localhost/tutos/tuts/css-3D/"/&gt;
&lt;link href="style.css" rel="stylesheet" type="text/css"/&gt;
&lt;/head&gt;
&lt;body&gt;
 &lt;div id="cube"&gt;
 &lt;div id="topSide"&gt;&lt;div&gt;Content&lt;/div&gt;&lt;/div&gt;
 &lt;div id="leftSide"&gt;&lt;div&gt;Content&lt;/div&gt;&lt;/div&gt;
 &lt;div id="rightSide"&gt;&lt;div&gt;Content&lt;/div&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>J'ai également créé un fichier css qui nous permettra de mettre en forme notre cube 3D. Dans un premier temps, j'ai simplement dissocier les blocs.</p>
<p>Code CSS fichier style.css</p>
<pre class="brush:css">#cube {
 position: relative;
 top: 200px;
 margin:0 0 230px 0;
}

#cube .cubeSide{
 height:200px;
 width:200px;
}
#topSide{
 background:#ff8000;
}
#leftSide{ background:#0080c0;}
#rightSide{background:#00ff40;}</pre>
<p>Voici le résultat obtenu (figure 2.1.1) :</p>
<div id="attachment_695" class="wp-caption alignnone" style="width: 216px"><img class="size-full wp-image-695" title="CSS Transform - Cube 3D Etape 1" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/2.1-css3D-etape1.jpg" alt="CSS Transform - Cube 3D Etape 1" width="206" height="575" /><p class="wp-caption-text">Figure 2.1.1  -CSS Transform - Cube 3D Etape 1</p></div>
<p>Maintenant, passons à des choses un peu plus sympa, nous allons appliquer notre propriété "transform" à notre cube :</p>
<pre class="brush:css;first-line:27">.leftFace {
 background: #ff8000;
 -moz-transform: skewY(30deg);
}

.rightFace {
 background: #800080;
 -moz-transform: skewY(-30deg);
}</pre>
<p>Nous avons appliqué ici une propriété "transform:skewY" permettant d'incliner nos div sur leurs axes Y donnant ainsi un effet de perspective.</p>
<div id="attachment_701" class="wp-caption alignnone" style="width: 221px"><img class="size-full wp-image-701" title="Transformation perspective sur l'axe Y - [transform:skewX(val)" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/cube_2.jpg" alt="Transformation perspective sur l'axe Y - [transform:skewX(val)" width="211" height="606" /><p class="wp-caption-text">Figure 2.1.2 - Transformation perspective sur l&#39;axe Y - [transform:skewX(val)</p></div>
<p>Positionner les DIV : Nous devons appliquer un positionnement "absolute" à l'ensemble de nos blocs afin que ceux-ci puissent êtres dissocié et placés indépendament (figure 2.1.3) .</p>
<p>Code CSS : Positionnement des DIV</p>
<pre class="brush:css;first-line:11">.topFace, .leftFace, .rightFace {
position: absolute;
}
</pre>
<div id="attachment_704" class="wp-caption alignnone" style="width: 222px"><img class="size-full wp-image-704" title="Positionnement absolute des blocs" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/cube_3.jpg" alt="Positionnement absolute des blocs" width="212" height="326" /><p class="wp-caption-text">Figure 2.1.3 - Positionnement absolute des blocs</p></div>
<p>Ensuite, nous allons positionner notre bloc right (figure 2.1.4). Il s'agit ici de décaller notre bloc de 200px sur la droite et vers le bas.</p>
<pre class="brush:css;first-line:34;">.rightFace {
 background: #800080;
 -moz-transform: skewY(-30deg);
 top: 200px;
 left: 200px;
}</pre>
<div id="attachment_705" class="wp-caption alignnone" style="width: 401px"><img class="size-full wp-image-705" title="Positionnement du bloc &quot;rightSide&quot;" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/cube_4.jpg" alt="Positionnement du bloc &quot;rightSide&quot;" width="391" height="442" /><p class="wp-caption-text">Figure 2.1.4 - Positionnement du bloc &quot;rightSide&quot;</p></div>
<p>Intéressons nous maintenant à la partie haute, c'est à dire le DIV topSide. C'est la partie la plus compliquée...</p>
<pre class="brush:css;first-line:15;">.topFace {
 -moz-transform: rotate(60deg);
 left: 100px;
 top: 42px;
}

.topFace div {
 background: #0080c0;
 -moz-transform: skewY(-30deg) scaleY(1.16);
}</pre>
<p>Quelques explications : Pour donner cet effet, il est nécessaire de pivoter notre face (-moz-transform: rotate(60deg);), puis nous appliquons une perspective et un redimenssionnement.</p>
<div id="attachment_731" class="wp-caption alignnone" style="width: 394px"><img class="size-full wp-image-731" title="CSS Effet 3D - Cube final" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/cube_6.jpg" alt="CSS Effet 3D - Cube final" width="384" height="472" /><p class="wp-caption-text">Figure 2.1.5 - CSS Effet 3D - Cube final</p></div>
<p>Avec un peu d'habillage, voici le résultat final :</p>
<div id="attachment_732" class="wp-caption alignnone" style="width: 429px"><img class="size-full wp-image-732" title="CSS Effet 3D - Cube Final" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/cube-final.jpg" alt="CSS Effet 3D - Cube Final" width="419" height="468" /><p class="wp-caption-text">Figure 2.1.5 - CSS Effet 3D - Cube Final</p></div>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://sldesign.openwab.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://sldesign.openwab.com/2010/07/27/tutoriel-css-3d-transform/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>SpeedTuts : CSS Image Switcher</title>
		<link>http://sldesign.openwab.com/2010/07/16/speedtuts-css-image-switcher/</link>
		<comments>http://sldesign.openwab.com/2010/07/16/speedtuts-css-image-switcher/#comments</comments>
		<pubDate>Fri, 16 Jul 2010 08:28:36 +0000</pubDate>
		<dc:creator>Steve Leherpeux</dc:creator>
				<category><![CDATA[HTML / CSS]]></category>
		<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[images]]></category>
		<category><![CDATA[SpeedTuts]]></category>

		<guid isPermaLink="false">http://sldesign.openwab.com/?p=595</guid>
		<description><![CDATA[Dans le cadre de ce tutoriel, nous allons voir comment créer un Switcher d&#8217;images uniquement en CSS et sans aucune utilisation de Javascript. Pour cela, nous utiliserons simplement CSS et déclencherons les permutation au survol de lien. Démo 1°) Ce dont nous avons besoin 4 images 1 éditeur de Code HTML  / CSS(j&#8217;utilise Aptana IDE) [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fsldesign.openwab.com%2F2010%2F07%2F16%2Fspeedtuts-css-image-switcher%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fsldesign.openwab.com%2F2010%2F07%2F16%2Fspeedtuts-css-image-switcher%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Dans le cadre de ce tutoriel, nous allons voir comment créer un Switcher d&#8217;images uniquement en CSS et sans aucune utilisation de Javascript. Pour cela, nous utiliserons simplement CSS et déclencherons les permutation au survol de lien.</p>
<p><a title="Démonstration CSS Images Switcher" href="http://samples.openwab.com/css-images-switcher/" target="_blank">Démo</a></p>
<p><span id="more-595"></span></p>
<h2>1°) Ce dont nous avons besoin</h2>
<ul>
<li>4 images</li>
<li>1 éditeur de Code HTML  / CSS(j&#8217;utilise Aptana IDE)</li>
<li>1 fichier HTML</li>
<li>1 fichier CSS</li>
<li>Connaissances de base HTML/CSS</li>
</ul>
<p>2°) Trame html &#8211; création du layout</p>
<p>La première étape consiste à créer un fichier HTML dans lequel nous allons placer nos images et nos liens.J&#8217;ai également lié un fichier CSS à mon document HTML</p>
<p>Code HTML &#8211; Fichier de base HTML</p>
<pre class="brush:html">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&gt;
&lt;title&gt;CSS Image Switcher&lt;/title&gt;
&lt;link href="style.css" rel="stylesheet" type="text/css"/&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;CSS Image Switcher&lt;/h1&gt;

&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Il ne reste plus qu&#8217;à insérer mon contenu, c&#8217;est à dire mes images et mes liens ; J&#8217;utilise des blocs &#8216;&lt;div&gt;&#8217; comme conteneur principal. J&#8217;ai ensuite inséré mes liens pour mes 4 images en veillant à les identifier avec des attributs &laquo;&nbsp;ID&nbsp;&raquo;.</p>
<p>Code HTML &#8211; Création des liens dans le conteneur principal</p>
<pre class="brush:html;first-line:10;">&lt;div id="wrapper"&gt;
 &lt;a id="img1" href="#" title="Image 1"&gt;Image 1&lt;/a&gt;
 &lt;a id="img2" href="#" title="Image 2"&gt;Image 2&lt;/a&gt;
 &lt;a id="img3" href="#" title="Image 3"&gt;Image 3&lt;/a&gt;
 &lt;a id="img4" href="#" title="Image 4"&gt;Image 4&lt;/a&gt;
&lt;/div&gt;</pre>
<h2>3°)Edition du CSS</h2>
<p>Nous allons éditer notre code CSS. Je dispose de 4 images qui ont les mêmes dimensions (256&#215;192). L&#8217;idée est de faire en sorte que les liens se chevauches, il faut donc appliquer une position &laquo;&nbsp;absolute&nbsp;&raquo; à nos liens et lier nos images à nos liens et plus particulièrement les attributs &laquo;&nbsp;ID&nbsp;&raquo; de nos liens.</p>
<p>Voici le code CSS de notre CSS Switcher :</p>
<p>Code CSS :</p>
<pre class="brush:css">/** Conteneur principal */
#wrapper{
 width:256px;
 margin:10px auto;
 position:relative;
}

/** Liens **/
#wrapper a{
 display:block;
 width:256px;
 height:192px;
 position:absolute;
}

/** Liaison des liens et des images */
#img1{background-image:url(img/img1.jpg);}
#img2{background-image:url(img/img2.jpg);}
#img3{background-image:url(img/img3.jpg);}
#img4{background-image:url(img/img4.jpg);}</pre>
<p>Vous pouvez voir le résultat obtenu en figure 3.1.1 :</p>
<div id="attachment_600" class="wp-caption alignnone" style="width: 603px"><img class="size-full wp-image-600" title="3.1.1-css-switcher-resultat" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/3.1.1-css-switcher-resultat.jpg" alt="Résultat après édition des liens" width="593" height="277" /><p class="wp-caption-text">Figure 3.1.1 - Résultat après édition des liens</p></div>
<p>Reste à savoir comment nous allons pouvoir donner un effet de switch au survol de nos liens et comment séparer ces différents liens&#8230;</p>
<p>La première étape va consister à modifier nos liens en englobant nos libellés de lien dans des balises &#8216;&lt;span&gt;&#8217; qui vont nous permettre de réaliser des décalages entre nos liens car, comme vous avez pu le remarquer, nos liens se chevauchent et apparaissent au dessus des images.</p>
<p>Code HTML des liens :</p>
<pre class="brush:html;first-line:10;">&lt;div id="wrapper"&gt;
 &lt;a id="img1" href="#" title="Image 1"&gt;&lt;span&gt;Image 1&lt;/span&gt;&lt;/a&gt;
 &lt;a id="img2" href="#" title="Image 2"&gt;&lt;span&gt;Image 2&lt;/span&gt;&lt;/a&gt;
 &lt;a id="img3" href="#" title="Image 3"&gt;&lt;span&gt;Image 3&lt;/span&gt;&lt;/a&gt;
 &lt;a id="img4" href="#" title="Image 4"&gt;&lt;span&gt;Image 4&lt;/span&gt;&lt;/a&gt;
&lt;/div&gt;</pre>
<p>Nous pouvons maintenant décaler nos liens avec notre feuille de style :</p>
<p>Code CSS des élément &#8216;&lt;span&gt;&#8217; :</p>
<pre class="brush:css;first-line:22;">/** Mise en forme des libellés de liens */
#wrapper a span{
 position:absolute;
 text-align:center;
}

/** Positionnement des libellés de liens */
#img1 span{left:0;top:200px;}
#img2 span{left:128px;top:200px;} /** Décalage 'left' à la moitié du div Wrapper */
#img3 span{left:0;top:225px;}
#img4 span{left:128px;top:225px;} /** Décalage 'left' à la moitié du div Wrapper */</pre>
<p>Notre Switcher prend forme comme vous pouvez le voir en figure 3.1.2 :</p>
<div id="attachment_599" class="wp-caption alignnone" style="width: 566px"><img class="size-full wp-image-599" title="3.1.2-css-switcher-resultat-2" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/3.1.2-css-switcher-resultat-2.jpg" alt="Résultat après édition CSS des libellés de liens" width="556" height="324" /><p class="wp-caption-text">Figure 3.1.2 - Résultat après édition CSS des libellés de liens</p></div>
<p>Reste la dernière étape&#8230; celle qui va déclencher l&#8217;effet de switch  au survol des liens ; pour cela, il existe une propriété CSS très pratique, la propriété &laquo;&nbsp;z-index&nbsp;&raquo;.</p>
<blockquote><p>La propriété de feuille de style css <strong>z-index</strong> permet de spécifier la  position d&#8217;empilement d&#8217;un bloc par rapport aux autres (notion de  profondeur).<br />
La propriété de feuille de style css<strong>z-index</strong> est généralement utilisée pour  la création de calques (Layer).<br />
Le bloc ayant la plus grande valeur est au dessus.</p></blockquote>
<p>Nous avons juste à appliquer cette propriété à l&#8217;attribut CSS :hover de nos liens</p>
<pre class="brush:css;first-line:34;">/** Appliquer le z-index pour l'affichage des images */
a:hover{z-index:1;}</pre>
<p>Le résultat final vous permettra de permuter vos images au survol du lien (figure 3.1.3). Vous pouvez encore améliorer la présentation si vous le souhaitez <img src='http://sldesign.openwab.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<div id="attachment_603" class="wp-caption alignnone" style="width: 503px"><img class="size-full wp-image-603" title="3.1.3-css-switcher-resultat-final" src="http://sldesign.openwab.com/wp-content/uploads/2010/07/3.1.3-css-switcher-resultat-final.jpg" alt="Résultat final" width="493" height="320" /><p class="wp-caption-text">Figure 3.1.3 - Résultat Final</p></div>
<h2>4°) Conclusion</h2>
<p>Vous venez de voir comment créer une permutation d&#8217;images en CSS. Il est vrai que JavaScript se démocratise et que de nombreuses bibliothèques permettent de mettre en place facilement ce type d&#8217;effet. Cela dit, cette méthode CSS reste légére et vous permet de voir en pratique l&#8217;utilisation de la propriété z-index.</p>
<h2>5°) Ressources</h2>
<p><a title="Zone CSS - Propriété z-index" href="http://www.zonecss.fr/style_css/feuille_css_z_index.html" target="_blank">Propriété z-index sur zone CSS</a></p>
<p>Ressource du tutoriel (Images + fichiers HTML et CSS) &#8211; <a title="Archive .zip - Ressources tutoriel" href="http://sldesign.openwab.com/wp-content/uploads/2010/07/css-images-switcher.zip">css-images-switcher.zip</a></p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://sldesign.openwab.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://sldesign.openwab.com/2010/07/16/speedtuts-css-image-switcher/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Les bonnes pratiques du WEB</title>
		<link>http://sldesign.openwab.com/2010/06/24/les-bonnes-pratiques-du-web/</link>
		<comments>http://sldesign.openwab.com/2010/06/24/les-bonnes-pratiques-du-web/#comments</comments>
		<pubDate>Thu, 24 Jun 2010 05:54:06 +0000</pubDate>
		<dc:creator>Steve Leherpeux</dc:creator>
				<category><![CDATA[HTML / CSS]]></category>
		<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[Bonnes pratiques]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>

		<guid isPermaLink="false">http://sldesign.openwab.com/?p=171</guid>
		<description><![CDATA[Je vous propose à travers cet article de mettre en avant les bonnes pratiques du WEB et plus particulièrement lors de la rédaction de notre code HTML. Que vous soyez débutant ou non, il est important de respecter de normes de développement, ceci ne rendra votre travail que plus facile &#8211; Relecture du Code, modification, [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fsldesign.openwab.com%2F2010%2F06%2F24%2Fles-bonnes-pratiques-du-web%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fsldesign.openwab.com%2F2010%2F06%2F24%2Fles-bonnes-pratiques-du-web%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><img class="alignleft size-full wp-image-161" style="margin: 5px;" title="Splash Screen - HTML5" src="http://sldesign.openwab.com/wp-content/uploads/2010/04/splash.jpg" alt="" width="159" height="201" />Je vous propose à travers cet article de mettre en avant les bonnes pratiques du WEB et plus particulièrement lors de la rédaction de notre code HTML. Que vous soyez débutant ou non, il est important de respecter de normes de développement, ceci ne rendra votre travail que plus facile &#8211; Relecture du Code, modification, passassions de projets, etc.</p>
<p><span id="more-171"></span></p>
<hr class="clear_all" />
<h3>1°) Fermez vos balises</h3>
<p>La fermeture des balises est une chose essentielle ! Même si vos balises ne l&#8217;imposent pas, faites le !</p>
<p><strong>Pas bon</strong></p>
<pre class="brush:html">&lt;li&gt;Element 1
&lt;li&gt;Element 2
&lt;li&gt;Element 3</pre>
<p><strong>Bon</strong></p>
<pre class="brush:html">&lt;ul&gt;
 &lt;li&gt;Element 1&lt;/li&gt;
 &lt;li&gt;Element 2&lt;/li&gt;
 &lt;li&gt;Element 3&lt;/li&gt;
&lt;/ul&gt;</pre>
<p>La fermeture des balises est essentielle, ceci vous évitera des problèmes de validation.</p>
<h3>2°) Choisir et renseigner le DOCTYPE</h3>
<blockquote><p>La <strong>Document Type  Definition</strong> (DTD), ou <strong>Définition de Type de Document</strong>,  est un document permettant de décrire un modèle de document SGML ou XML. Le  modèle est décrit comme une grammaire de classe de documents :  <em>grammaire</em> parce qu&#8217;il décrit la position des termes les uns par  rapport aux autres, <em>classe</em> parce qu&#8217;il forme une généralisation  d&#8217;un domaine particulier, et <em>document</em> parce que on peut former  avec un texte complet.</p>
<p>Source Wikipedia.</p></blockquote>
<p>Pour faire court, si votre DOCTYPE n&#8217;est pas correctement renseigné, voir, pas renseigné du tout, il en résultera des problèmes de lecture de vos pages WEB ; On peut cité entre autre des mauvaises interprétations CSS qui on pour effet l&#8217;effet inverse de ce que vous attendez&#8230;</p>
<p>La  plupart d&#8217;entre nous vont choisir entre quatre différents doctypes lors de  la création de nouveaux sites Web.</p>
<ol>
<li><strong>&lt;!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01//EN”  “http://www.w3.org/TR/html4/strict.dtd”&gt;</strong></li>
<li><strong>&lt;!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01  Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd”&gt;</strong></li>
<li><strong>&lt;!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0  Transitional//EN”  “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”&gt;</strong></li>
<li><strong>&lt;!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Strict//EN”  “http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd”&gt;</strong></li>
</ol>
<p>Reste à savoir quel DOCTYPE utiliser&#8230; beaucoup de développeurs vous dirons qu&#8217;il faut utiliser un DOCTYPE XHTML 1.0 Strict mais ceci n&#8217;est pas sans poser de problèmes ; en effet, tous les navigateurs ne réagissent pas encore de la même façon et comme nous créons des IHM (Interfaces Utilisateur), nous devons avant tout penser à l&#8217;utilisateur&#8230;</p>
<p>L&#8217;utilisation d&#8217;un DOCTYPE 4.01 Strict peut s&#8217;avérer la bonne solution de transition. A vous de faire vos test et de vous forger votre propre opinion en fonction de ce que vous attendez. Je vous renvoi vers le site du W3C et celui de &laquo;&nbsp;POMPAGE.NET&nbsp;&raquo; afin que vous puissiez étudier par vous même la situation :</p>
<p><a title="Le DOCTYPE qu'il vous faut" href="http://www.pompage.net/pompe/doctype/">http://www.pompage.net/pompe/doctype/</a></p>
<p><a title="Liste et définition des DOCTYPE" href="http://www.w3.org/QA/2002/04/valid-dtd-list.html">http://www.w3.org/QA/2002/04/valid-dtd-list.html</a></p>
<h3>3°) Pas de CSS dans vos balises WEB</h3>
<p>Ceci peut être tentant d&#8217;ajouter dans vos balises des informations de style :</p>
<pre class="brush:html">&lt;p style="color: blue; font-size: 1em;"&gt;&lt;strong style="color: red;"&gt;Information
importante : &lt;/strong&gt;Il est important de ne pas intégrer des
informations de style dans vos balise !&lt;/p&gt;</pre>
<p>Voici quelques raisons du pourquoi&#8230;</p>
<p>Ne jamais penser au style dans un premier temps, pensez structure.</p>
<p>Pensez aux futures modifications ; ne serait il pas plus aiser de regrouper toutes vos informations de styles dans un même document ?</p>
<p>Mieux vaut référencer vos balises à l&#8217;aide d&#8217;une feuille de style :</p>
<p>Code document HTML</p>
<pre class="brush:css">&lt;p&gt;&lt;strong&gt;Information
importante : &lt;/strong&gt;Il est important de ne pas intégrer des
informations de style dans vos balise !&lt;/p&gt;</pre>
<p>Code document CSS</p>
<pre class="brush:css">p.blue{
 color:blue;
}
p.medium{
 font-size:1em;
}
.red{
 color:red;
}</pre>
<h3>4°) Placez toutes les feuilles de styles dans le header de votre index</h3>
<p>Techniquement,  vous pouvez placer les feuilles de style où vous voulez. Toutefois, la spécification HTML recommande  qu&#8217;ils soient placés dans la balise HEAD du document. Le  principal avantage est que vos pages se chargent plus rapidement et sont stockées en mémoire.</p>
<pre class="brush:html">&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&gt;
&lt;title&gt;slDesign - Bonnes pratiques HTML&lt;/title&gt;
&lt;link href="design/style.css" rel="stylesheet" type="text/css" /&gt;
&lt;link href="js/themes/base/jquery.ui.all.css" rel="stylesheet"
 type="text/css" /&gt;
&lt;/head&gt;</pre>
<h3>5°) Insérez vos fichiers javascript en bas</h3>
<p>JavaScript est un langage interprété par votre navigateur et non pas côté serveur. Afin d&#8217;être sur et certain que vos fonctions JavaScript soient interprétées, il faut s&#8217;assurer avant tout que l&#8217;ensemble du document soit chargé. Ceci peut paraitre basique, mais vos pages sont lues de bas en haut par votre navigateur et si votre navigateur inspecte une fonction JavaScript qui port sur un élément non encore chargé, cette dernière ne pourra s&#8217;exécuter.</p>
<p>Il existe avec jQuery la fonction &laquo;&nbsp;$(document).ready(funcion(){})&nbsp;&raquo; qui s&#8217;assure que la page soit totalement chargé avant l&#8217;exécution de toute autre fonction. Mais si vous ne travaillez pas avec jQuery et que vous avez développé vous même des foncions JavaScript, il est préférable de les lancer en bas de votre document HTML.</p>
<h3>6°) Ne pas utiliser JavaScript en ligne</h3>
<p>Il y a quelques années de cela, la pratique voulait que l&#8217;on insère directement le code JavaScript dans les balises HTML ; Les événement &laquo;&nbsp;onClick&nbsp;&raquo; était suivi de toutes les actions&#8230;</p>
<p>Vous ne  devez jamais faire cela. Au lieu de cela, le transfert de ce code à un fichier externe JS et  l&#8217;utilisation &laquo;&nbsp;addEventListener / attachEvent&nbsp;&raquo; à &laquo;&nbsp;écouter&nbsp;&raquo; pour votre  événement désiré. Ou, si vous utilisez un framework  comme <a href="http://translate.googleusercontent.com/translate_c?hl=fr&amp;sl=en&amp;tl=fr&amp;u=http://www.jquery.com/&amp;rurl=translate.google.fr&amp;usg=ALkJrhi47YgdEuK8hTYkON2CMssxz1EfMQ">jQuery</a> , il suffit d&#8217;utiliser le «clic» méthode.</p>
<pre class="brush:javascript">// Exemple avec jQuery
$(document).ready(function() {
 $("a").click(function() {
  //Ma fonction
 });
});</pre>
<h3>7°) Valider votre code</h3>
<p>Cette étape est très importante. Je vous conseille de la réaliser tout au long de l&#8217;avancement de vos projets et non pas une fois que tout est terminé&#8230;</p>
<p>Des outils présents dans les navigateurs vous permettent de réaliser ce type d&#8217;opération, pour ne citer que l&#8217;add-on de mozilla, il y a la barre d&#8217;outil du développeur qui intègre un module de validation HTML et CSS</p>
<div id="attachment_202" class="wp-caption alignnone" style="width: 966px"><a href="http://sldesign.openwab.com/wp-content/uploads/2010/04/barre-outi-dev.jpg"><img class="size-full wp-image-202" title="barre-outi-dev" src="http://sldesign.openwab.com/wp-content/uploads/2010/04/barre-outi-dev.jpg" alt="Barre d'outils développeur Mozilla" width="956" height="26" /></a><p class="wp-caption-text">Barre d&#39;outils développeur Mozilla</p></div>
<div id="attachment_203" class="wp-caption alignnone" style="width: 310px"><a href="http://sldesign.openwab.com/wp-content/uploads/2010/04/barre-outil-validation.jpg"><img class="size-full wp-image-203" title="barre-outil-validation" src="http://sldesign.openwab.com/wp-content/uploads/2010/04/barre-outil-validation.jpg" alt="Menu de validation de la barre d'outils développeurs" width="300" height="300" /></a><p class="wp-caption-text">Menu de validation de la barre d&#39;outils développeurs</p></div>
<h3>8°) Téléchargez et installer Firebug</h3>
<p>Ce module complémentaire vous permettra de débugger en temps réel vos applications WEB. Cet outil est indispensable, notamment par le fait qu&#8217;il interprète et lit le code généré par JavaScript et Ajax.</p>
<p>Vous trouverez ce module à l&#8217;adresse suivante : <a title="Lien page de éléchargement Firebug" href="https://addons.mozilla.org/fr/firefox/addon/1843">https://addons.mozilla.org/fr/firefox/addon/1843</a></p>
<p><span style="text-decoration: underline;"><strong>Firebug vous permettra entre autre : </strong></span></p>
<ul>
<li>Inspectez HTML et modifier le style et la présentation en  temps réel</li>
<li>Utiliser le débogueur JavaScript le plus avancé  disponible pour n&#8217;importe quel navigateur</li>
<li>Analyser avec précision  l&#8217;utilisation du réseau et la performance</li>
<li>Explorer le DOM</li>
<li>Exécuter JavaScript à la volée</li>
</ul>
<div id="attachment_205" class="wp-caption alignnone" style="width: 763px"><a href="http://sldesign.openwab.com/wp-content/uploads/2010/04/screen-firebug.gif"><img class="size-full wp-image-205" title="screen-firebug" src="http://sldesign.openwab.com/wp-content/uploads/2010/04/screen-firebug.gif" alt="Copie d'écran Firebug" width="753" height="342" /></a><p class="wp-caption-text">Copie d&#39;écran Firebug</p></div>
<p>Ce n&#8217;est pas le tout de l&#8217;installer, encore faudra t-il l&#8217;utiliser&#8230;</p>
<p>Voici une liste de tutoriels portant sur cet outil :</p>
<p><a title="Tutoriel Firebug Site du Zero" href="http://www.siteduzero.com/tutoriel-3-31228-firebug-une-merveille-de-plus-pour-firefox.html">http://www.siteduzero.com/tutoriel-3-31228-firebug-une-merveille-de-plus-pour-firefox.html</a></p>
<p><a title="Tutoriel Firebug Club des décideurs informatique" href="http://eric-pommereau.developpez.com/tutoriels/outil-web/firebug/">http://eric-pommereau.developpez.com/tutoriels/outil-web/firebug/</a></p>
<h3>9°) Editez vos balises HTML en minuscule</h3>
<p>Il n&#8217;y a aucun intérêt à capitaliser vos balises HTML. Dans un souci de relecture veillez à utiliser des minuscules pour vos balises. De même, il n&#8217;est pas interdit d&#8217;utiliser des majuscules dans vos attributs mais pensez avant tout à respecter une logique</p>
<p>Mauvaise pratique</p>
<pre class="brush:html">&lt;DIV id="BLOCDROIT"&gt;
 &lt;!-- Contenu --&gt;
&lt;/DIV&gt;</pre>
<p>Bonne pratique</p>
<pre class="brush:html">&lt;div id="blocDroit"&gt;
 &lt;!-- Contenu --&gt;
&lt;/div&gt;</pre>
<h3>10°) Utilisez les balises &#8216;H&#8217;</h3>
<p>Il existe 6 types de &#8216;Headers&#8217; HTML et il est important de tous les utiliser&#8230; je l&#8217;avoue, j&#8217;utilise essentiellement le 4 premiers <img src='http://sldesign.openwab.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Cela dit, pour  des raisons sémantiques et SEO, forcez vous à utiliser ces balises ; chacune d&#8217;entre elle sera interprétée selon leur importance.</p>
<div id="attachment_206" class="wp-caption alignnone" style="width: 141px"><a href="http://sldesign.openwab.com/wp-content/uploads/2010/04/balises_h.jpg"><img class="size-full wp-image-206" title="Les balises H" src="http://sldesign.openwab.com/wp-content/uploads/2010/04/balises_h.jpg" alt="Liste des balises de header" width="131" height="261" /></a><p class="wp-caption-text">Balises de titres</p></div>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://sldesign.openwab.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://sldesign.openwab.com/2010/06/24/les-bonnes-pratiques-du-web/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CSS3 &#8211; Quelques nouveautés en image</title>
		<link>http://sldesign.openwab.com/2010/04/23/css3-quelques-nouveautes-en-image/</link>
		<comments>http://sldesign.openwab.com/2010/04/23/css3-quelques-nouveautes-en-image/#comments</comments>
		<pubDate>Fri, 23 Apr 2010 05:19:20 +0000</pubDate>
		<dc:creator>Steve Leherpeux</dc:creator>
				<category><![CDATA[HTML / CSS]]></category>
		<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[Tutoriel]]></category>

		<guid isPermaLink="false">http://sldesign.openwab.com/?p=173</guid>
		<description><![CDATA[Je suis persuadé que lorsque vous développez un site WEB, vous avez un multitude de logiciels ouverts sur votre bureau ; encore aujourd&#8217;hui, j&#8217;utilise Gimp pour éditer des images aux coins arrondis. Bientôt, avec CSS3, nous allons pouvoir nous passer d&#8217;éditer certaines images et gagner un temps précieux dans le développement de nos sites. Dans [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fsldesign.openwab.com%2F2010%2F04%2F23%2Fcss3-quelques-nouveautes-en-image%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fsldesign.openwab.com%2F2010%2F04%2F23%2Fcss3-quelques-nouveautes-en-image%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><a href="http://sldesign.openwab.com/wp-content/uploads/2010/04/css3-article.jpg"><img class="alignleft size-full wp-image-146" title="Icone Article CSS3 Gradient" src="http://sldesign.openwab.com/wp-content/uploads/2010/04/css3-article.jpg" alt="Icone de l'article sur CSS 3 et la gestion de dégradés" width="175" height="187" /></a>Je suis persuadé que lorsque vous développez un site WEB, vous avez un multitude de logiciels ouverts sur votre bureau ; encore aujourd&#8217;hui, j&#8217;utilise Gimp pour éditer des images aux coins arrondis. Bientôt, avec CSS3, nous allons pouvoir nous passer d&#8217;éditer certaines images et gagner un temps précieux dans le développement de nos sites.</p>
<p>Dans cet article, je vais vous montrer certaines techniques CSS3 qui vous permettront de changer vos méthodes de travail.</p>
<p><span id="more-173"></span></p>
<h3>CSS3?  What&#8217;s  that?! Qu&#8217;est-ce que c&#8217;est?!</h3>
<p>Je  suis sûr que vous avez entendu parler de CSS en général. CSS3 n&#8217;est pas très différent, en termes de  syntaxe, mais la puissance de CSS3 est beaucoup plus grande. Comme vous le verrez dans ces techniques comment il est possible redimensionner  dynamiquement des éléments, créer des ombres de texte,  et plus encore!</p>
<p>Voici la définition donnée par le W3C de CSS3 :</p>
<blockquote><p>CSS3 est le petit nouveau dans la famille feuille de style. Il offre de nouvelles possibilités intéressantes  pour créer un impact avec vos dessins, vous permet d&#8217;utiliser des  feuilles de style plus variés pour des effets de style beaucoup plus puissants et variés.</p></blockquote>
<h3>1°) Les coins arrondis en CSS3</h3>
<p>Alors qu&#8217;auparavant il était nécessaire de créer des coins arrondis avec des images ou encore utiliser javascript il est désormais possible de faire appel à CSS3 ; Voici le code et le résultat (figure 1) que vous obtiendrez avec la propriété &#8216;border-radius&#8217; :</p>
<pre class="brush:html">&lt;style type="text/css"&gt;
.box {
 background: #e3e3e3;
 border: 1px solid #000; border-radius : 10px;
 width:150px;
 height:150px;
 -moz-border-radius: 10px;
 -webkit-border-radius: 10px;
 border-radius: 10px;
}
&lt;/style&gt;

&lt;div&gt;&lt;!--CONTENT--&gt;&lt;/div&gt;</pre>
<div id="attachment_174" class="wp-caption alignnone" style="width: 226px"><a href="http://sldesign.openwab.com/wp-content/uploads/2010/04/01-corner-radius.jpg"><img class="size-full wp-image-174" title="01-corner-radius" src="http://sldesign.openwab.com/wp-content/uploads/2010/04/01-corner-radius.jpg" alt="Corner radius en CSS3" width="216" height="220" /></a><p class="wp-caption-text">Figure 1 - Résultat obtenu avec la propriété corner radius</p></div>
<p>Vous avez la possibilité de manipuler chacun des coins ; voici un exemple courbant les coins haut gauche et bas droit (figure 2) :</p>
<pre class="brush:html">&lt;style type="text/css"&gt;
.box_2{
 background: #e3e3e3;
 border: 1px solid #000; border-radius : 10px;
 width:150px;
 height:150px;
 -moz-border-radius-topleft: 10px;
 -webkit-border-top-left-radius: 10px;
 -moz-border-radius-bottomright:10px;
 -webkit-border-bottom-right-radius:10px;
}
&lt;/style&gt;
&lt;div&gt;&lt;!--CONTENT--&gt;&lt;/div&gt;</pre>
<div id="attachment_176" class="wp-caption alignnone" style="width: 176px"><a href="http://sldesign.openwab.com/wp-content/uploads/2010/04/02-corner-radius-exemple2.jpg"><img class="size-full wp-image-176" title="02-corner-radius-exemple2" src="http://sldesign.openwab.com/wp-content/uploads/2010/04/02-corner-radius-exemple2.jpg" alt="Border-radius exemple 2" width="166" height="170" /></a><p class="wp-caption-text">Figure 2 - Coins arrondis sur deux angles</p></div>
<h3>2°) Les ombre sur div en CSS3</h3>
<p>Encore une fois CSS3 va nous faire gagner du temps ; fini les DIV superposés et décalés ou encore l&#8217;utilisation de javascript pour générer de belles ombres. La propriété &#8216;box-shadow&#8217; nous permet maintenant de réaliser ce type d&#8217;effet (Figure 3)</p>
<pre class="brush:html">&lt;style type="text/css"&gt;
.box_3 {
 background: #e3e3e3;
 border: 1px solid #000; border-radius : 10px;
 width:150px;
 height:150px;
 box-shadow: 10px 10px 5px #888;
 -moz-box-shadow: 10px 10px 5px #888;
 -webkit-box-shadow: 10px 10px 5px #888;
}
&lt;/style&gt;
&lt;div&gt;&lt;!--CONTENT--&gt;&lt;/div&gt;</pre>
<div id="attachment_177" class="wp-caption alignnone" style="width: 191px"><a href="http://sldesign.openwab.com/wp-content/uploads/2010/04/03-ombre-protée.jpg"><img class="size-full wp-image-177" title="03-ombre-protée" src="http://sldesign.openwab.com/wp-content/uploads/2010/04/03-ombre-protée.jpg" alt="Figure 3 - Ombre portée sur un DIV" width="181" height="178" /></a><p class="wp-caption-text">Figure 3 - Ombre portée sur un DIV</p></div>
<p><span style="text-decoration: underline;"><strong>Voici les propriétés de notre élément &#8216;box-shadow&#8217; :</strong></span></p>
<ol>
<li>Décalage horizontal : en négatif le décalage sera à gauche en positif, il sera à droite</li>
<li>Décalage vertical : négatif il sera vers le haut, positif il sera vers le bas</li>
<li>Rayon de flou : par défaut 0, c&#8217;est à dire aucun.</li>
</ol>
<h3>3°) Les ombres de texte en CSS3</h3>
<p>Voici le code vous pemettant d&#8217;implémenter ce nouvel effet CSS3 ; Vous verrez en figure 4 le résultat, la première ligne sert à montrer la différence entre un texte sans ombre et un second avec :</p>
<pre class="brush:html">&lt;style type="text/css"&gt;
.not-shadowed{
 color:blue;
 font-size:20px;
}
.shadowed{
 color:blue;
 font-size:20px;
 text-shadow: 0 1px 0 #000;
}
&lt;/style&gt;
&lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor...&lt;/p&gt;
&lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor...&lt;/p&gt;</pre>
<div id="attachment_179" class="wp-caption alignnone" style="width: 679px"><a href="http://sldesign.openwab.com/wp-content/uploads/2010/04/04-text-shadow.jpg"><img class="size-full wp-image-179" title="04-text-shadow" src="http://sldesign.openwab.com/wp-content/uploads/2010/04/04-text-shadow.jpg" alt="Résultat CSS3 Text shadow" width="669" height="77" /></a><p class="wp-caption-text">Figure 4 - Text shadow</p></div>
<p>Les propriétés sont les mêmes que pour un DIV.</p>
<h3>4°) Les polices de caractères embarquées :</h3>
<p>Nous en avons rêvé pendant longtemps, CSS3 l&#8217;a fait ! Il est maintenant possible de choisir votre police et de l&#8217;utiliser dans vos pages WEB &#8211; veillez toutefois à faire attention aux droits d&#8217;utilisation, toutes les polices ne sont pas libres de droit. Dans l&#8217;exemple suivant, j&#8217;ai opté pour la police &#8216;LIBRE&#8217;.</p>
<pre class="brush:html">&lt;style type="text/css"&gt;
@font-face {
 font-family: 'libre';
 src: url('design/mido_igual.ttf');
}
.font {
 font-family: libre;
 font-size: 30px;
}
&lt;/style&gt;

&lt;p&gt;Lorem ipsum dolor sit amet...&lt;/p&gt;</pre>
<div id="attachment_181" class="wp-caption alignnone" style="width: 529px"><a href="http://sldesign.openwab.com/wp-content/uploads/2010/04/05-police-embarquée.jpg"><img class="size-full wp-image-181" title="05-police-embarquée" src="http://sldesign.openwab.com/wp-content/uploads/2010/04/05-police-embarquée.jpg" alt="Figure 5 - CSS3 et police embarquée" width="519" height="50" /></a><p class="wp-caption-text">Figure 5 - CSS3 et police embarquée</p></div>
<h3>5°) CSS3 et opacité :</h3>
<p>Vous pouvez maintenant gérer l&#8217;opacité des éléments HTML dans vos feuilles de styles ; Il était déjà possible de réaliser cette opération avec les propriétés CSS &#8216;opacity&#8217; et &#8216;filter&#8217;. Maintenant la tache est plus facile comme vous pouvez le voir :</p>
<pre class="brush:html">&lt;style type="text/css"&gt;
.main-box{
 background:red;
 height:200px;
 width:200px;
 border:1px solid #000;
}
.box_4 {
 height:100px;
 width:100px;
 opacity: .6;
 border:1px solid #000;
 background:#C3C3C3;
 float:left;
 margin-left:150px;
 margin-top:50px;
}
&lt;/style&gt;
&lt;div&gt;
 &lt;div&gt;
 &lt;!--CONTENT--&gt;
 &lt;/div&gt;
&lt;/div&gt;</pre>
<p>La figure 6 vous montre un carré gris dont l&#8217;opacité est fixée à 60% :</p>
<div id="attachment_182" class="wp-caption alignnone" style="width: 282px"><a href="http://sldesign.openwab.com/wp-content/uploads/2010/04/06-opacity.jpg"><img class="size-full wp-image-182" title="06-opacity" src="http://sldesign.openwab.com/wp-content/uploads/2010/04/06-opacity.jpg" alt="Figure 6 - Opacité d'un élément " width="272" height="226" /></a><p class="wp-caption-text">Figure 6 - Opacité d&#39;un élément </p></div>
<h3>6°) Taille des &laquo;&nbsp;background&nbsp;&raquo;</h3>
<p>Il est maintenant possible d&#8217;utiliser la propriété &#8216;background-size&#8217; ; cette propriété sert à fixer la tailles des backgrounds ce qui était jusqu&#8217;alors impossible.</p>
<p>Voici un exemple avec une image dont la taille initiale est de 400px X 566px et ramenée à 50% d&#8217;un div dont les dimensions sont de 200px X 200px :</p>
<pre class="brush:html">&lt;style type="text/css"&gt;
.box_5 {
 height:200px;
 width:200px;
 border:1px solid #000;
 background:#C3C3C3;
 background: #ccc url(medias/img_400x566.png) no-repeat;
 -moz-background-size: 50%; /* Mozilla */
 -webkit-background-size: 50%; /* Safari */
 -o-background-size: 50%; /* Opera */
 -khtml-background-size: 50%; /* Konqueror */
}
&lt;/style&gt;

&lt;div&gt;
 &lt;!--CONTENT--&gt;
&lt;/div&gt;</pre>
<div id="attachment_184" class="wp-caption alignnone" style="width: 227px"><a href="http://sldesign.openwab.com/wp-content/uploads/2010/04/07-background-size.jpg"><img class="size-full wp-image-184" title="07-background-size" src="http://sldesign.openwab.com/wp-content/uploads/2010/04/07-background-size.jpg" alt="Figure 7 - Propriété Background-size" width="217" height="218" /></a><p class="wp-caption-text">Figure 7 - Propriété Background-size</p></div>
<p><strong>Attention !</strong> Le résultat ne sera pas le même sur tous les navigateurs ! Pour exemple, Mozilla conserve les proportions de votre image ce qui n&#8217;est pas le cas sur Chrome&#8230;</p>
<h3>7°) Propriétés columns :</h3>
<p>Voici une propriété qui vous permet de diviser un DIV en plusieurs colonnes. pour cela, il vous suffit d&#8217;en spécifier le nombre.</p>
<pre class="brush:html">&lt;style type="text/css"&gt;
.columns {
 width:600px;
 -moz-column-count: 2;
 -webkit-column-count: 2;
}
&lt;/style&gt;

&lt;div&gt;
 &lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla elementum accumsan mi. Maecenas id dui a magna tempor pretium. Quisque id enim. Proin id tortor. Curabitur sit amet enim vitae quam pharetra imperdiet. Nulla diam ante, pellentesque eu, vestibulum non, adipiscing nec, eros. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Duis a nunc. Donec non dui a velit pulvinar gravida. Nunc rutrum libero vel tortor. Duis sed mi eu metus tincidunt ullamcorper. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. In purus lorem, aliquam ac, congue ac, vestibulum quis, felis. Aliquam non sapien.&lt;/p&gt;
 &lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla elementum accumsan mi. Maecenas id dui a magna tempor pretium. Quisque id enim. Proin id tortor. Curabitur sit amet enim vitae quam pharetra imperdiet. Nulla diam ante, pellentesque eu, vestibulum non, adipiscing nec, eros. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Duis a nunc. Donec non dui a velit pulvinar gravida. Nunc rutrum libero vel tortor. Duis sed mi eu metus tincidunt ullamcorper. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. In purus lorem, aliquam ac, congue ac, vestibulum quis, felis. Aliquam non sapien.&lt;/p&gt;
&lt;/div&gt;</pre>
<div id="attachment_185" class="wp-caption alignnone" style="width: 638px"><a href="http://sldesign.openwab.com/wp-content/uploads/2010/04/08-columns.jpg"><img class="size-full wp-image-185" title="08-columns" src="http://sldesign.openwab.com/wp-content/uploads/2010/04/08-columns.jpg" alt="Figure 8 - Propriété colonnes" width="628" height="313" /></a><p class="wp-caption-text">Figure 8 - Propriété colonnes</p></div>
<p>8°) Bordures &#8216;images&#8217;</p>
<p>Euh&#8230; Comment dire ? l&#8217;utilité de cette nouvelle propriété est contestable mais elle a le mérite d&#8217;exister. Donc, vous allez pouvoir créer des bordures à partir d&#8217;images.</p>
<p>Je ne vais pas m&#8217;étendre sur cette propriété donc passons tout de suite au code et au résultat :</p>
<pre class="brsh:html">&lt;style type="text/css"&gt;
.box_6 {
 height:200px;
 width:200px;
 border-width: 20px;
 -webkit-border-image: url(design/border2.png) 27 round;
 -moz-border-image: url(design/border2.png) 27 round;
 border-image: url(design/border2.png) 27 round;
}
&lt;/style&gt;

&lt;div&gt;
 &lt;!--CONTENT--&gt;
&lt;/div&gt;</pre>
<div id="attachment_186" class="wp-caption alignnone" style="width: 91px"><a href="http://sldesign.openwab.com/wp-content/uploads/2010/04/border2.png"><img class="size-full wp-image-186" title="border2" src="http://sldesign.openwab.com/wp-content/uploads/2010/04/border2.png" alt="Figure 9 - Image source" width="81" height="81" /></a><p class="wp-caption-text">Figure 9 - Image source</p></div>
<div id="attachment_187" class="wp-caption alignnone" style="width: 267px"><a href="http://sldesign.openwab.com/wp-content/uploads/2010/04/09-image-border.jpg"><img class="size-full wp-image-187" title="09-image-border" src="http://sldesign.openwab.com/wp-content/uploads/2010/04/09-image-border.jpg" alt="Figure 10 - Résultat d'une bordure 'image'" width="257" height="255" /></a><p class="wp-caption-text">Figure 10 - Résultat d&#39;une bordure &#39;image&#39;</p></div>
<h3>Les sélecteurs CSS3</h3>
<p>Je n&#8217;ai pas d&#8217;exemple imagé, sachez simplement que de nouveaux sélecteurs font leur arrivée dans vos feuilles de style ; Cela signifie que vous pourrez créer des design encore plus puissants et personnalisés.</p>
<p>Je vous renvoi à l&#8217;excellent article parru sur le site <a href="http://www.456bereastreet.com/archive/200601/css_3_selectors_explained/">www.456bereastreet.com</a></p>
<p>Je réaliserai un post complet à ce sujet dans les jours qui viennent.</p>
<h3>Conclusion</h3>
<p><span onmouseover="_tipon(this)" onmouseout="_tipoff()">Vous venez de consulter quelques techniques CSS qui vous faciliteront le développement de vos interfaces et design WEB.</span> <span onmouseover="_tipon(this)" onmouseout="_tipoff()">Malheureusement, il faudra encore attendre un peu avant que ceci soit réalisable sur tous les navigateurs&#8230; alors pensez utilisateurs et dites vous bien que de nombreuses personnes n&#8217;aurons pas accès à toues ces propriétés.<br />
</span></p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 6503px; width: 1px; height: 1px; overflow: hidden;">
<table>
<caption><span onmouseover="_tipon(this)" onmouseout="_tipoff()">Vue d&#8217;ensemble de la syntaxe CSS 3 Sélecteur</span> </caption>
<thead>
<tr>
<th scope="col"> <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Selector type</span> Sélecteur de type</span></th>
<th scope="col"> <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Pattern</span> Modèle</span></th>
<th scope="col"> <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Description</span> <a href="http://translate.googleusercontent.com/translate_c?hl=fr&amp;sl=en&amp;tl=fr&amp;u=http://www.w3.org/TR/2005/WD-css3-selectors-20051215/&amp;rurl=translate.google.fr&amp;usg=ALkJrhio3IcrAl3wjSeyIm2tFahr3fR9IQ">Description</a></span></th>
</tr>
</thead>
<tbody>
<tr>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Substring  matching attribute selector</span> sélecteur de sous-chaîne  correspondant à l&#8217;attribut</span></td>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">E[att^=”val”]</span> E [^ att = "val"]</span></td>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Matches  any E element whose <code>att</code> attribute value begins with “val”.</span> Correspond à tout élément E dont l&#8217; <code>att</code> valeur de  l&#8217;attribut commence par &laquo;&nbsp;val&nbsp;&raquo;.</span></td>
</tr>
<tr>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Substring  matching attribute selector</span> sélecteur de sous-chaîne  correspondant à l&#8217;attribut</span></td>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">E[att$=”val”]</span> E [att $ = "val"]</span></td>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Matches  any E element whose <code>att</code> attribute value ends with “val”.</span> Correspond à tout élément E dont l&#8217; <code>att</code> valeur de  l&#8217;attribut se termine par &laquo;&nbsp;Val&nbsp;&raquo;.</span></td>
</tr>
<tr>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Substring  matching attribute selector</span> sélecteur de sous-chaîne  correspondant à l&#8217;attribut</span></td>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">E[att*=”val”]</span> E [att *= "val"]</span></td>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Matches  any E element whose <code>att</code> attribute value contains the  substring “val”.</span> Correspond à tout élément E dont l&#8217; <code>att</code> valeur de l&#8217;attribut contient la chaîne &laquo;&nbsp;val&nbsp;&raquo;.</span></td>
</tr>
<tr>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Structural  pseudo-class</span> Structurels pseudo-classe</span></td>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">E:root</span> E: root</span></td>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Matches the document&#8217;s root element.</span> Correspondances élément racine du document.</span> <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">In  HTML, the root element is always the HTML element.</span> En HTML,  l&#8217;élément racine est toujours l&#8217;élément HTML.</span></td>
</tr>
<tr>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Structural  pseudo-class</span> Structurels pseudo-classe</span></td>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">E:nth-child(n)</span> E: nth-child (n)</span></td>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Matches any E element that is the n-th child of  its parent.</span> Correspond à tout élément E qui est l&#8217;enfant n-ième  de son parent.</span></td>
</tr>
<tr>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Structural  pseudo-class</span> Structurels pseudo-classe</span></td>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">E:nth-last-child(n)</span> E: nth-last-child (n)</span></td>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Matches any E element that is the n-th child of  its parent, counting from the last child.</span> Correspond à tout  élément E qui est l&#8217;enfant n-ième de sa mère, à compter du dernier  enfant.</span></td>
</tr>
<tr>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Structural pseudo-class</span> Structurels  pseudo-classe</span></td>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">E:nth-of-type(n)</span> E: nth-of-type (n)</span></td>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Matches  any E element that is the n-th sibling of its type.</span> Correspond à  tout élément E qui est le frère n-ème de sa catégorie.</span></td>
</tr>
<tr>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Structural  pseudo-class</span> Structurels pseudo-classe</span></td>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">E:nth-last-of-type(n)</span> E: nth-last-of-type (n)</span></td>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Matches  any E element that is the n-th sibling of its type, counting from the  last sibling.</span> Correspond à tout élément E qui est le frère n-ème  de sa catégorie, à compter de la fratrie dernier.</span></td>
</tr>
<tr>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Structural  pseudo-class</span> Structurels pseudo-classe</span></td>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">E:last-child</span> E: last-child</span></td>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Matches any E element that is the last child of  its parent.</span> Correspond à tout élément E qui est le dernier enfant  de son parent.</span></td>
</tr>
<tr>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Structural  pseudo-class</span> Structurels pseudo-classe</span></td>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">E:first-of-type</span> E: first-of-type</span></td>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Matches any E element that is the first sibling  of its type.</span> Correspond à tout élément E qui est le premier frère  de son type.</span></td>
</tr>
<tr>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Structural pseudo-class</span> Structurels  pseudo-classe</span></td>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">E:last-of-type</span> E: last-of-type</span></td>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Matches  any E element that is the last sibling of its type.</span> Correspond à  tout élément E qui est le frère dernière de ce type.</span></td>
</tr>
<tr>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Structural  pseudo-class</span> Structurels pseudo-classe</span></td>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">E:only-child</span> E: que l&#8217;enfant</span></td>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Matches any E element that is the only child of  its parent.</span> Correspond à tout élément E qui est le seul enfant de  son parent.</span></td>
</tr>
<tr>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Structural pseudo-class</span> Structurels  pseudo-classe</span></td>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">E:only-of-type</span> E: only-of-type</span></td>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Matches  any E element that is the only sibling of its type.</span> Correspond à  tout élément E qui est le seul frère de son type.</span></td>
</tr>
<tr>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Structural  pseudo-class</span> Structurels pseudo-classe</span></td>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">E:empty</span> E: vide</span></td>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Matches any E element that has no children  (including text nodes).</span> Correspond à tout élément E qui n&#8217;a pas  d&#8217;enfants (y compris les nœuds de texte).</span></td>
</tr>
<tr>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Target  pseudo-class</span> Objectif pseudo-classe</span></td>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">E:target</span> E: l&#8217;objectif</span></td>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Matches an E element that is the target of the  referring URL.</span> Correspond à un élément E qui est la cible de  l&#8217;URL de renvoi.</span></td>
</tr>
<tr>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">UI  element states pseudo-class</span> UI élément Etats pseudo-classe</span></td>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">E:enabled</span> E: activé</span></td>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Matches any user interface element (form  control) E that is enabled.</span> Correspond à tout élément d&#8217;interface  utilisateur (contrôle de formulaire) E qui est activé.</span></td>
</tr>
<tr>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">UI  element states pseudo-class</span> UI élément Etats pseudo-classe</span></td>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">E:disabled</span> E: personnes handicapées</span></td>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Matches  any user interface element (form control) E that is disabled.</span> Correspond à tout élément d&#8217;interface utilisateur (contrôle de  formulaire) E qui est désactivé.</span></td>
</tr>
<tr>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">UI  element states pseudo-class</span> UI élément Etats pseudo-classe</span></td>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">E:checked</span> E: checked</span></td>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Matches any user interface element (form  control) E that is checked.</span> Correspond à tout élément d&#8217;interface  utilisateur (contrôle de formulaire) E qui est vérifiée.</span></td>
</tr>
<tr>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">UI  element fragments pseudo-element</span> élément d&#8217;interface fragments  pseudo-élément</span></td>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">E::selection</span> E:: sélection</span></td>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Matches  the portion of an element E that is currently selected or highlighted  by the user.</span> Correspond à la partie d&#8217;un élément E qui est  actuellement sélectionné ou mis en valeur par l&#8217;utilisateur.</span></td>
</tr>
<tr>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Negation  pseudo-class</span> Négation pseudo-classe</span></td>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">E:not(s)</span> E: pas (s)</span></td>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Matches any E element that does not match the  simple selector s.</span> Correspond à tout élément E qui ne correspond  pas à la simple sélection de l&#8217;art</span></td>
</tr>
<tr>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">General  sibling combinator</span> Générale frère combinateur</span></td>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">E ~ F</span> E ~ F</span></td>
<td><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Matches any F element that is preceded by an E  element.</span> Correspond à tout élément F qui est précédé par un  élément E.</span></td>
</tr>
</tbody>
</table>
</div>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://sldesign.openwab.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://sldesign.openwab.com/2010/04/23/css3-quelques-nouveautes-en-image/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Astuce : Intégrer du son natif grace au HTML 5</title>
		<link>http://sldesign.openwab.com/2010/04/18/astuce-integrer-du-son-natif-grace-au-html-5/</link>
		<comments>http://sldesign.openwab.com/2010/04/18/astuce-integrer-du-son-natif-grace-au-html-5/#comments</comments>
		<pubDate>Sun, 18 Apr 2010 07:26:47 +0000</pubDate>
		<dc:creator>Steve Leherpeux</dc:creator>
				<category><![CDATA[HTML / CSS]]></category>
		<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[Astuce]]></category>
		<category><![CDATA[audio]]></category>
		<category><![CDATA[HTML5]]></category>

		<guid isPermaLink="false">http://sldesign.openwab.com/?p=160</guid>
		<description><![CDATA[Comme Firefox 3.5, Chrome 3, Opera 10.5, et Safari 4, nous pouvons tirer profit de la plupart des nouvelles fonctionnalités de HTML 5, y compris le soutien audio natif sans avoir besoin de Flash. Comme vous le verrez, nous seulement pour créer l&#8217;élément &#60;audio&#62; nouvelle, et a fixé un peu d&#8217;attributs. Dans cette recommandation de [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fsldesign.openwab.com%2F2010%2F04%2F18%2Fastuce-integrer-du-son-natif-grace-au-html-5%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fsldesign.openwab.com%2F2010%2F04%2F18%2Fastuce-integrer-du-son-natif-grace-au-html-5%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><img class="size-full wp-image-161 alignleft" title="Splash Screen - HTML5" src="http://sldesign.openwab.com/wp-content/uploads/2010/04/splash.jpg" alt="" width="156" height="197" />Comme Firefox 3.5, Chrome 3, Opera 10.5, et Safari 4, nous pouvons tirer  profit de la plupart des nouvelles fonctionnalités de HTML 5, y compris  le soutien audio natif sans avoir besoin de Flash. Comme vous le verrez, nous seulement pour créer  l&#8217;élément &lt;audio&gt; nouvelle, et a fixé un peu d&#8217;attributs. Dans cette recommandation de  quatre minutes de vidéo rapide, nous passerons en revue la majoration,  et aussi un moyen rapide pour lire des fichiers audio avec jQuery.</p>
<p><span id="more-160"></span></p>
<h2>L&#8217;élément audio HTML 5</h2>
<pre class="brush:html">&lt;audio autoplay="autoplay" controls="controls"&gt;
 &lt;source src="medias/suhov-skunn.ogg" /&gt;
 &lt;source src="medias/suhov-skunn.mp3" /&gt;
&lt;/audio&gt;
</pre>
<p>L&#8217;élément  audio accepte une poignée d&#8217;attributs, notamment:</p>
<ul>
<li> <strong>autoplay  :</strong> I<strong>Autostart:</strong> joue immédiatement le fichier lors du chargement de la page.</li>
<li> <strong>controls  :</strong> <strong>Contrôles :</strong> Affiche le lecteur sur la page.</li>
<li> <strong>preload  :</strong> <strong>Préchargement :</strong> commence immédiatement mise en mémoire tampon le fichier. (Valeurs = none, auto, les métadonnées)</li>
<li> <strong>src  :</strong> <strong>src:</strong> Le  chemin vers le nom de fichier. C&#8217;est une bonne pratique pour  charger le fichier via l&#8217;enfant &laquo;&nbsp;source&nbsp;&raquo; élément à la place.</li>
</ul>
<p>Mozilla et WEBKIT ne se sont pas entendu en ce qui concerne le format audio ; Mozilla souhaite favoriser le format &#8216;ogg&#8217; tandis que WEBKIT souhaite lire les fichiers au format &#8216;mp3&#8242;. Cela  signifie que, au moins pour le moment, vous devez créer deux versions audio. Je vous recommande  d&#8217;utiliser un outil en ligne simple et rapide, appelé <a href="http://translate.googleusercontent.com/translate_c?hl=fr&amp;sl=en&amp;tl=fr&amp;u=http://media.io/&amp;rurl=translate.google.fr&amp;usg=ALkJrhhab3I19RaqtZksMqZUesNaJRBNzw">Media.io</a> , de convertir vos fichiers MP3 vers le format ogg.</p>
<p>Voici le résultat obtenu par défaut dans un navigateur Firefox (figure 1)</p>
<div id="attachment_164" class="wp-caption alignnone" style="width: 420px"><a href="http://sldesign.openwab.com/wp-content/uploads/2010/04/element-audio-html5.jpg"><img class="size-full wp-image-164" title="element-audio-html5" src="http://sldesign.openwab.com/wp-content/uploads/2010/04/element-audio-html5.jpg" alt="" width="410" height="98" /></a><p class="wp-caption-text">Figure 1 - Rendu lecteur HTML 5 </p></div>
<h2>Implémentation avec jQuery</h2>
<p>Nous allons voir comment il est possible d&#8217;utiliser les propriétés de la balise &#8216;&lt;audio&gt;&#8217; avec jQuery. Vous trouverez ci-dessous le code qui permet de créer un lecteur à partir d&#8217;un lien :</p>
<pre class="brush:html">&lt;script type="text/javascript"&gt;

$(document).ready(function() {
 // Création d'un élément audio, et paramétrages
 var audio = $('&lt;audio&gt;', {
 autoPlay : 'autoplay',
 controls : 'controls'
 });

 //On ajoute les sources (*.ogg et *.mp3)
 addSource(audio, 'medias/suhov-skunn.ogg');
 addSource(audio, 'medias/suhov-skunn.mp3');

 // Initialisation de l'action sur notre lien
 $('.trigger').click(function() {
 // Ajout des éléments dans notre div
 audio.appendTo('#audio');
 // Effet
 $(this).fadeOut('slow');
 return false;
 });

 // Initialise la source
 function addSource(elem, path) {
 $('&lt;source&gt;').attr('src', path).appendTo(elem);
 }

});
&lt;/script&gt;
&lt;!-- Elements HTML --&gt;
&lt;a href="#" title="Ecouter le titre"&gt;suhov-skunn&lt;/a&gt;
&lt;div id="audio"&gt;&lt;/div&gt;</pre>
<p>Cet exemple est volontairement simple, il est juste présent pour vous montrer les différentes possibilités qui s&#8217;offrent à vous ; Nous aurions pu implémenter cet exemple en générant des liens dynamiques depuis un script PHP et définir les sources dans un attribut &#8216;rel&#8217;.</p>
<h2>Compléments</h2>
<p>Tous les navigateurs (selon version et moteur) ne supportent pas cette balise ; n&#8217;oubliez pas de le notifier dans votre tag :</p>
<pre class="brush:javascript">&lt;audio src="mon-fichier.ogg" src="mon-fichier.mp3" controls="controls"&gt;
 Your browser does not support the audio element.
 &lt;/audio&gt;</pre>
<p>Vous pouvez également utiliser le plugin jQuery &laquo;&nbsp;jPlayer&nbsp;&raquo; ; Ce plug-in utilise HTML 5 si Flash n&#8217;est pas pris en charge et fonctionne sur tous les navigateurs.</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://sldesign.openwab.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://sldesign.openwab.com/2010/04/18/astuce-integrer-du-son-natif-grace-au-html-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CSS3 : Dégradés natifs</title>
		<link>http://sldesign.openwab.com/2010/04/16/css3-degrades-natifs/</link>
		<comments>http://sldesign.openwab.com/2010/04/16/css3-degrades-natifs/#comments</comments>
		<pubDate>Fri, 16 Apr 2010 06:54:26 +0000</pubDate>
		<dc:creator>Steve Leherpeux</dc:creator>
				<category><![CDATA[HTML / CSS]]></category>
		<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Dégradé]]></category>
		<category><![CDATA[HTML]]></category>

		<guid isPermaLink="false">http://sldesign.openwab.com/?p=144</guid>
		<description><![CDATA[La création d&#8217;une image uniquement dans le but d&#8217;afficher un gradient est inflexible, et devient rapidement une mauvaise pratique. Malheureusement, au moment d&#8217;écrire ces lignes, ils pourraient très bien être encore nécessaires, mais j&#8217;espère pas pour longtemps. Merci à Firefox et Safari / Chrome, nous pouvons maintenant créer des gradients puissants avec un effort minimal. [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fsldesign.openwab.com%2F2010%2F04%2F16%2Fcss3-degrades-natifs%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fsldesign.openwab.com%2F2010%2F04%2F16%2Fcss3-degrades-natifs%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><img class="alignleft size-full wp-image-146" title="Icone Article CSS3 Gradient" src="http://sldesign.openwab.com/wp-content/uploads/2010/04/css3-article.jpg" alt="Icone de l'article sur CSS 3 et la gestion de dégradés" width="230" height="248" />La création d&#8217;une  image uniquement dans le but d&#8217;afficher un gradient est inflexible, et  devient rapidement une mauvaise pratique. Malheureusement, au moment  d&#8217;écrire ces lignes, ils pourraient très bien être encore nécessaires,  mais j&#8217;espère pas pour longtemps. Merci à Firefox et Safari / Chrome, nous pouvons  maintenant créer des gradients puissants avec un effort minimal. Dans  cet article, nous allons examiner les différentes façon d&#8217;implémenter des dégradés à l&#8217;aide de CSS 3.</p>
<p><span id="more-144"></span></p>
<hr class="clearAll" />
<h2>Introduction :</h2>
<p>Dans cet article, nous allons voir comment implémenter des dégradés en CSS 3 à travers des exemples concret. Les techniques pour réaliser ces opérations ne sont pas les mêmes qu&#8217;il s&#8217;agisse de navigateurs Safari &#8211; Chrome / Firefox. Pour réaliser ces dégradés, j&#8217;ai simplement créé un bloc &#8216;DIV&#8217; avec un id &#8216;gradient&#8217;.</p>
<p>Ce que vous devez savoir : Connaitre les bases du HTML et du CSS</p>
<p>Ce que vous devez avoir : Un éditeur HTML</p>
<h2>Les dégradés CSS sous Mozilla :</h2>
<p>Vous trouverez ci dessous le code qui permet de réaliser un beau dégradé en CSS 3 !</p>
<pre class="brush:css">#gradient{
 border:1px solid #000;
 height:400px;
 width:600px;
 background:#e3e3e3;
 background: -moz-linear-gradient(top, red, green);
}</pre>
<div id="attachment_145" class="wp-caption alignnone" style="width: 644px"><a href="http://sldesign.openwab.com/wp-content/uploads/2010/04/02-css3-gradient.jpg"><img class="size-full wp-image-145" title="Gradient Mozilla" src="http://sldesign.openwab.com/wp-content/uploads/2010/04/02-css3-gradient.jpg" alt="Figure 2 - Gradient CSS sous Mozilla" width="634" height="473" /></a><p class="wp-caption-text">Figure 2 - Gradient CSS sous Mozilla</p></div>
<h2>Les dégradés CSS sous WEBKIT :</h2>
<p>En ce qui concerne l&#8217;implémentation des navigateurs développés sous WEBKIT, la technique est un peu différente. Voici le code :</p>
<pre class="brush:css">#gradient{
 border:1px solid #000;
 height:400px;
 width:600px;
 background:#e3e3e3;
 background: -webkit-gradient(linear, 0 0, 0 100%, from(red), to(blue));
}</pre>
<p>Ne vous inquiétez pas si vous avez un peu plus mal au crane en lisant cette syntaxe (moi aussi&#8230;) mais rien de bien compliqué :</p>
<ul>
<li>Quel  type de gradient? (Linéaire)</li>
<li> Axes X et Y les coordonnées  de l&#8217;endroit où commencer. (0 0 &#8211; ou un  coin en haut à gauche)</li>
<li>Axes X et Y les coordonnées de l&#8217;endroit où la conclusion (0 à 100% &#8211;  ou le coin en bas à gauche)</li>
<li> Quelle couleur pour commencer? (À partir de (rouge))</li>
<li> Quelle est  la couleur de conclure ? (À (bleu))</li>
</ul>
<h2>Les dégradés Partiels :</h2>
<p>Il est possible de mettre en place un dégradé partiel ; je vous livre le code qui vous permettra de réaliser cet effet :</p>
<pre class="brush:css">#gradient{
 border:1px solid #000;
 height:400px;
 width:600px;
 background :#9e7e48;
 /* Navigateurs Safari */
 background: -webkit-gradient(linear, 0 0, 0 10%, from(#672907), to(#9e7e48));
 /* Navigateurs Mozillas */
 background : -moz-linear-gradient(top, #672907, #9e7e48 20%);
}</pre>
<p>Comme vous pouvez le constater, il devient très simple de mettre en place des dégradés dans vos sites WEB !</p>
<div id="attachment_155" class="wp-caption alignnone" style="width: 636px"><a href="http://sldesign.openwab.com/wp-content/uploads/2010/04/03-css3-gradient-partiel.jpg"><img class="size-full wp-image-155" title="CSS3 Dégradé partiel" src="http://sldesign.openwab.com/wp-content/uploads/2010/04/03-css3-gradient-partiel.jpg" alt="" width="626" height="471" /></a><p class="wp-caption-text">Figure 2 - Résultat d&#39;un dégradé partiel</p></div>
<p>Dégradés multiples :</p>
<p>Il es également possible de créer des dégradés à n* couleurs ; Voici comment :</p>
<pre class="brush:css">#gradient{
 border:1px solid #000;
 height:400px;
 width:600px;
 background :#9e7e48;
 /* Navigateurs Safari */
 background: -webkit-gradient(linear, 0 0, 0 100%, from(#672907), color-stop(10%, #5f0000), color-stop(20%, #9e7e48), color-stop(30%, #672907);
 /* Navigateurs Mozillas */
 background: -moz-linear-gradient(top, #672907, #5f0000 10%, #9e7e48 20%, #672907 30%);
}</pre>
<div id="attachment_156" class="wp-caption alignnone" style="width: 634px"><a href="http://sldesign.openwab.com/wp-content/uploads/2010/04/04-css3-gradient-multiples.jpg"><img class="size-full wp-image-156" title="CSS3 Dégradés multiples" src="http://sldesign.openwab.com/wp-content/uploads/2010/04/04-css3-gradient-multiples.jpg" alt="" width="624" height="473" /></a><p class="wp-caption-text">Figure 3 - Dégradé multiple</p></div>
<h2>Informations importantes</h2>
<ul>
<li>Utilisez-les  autant que vous le pouvez.  Même si les utilisateurs de IE auront une couleur unie, je vous encourage à utiliser cette méthode.</li>
<li> IE6/7/8, Opera, Safari 3 et Firefox 3 ne peut pas rendre gradients CSS3.  Firefox et les utilisateurs de Safari sont généralement mis à jour régulièrement, ce qui ne devrait pas poser de problème.</li>
<li> Appliquez toujours une couleur par défaut, la  couleur solide en arrière-plan pour les navigateurs qui ne comprennent pas  les différents préfixes de dégradés.</li>
<li> Ne jamais utiliser un rouge à dégradé bleu, comme  je l&#8217;ai fait pour les exemples (C&#8217;est moche <img src='http://sldesign.openwab.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ).</li>
</ul>
<h2>Ressources :</h2>
<p>Article sur les dégradés sous Mozilla très complet : <a title="Article sur les dégradés Mozilla" href="http://hacks.mozilla.org/2009/11/css-gradients-firefox-36/">http://hacks.mozilla.org/2009/11/css-gradients-firefox-36/</a></p>
<p>CSS références pour Mozilla (en anglais) : <a title="Références CSS Mozilla" href="https://developer.mozilla.org/en/CSS_Reference">https://developer.mozilla.org/en/CSS_Reference</a></p>
<p>CSS références pour WEBKIT (en anglais) : <a title="références css WEBKIT" href="http://webkit.org/projects/css/index.html">http://webkit.org/projects/css/index.html</a></p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://sldesign.openwab.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://sldesign.openwab.com/2010/04/16/css3-degrades-natifs/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

