<?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>CreativeJuiz</title> <atom:link href="http://www.creativejuiz.fr/blog/feed" rel="self" type="application/rss+xml" /><link>http://www.creativejuiz.fr/blog</link> <description>Discussion et tutoriels autour de HTML5, CSS3, jQuery et WordPress</description> <lastBuildDate>Mon, 21 May 2012 06:09:05 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <item><title>WordPress Plugin &#8211;  Afficher vos followers, fans et abonnés sur votre site</title><link>http://www.creativejuiz.fr/blog/wordpress/plugin-afficher-followers-fans-abonnes-sur-votre-site</link> <comments>http://www.creativejuiz.fr/blog/wordpress/plugin-afficher-followers-fans-abonnes-sur-votre-site#comments</comments> <pubDate>Mon, 21 May 2012 06:09:05 +0000</pubDate> <dc:creator>Geoffrey</dc:creator> <category><![CDATA[WordPress]]></category> <category><![CDATA[extension]]></category> <category><![CDATA[facebook]]></category> <category><![CDATA[module]]></category> <category><![CDATA[plugin]]></category> <category><![CDATA[rss]]></category> <category><![CDATA[twitter]]></category> <category><![CDATA[widget]]></category> <guid
isPermaLink="false">http://www.creativejuiz.fr/blog/?p=2556</guid> <description><![CDATA[Le plugin social subscribers counter développé par GeekPress est un outil très simple d&#8217;utilisation qui vous permet d&#8217;afficher à plusieurs endroits de votre site WordPress des statistiques globales des différents réseaux sociaux que vous utilisez. Fonctionnalités Ce plugin est très simple d&#8217;utilisation. Après l&#8217;avoir activé, rendez-vous dans la page de réglages pour renseigner les adresses [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://www.creativejuiz.fr/blog/wp-content/uploads/2012/05/social-subscribers-counter.png" alt="" title="" width="100" height="100" class="alignleft first size-full wp-image-2571" />Le plugin <a
href="http://wordpress.org/extend/plugins/social-subscribers-counter/" title="Télécharger le plugin sur l'extend WordPress" hreflang="en">social subscribers counter</a> développé par <a
href="http://profiles.wordpress.org/GeekPress/" title="Profil développeur de GeekPress sur l'extend WordPress" hreflang="en">GeekPress</a> est un outil très simple d&#8217;utilisation qui vous permet d&#8217;afficher à plusieurs endroits de votre site WordPress des statistiques globales des différents réseaux sociaux que vous utilisez.<span
id="more-2556"></span></p><h4>Fonctionnalités</h4><p>Ce plugin est très simple d&#8217;utilisation.<br
/> Après l&#8217;avoir activé, rendez-vous dans la page de réglages pour renseigner les adresses de vos différentes pages de réseaux sociaux.</p> <figure
id="attachment_2561" aria-labelledby="figcaption_attachment_2561" class="wp-caption aligncenter" style="width: 485px"><img
src="http://www.creativejuiz.fr/blog/wp-content/uploads/2012/05/social-subscribers-settings.png" alt="" title="" width="475" height="315" class="size-full wp-image-2561" /><figcaption
id="figcaption_attachment_2561" class="wp-caption-text">Page de réglages du plugin</figcaption></figure><p>Proposant de compter le nombre de vos followers (abonnés Twitter), fans (abonnés Facebook) et lecteurs (abonnés au flux RSS feedburner), ce plugin ajoute ces chiffres dans l&#8217;administration de votre site WordPress, à la suite de vos statistiques globales.<br
/> Bien entendu, vous n&#8217;êtes pas obligés d&#8217;utiliser tous ces réseaux pour utiliser le plugin.</p> <figure
id="attachment_2560" aria-labelledby="figcaption_attachment_2560" class="wp-caption aligncenter" style="width: 173px"><img
src="http://www.creativejuiz.fr/blog/wp-content/uploads/2012/05/social-subscribers-admin.png" alt="" title="" width="163" height="202" class="size-full wp-image-2560" /><figcaption
id="figcaption_attachment_2560" class="wp-caption-text">Tableau de bord</figcaption></figure><p>On regrettera peut-être l&#8217;absence de couleurs sur ces liens qui permettraient de distinguer plus rapidement les différents réseaux sociaux.</p><p>En plus de vous proposer un affichage des chiffres dans l&#8217;espace d&#8217;administration, un petit module est mis à votre disposition pour un aperçu de ces chiffres directement sur votre site.</p> <figure
id="attachment_2563" aria-labelledby="figcaption_attachment_2563" class="wp-caption aligncenter" style="width: 272px"><img
src="http://www.creativejuiz.fr/blog/wp-content/uploads/2012/05/social-subscribers-widget.png" alt="" title="" width="262" height="292" class="size-full wp-image-2563" /><figcaption
id="figcaption_attachment_2563" class="wp-caption-text">Réglage du widget</figcaption></figure><p>Les réglages de ce module vous permettent d&#8217;afficher une accroche précise pour chacun des réseaux que vous utilisez, en plus du titre classique de module.</p><p>Un thème par défaut accompagne ce plugin et se veut simple et facilement personnalisable.</p> <figure
id="attachment_2562" aria-labelledby="figcaption_attachment_2562" class="wp-caption aligncenter" style="width: 230px"><img
src="http://www.creativejuiz.fr/blog/wp-content/uploads/2012/05/social-subscribers-site.png" alt="" title="" width="220" height="236" class="size-full wp-image-2562" /><figcaption
id="figcaption_attachment_2562" class="wp-caption-text">Thème graphique du module</figcaption></figure><p>Pour les amateurs de CSS, il vous sera possible de personnaliser l&#8217;apparence en écrasant les styles existants directement depuis votre feuille de styles.</p><h4>Évolutions envisageables</h4><p>D&#8217;après ce que j&#8217;ai cru entendre ci et là, l&#8217;auteur pourrait bien ajouter quelques réseaux sociaux à la liste de ceux déjà disponibles.<br
/> Un second thème graphique pourrait également être ajouté (bien que déjà existant :p) et vous permettre, depuis les paramètres du plugins, de choisir entre l&#8217;une ou l&#8217;autre des apparences.</p><p>À suivre donc <img
src='http://www.creativejuiz.fr/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p><p
class="center"><a
href="http://wordpress.org/extend/plugins/social-subscribers-counter/" class="telechargement download" hreflang="en">Télécharger le plugin<br
/>Social Subscribers Counter</a></p><div
class="sources"><h4>Sources et liens utiles</h4><ul><li><a
href="http://geekpress.fr">GeekPress.fr</a></li><li><a
href="http://wordpress.org/extend/plugins/social-subscribers-counter/" hreflang="en">Le plugin Social Subscribers Counter &#8211; WordPress Extend</a></li></ul></div> ]]></content:encoded> <wfw:commentRss>http://www.creativejuiz.fr/blog/wordpress/plugin-afficher-followers-fans-abonnes-sur-votre-site/feed</wfw:commentRss> <slash:comments>7</slash:comments> </item> <item><title>CSS3 &#8211; Créer un slideshow automatique et contrôlable</title><link>http://www.creativejuiz.fr/blog/tutoriels/css3-creer-slideshow-automatique-controlable-transition</link> <comments>http://www.creativejuiz.fr/blog/tutoriels/css3-creer-slideshow-automatique-controlable-transition#comments</comments> <pubDate>Wed, 16 May 2012 06:58:33 +0000</pubDate> <dc:creator>Geoffrey</dc:creator> <category><![CDATA[CSS / CSS3]]></category> <category><![CDATA[Tutoriels]]></category> <category><![CDATA[Veille technologique]]></category> <category><![CDATA[animation]]></category> <category><![CDATA[CSS3]]></category> <category><![CDATA[HTML5]]></category> <category><![CDATA[slideshow]]></category> <category><![CDATA[target]]></category> <category><![CDATA[transition]]></category> <guid
isPermaLink="false">http://www.creativejuiz.fr/blog/?p=2127</guid> <description><![CDATA[Si vous suivez le compte @NoupeMag sur Twitter (ça marche aussi pour mon compte), vous avez certainement vu passer mon slideshow en CSS3 datant de l&#8217;an dernier. Ce n&#8217;était pas ma première tentative de slideshow comme le présentent ces premier et second travaux datant de mai 2010. Ce tutoriel ne s&#8217;adresse pas aux débutants, il [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://www.creativejuiz.fr/blog/wp-content/uploads/2012/03/full-css3-slideshow.png" alt="" title="" width="100" height="100" class="alignleft size-full first wp-image-2549" /> Si vous suivez le compte <a
href="https://twitter.com/NoupeMag">@NoupeMag</a> sur Twitter (ça marche aussi pour <a
href="https://twitter.com/geoffrey_crofte">mon compte</a>), vous avez certainement vu passer mon <a
href="http://creativejuiz.fr/trytotry/juizy-slideshow-full-css3-html5/" hreflang="en">slideshow en CSS3</a> datant de l&#8217;an dernier.<br
/> Ce n&#8217;était pas ma première tentative de slideshow comme le présentent ces <a
href="/trytotry/webdesign-and-slideshow-with-css3/" title="Slideshow manuel en CSS3">premier</a> et <a
href="/trytotry/automatic-slideshow-css3/" title="Slideshow automatique en CSS3">second travaux</a> datant de mai 2010.<span
id="more-2127"></span></p><p
class="message">Ce tutoriel ne s&#8217;adresse pas aux débutants, il vous faudra un minimum de connaissances techniques pour vous y retrouver dans les tronçons de code qui vont suivre. Cependant, le code commenté reste &#8211; je l&#8217;espère &#8211; accessible.</p><h4>Avant propos</h4><p>La page de <a
href="http://creativejuiz.fr/trytotry/juizy-slideshow-full-css3-html5/" hreflang="en">démonstration du slideshow full CSS3</a> vous propose des fichiers sources en téléchargement, profitez-en, notamment si vous souhaitez récupérer les images.</p><p>Les codes CSS fournis ici sont <strong>légèrement différents</strong> de ceux fournis dans l&#8217;archive zippée téléchargeable. En effet, la rédaction du tutoriel que vous allez lire m&#8217;a permis d&#8217;alléger, corriger et améliorer le code disponible en téléchargement. Il fera l&#8217;objet d&#8217;une refonte prochaine.</p><p>Les codes CSS3 présents sur ce tutoriel ne tiennent pas compte des préfixes parfois nécessaires (-webkit-, -moz-, -ms-, -o-) pour une question de gain de place dans le code. Ne les oubliez pas.</p><p
class="center"><img
src="http://www.creativejuiz.fr/blog/wp-content/uploads/2012/03/slideshow-css3-html5-juizy.jpg" alt="" title="" width="600" height="296" class="aligncenter size-full wp-image-2494" /></p><h4 id="log">Les défauts des versions précédentes</h4><p>Comme les expérimentations foireuses sont là pour faire ressortir les limites d&#8217;une technique, voyons ce qui nous manquait dans les versions précédentes (gardez-les sous les yeux pour tester, c&#8217;est mieux).<br
/> Sur la version contrôlable (la première) :</p><ul><li>Un saut de page est visible au clic sur les flèches ;</li><li>Nous sommes obligés de multiplier les éléments (<code
class="element">div</code> pour les conteneurs, <code
class="element">a</code> pour les flèches) ;</li><li>il faut dupliquer des règles CSS à chaque image ajoutée.</li></ul><p>Sur la version automatique (la seconde) :</p><ul><li>Il n&#8217;y a pas de commandes (soit&#8230;)</li><li>Aucune possibilité de stopper l&#8217;animation</li><li>il faut dupliquer des règles CSS à chaque image ajoutée.</li></ul><p>Certains de ces problèmes ne sont pas résolubles, j&#8217;ai décidé de me concentrer sur la fusion des fonctionnalités et sur la correction de certains points :</p><ul><li>Fusionner le slideshow automatique et contrôlable</li><li>Ajouter une commande de stop et lecture de l&#8217;animation</li><li>Limiter la multiplication des éléments</li><li>Virer le saut au clic (grâce à l&#8217;<a
href="http://www.css3create.com/Astuce-Empecher-le-scroll-avec-l-utilisation-de-target">astuce CSS de Vincent De Oliveira</a>)</li></ul><p>Les autres problèmes persisteront, vous le verrez.</p><h4 id="fondations">Poser les fondations</h4><p>Voici du code HTML (HTML5 en l&#8217;occurrence) que j&#8217;espère suffisamment parlant.</p><pre class="code"><code class="html">&lt;section id="slideshow"&gt;
	&lt;div class="container"&gt;
		&lt;div class="c_slider"&gt;&lt;/div&gt;
		&lt;div class="slider"&gt;
			&lt;figure&gt;
				&lt;img src="img/dummy-640x310-1.jpg" alt="" width="640" height="310" /&gt;
				&lt;figcaption&gt;The mirror of soul&lt;/figcaption&gt;
			&lt;/figure&gt;&lt;!--
			--&gt;&lt;figure&gt;
				&lt;img src="img/dummy-640x310-2.jpg" alt="" width="640" height="310" /&gt;
				&lt;figcaption&gt;Let's cross that bridge when we come to it&lt;/figcaption&gt;
			&lt;/figure&gt;&lt;!--
			--&gt;&lt;figure&gt;
				&lt;img src="img/dummy-640x310-3.jpg" alt="" width="640" height="310" /&gt;
				&lt;figcaption&gt;Sushi&lt;em&gt;(do)&lt;/em&gt; time&lt;/figcaption&gt;
			&lt;/figure&gt;&lt;!--
			--&gt;&lt;figure&gt;
				&lt;img src="img/dummy-640x310-4.jpg" alt="" width="640" height="310" /&gt;
				&lt;figcaption&gt;Waking Life&lt;/figcaption&gt;
			&lt;/figure&gt;
		&lt;/div&gt;
	&lt;/div&gt;
	&lt;span id="timeline"&gt;&lt;/span&gt;
&lt;/section&gt;</code></pre><p>Ce code HTML pourrait être simplifié en prenant le risque de complexifier la CSS, mais cette dernière va déjà l&#8217;être suffisamment&hellip;<br
/> Pour faire simple nous avons une section pour le slideshow qui réunie le conteneur des images (<code>.container</code>), la partie qui glisse (<code>.slider</code>), les différentes images légendées (sous forme de <code>figure > figcaption</code>) et la petite barre de défilement du temps (<code>#timeline</code>).</p><p>Pour ceux qui s&#8217;interrogent sur la présence de commentaires HTML, je vous invite à lire cet autre article du blog : <a
href="/blog/tutoriels/display-inline-block-une-valeur-trop-peu-utilisee">Display inline-block, une valeur trop peu utilisée</a>.</p><p>Je n&#8217;ai mis aucun élément de commande pour le moment, nous verrons cela plus tard.</p><p>Voici le code CSS servant principalement à positionner, dimensionner et décorer les différents blocs, que je ne vais pas expliquer dans la mesure où ce n&#8217;est pas le cœur de l&#8217;article, mais il est un minimum commenté <img
src='http://www.creativejuiz.fr/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /></p><pre class="code"><code class="css">#slideshow {
	position: relative;
	width: 640px;
	height: 310px;
	padding: 15px;
	margin: 0 auto 2em;
	border: 1px solid #ddd;
	background: #FFF;
	/* CSS3 effects */
	background: linear-gradient(#FFF, #FFF 20%, #EEE 80%, #DDD);
	border-radius: 2px 2px 2px 2px;
	box-shadow: 0 0 3px rgba(0,0,0, 0.2);
}
&nbsp;
/* avanced box-shadow
&nbsp;* tutorial @
&nbsp;* http://www.creativejuiz.fr/blog/les-tutoriels/ombre-avancees-avec-css3-et-box-shadow
*/
#slideshow:before,
#slideshow:after {
	position: absolute;
	bottom:16px;
	z-index: -10;
	width: 50%;
	height: 20px;
	content: " ";
	background: rgba(0,0,0,0.1);
	border-radius: 50%;
	box-shadow: 0 0 3px rgba(0,0,0, 0.4), 0 20px 10px rgba(0,0,0, 0.7);
}
#slideshow:before {
	left:0;
	transform: rotate(-4deg);
}
#slideshow:after {
	right:0;
	transform: rotate(4deg);
}</code></pre><p
class="center"><img
src="http://www.creativejuiz.fr/blog/wp-content/uploads/2012/03/demo-slideshow-css3-1.jpg" alt="" title="" width="600" height="326" class="aligncenter size-full wp-image-2501" /></p><p>Avec ceci nous avons le support graphique des images. C&#8217;est un peu tout cassé, mais vous pouvez voir comment réaliser simplement un élément qui semble assez complexe, notamment au niveau des ombres et dégradés.<br
/> Gérons le débordement et l&#8217;alignement de tout ce contenu.</p><pre class="code"><code class="css">/* gestion des dimensions et débordement du conteneur */
#slideshow .container {
	position:relative;
	width: 640px;
	height: 310px;
	overflow: hidden;
}
/* on prévoit un petit espace gris pour la timeline */
#slideshow .container:after {
	position:absolute;
	bottom: 0; left:0;
	content: " ";
	width: 100%;
	height: 1px;
	background: #999;
}
/*
   le conteneur des slides
   en largeur il fait 100% x le nombre de slides
*/
#slideshow .slider {
	position: absolute;
	left:0; top:0;
	width: 400%;
	height: 310px;
}
/* annulation des marges sur figure */
#slideshow figure {
	position:relative;
	display:inline-block;
	padding:0; margin:0;
}
/* petit effet de vignette sur les images */
#slideshow figure:after {
	position: absolute;
	display:block;
	content: " ";
	top:0; left:0;
	width: 100%; height: 100%;
	box-shadow: 0 0 65px rgba(0,0,0, 0.5) inset;
}</code></pre><p
class="center"><img
src="http://www.creativejuiz.fr/blog/wp-content/uploads/2012/03/demo-slideshow-css3-2.jpg" alt="" title="" width="600" height="296" class="aligncenter size-full wp-image-2503" /></p><p>Nous voici sur une mise en forme plus propre, les éléments <code
class="element">figure</code> sont placés sur une seule et même ligne et le débordement est caché.<br
/> Il ne nous reste plus qu&#8217;à présenter un peu mieux notre légende qui est actuellement planquée :</p><pre class="code"><code class="css">/* styles de nos légendes */
#slideshow figcaption {
	position:absolute;
	left:0; right:0; bottom: 5px;
	padding: 20px;
	margin:0;
	border-top: 1px solid rgb(225,225,225);
	text-align:center;
	letter-spacing: 0.05em;
	word-spacing: 0.05em;
	font-family: Georgia, Times, serif;
	background: #fff;
	background: rgba(255,255,255,0.7);
	color: #555;
	text-shadow: -1px -1px 0 rgba(255,255,255,0.3);
}</code></pre><p
class="center"><img
src="http://www.creativejuiz.fr/blog/wp-content/uploads/2012/03/demo-slideshow-css3-3.jpg" alt="" title="" width="600" height="99" class="aligncenter size-full wp-image-2504" /></p><p>Et voilà qui est mieux.</p><p>Nous allons maintenant nous occuper de la phase automatique du slideshow.<br
/> Nous verrons dans une troisième partie comment gérer des actions pour contrôler notre slideshow.</p><h4 id="autoslide">Animer notre contenu : phase automatique</h4><p>Cette phase va être quelque peu répétitive puisque nous allons devoir créer un certain nombre d&#8217;animations grâce à la fonction CSS <a
href="http://www.w3.org/TR/css3-animations/" title="Documentation du W3C en anglais" hreflang="en"><code>@keyframes</code></a>. Pour en savoir plus sur les animations, je vous invite à lire la partie &laquo;&nbsp;animation&nbsp;&raquo; de cet <a
href="http://www.alsacreations.com/tuto/lire/1299-timing-des-animations-et-des-transitions-en-css3.html">article sur le timing</a> sur Alsacréations.</p><p>Pour obtenir une animation cohérente tout le long d&#8217;un cycle, vous devez vous poser la question suivante :<br
/> <q>Combien de temps est nécessaire pour la compréhension de chaque slide ?</q></p><p>Bien entendu, la réponse va dépendre du contenu, mais imaginons que nous ayons 4 étapes, pas beaucoup de texte, 6 ou 7 secondes peuvent sembler suffisantes pour chaque étape. Il reste alors à estimer la durée d&#8217;une transition d&#8217;une étape à l&#8217;autre, 1 ou 2 secondes. Avec 8 secondes multipliées par 4, ça nous fait <strong>32 secondes d&#8217;animation</strong> pour boucler un cycle complet.</p><h5 id="container-animation">Animation du conteneur</h5><p
class="center"><img
src="http://www.creativejuiz.fr/blog/wp-content/uploads/2012/03/demo-slideshow-css3-4.jpg" alt="" title="" width="600" height="178" class="aligncenter size-full wp-image-2518" /></p><p>Commençons par animer le bloc qui contient nos images et légendes en le faisant glisser. Pour cela, créons notre animation :</p><pre class="code"><code class="css">/* fonction d'animation, n'oubliez pas de prefixer ! */
@keyframes slider {
	0%, 20%, 100%	{ left: 0 }
	25%, 45%		{ left: -100% }
	50%, 70%		{ left: -200% }
	75%, 95%		{ left: -300% }
}</code></pre><p>Chaque étape est exprimée en pourcentage, aussi 50% signifie que nous en sommes à la 16<sup>ième</sup> seconde de notre animation.<br
/> Si plusieurs étapes ont la même valeur d&#8217;une propriété, ou si vous souhaitez créer un arrêt, il suffit de mettre la valeur sur la même ligne séparer par une virgule.<br
/> Par exemple, sur la première étape, nous avons 0, 20 et 100% qui cohabitent. Cela sous entend que de 0 à 20%, la valeur de <code>left</code> est de 0, nous créons donc un arrêt. Cela signifie aussi que de 95 à 100%, la valeur de <code>left</code> passe de -300% à 0. C&#8217;est un moyen facile de retourner à la valeur initiale pour créer une boucle.</p><p>Nous avons créer l&#8217;animation, il faut maintenant l&#8217;attribuer à notre élément de cette manière :</p><pre class="code"><code class="css">/* complétez le sélecteur : */
#slideshow .slider {
	/* ... avec la propriété animation */
	animation: slider 32s infinite;
}</code></pre><p>Cette syntaxe de la propriété <code>animation</code> est le raccourci de <code>animation-name</code>, <code>animation-duration</code>, <code>animation-iteration-count</code>, dans cet ordre précisément ici.</p><h5 id="timeline-animation">Animation de la ligne de temps</h5><p
class="center"><img
src="http://www.creativejuiz.fr/blog/wp-content/uploads/2012/03/demo-slideshow-css3-5.jpg" alt="" title="" width="600" height="178" class="aligncenter size-full wp-image-2518" /></p><p>Notre petite ligne d&#8217;un pixel de hauteur servant de ligne de temps va être animée sur le même principe.<br
/> Mais avant cela, donnons-lui quelques styles de couleur.</p><pre class="code"><code class="css">#timeline {
	position: absolute;
	background: #999;
	bottom: 15px;
	left: 15px;
	height: 1px;
	background: rgb(214,98,13);
	background: rgba(214,98,13,.8);
	width: 0;
	/* fonction d'animation */
	animation: timeliner 32s infinite;
}</code></pre><p>Il est ainsi placé précisément en tenant compte des marges autour des photos, et nous lui attribuons tout de suite une animation nommée <code>timeliner</code> qu&#8217;il nous faut déclarer comme ceci :</p><pre class="code"><code class="css">@keyframes timeliner {
	0%, 25%, 50%, 75%, 100%	{ width: 0;		}
	20%, 45%, 70%, 90%		{ width: 640px;	}
}</code></pre><p>Ici nous savons que la ligne doit être à son maximum à quatre reprise (avant chaque changement de slide). Il y a donc 4 étapes à 640px (largeur max), et 4 (si on confond 0 et 100) à 0.</p><h5 id="caption-animation">Animation de la légende</h5><p
class="center"><img
src="http://www.creativejuiz.fr/blog/wp-content/uploads/2012/03/demo-slideshow-css3-6.jpg" alt="" title="" width="600" height="178" class="aligncenter size-full wp-image-2518" /></p><p>Même procédé, nous allons faire monter et descendre notre légende à chaque slide.</p><pre class="code"><code class="css">@keyframes figcaptionner {
	0%, 25%, 50%, 75%, 100%						{ bottom: -55px;	}
	5%, 20%, 30%, 45%, 55%, 70%, 80%, 95%		{ bottom: 5px;		}
}</code></pre><p>Puis nous accrochons cette animation à notre élément :</p><pre class="code"><code class="css">/* ajouter à l'élément : */
#slideshow figcaption {
	/* ... la propriété animation */
	animation: figcaptionner 32s infinite;
}</code></pre><p>Je ne sais pas si vous avez vu, mais le vignettage des slides est animé. Comme vous avez compris le principe, je vous laisse vous amuser à trouver le code <img
src='http://www.creativejuiz.fr/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /></p><p>Nous avons désormais un slideshow qui fonctionne en mode automatique.<br
/> Maintenant, voyons comment procéder si l&#8217;on souhaite ajouter des boutons stop/marche, et suivant/précédent, ou &laquo;&nbsp;aller à la slide 3&#8243;, par exemple.</p><h4 id="manuel">Contrôler notre contenu : phase manuelle</h4><p>Lorsque l&#8217;on conçoit un slideshow, il est très recommandé de permettre à l&#8217;utilisateur de stopper l&#8217;animation, soit parce que ça le stresse, soit parce qu&#8217;il veut contempler une des images, soit&hellip; bref, voyons ce qu&#8217;on peut faire !</p><p>Pour rappel, nous n&#8217;avons encore aucun élément HTML pour ces contrôles, nous allons donc les rajouter progressivement.<br
/> Ces éléments de contrôles (des liens) vont cibler des ancres placés &laquo;&nbsp;à côté&nbsp;&raquo; de notre slideshow, en tant que frères indirects.</p><p>Juste avant notre élément <code>#slideshow</code>, placez donc ces éléments <code
class="element">span</code> :</p><pre class="code"><code class="html">&lt;span id="sl_play" class="sl_command"&gt;&lt;/span&gt;
&lt;span id="sl_pause" class="sl_command"&gt;&lt;/span&gt;
&nbsp;
&lt;span id="sl_i1" class="sl_command sl_i"&gt;&lt;/span&gt;
&lt;span id="sl_i2" class="sl_command sl_i"&gt;&lt;/span&gt;
&lt;span id="sl_i3" class="sl_command sl_i"&gt;&lt;/span&gt;
&lt;span id="sl_i4" class="sl_command sl_i"&gt;&lt;/span&gt;</code></pre><p>Ceux-ci ont des classes communes (parfois) qui nous permettrons des actions groupées par la suite.<br
/> Vous comprendrez leur utilité par la suite, ne vous faites pas de souci.</p><h5 id="play-stop-button">Bouton jouer et arrêter</h5><p><img
src="http://www.creativejuiz.fr/blog/wp-content/uploads/2012/03/demo-slideshow-css3-stop.jpg" alt="" title="" width="90" height="90" class="alignleft size-full wp-image-2538" /> Les boutons play et pause peuvent être ajoutés dans la section <code>#slideshow</code>, juste avant notre <code>.container</code>.</p><p>Il n&#8217;y a aucune obligation à les placer précisément ici, il est généralement conseillé de conserver ordre d&#8217;apparition dans le DOM et ordre d&#8217;apparition à la lecture de la page. Là nous allons les placer au milieu (verticalement) du slideshow :</p><pre class="code"><code class="html">&lt;a class="play_commands pause" href="#sl_pause" title="Maintain paused"&gt;Pause&lt;/a&gt;
&lt;a class="play_commands play" href="#sl_play" title="Play the animation"&gt;Play&lt;/a&gt;</code></pre><p>Ces éléments peuvent prendre leur apparence avec quelques lignes de code uniquement, et sont par défaut cachés : ils n&#8217;apparaissent qu&#8217;à certains moments bien précis que nous définirons par la suite.</p><pre class="code"><code class="css">.play_commands {
	/* positionnement en haut à droite */
	position: absolute;
	top: 25px; right: 25px;
	z-index: 10;
	/* dimensionnement des icônes */
	width: 22px;
	height: 22px;
	text-indent: -9999px;
	border:0 none;
	/* placez l'opacité à 1 si vous souhaitez voir les commandes */
	opacity: 0;
	/* préparation de transition sur opacicty et right */
	transition: opacity 1s, right 1s;
}
/* on décale play légèrement sur la gauche */
.play { right: 55px; cursor: default; }
&nbsp;
/* création de l'icône pause avec 2 pseudos éléments */
.pause:after,
.pause:before {
	position: absolute;
	display: block;
	content: " ";
	top:0;
	width:38%;
	height: 22px;
	background: #fff;
	background: rgba(255,255,255,0.5);
}
.pause:after { right:0; }
.pause:before {	left:0; }
&nbsp;
/* création de l'icône play avec des bordures */
.play {
	width: 1px;
	height: 1px;
	/* les transparentes forment la flèche */
	border-top: 10px solid transparent;
	border-bottom: 10px solid transparent;
	border-left: 20px solid #fff;
	border-left: 20px solid rgba(255,255,255,0.5);
	/* renseignez 1 pour voir l'icône de suite */
	opacity: 0;
}
&nbsp;
/* apparition du bouton pause au survole */
/* apparition des boutons au focus */
#slideshow:hover .pause,
.play_commands:focus {
	opacity: 1;
	outline: none;
}</code></pre><p>Voilà, toutes ces lignes pour mettre en place nos deux liens. Ceux qui trouveront plus pertinent de charger des images ou un sprite, je ne leur en voudrais pas.<br
/> C&#8217;est bien, c&#8217;est beau, mais pas fonctionnel.</p><p>Nous allons maintenant utiliser la pseudo classe <code
class="pseudo-class">target</code> pour agir sur notre animation en fonction du bouton que nous aurons cliqué.<br
/> Lorsque pause est cliqué, nous ciblons l&#8217;élément <code>#sl_pause</code>, lorsque lecture est cliqué, c&#8217;est <code>#sl_play</code> qui est ciblé.<br
/> Dans notre scénario, nous n&#8217;afficherons que le bouton utile : pause quand la lecture est effective, play lorsque la pause est en place.</p><pre class="code"><code class="css">/* stopper les animation */
.sl_command:target ~ #slideshow .slider,
.sl_command:target ~ #slideshow figcaption,
.sl_command:target ~ #slideshow #timeline,
.sl_command:target ~ #slideshow .dots_commands li:first-child a:after {
	animation-play-state: paused;
}
&nbsp;
/* redémarrer les animations */
#sl_play:target ~ #slideshow .slider,
#sl_play:target ~ #slideshow figcaption,
#sl_play:target ~ #slideshow #timeline,
#sl_play:target ~ #slideshow .dots_commands li:first-child a:after {
	animation-play-state: running;
}
&nbsp;
/* switch entre les boutons */
.sl_command:target ~ #slideshow .pause 		{ opacity:0; }
#sl_play:target ~ #slideshow:hover .pause,
#sl_play:target ~ #slideshow .pause:focus 	{ opacity:1; }
.sl_command:target ~ #slideshow .play 		{ opacity:1; right: 25px; cursor: pointer; }
#sl_play:target ~ #slideshow .play 			{ opacity:0; right: 55px; cursor: default; }</code></pre><p>Le premier bloc permet de stopper les animations grâce à la propriété <code>animation-play-state</code>. Cette propriété placée à sa valeur <code>paused</code> permet de figer l&#8217;animation.<br
/> Les sélecteurs sont assez spéciaux : <code>.sl_command:target ~ #slideshow .slider</code> permet de cibler &laquo;&nbsp;L&#8217;élément <code>.slider</code> fils de <code>#slideshow</code> lorsque ce dernier est indirectement frère de <code>.sl_command</code>, uniquement lorsque ce dernier est ciblé.&nbsp;&raquo;. Autrement dit : si <code>.sl_command</code> est ciblé, alors on va chercher le frère <code>#slideshow</code> puis son fils <code>.slider</code> pour lui appliquer un stop.<br
/> On procède de la même manière pour les autres éléments (<code>figcaption</code>, <code>#timeline</code> et <code>.dots_commands</code> que nous verrons plus tard dans le bonux) qui ont une animation en route également.<br
/> Pour en savoir plus sur les sélecteurs d&#8217;adjacence indirecte, lisez cet autre article du blog : <a
href="/blog/tutoriels/selecteur-dadjacence-indirecte-en-css3">Sélecteur d&#8217;adjacence indirecte en CSS3</a>.</p><p>Le dernier bloc de code permet d&#8217;afficher les boutons en fonction de situation précise, je vous laisse essayer de décortiquer leur signification.</p><h5 id="bonux-prev-next">Bonux : Les flèches &laquo;&nbsp;suivant&nbsp;&raquo; et &laquo;&nbsp;précédent&nbsp;&raquo;</h5><p><img
src="http://www.creativejuiz.fr/blog/wp-content/uploads/2012/03/demo-slideshow-css3-next.jpg" alt="" title="" width="90" height="90" class="alignleft size-full wp-image-2539" /> Il va nous falloir une paire de liens par étape de notre slideshow en gardant en tête que la flèche de gauche de notre première slide nous permet d&#8217;aller à la dernière, la flèche de droite de notre dernière slide nous permet d&#8217;aller à la première (vous me suivez ?). Lisez les <code>title</code> pour comprendre l&#8217;utilité de chaque flèche. Vous pouvez placer ces liens après nos deux liens pause et lecture.</p><pre class="code"><code class="html">&lt;a class="commands prev commands1" href="#sl_i4" title="Aller à la dernière slide"&gt;&amp;lt;&lt;/a&gt;
&lt;a class="commands next commands1" href="#sl_i2" title="Aller à la 2ème slide"&gt;&amp;gt;&lt;/a&gt;
&lt;a class="commands prev commands2" href="#sl_i1" title="Aller à la 1ère slide"&gt;&amp;lt;&lt;/a&gt;
&lt;a class="commands next commands2" href="#sl_i3" title="Aller à la 3ème slide"&gt;&amp;gt;&lt;/a&gt;
&lt;a class="commands prev commands3" href="#sl_i2" title="Aller à la 2ème slide"&gt;&amp;lt;&lt;/a&gt;
&lt;a class="commands next commands3" href="#sl_i4" title="Aller à la 4ème slide"&gt;&amp;gt;&lt;/a&gt;
&lt;a class="commands prev commands4" href="#sl_i3" title="Aller à la 3ème slide"&gt;&amp;lt;&lt;/a&gt;
&lt;a class="commands next commands4" href="#sl_i1" title="Aller à la 1ère slide"&gt;&amp;gt;&lt;/a&gt;</code></pre><p>C&#8217;est là que la pertinence du markup en prend un coup. Pour des raisons d&#8217;accessibilité (clavier ici) ces liens ne sont peut-être pas des plus utiles et pratiques à utiliser. Est peut-être à envisager l&#8217;ajout de l&#8217;attribut <code>tabindex="-1"</code> pour empêcher le focus sur ces éléments. En effet, nous utiliserons un second système de navigation juste après, qui lui est peut-être plus pertinent.<br
/> Donnons quelques styles à nos boutons et cachons ceux qui ne sont pas utiles.</p><pre class="code"><code class="css">#slideshow .commands {
	position: absolute;
	top: 45%;
	padding: 5px 13px;
	border-bottom:0;
	font-size: 1.3em;
	color: #aaa;
	text-decoration:none;
	background-color: #eee;
	background-image: linear-gradient(#fff,#ddd);
	text-shadow: 0 0 1px #aaa;
	border-radius: 50%;
	box-shadow: 1px 1px 2px rgba(0,0,0,0.2);
}
&nbsp;
#slideshow .prev { left: -48px; }
#slideshow .next { right: -48px; }
&nbsp;
#slideshow .commands { display:none; }
#slideshow .commands1 {	display: block; }</code></pre><p>Très bien, nous avons des flèches&hellip; mais que va-t-on bien pouvoir bouger avec ?<br
/> Sur le même principe que précédemment, nous ciblons l&#8217;un des <code
class="element">span</code> abandonnés en début de code. Si vous cliquez sur une des flèches, pour le moment ça ne fait que stopper l&#8217;animation (oui, tous les <code
class="element">span</code> sont porteurs de la classe <code>.sl_command</code>, rappelez-vous, en en ciblant un, les animations s&#8217;arrête).<br
/> En fonction de l&#8217;élément ciblé, on pourrait stopper l&#8217;animation et changer les valeurs de <code>left</code> pour le slider, de <code>width</code> pour la timeline, et de <code>bottom</code> pour la légende. Ça serait cool hein ?<br
/> Oui mais non, parce qu&#8217;en fait ça ne fonctionne pas : <a
href="/blog/veille-technologique/astuces-html-css-experimentations-parfois-foireuses#keyframes-is-too-strong" title="Expérimentations parfois foireuses en CSS - Article du blog Creative Juiz">les keyframes sont &laquo;&nbsp;prioritaires&nbsp;&raquo;</a>.</p><p>C&#8217;est ce qui nous oblige à compléter notre code HTML légèrement avec ce petit morceau :</p><pre class="code"><code class="html boc-nocontrols boc-nogutter">&lt;div class="c_slider"&gt;&lt;/div&gt;</code></pre><p>Il est <strong>déjà présent dans le code</strong> fourni initialement (premier bloc de cet article).</p><p>Cet élément nous permet d&#8217;appliquer les images en image de fond. Ces mêmes images que nous avons déjà chargé dans le HTML, nous allons les appliquer en background CSS.<br
/> C&#8217;est en faisant bouger ce nouvel élément que nous allons donner l&#8217;illusion d&#8217;un slideshow classique. Je dis bien illusion, car vous aurez compris qu&#8217;ici on se restreint à l&#8217;idée d&#8217;un vrai diaporama, avec des images, et non du contenu textuel qu&#8217;il serait difficile de &laquo;&nbsp;dupliquer&nbsp;&raquo;.</p><pre class="code"><code class="css">#slideshow .c_slider {
	position: absolute;
	left:0; top:0;
	width: 400%;
	height: 310px;
	/* multiple background */
	background: url(img/dummy-640x310-1.jpg) 0 0 no-repeat,
	            url(img/dummy-640x310-2.jpg) 640px 0 no-repeat,
	            url(img/dummy-640x310-3.jpg) 1280px 0 no-repeat,
	            url(img/dummy-640x310-4.jpg) 1920px 0 no-repeat;
	transition: background 1s;
}</code></pre><p>Cette division fournies de quelques images est cachées par la partie principale du diaporama pour le moment. Lorsque nous ciblerons le contenu avec l&#8217;une de nos flèches &laquo;&nbsp;suivant&nbsp;&raquo; ou &laquo;&nbsp;précédent&nbsp;&raquo;, nous cacherons ce diaporama automatique (qui se sera stoppé) pour découvrir nos slides contrôlables qui bougeront en fonction de l&#8217;élément ciblé.<br
/> Vous n&#8217;allez pas m&#8217;aimer&hellip; :</p><pre class="code"><code class="css">/* on cache le slider */
.sl_i:target ~ #slideshow .slider									{ visibility: hidden }
/* on planque la 1ère pastille (cf. bonux suivant) */
.sl_i:target ~ #slideshow .dots_commands li:first-child a:after		{ display:none; }
/* pour afficher la 2ème pastille (cf. bonux suivant) */
.sl_i:target ~ #slideshow .dots_commands li:first-child a:before	{ display:block; }
&nbsp;
/* lorsque on cible le premier slider */
/* on cache tous les "précédent" et "suivant" */
#sl_i1:target ~ #slideshow .commands								{ display: none; }
/* on affiche seulement deux flèches */
#sl_i1:target ~ #slideshow .commands1								{ display: block; }
/* correspond au décalage des images */
#sl_i1:target ~ #slideshow .c_slider								{ background-position: 0 0, 640px 0, 1280px 0, 1920px 0; }
/* on place la pastille tout à gauche */
#sl_i1:target ~ #slideshow .dots_commands li:first-child a:before	{ left:0; }
&nbsp;
/* même procédé lorsqu'on cible le second slide */
#sl_i2:target ~ #slideshow .commands								{ display: none; }
#sl_i2:target ~ #slideshow .commands2								{ display: block; }
#sl_i2:target ~ #slideshow .c_slider								{ background-position: -640px 0, 0 0, 640px 0, 1280px 0; }
#sl_i2:target ~ #slideshow .dots_commands li:first-child a:before	{ left:18px; }
&nbsp;
/* puis le 3ème */
#sl_i3:target ~ #slideshow .commands								{ display: none; }
#sl_i3:target ~ #slideshow .commands3								{ display: block; }
#sl_i3:target ~ #slideshow .c_slider								{ background-position: -1280px 0, -640px 0, 0 0, 640px 0; }
#sl_i3:target ~ #slideshow .dots_commands li:first-child a:before	{ left:36px; }
&nbsp;
/* et enfin le 4ème */
#sl_i4:target ~ #slideshow .commands								{ display: none; }
#sl_i4:target ~ #slideshow .commands4								{ display: block; }
#sl_i4:target ~ #slideshow .c_slider								{ background-position: -1920px 0, -1280px 0, -640px 0, 0 0; }
#sl_i4:target ~ #slideshow .dots_commands li:first-child a:before	{ left:54px; }</code></pre><p>À chaque étape nous déplaçons les images, cachons tous les liens &laquo;&nbsp;précédent&nbsp;&raquo; et &laquo;&nbsp;suivant&nbsp;&raquo; sauf ceux dont on peut avoir besoin, et on déplace la petite pastille de la navigation secondaire (voir bonus qui suit).</p><h5 id="bonux-pagination">Bonux : &laquo;&nbsp;pagination&nbsp;&raquo; pour sauter vers une slide</h5><p><img
src="http://www.creativejuiz.fr/blog/wp-content/uploads/2012/03/demo-slideshow-css3-dots.jpg" alt="" title="" width="90" height="90" class="alignleft size-full wp-image-2546" /> Vous avez certaine souvent vu ces petits points au pied d&#8217;un slideshow qui servent un peu de pagination et qui, parfois, permettent de savoir précisément où on se trouve dans le déroulement des slides.<br
/> Nous allons en créer une. Pour commencer, ajoutons ce code HTML juste après l&#8217;élément <code>timeline</code></p><pre class="code"><code class="html">&lt;ul class="dots_commands"&gt;&lt;!--
	--&gt;&lt;li&gt;&lt;a title="Afficher la slide 1" href="#sl_i1"&gt;Slide 1&lt;/a&gt;&lt;/li&gt;&lt;!--
	--&gt;&lt;li&gt;&lt;a title="Afficher la slide 2" href="#sl_i2"&gt;Slide 2&lt;/a&gt;&lt;/li&gt;&lt;!--
	--&gt;&lt;li&gt;&lt;a title="Afficher la slide 3" href="#sl_i3"&gt;Slide 3&lt;/a&gt;&lt;/li&gt;&lt;!--
	--&gt;&lt;li&gt;&lt;a title="Afficher la slide 4" href="#sl_i4"&gt;Slide 4&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</code></pre><p>Puis, ces quelques lignes de CSS pour donner un style bien propre à nos petits points.<br
/> N&#8217;hésitez pas à agrandir les dimensions si ça vous semble trop petit.</p><pre class="code"><code class="css">.dots_commands  {
	padding:0;
	margin:32px 0 0;
	text-align: center;
}
.dots_commands li {
	display: inline;
	padding:0; margin:0;
}
.dots_commands a {
	position: relative;
	display: inline-block;
	height:8px; width: 8px;
	margin: 0 5px;
	text-indent: -9999px;
	background: #fff;
&nbsp;
	border-radius: 50%;
	box-shadow: 0 1px 2px rgba(0,0,0,0.55) inset;
}
/* quelques styles au focus */
.dots_commands a:focus {
	outline: none;
	background: orange;
}
.dots_commands li:first-child a { z-index: 25; }</code></pre><p>Rien de sorcier ici.<br
/> On s&#8217;assure simplement en dernière ligne que le premier élément ait un z-index supérieur aux autres. Nous allons nous en servir pour l&#8217;animation qui suit.</p><p>Nous allons créer un petit disque par dessus ces puces pour représenter le slide visible par un point d&#8217;une couleur différente. Pour ce faire nous utilisons les pseudo-éléments.</p><pre class="code"><code class="css">/* on style after et before, on utilisera les deux */
.dots_commands li:first-child a:after,
.dots_commands li:first-child a:before {
	position: absolute;
	top: 0; left: 0;
	content: " ";
	width: 8px; height: 8px;
	background: #bd9b83;
	z-index:20;
	border-radius: 50%;
	box-shadow: 0 1px 2px rgba(0,0,0,0.55) inset;
}
/* on anime "after" */
.dots_commands li:first-child a:after {
	animation: dotser 32s infinite;
}
/* on cache "before", on l'utilise uniquement au clic (cf. bonux précédent) */
.dots_commands li:first-child a:before { display:none; }
&nbsp;
/* c'est parti pour l'animation ! */
@keyframes dotser {
	0%, 100% 	{ opacity: 1; left: 0; 		}
&nbsp;
	20%			{ opacity: 1; left: 0;		}
	22%			{ opacity: 0; left: 0;		}
	23%			{ opacity: 0; left: 18px;	}
	25%			{ opacity: 1; left: 18px;	}
&nbsp;
	45%			{ opacity: 1; left: 18px;	}
	47%			{ opacity: 0; left: 18px;	}
	48%			{ opacity: 0; left: 36px;	}
	50%			{ opacity: 1; left: 36px;	}
&nbsp;
	70%			{ opacity: 1; left: 36px;	}
	72%			{ opacity: 0; left: 36px;	}
	73%			{ opacity: 0; left: 54px;	}
	75%			{ opacity: 1; left: 54px;	}
&nbsp;
	95%			{ opacity: 1; left: 54px;	}
	97%			{ opacity: 0; left: 54px;	}
	98%			{ opacity: 0; left: 0;	}
}</code></pre><p>Comme nous l&#8217;avons prévu dans notre bonus précédent, nous n&#8217;avons rien besoin de gérer en plus. Ces liens ciblent les mêmes éléments que nos flèches latérales et ont donc le même effet. (stop de l&#8217;animation et slide contrôlable avec tous les effets qui y sont liés)<br
/> L&#8217;animation peut sembler compliquée, mais c&#8217;est la logique de &laquo;&nbsp;disparition, déplacement, apparition&nbsp;&raquo; multiplié par 4 (4 étapes). Pour information, jusqu&#8217;à très récemment, <a
href="/blog/veille-technologique/astuces-html-css-experimentations-parfois-foireuses#pseudo-element-animated-webkit" title="Article sur les animations des pseudo éléments sous Webkit">Google Chrome avait du mal avec les animations sur before ou after</a>. Je ne sais pas si ça a changé, il me semble.</p><p>Et on en restera là !</p><p
class="center"><a
class="demonstration" href="/trytotry/juizy-slideshow-full-css3-html5/#sl_i1" hreflang="en">Démonstration</a></p><p>Pour être sûr que tout fonctionne, j&#8217;ai effectué un test en suivant ce tutoriel et <strong>en préfixant pour Firefox</strong> uniquement, voici le résultat : <a
href="/blog/doc/slideshow-full-css3/">Slideshow Full CSS3</a>.</p><p
class="message">Lors de la rédaction de ce tutoriel certains éléments comme les infobulles ou le vignettage animés ont été volontairement omis pour alléger le contenu. Si certaines portions de ce tutoriel restent pour vous un mystère à cause d&#8217;un manque d&#8217;explications, l&#8217;espace de commentaires est là pour vous <img
src='http://www.creativejuiz.fr/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p><h4>Analyse personnelle</h4><p>Ce qui est bloquant est gourmand en lignes de code ici, c&#8217;est la volonté de vouloir fusionner système automatique et système contrôlable au clavier, souris ou même touché.</p><p>Ce slideshow date de novembre 2011, les techniques se sont multipliées, il existe d&#8217;autres solutions full CSS3 passant par l&#8217;utilisation détournée des éléments <code
class="element">label</code> et <code
class="element">input</code> de type <code>radio</code>. En contrôlant la valeur de la coche avec la pseudo-classe <code
class="pseudo-class">checked</code> il est possible d&#8217;agir sur les éléments, de la même manière que nous le faisons ici avec la pseudo-classe <code
class="pseudo-class">target</code>.</p><p>Je vous invite à regarder ce qui peut se faire ailleurs, comme par exemple sur ce <a
href="http://csscience.com/responsiveslidercss3/" title="Slideshow adaptable en CSS3 (anglais)" hreflang="en">Slideshow Full CSS3 Responsive</a>.</p><p>L&#8217;espace de commentaires est à vous !</p><div
class="sources"><h4>Sources et liens utiles</h4><ul><li><a
href="/trytotry/juizy-slideshow-full-css3-html5/#sl_i1" hreflang="en" title="Slideshow Full CSS3, démonstration du tutoriel">Slideshow full CSS3 &#8211; Démonstration</a></li><li><a
href="/blog/veille-technologique/astuces-html-css-experimentations-parfois-foireuses#keyframes-is-too-strong" title="Expérimentations parfois foireuses en CSS - Article du blog Creative Juiz">les keyframes sont &laquo;&nbsp;prioritaires&nbsp;&raquo;</a></li><li><a
href="http://csscience.com/responsiveslidercss3/" title="Slideshow adaptable en CSS3 (anglais)" hreflang="en">Slideshow Full CSS3 Responsive</a></li><li><a
href="http://www.w3.org/TR/css3-animations/" hreflang="en">CSS3 Animations &#8211; W3C</a></li></ul></div> ]]></content:encoded> <wfw:commentRss>http://www.creativejuiz.fr/blog/tutoriels/css3-creer-slideshow-automatique-controlable-transition/feed</wfw:commentRss> <slash:comments>13</slash:comments> </item> <item><title>Le blog a deux ans !</title><link>http://www.creativejuiz.fr/blog/actualites-diverses/le-blog-a-deux-ans</link> <comments>http://www.creativejuiz.fr/blog/actualites-diverses/le-blog-a-deux-ans#comments</comments> <pubDate>Sun, 06 May 2012 22:03:49 +0000</pubDate> <dc:creator>Geoffrey</dc:creator> <category><![CDATA[Le Blog, et blabla]]></category> <category><![CDATA[anniversaire]]></category> <category><![CDATA[blog]]></category> <category><![CDATA[chiffres]]></category> <category><![CDATA[creativejuiz]]></category> <guid
isPermaLink="false">http://www.creativejuiz.fr/blog/?p=2484</guid> <description><![CDATA[Cela fait maintenant deux années que le blog Creative Juiz vous propose des articles sur les technologies du web et le web design. Cette activité aussi passionnante que chronophage a amené un certain nombre de discussions ici, sur Twitter, ou sur les autres réseaux sociaux. C&#8217;est ce type d&#8217;interactions et de participations qui me donne [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://www.creativejuiz.fr/blog/wp-content/uploads/2012/05/anniversaire.jpg" alt="" title="" width="100" height="100" class="alignleft first size-full wp-image-2488" /> Cela fait maintenant deux années que le blog Creative Juiz vous propose des articles sur les technologies du web et le web design. Cette activité aussi passionnante que chronophage a amené un certain nombre de discussions ici, sur Twitter, ou sur les autres réseaux sociaux.<span
id="more-2484"></span></p><p>C&#8217;est ce type d&#8217;interactions et de participations qui me donne envie de continuer à écrire et à partager avec vous. Ce sont ces discussions qui permettent de générer de nouvelles idées, d&#8217;améliorer celles existantes, et bannir les mauvaises pratiques.</p><p>J&#8217;ai rencontré des lecteurs du blog lors de la dernière <a
href="http://kiwiparty.fr">conférence web KiwiParty</a>. Cette brève rencontre m&#8217;a rassuré et encouragé (merci les gars) à continuer à écrire dans l&#8217;idée de contribuer &#8211; à ma manière &#8211; au web francophone (mais pas uniquement).</p><h4>Quelques chiffres</h4><p>Sans prétention aucune, et comme je l&#8217;ai fait l&#8217;<a
href="http://www.creativejuiz.fr/blog/actualites-diverses/le-blog-fete-sa-premiere-annee">an dernier</a>, je vous donne quelques chiffres pour le fun&nbsp;:</p><p>Les chiffres précis&nbsp;:</p><ul><li>138 articles <em>(1 article tous les 5 jours)</em></li><li>722 commentaires <em>(1 commentaire par jour)</em></li><li>10 catégories d’articles (2 nouvelles dans l&#8217;année)</li></ul><p>Les moins précis</p><ul><li>750 visites (650 uniques) quotidiennes</li><li>47000 pages vues en moyenne par mois</li><li>plus de 230 mentions dans des blogs de référence (français, anglophones, chinois, japonais)</li><li>5200ème blog Français (<a
href="http://www.alexa.com/siteinfo/creativejuiz.fr">Alexa rank</a>)</li><li>une centaine de contacts par e-mail</li><li>une vingtaine de corrections d&#8217;articles grâce aux intervenants (merci !)</li></ul><h4>À venir</h4><p>J&#8217;en profite également pour annoncer une refonte complète du blog courant de l&#8217;année (oui c&#8217;est vague) qui aura pour objectifs principaux de revoir la navigation aux travers des différentes thématiques phares du blog, mais également d&#8217;optimiser l&#8217;interface et le chargement du blog sur les différents terminaux (mobiles, tablettes, mini-pc, pc, etc.)<br
/> La newsletter devrait également être mise plus en avant dans les mois à venir (les inscriptions sont ouvertes si ça vous dit, il suffit de compléter le formulaire dans la petite colonne latérale).<br
/> Bref, tout plein de choses qui vont arriver progressivement dans le but de vous offrir un contenu de bonne qualité, je l&#8217;espère.</p><p>N&#8217;hésitez donc pas à profiter de l&#8217;occasion pour critiquer les points qui semblent ne pas vous convenir sur ce blog.</p><h4>Merci</h4><p>Je vais avoir du mal à être aussi précis que l&#8217;an dernier dans mes remerciements, par peur d&#8217;avoir une liste trop longue de personnes à remercier, par peur également d&#8217;oublier des personnes,  alors merci à tous pour vos commentaires, encouragements et contributions.</p><p>Merci à vous pour cette troisième année que nous entamons ensemble !</p> ]]></content:encoded> <wfw:commentRss>http://www.creativejuiz.fr/blog/actualites-diverses/le-blog-a-deux-ans/feed</wfw:commentRss> <slash:comments>6</slash:comments> </item> <item><title>WordPress &#8211; personnaliser les champs du formulaire de commentaire</title><link>http://www.creativejuiz.fr/blog/tutoriels/wordpress-personnaliser-champs-formulaire-commentaire</link> <comments>http://www.creativejuiz.fr/blog/tutoriels/wordpress-personnaliser-champs-formulaire-commentaire#comments</comments> <pubDate>Wed, 02 May 2012 06:56:53 +0000</pubDate> <dc:creator>Geoffrey</dc:creator> <category><![CDATA[Tutoriels]]></category> <category><![CDATA[WordPress]]></category> <category><![CDATA[astuce]]></category> <category><![CDATA[commentaire]]></category> <category><![CDATA[hook]]></category> <guid
isPermaLink="false">http://www.creativejuiz.fr/blog/?p=2059</guid> <description><![CDATA[WordPress possède un formulaire de commentaire adapté à la plupart des blogs. Cependant, comment s&#8217;y prendre si vous souhaitez ajouter ou supprimer des champs et personnaliser l&#8217;affichage des commentaires ? WordPress prévoit la possibilité de personnaliser le formulaire de commentaire grâce à la fonction comment_form( $args, $post_id ), cette fonction est intéressante mais quelque peu [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://www.creativejuiz.fr/blog/wp-content/uploads/2012/02/custom-comment-wordpress.png" alt="" title="" width="100" height="100" class="aligncenter first size-full wp-image-2473" /> WordPress possède un formulaire de commentaire adapté à la plupart des blogs. Cependant, comment s&#8217;y prendre si vous souhaitez ajouter ou supprimer des champs et personnaliser l&#8217;affichage des commentaires ?<span
id="more-2059"></span></p><p>WordPress prévoit la possibilité de personnaliser le formulaire de commentaire grâce à la fonction <code><a
href="http://codex.wordpress.org/Function_Reference/comment_form">comment_form( $args, $post_id )</a></code>, cette fonction est intéressante mais quelque peu limitée. Nous allons plutôt aborder quelques crochets (hooks) s&#8217;y rapprochant.</p><p>Concrètement, il faut procéder en trois étapes :</p><ul><li>insérer ou supprimer un champ dans le formulaire</li><li>permettre l&#8217;insertion des données renseignées dans la base de données</li><li>afficher les nouvelles données dans les commentaires</li></ul><p>Je vous invite à éditer votre fichier <code>functions.php</code> pour effectuer des tests avec les codes que je vais fournir.<br
/> Allez, c&#8217;parti !</p><h4>Insérer et supprimer des champs dans le formulaire de commentaire</h4><p>Cette première étape va utiliser le hook <code>comment_form_defaults</code> et se présente sous la forme d&#8217;une manipulation de tableau PHP.<br
/> Les champs sont enregistrés dans l&#8217;entrée &laquo;&nbsp;fields&nbsp;&raquo; du tableau et peuvent être manipulés assez simplement. Ils contiennent du code HTML que nous allons reproduire pour nos champs personnalisés.</p><pre class="code"><code class="php">add_filter( 'comment_form_defaults', 'juiz_manage_default_fields');
&nbsp;
// $default contient tous les messages du formulaire de commentaire
// il contient également "comment_field", le textarea du message
&nbsp;
if ( !function_exists('juiz_manage_default_fields')) {
   function juiz_manage_default_fields( $default ) {
&nbsp;
      // Récupération des infos connues sur le visiteur
      // Permet de pré-remplir nos nouveaux champs
&nbsp;
      $commenter = wp_get_current_commenter();
&nbsp;
      // Suppression d'un champ par défaut parmi : author, email, url
&nbsp;
      unset ( $default['fields']['url'] );
&nbsp;
      // Ajout des champs dans le tableau "fields"
      // $commenter[] contient les infos sur le visiteur
&nbsp;
      $default['fields']['job'] = '&lt;p class="comment-form-author-job comment-form-author"&gt;
      &lt;label for="job"&gt;'. __('Your job') . '&lt;/label&gt;
      &lt;span class="required"&gt;*&lt;/span&gt;
      &lt;input id="job" name="job" value="'.$commenter['comment_author_job'].'" aria-required="true" size="30" type="text" /&gt;
      &lt;/p&gt;';
&nbsp;
      $sel_female = $sel_male = '';
      if ( $commenter['comment_author_gender'] != '') ${'sel_'.$commenter['comment_author_gender']} = ' checked="checked"';
&nbsp;
      $default['fields']['gender'] = '&lt;p class="comment-form-author-gender"&gt;
      &lt;span class="label_like"&gt;'. __('Your gender') . '&lt;/span&gt;
      &lt;label for="female"&gt;F&lt;/label&gt; &lt;input '. $sel_female .' id="female" name="gender" value="female" type="radio" /&gt;
      &lt;label for="male"&gt;M&lt;/label&gt; &lt;input '. $sel_male .' id="male" name="gender" value="male" type="radio" /&gt;
      &lt;/p&gt;';
&nbsp;
      // On retourne le tableau des champs
&nbsp;
      return $default;
   }
}</code></pre><p>Quelques explications s&#8217;imposent :<br
/> Concernant le HTML produit, je copie et adapte la structure par défaut de mon thème sur les champs de formulaire (ici TwentyEleven) dans le but de limiter les modifications futures sur la CSS (d&#8217;où la copie de la classe <code>comment-form-author</code> sur <code>comment-form-author-job</code>).</p><p
class="center"><img
src="http://www.creativejuiz.fr/blog/wp-content/uploads/2012/02/before-after-commentaire-wordpress.png" alt="" title="" width="596" height="939" class="noborder aligncenter size-full wp-image-2464" /></p><p>Le tableau des champs (fields) ressemble à cela :</p><pre class="code"><code class="php boc-nogutter boc-nocontrols">array(
   'author' =&gt; '&lt;p class="comment-form-author"&gt;&hellip;',
   'email'  =&gt; '&lt;p class="comment-form-email"&gt;&hellip;',
   'url'    =&gt; '&lt;p class="comment-form-url"&gt;&hellip;'
);</code></pre><p>Pour ajouter un champ il me suffit donc de faire (en remplaçant &laquo;&nbsp;slug&nbsp;&raquo; par quelque chose de pertinent) :</p><pre class="code"><code class="php boc-nogutter boc-nocontrols">$default['fields']['slug'] = '&lt;p class="comment-form-author-slug"&gt;&hellip;';</code></pre><p>La ligne 12 récupère les cookies enregistrés lorsque qu&#8217;un commentaire est posté par un utilisateur. Ils n&#8217;existent donc pas lorsqu&#8217;un visiteur n&#8217;a jamais commenté sur votre blog, mais permettent ensuite de pré-remplir les champs (ligne 26 et 30) si l&#8217;utilisateur revient poster un commentaire.<br
/> Nous verrons plus loin comment nous enregistrons les cookies pour nos nouveaux champs de formulaire.</p><p><strong>À noter</strong> : Il existe le hook <code>comment_form_defaults_fields</code> qui permet de manipuler directement les champs (ex : <code>unset($default['url']</code>). Cependant j&#8217;ai une légère préférence pour le hook <code>comment_form_defaults</code> car il permet d&#8217;atteindre d&#8217;autres éléments du formulaire.<br
/> Par contre, si votre objectif est de supprimer simplement le champ url par exemple :</p><pre class="code"><code class="php boc-nocontrols boc-nogutter">add_filter('comment_form_default_fields','juiz_remove_url_field');
if ( !function_exists('juiz_remove_url_field')) {
   function juiz_remove_url_field( $fields ) {
      unset($fields['url']); return $fields;
   }
}</code></pre><h4>Enregistrer les données des champs personnalisés</h4><p>Cette seconde étape se découpe en deux sous-étapes si certains de vos champs sont obligatoires.<br
/> Le premier hook utilisé est <code>comment_post</code> qui permet d&#8217;intervenir lorsque le commentaire a été enregistré.<br
/> Le second est <code>preprocess_comment</code> qui intervient avant l&#8217;enregistrement des données en base, notamment pour les contrôler.</p><p>Nous allons donc d&#8217;abord contrôler notre champ obligatoire &#8216;job&#8217; pour retourner une erreur s&#8217;il est vide :</p><pre class="code"><code class="php boc-nocontrols boc-nogutter">add_filter( 'preprocess_comment', 'juiz_verify_comment_data' );
if ( !function_exists('juiz_verify_comment_data') ) {
   function juiz_verify_comment_data( $commentdata ) {
&nbsp;
      // si job est vide on affiche une erreur
      if ( ! isset( $_POST['job'] ) )
         wp_die( __( 'Error: please fill the required field (job).' ) );
&nbsp;
      // si job dépasse 45 caractères (arbitraire) on affiche une erreur
      elseif ( isset( $_POST['job'] ) AND strlen ( $_POST['job'] ) > 45 )
         wp_die( __( 'Error: 45 maximum char. for "job" field.' ) );
&nbsp;
      return $commentdata;
   }
}</code></pre><p
class="center"><img
src="http://www.creativejuiz.fr/blog/wp-content/uploads/2012/02/error-45-max.png" alt="" title="" width="600" height="85" class="aligncenter size-full wp-image-2465" /></p><p>Une fois la donnée obligatoire contrôlée, nous enregistrons les données du commentaire :</p><pre class="code"><code class="php boc-nocontrols boc-nogutter">add_action( 'comment_post', 'juiz_save_comment_data' );
if ( !function_exists('juiz_save_comment_data') ) {
   function juiz_save_comment_data( $comment_id ) {
&nbsp;
      // définition de la durée de vie des cookies
      $comment_cookie_lifetime = apply_filters('comment_cookie_lifetime', 30000000);
&nbsp;
      if (isset($_POST['job'])) {
&nbsp;
         // on enregistre l'info en base de données
         add_comment_meta( $comment_id, 'job', esc_html( $_POST['job'] ) );
&nbsp;
         // on enregistre un cookie
         setcookie('comment_author_job_' . COOKIEHASH, esc_html( $_POST['job'] ), time() + $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN);
      }
&nbsp;
      // on vérifie que le champ gender respecte les valeurs prévues
      if (isset($_POST['gender']) AND in_array ( $_POST['gender'] , array('male', 'female'))) {
         // même schéma que précédemment
         add_comment_meta( $comment_id, 'gender', esc_html($_POST['gender']) );
         setcookie('comment_author_gender_' . COOKIEHASH, esc_html( $_POST['gender']), time() + $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN);
      }
   }
}</code></pre><p>Le cookie est optionnel mais il permet de reproduire le comportement de WordPress qui ajoute un cookie par champ du formulaire de commentaire pour se souvenir des données entrées par le visiteur.</p><p>En l&#8217;état, nous avons ajouté les infos en base de données, nous avons créé des cookies, et nous avons pris soin, dans l&#8217;étape précédente, de récupérer ces cookies grâce à la fonction <code><a
href="http://codex.wordpress.org/Function_Reference/wp_get_current_commenter" title="Codex WordPress pour la fonction wp_get_current_commenter" hreflang="en">wp_get_current_commenter()</a></code>. Sauf qu&#8217;en fait cette fonction récupère uniquement les cookies pour les champs &laquo;&nbsp;classiques&nbsp;&raquo; (Nom, url, e-mail). Il faut donc compléter cette fonction pour l&#8217;inviter à piocher dans nos cookies fraichement créés :</p><pre class="code"><code class="php boc-nocontrols boc-nogutter">add_filter('wp_get_current_commenter', 'juiz_add_custom_comment_cookies');
function juiz_add_custom_comment_cookies($cookies) {
&nbsp;
	$comment_author_job = '';
	if ( isset($_COOKIE['comment_author_job_'.COOKIEHASH]) )
		$comment_author_job = $_COOKIE['comment_author_job_'.COOKIEHASH];
&nbsp;
	$comment_author_gender = '';
	if ( isset($_COOKIE['comment_author_gender_'.COOKIEHASH]) )
		$comment_author_gender = $_COOKIE['comment_author_gender_'.COOKIEHASH];
&nbsp;
&nbsp;
	$cookies['comment_author_job'] = $comment_author_job;
	$cookies['comment_author_gender'] = $comment_author_gender;
&nbsp;
	return $cookies;
}</code></pre><p>La variable <code>$cookies</code> est un tableau associatif (clé + valeur), dont la clé est le nom du cookie (sans le <code>_cookiehash</code>) et la valeur est la valeur du cookie que l&#8217;on récupère s&#8217;il existe.</p><p>Maintenant il faut afficher ces informations dans notre liste de commentaire !</p><h4>Afficher les données personnalisées dans la liste de commentaires</h4><p>Cette dernière étape permet d&#8217;afficher les informations dans la liste de commentaires. Il existe un certain nombre de hooks qui permettent d&#8217;intervenir sur des zones précises d&#8217;un commentaire. Je vais en utiliser deux ici qui sont : <code>get_comment_author_link</code> et <code>get_avatar</code>.</p><p>Je souhaite afficher le job à côté du nom de l&#8217;auteur d&#8217;un commentaire.</p><pre class="code"><code class="php boc-nocontrols boc-nogutter">add_filter( 'get_comment_author_link', 'juiz_attach_custom_info_to_comments_list' );
if ( !function_exists('juiz_attach_custom_info_to_comments_list') ) {
   function juiz_attach_custom_info_to_comments_list( $author ) {
&nbsp;
      // on récupère l'info job
      $job = get_comment_meta( get_comment_ID(), 'job', true );
&nbsp;
      // si l'info existe, on l'ajoute entre parenthèse après l'auteur
      if ( $job )
         $author .= ' (' . $job . ')';
&nbsp;
      // on retourne l'info
      return $author;
   }
}</code></pre><p><img
src="http://www.creativejuiz.fr/blog/wp-content/uploads/2012/02/commentaires-recents.png" alt="" title="" width="185" height="143" class="alignright size-full wp-image-2474" /> La variable <code>$author</code> contient le code HTML qui affiche le nom de l&#8217;auteur (avec ou sans lien vers son site). On ne fait donc que rajouter du contenu à la suite de cette chaine.<br
/> Cette technique a l&#8217;avantage d&#8217;ajouter l&#8217;information également dans le widget qui traite des derniers commentaires postés.</p><p>Pour afficher la valeur de gender, j&#8217;aurais très bien pu faire la même chose en ajoutant l&#8217;information à la suite après l&#8217;avoir récupérée avec <code><a
href="http://codex.wordpress.org/Function_Reference/get_comment_meta" hreflang="en" title="Lien vers le Codex WordPress pour la fonction get_comment_meta">get_comment_meta()</a></code>. Mais comme j&#8217;aime bien me compliquer la vie, j&#8217;ai décidé d&#8217;ajouter une classe autour de l&#8217;avatar de l&#8217;utilisateur.</p><pre class="code"><code class="php boc-nocontrols boc-nogutter">add_filter ( 'get_avatar', 'juiz_attach_custom_gender_to_avatar');
if ( !function_exists('juiz_attach_custom_gender_to_avatar') ) {
   function juiz_attach_custom_gender_to_avatar( $avatar ) {
&nbsp;
      $gender = get_comment_meta( get_comment_ID(), 'gender', true );
      $gender = $gender ? $gender : 'undefined';
      $avatar = '&lt;span class="gender ' . $gender . '"&gt;' . $avatar . '&lt;/span&gt;';
&nbsp;
      return $avatar;
   }
}</code></pre><p>La variable <code>$avatar</code> contient le code HTML de l&#8217;avatar de l&#8217;utilisateur, une simple image par défaut. Ici on englobe l&#8217;avatar d&#8217;un élément <code
class="element">span</code> porteur du classe <code>gender</code> ainsi que d&#8217;une classe dynamique qui peut être <code>male</code>, <code>female</code> ou <code>undefined</code> en fonction de l&#8217;info que l&#8217;on récupère en base de données.</p> <figure
id="attachment_2469" aria-labelledby="figcaption_attachment_2469" class="wp-caption aligncenter" style="width: 610px"><img
src="http://www.creativejuiz.fr/blog/wp-content/uploads/2012/02/commentaire-perso-wordpress.png" alt="" title="" width="600" height="140" class="size-full wp-image-2469" /><figcaption
id="figcaption_attachment_2469" class="wp-caption-text">Le métier placé à côté du nom d&#039;auteur, et l&#039;avatar customisé avec un symbole en fonction du sexe.</figcaption></figure><p>Et voilà, c&#8217;est tout pour cette longue astuce, pour le reste c&#8217;est à vous d&#8217;imaginer.</p><h4 id="bonux1">Option bonux 1 : éditer un champ existant</h4><p>En restant dans le premier hook (<code>comment_form_defaults</code>) il est possible d&#8217;éditer les champs existants en les manipulants avec des expressions régulières, ou en les réécrivant :</p><pre class="code"><code class="php">$default['fields']['author'] = '
   &lt;p class="comment-form-author"&gt;
      &lt;label for="author"&gt;'. __('Name') . '&lt;/label&gt;
      &lt;span class="required"&gt;*&lt;/span&gt;
      &lt;input id="author" name="author" value="'.$commenter['comment_author'].'" placeholder="Votre nom ou pseudo" aria-required="true" size="30" type="text" /&gt;
   &lt;/p&gt;
';</code></pre><p>Ici je rajouter un attribut <code>placeholder</code> par exemple.<br
/> Inutile de changer quoi que ce soit dans le traitement des données, WordPress le prévoit déjà.<br
/> Merci à <a
href="http://www.nicolasgilis.be/">Nicolas</a> pour la suggestion.</p><h4 id="bonux2">Option bonux 2 : redirection après un commentaire</h4><p>J&#8217;ai croisé dans le cœur de WordPress le hook <code>comment_post_redirect</code> qui permet de choisir la page de redirection lorsqu&#8217;un utilisateur a posté un commentaire.<br
/> Par défaut cette page redirige vers le commentaire de l&#8217;utilisateur avec une ancre.<br
/> Voici comment la fonction se présente :</p><pre class="code"><code class="js boc-nocontrols boc-nogutter">add_action('comment_post_redirect', 'juiz_new_comment_redirection');
if ( !function_exists('juiz_new_comment_redirection') ) {
   function juiz_new_comment_redirection( $location ) {
      // valeur par défaut donnée par WordPress
      // à vous de personnaliser $location en fonction de vos besoins
      $location = empty($_POST['redirect_to']) ? get_comment_link($comment_id) : $_POST['redirect_to'] . '#comment-' . $comment_id;
      return $location;
   }
}</code></pre><h4 id="bonux3">Option bonux 3 : le code complet</h4><p>Pour ceux qui ont peur d&#8217;avoir raté une étape :</p><pre class="code"><code class="php boc-nocontrols boc-nogutter">// ajout physique d'un champ
add_filter( 'comment_form_defaults', 'juiz_manage_default_fields');
&nbsp;
// $default contient tous les messages du formulaire de commentaire
// il contient également "comment_field", le textarea du message
if ( !function_exists('juiz_manage_default_fields')) {
	function juiz_manage_default_fields( $default ) {
&nbsp;
		$commenter = wp_get_current_commenter();
&nbsp;
		// Suppression d'un champ par défaut parmi : author, email, url
&nbsp;
		//unset($default['fields']['url']);
&nbsp;
		// Ajout des champs dans le tableau "fields"
&nbsp;
		$default['fields']['job'] = '&lt;p class="comment-form-job comment-form-author"&gt;
		&lt;label for="job"&gt;'. __('Your job') . '&lt;/label&gt;
		&lt;span class="required"&gt;*&lt;/span&gt;
		&lt;input id="job" name="job" aria-required="true" size="30" type="text" value="' . esc_attr($commenter['comment_author_job']) . '" /&gt;
		&lt;/p&gt;';
&nbsp;
		$sel_female = $sel_male = '';
		if ( $commenter['comment_author_gender'] != '') ${'sel_' . $commenter['comment_author_gender']} = ' checked="checked"';
&nbsp;
		$default['fields']['gender'] = '&lt;p class="comment-form-gender"&gt;
		&lt;span class="label_like"&gt;'. __('Your gender') . '&lt;/span&gt;
		&lt;label for="female"&gt;F&lt;/label&gt; &lt;input id="female" '. $sel_female .' name="gender" value="female" type="radio" /&gt;
		&lt;label for="male"&gt;M&lt;/label&gt; &lt;input id="male" '. $sel_male .' name="gender" value="male" type="radio" /&gt;
		&lt;/p&gt;';
&nbsp;
		// On retourne le tableau des champs
&nbsp;
		return $default;
	}
}
&nbsp;
&nbsp;
// controle des champs obligatoires à l'enregistrement
add_filter( 'preprocess_comment', 'juiz_verify_comment_data' );
if ( !function_exists('juiz_verify_comment_data') ) {
	function juiz_verify_comment_data( $commentdata ) {
&nbsp;
		if ( ! isset( $_POST['job'] ) )
			wp_die( __( 'Error: please fill the required field (job).' ) );
		elseif ( isset( $_POST['job'] ) AND strlen ( $_POST['job'] ) > 45 )
			wp_die( __( 'Error: 45 maximum char. for "job" field.' ) );
&nbsp;
		return $commentdata;
	}
}
&nbsp;
//ajout en base de données des champs
add_action( 'comment_post', 'juiz_save_comment_data' );
if ( !function_exists('juiz_save_comment_data') ) {
	function juiz_save_comment_data( $comment_id ) {
&nbsp;
		$comment_cookie_lifetime = apply_filters('comment_cookie_lifetime', 30000000);
&nbsp;
		if (isset($_POST['job']) AND strlen ($_POST['job']) &lt; 45) {
			add_comment_meta( $comment_id, 'job', esc_html( $_POST['job'] ) );
			setcookie('comment_author_job_' . COOKIEHASH, esc_html( $_POST['job'] ), time() + $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN);
		}
&nbsp;
		if (isset($_POST['gender']) AND in_array ( $_POST['gender'] , array('male', 'female'))) {
			add_comment_meta( $comment_id, 'gender', esc_html($_POST['gender']) );
			setcookie('comment_author_gender_' . COOKIEHASH, esc_html( $_POST['gender']), time() + $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN);
		}
	}
}
&nbsp;
&nbsp;
// pour que get_commenter retourne nos cookies custom
add_filter('wp_get_current_commenter', 'juiz_add_custom_comment_cookies');
function juiz_add_custom_comment_cookies($cookies) {
&nbsp;
	$comment_author_job = '';
	if ( isset($_COOKIE['comment_author_job_'.COOKIEHASH]) )
		$comment_author_job = $_COOKIE['comment_author_job_'.COOKIEHASH];
&nbsp;
	$comment_author_gender = '';
	if ( isset($_COOKIE['comment_author_gender_'.COOKIEHASH]) )
		$comment_author_gender = $_COOKIE['comment_author_gender_'.COOKIEHASH];
&nbsp;
	$cookies['comment_author_job'] = $comment_author_job;
	$cookies['comment_author_gender'] = $comment_author_gender;
&nbsp;
	return $cookies;
}
&nbsp;
&nbsp;
// afficher l'info job dans la liste des commentaires
add_filter( 'get_comment_author_link', 'juiz_attach_custom_info_to_comments_list' );
if ( !function_exists('juiz_attach_custom_info_to_comments_list') ) {
	function juiz_attach_custom_info_to_comments_list( $author ) {
&nbsp;
		$job = get_comment_meta( get_comment_ID(), 'job', true );
		if ( $job )
			$author .= ' (' . $job . ')';
&nbsp;
		return $author;
	}
}
&nbsp;
// afficher l'info gender graphiquement pas loin de l'avatar
add_filter ( 'get_avatar', 'juiz_attach_custom_gender_to_avatar');
if ( !function_exists('juiz_attach_custom_gender_to_avatar') ) {
	function juiz_attach_custom_gender_to_avatar( $avatar ) {
&nbsp;
		$gender = get_comment_meta( get_comment_ID(), 'gender', true );
		$gender = $gender ? $gender : 'undefined';
			$avatar = '&lt;span class="gender ' . $gender . '"&gt;' . $avatar . '&lt;/span&gt;';
&nbsp;
		return $avatar;
	}
}
&nbsp;
// redirection personnalisée après un post de commentaire
add_action('comment_post_redirect', 'juiz_new_comment_redirection');
if ( !function_exists('juiz_new_comment_redirection') ) {
	function juiz_new_comment_redirection( $location ) {
		$location = empty($_POST['redirect_to']) ? get_comment_link($comment_id) : $_POST['redirect_to'] . '#comment-' . $comment_id;
		return $location;
	}
}</code></pre><p>L&#8217;espace de commentaire et là pour vous <img
src='http://www.creativejuiz.fr/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /></p><div
class="sources"><h4>Sources et liens utiles</h4><ul><li><a
href="http://yuguotheme.com/customizing-comment-form-for-wordpress-3-0/" hreflang="en" lang="en">Customizing Comment form &#8211; Yuguotheme</a></li><li><a
href="http://4h18.com/2011/06/modifier-le-formulaire-des-commentaires/">Modifier le formulaire des commentaires &#8211; 4h18</a></li></ul></div> ]]></content:encoded> <wfw:commentRss>http://www.creativejuiz.fr/blog/tutoriels/wordpress-personnaliser-champs-formulaire-commentaire/feed</wfw:commentRss> <slash:comments>20</slash:comments> </item> <item><title>HTML5 &#8211; Attribut download pour forcer le téléchargement d&#8217;une ressource</title><link>http://www.creativejuiz.fr/blog/tutoriels/html5-attribut-download-pour-forcer-telechargement</link> <comments>http://www.creativejuiz.fr/blog/tutoriels/html5-attribut-download-pour-forcer-telechargement#comments</comments> <pubDate>Mon, 23 Apr 2012 06:15:05 +0000</pubDate> <dc:creator>Geoffrey</dc:creator> <category><![CDATA[Tutoriels]]></category> <category><![CDATA[Veille technologique]]></category> <category><![CDATA[attribut]]></category> <category><![CDATA[download]]></category> <category><![CDATA[HTML5]]></category> <category><![CDATA[octet-stream]]></category> <category><![CDATA[téléchargement]]></category> <guid
isPermaLink="false">http://www.creativejuiz.fr/blog/?p=2406</guid> <description><![CDATA[Je vous parlais d&#8217;une solution pour forcer le téléchargement grâce à un morceau de code dans votre fichier .htaccess dans l&#8217;article précédent, alors que je venais juste de découvrir cet attribut HTML5 permettant de faire la même chose en mieux. Pour le moment seul Chrome supporte cet attribut. Présentation de l&#8217;attribut download En gros cet [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://www.creativejuiz.fr/blog/wp-content/uploads/2012/04/html5-download.png" alt="HTML5 download. " title="" width="100" height="100" class="alignleft size-full wp-image-2424 first" />Je vous parlais d&#8217;une solution pour forcer le téléchargement grâce à un morceau de code dans votre fichier .htaccess dans l&#8217;<a
href="/blog/tutoriels/forcer-telechargement-fichier-par-navigateur">article précédent</a>, alors que je venais juste de découvrir cet attribut HTML5 permettant de faire la même chose en mieux. Pour le moment seul Chrome supporte cet attribut.<span
id="more-2406"></span></p><h4>Présentation de l&#8217;attribut <code>download</code></h4><p>En gros cet attribut permet de spécifier au navigateur qu&#8217;il ne doit pas se diriger (naviguer) vers la ressource ciblée, mais la télécharger.<br
/> Cet attribut s&#8217;applique donc naturellement un élément <code
class="element">a</code> et peut avoir une valeur qui sera attribuée comme nom de fichier à la ressource que vous allez télécharger.</p><p>Voici un exemple d&#8217;utilisation :</p><pre class="code"><code class="html boc-nogutter boc-nocontrols">&lt;a href="http://creativejuiz.fr/images/main.jpg" download="CreativeJuiz_Background"&gt;Télécharger l'image&lt;/a&gt;</code></pre><p>La valeur de l&#8217;attribut <code>download</code> n&#8217;a, a priori, aucune restriction, mais il faut avoir en tête qu&#8217;il s&#8217;agit d&#8217;un nom de fichier et que tous les systèmes ne sont pas égaux quant au traitement de certains signes de ponctuation (mais contredites-moi si je fais erreur). Vous remarquerez que j&#8217;ai écris &laquo;&nbsp;CreativeJuiz_Background&nbsp;&raquo; en nom de fichier, et non &laquo;&nbsp;CreativeJuiz_Background.jpg&nbsp;&raquo;. En effet il est inutile de préciser l&#8217;extension du fichier si vous souhaitez conserver l&#8217;originale.</p> <figure
id="attachment_2426" aria-labelledby="figcaption_attachment_2426" class="wp-caption aligncenter" style="width: 614px"><img
src="http://www.creativejuiz.fr/blog/wp-content/uploads/2012/04/download-chrome-attribut-html5.png" alt="" title="" width="604" height="39" class="size-full wp-image-2426" /><figcaption
id="figcaption_attachment_2426" class="wp-caption-text">La barre de téléchargement de Chrome après deux essais de l&#039;attribut download</figcaption></figure><p>Si vous naviguez sur la dernière version de Chrome, ce lien de démo devrait vous proposer de télécharger un fichier .png : <a
href="http://creativejuiz.fr/images/main.jpg" download="CreativeJuiz_Background">Télécharger l&#8217;image</a></p><p>La valeur de l&#8217;attribut <code>download</code> accepte également l&#8217;ajout d&#8217;une extension de fichier, il est ainsi possible de proposer au téléchargement un fichier HTML transformé en fichier TXT par exemple :</p><pre class="code"><code class="html boc-nogutter boc-nocontrols">&lt;a href="http://www.creativejuiz.fr/trytotry/css3-box-shadow-after-before/index.html" download="CreativeJuiz_DropShadow.txt"&gt;Télécharger le code (.txt)&lt;/a&gt;</code></pre><p>Ce qui nous donnerait le lien suivant : <a
href="http://www.creativejuiz.fr/trytotry/css3-box-shadow-after-before/index.html" download="CreativeJuiz_DropShadow.txt">Télécharger le code (.txt)</a></p><h4>Avis personnel</h4><p>Cet attribut est plutôt intéressant en un sens, puisqu&#8217;il permet d&#8217;alléger le fichier .htaccess ou certains scripts en PHP.<br
/> Cependant, à l&#8217;image de l&#8217;attribut <code>target</code> aujourd&#8217;hui considéré comme une manière de contraindre le visiteur à naviguer d&#8217;une certaine manière, cet attribut <code>download</code> ne serait-il pas en train de reproduire ce schéma de contrainte en forçant un visiteur à télécharger une image (ou tout autre type de fichier) alors qu&#8217;il souhaite juste la visualiser dans son navigateur ? Il faudra voir cela à l&#8217;usage <img
src='http://www.creativejuiz.fr/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p><div
class="sources"><h4>Sources et liens utiles</h4><ul><li><a
href="http://html5-demos.appspot.com/static/a.download.html" hreflang="en" lang="en">a[download] demonstration &#8211; HTML5 Demos</a></li><li><a
href="http://updates.html5rocks.com/2011/08/Downloading-resources-in-HTML5-a-download" hreflang="en" lang="en">HTML5 a[download] &#8211; HTML5Rocks</a></li><li><a
href="http://www.html5rocks.com/en/tutorials/workers/basics/#toc-inlineworkers-bloburis" hreflang="en">Information sur les Blob URLs</a></li></ul></div> ]]></content:encoded> <wfw:commentRss>http://www.creativejuiz.fr/blog/tutoriels/html5-attribut-download-pour-forcer-telechargement/feed</wfw:commentRss> <slash:comments>5</slash:comments> </item> <item><title>Forcer le téléchargement d&#8217;un fichier par le navigateur</title><link>http://www.creativejuiz.fr/blog/tutoriels/forcer-telechargement-fichier-par-navigateur</link> <comments>http://www.creativejuiz.fr/blog/tutoriels/forcer-telechargement-fichier-par-navigateur#comments</comments> <pubDate>Fri, 20 Apr 2012 21:19:21 +0000</pubDate> <dc:creator>Geoffrey</dc:creator> <category><![CDATA[Tutoriels]]></category> <category><![CDATA[astuce]]></category> <category><![CDATA[htaccess]]></category> <category><![CDATA[mime]]></category> <category><![CDATA[octet-stream]]></category> <category><![CDATA[téléchargement]]></category> <guid
isPermaLink="false">http://www.creativejuiz.fr/blog/?p=2370</guid> <description><![CDATA[Le &#171;&#160;force file to download&#160;&#187; (entendez forcer le fichier à se télécharger) permet de forcer le navigateur à ouvrir la boîte de dialogue de téléchargement pour certains types de fichier. C&#8217;est le cas par défaut des fichiers de type archive (.zip, .rar, etc.) si je ne fais pas erreur. Forcer le téléchargement d&#8217;un type de [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://www.creativejuiz.fr/blog/wp-content/uploads/2012/04/download-htaccess.png" alt="" title="" width="100" height="100" class="alignleft first size-full wp-image-2414" /> Le &laquo;&nbsp;force file to download&nbsp;&raquo; (entendez forcer le fichier à se télécharger) permet de forcer le navigateur à ouvrir la boîte de dialogue de téléchargement pour certains types de fichier. C&#8217;est le cas par défaut des fichiers de type archive (.zip, .rar, etc.) si je ne fais pas erreur.<span
id="more-2370"></span></p><h4>Forcer le téléchargement d&#8217;un type de fichier</h4><p>Il existe une instruction à placer dans le fichier <code>.htaccess</code> qui permet d&#8217;indiquer au navigateur la manière dont il doit traiter certains formats de fichier lorsque le visiteur parcourt un fichier.<br
/> La ligne de code suivante permet de traiter les PDF comme étant un type de fichier à télécharger, et non à afficher dans le navigateur :</p><pre class="code"><code class="js boc-nogutter boc-nocontrols">AddType application/octet-stream .pdf</code></pre><p><img
src="http://www.creativejuiz.fr/blog/wp-content/uploads/2012/04/download.png" alt="" title="" width="250" height="189" class="alignright noborder size-full wp-image-2413" />À noter que le point est optionnel, et que l&#8217;extension d&#8217;un fichier n&#8217;est pas sensible à la casse : inutile donc d&#8217;ajouter l&#8217;extension en majuscule &laquo;&nbsp;PDF&nbsp;&raquo;, ça ferait doublon.</p><p>Vous pouvez traiter plusieurs types de fichiers de la même manière en rajoutant simplement les extensions de chacun des fichiers les uns derrière les autres en les séparant par un espace :</p><pre class="code"><code class="js boc-nogutter boc-nocontrols">AddType application/octet-stream pdf mp3 mp4 avi</code></pre><p>Il est possible de placer un fichier <code>.htaccess</code> dans un sous-dossier de votre site web pour n&#8217;impacter que les fichiers à l&#8217;intérieur de ce dosssier.</p><h4>Écartons-nous un poil du sujet</h4><p>Dans certains cas, le navigateur télécharge votre fichier <code>.swf</code> comme s&#8217;il s&#8217;agissait d&#8217;un type <code>application/octet-stream</code>. Pour résoudre ce problème, complétez votre <code>.htaccess</code> de la sorte :</p><pre class="code"><code class="js boc-nogutter boc-nocontrols">AddType application/x-shockwave-flash swf </code></pre><p>Je vous invite à lire ce guide en anglais pour en apprendre davantage :<br
/> <a
href="http://www.htaccess-guide.com/adding-mime-types/" hreflang="en" lang="en">Adding MIME Types &#8211; htaccess-guide.com</a></p><p>C&#8217;est tout pour cette astuce.<br
/> N&#8217;hésitez pas à commenter si vous rencontrez des problèmes !</p><p><em>PS : astuce à venir sur le même sujet en HTML5</em></p><div
class="sources"><h4>Sources et liens utiles</h4><ul><li><a
href="http://www.htaccess-guide.com/adding-mime-types/" hreflang="en" lang="en">Adding MIME Types &#8211; htaccess-guide.com</a></li></ul></div> ]]></content:encoded> <wfw:commentRss>http://www.creativejuiz.fr/blog/tutoriels/forcer-telechargement-fichier-par-navigateur/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>HTML5 &#8211; Attribut translate</title><link>http://www.creativejuiz.fr/blog/veille-technologique/html5-attribut-translate</link> <comments>http://www.creativejuiz.fr/blog/veille-technologique/html5-attribut-translate#comments</comments> <pubDate>Mon, 16 Apr 2012 06:46:42 +0000</pubDate> <dc:creator>Geoffrey</dc:creator> <category><![CDATA[Veille technologique]]></category> <category><![CDATA[attribut]]></category> <category><![CDATA[HTML5]]></category> <category><![CDATA[I18n]]></category> <category><![CDATA[translate]]></category> <guid
isPermaLink="false">http://www.creativejuiz.fr/blog/?p=2386</guid> <description><![CDATA[HTML5 nous apporte l&#8217;attribut translate. Cet attribut permet de limiter l&#8217;impact d&#8217;une traduction par des outils tels que Google Translate en interdisant la traduction de certains contenus. Ainsi le contenu de votre site web est composé avec davantage de précision. Voyons comment agir et sur quoi appliquer cet attribut. Définition Le W3C définit cet attribut [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://www.creativejuiz.fr/blog/wp-content/uploads/2012/04/html5-translate-attribute.png" alt="" title="" width="100" height="100" class="alignleft size-full first wp-image-2395" /> HTML5 nous apporte l&#8217;attribut <code>translate</code>. Cet attribut permet de limiter l&#8217;impact d&#8217;une traduction par des outils tels que Google Translate en interdisant la traduction de certains contenus.<br
/> Ainsi le contenu de votre site web est composé avec davantage de précision. Voyons comment agir et sur quoi appliquer cet attribut.<span
id="more-2386"></span></p><h4>Définition</h4><p>Le <a
href="http://dev.w3.org/html5/spec/global-attributes.html#the-translate-attribute">W3C définit cet attribut translate</a> comme étant :</p><blockquote><p>[&hellip;] un attribut à valeurs énumérées* utilisé pour spécifier si les valeurs d&#8217;attribut d&#8217;un élément et les valeurs textuelles de ses enfants doivent être traduits lorsque la page est localisée, ou si elles doivent rester inchangées.</p><p><small>*c&#8217;est à dire qu&#8217;il a des valeurs prévues bien précises</small></p></blockquote><p>Je l&#8217;ai résumé dans l&#8217;intro, en somme cela vous permet de définir quelles parties de votre document sont traduisibles.</p><h4>Utilisation</h4><p>Cet attribut attend des valeurs précises que sont &laquo;&nbsp;<code>no</code> &raquo;, &laquo;&nbsp;<code>yes</code>&nbsp;&raquo; ou encore une chaine vide (valeur par défaut). La chaine vide ou le &laquo;&nbsp;<code>yes</code>&nbsp;&raquo; ont valeur équivalente : le contenu sera traduit.<br
/> Pour définir un élément comme n&#8217;étant pas sujet à traduction, voici comment procéder.</p><pre class="code"><code class="html boc-nocontrols boc-nogutter">&lt;span translate="no" class="author"&gt;Hope&lt;/span&gt;</code></pre><p>Sur un document définit originellement en anglais et traduit ponctuellement en français, &laquo;&nbsp;<em
lang="en" translate="no">Hope</em>&nbsp;&raquo; ne sera ainsi pas traduit par &laquo;&nbsp;Espérer&nbsp;&raquo;. Cela permet à l&#8217;auteur de conserver son vrai pseudonyme <img
src='http://www.creativejuiz.fr/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p><p>Si l&#8217;ancre de l&#8217;exemple avait été porteuse d&#8217;un attribut <code>title</code> ou <code>alt</code>, son contenu n&#8217;aurait également pas été traduit, d&#8217;après la définition donnée par le W3C.</p><h4>Quelques exemples</h4><h5>Le pseudo, le nom, le prénom &hellip;</h5><p>C&#8217;est le cas de l&#8217;exemple précédent : le nom ou pseudonyme d&#8217;un auteur, ou le nom d&#8217;un programme, par exemple, n&#8217;ont a priori pas à être traduits.<br
/> Dans les classiques espaces &laquo;&nbsp;Auteur&nbsp;&raquo; des blogs, il conviendrait d&#8217;utiliser systématiquement la valeur <code>no</code> de <code>translate</code> sur l&#8217;élément balisant le pseudo de l&#8217;auteur.</p><pre class="code"><code class="html boc-nocontrols boc-nogutter">Article écrit par &lt;a translate="no" class="author" href="/auteur/pierre"&gt;Pierre&lt;/a&gt;</code></pre><p>Ici on part du principe que notre page est en français, le prénom Pierre ne sera pas traduit par Peter lors d&#8217;une traduction du français vers l&#8217;anglais, grâce à notre intervention.</p><h5>Cheat mode, transcription, ligne de commande &hellip;</h5><p>Imaginions que vous lisiez des articles en anglais sur un cheat mode pour un jeu, mais que l&#8217;article vous semble trop obscure dans sa langue originelle. Hop, un coup de Google translate, et là, c&#8217;est le drame, vos codes sont aussi traduits !<br
/> Je prends l&#8217;exemple d&#8217;un code d&#8217;un jeu auquel j&#8217;ai joué de nombreuses heures (je vous laisse trouver son nom) :</p><pre class="code"><code class="html boc-nocontrols boc-nogutter">You can also use this code to get a car for the game :&lt;br&gt;
&lt;kbd&gt;HOW DO YOU TURN THIS ON&lt;/kbd&gt;</code></pre><p>Ceci serait alors traduit par :<br
/> <samp>Vous pouvez également utiliser ce code pour obtenir une voiture pour le jeu : COMMENT vous activez cette fonction</samp></p><p>Nous aurions pu sauver le code simplement en prévoyant le coup :</p><pre class="code"><code class="html boc-nocontrols boc-nogutter">You can also use this code to get a car for the game :&lt;br&gt;
&lt;kbd translate="no"&gt;HOW DO YOU TURN THIS ON&lt;/kbd&gt;</code></pre><p>Celui-ci n&#8217;aurait alors pas été vulgairement traduit.</p><h4>Attention à l&#8217;héritage</h4><p>Lorsque vous définissez un élément comme n&#8217;étant pas traduisible, ses enfants héritent de cet aspect et ne sont eux-mêmes pas traduisibles.<br
/> Pour corriger le tir il suffit de re-définir la valeur <code>yes</code> de <code>translate</code> sur les enfants.</p><pre class="code"><code class="html boc-nocontrols boc-nogutter">&lt;p translate="no"&gt;Texte qui ne doit pas être traduit à part
&lt;span translate="yes"&gt;cette partie&lt;/span&gt; qui peut l'être.&lt;/p&gt;</code></pre><p
class="center"><img
src="http://www.creativejuiz.fr/blog/wp-content/uploads/2012/04/traduction-chrome.png" alt="Barre de traduction de Google Chrome" title="" width="525" height="38" class="aligncenter size-full wp-image-2394" /></p><p>Pour rappel, Google Chrome, qui est de plus en plus utilisé, intègre cet outil de traduction et le propose dès que vous êtes sur une page de langue étrangère (pour votre navigateur).<br
/> La traduction de contenu est donc chose courante, je le vois sur mes outils d&#8217;analyse sur ce blog, mais bien entendu tout dépend de la cible de votre site internet.</p><p>N&#8217;hésitez pas à venir me corriger si vous voyez une bêtise <img
src='http://www.creativejuiz.fr/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /></p> ]]></content:encoded> <wfw:commentRss>http://www.creativejuiz.fr/blog/veille-technologique/html5-attribut-translate/feed</wfw:commentRss> <slash:comments>6</slash:comments> </item> <item><title>Un Nth-child en CSS 2 compatible depuis IE7</title><link>http://www.creativejuiz.fr/blog/tutoriels/nth-child-css2-compatible-ie7</link> <comments>http://www.creativejuiz.fr/blog/tutoriels/nth-child-css2-compatible-ie7#comments</comments> <pubDate>Tue, 10 Apr 2012 05:58:31 +0000</pubDate> <dc:creator>Geoffrey</dc:creator> <category><![CDATA[CSS / CSS3]]></category> <category><![CDATA[Tutoriels]]></category> <category><![CDATA[adjacence]]></category> <category><![CDATA[astuce]]></category> <category><![CDATA[CSS2.1]]></category> <category><![CDATA[CSS3]]></category> <category><![CDATA[nth-child]]></category> <category><![CDATA[sélecteur]]></category> <guid
isPermaLink="false">http://www.creativejuiz.fr/blog/?p=2365</guid> <description><![CDATA[Utiliser CSS3 c&#8217;est bien, mais pas suffisant. Il ne s&#8217;agit pas d&#8217;un nouveau langage de style, mais bien d&#8217;ajouts à CSS2.1. Il serait donc prématuré de vouloir se jeter sur CSS3 sans maitriser son petit frère. Cette phrase sonne comme du déjà vu, déjà entendu, ce n&#8217;est pas la première fois que je le dis, [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://www.creativejuiz.fr/blog/wp-content/uploads/2012/04/nth-child-css2-1.png" alt="" title="" width="100" height="100" class="alignleft first size-full wp-image-2377" /> Utiliser CSS3 c&#8217;est bien, mais pas suffisant. Il ne s&#8217;agit pas d&#8217;un nouveau langage de style, mais bien d&#8217;ajouts à CSS2.1. Il serait donc prématuré de vouloir se jeter sur CSS3 sans maitriser son petit frère.<span
id="more-2365"></span></p><p>Cette phrase sonne comme du déjà vu, déjà entendu, ce n&#8217;est pas la première fois que je le dis, et elle fait également écho à l&#8217;article sur <a
href="http://blog.goetter.fr/post/20724748032/papa-cest-quoi-un-mirage-css3-mon-fils">le&nbsp;&laquo;mirage&nbsp;CSS3&raquo;</a> de Raphaël Goetter.</p><p>Je ne vais pas m&#8217;étaler davantage sur cet aspect de ce 3ème volet de la passionnante saga CSS, ce n&#8217;est pas l&#8217;objet de ce billet.</p><h4>Ce qu&#8217;on cherche à faire</h4><p><code
class="pseudo-class">nth-child()</code> permet de cibler précisément un élément s&#8217;il respecte la condition entre parenthèses.<br
/> On part du principe qu&#8217;on travaille sur une liste.</p><p>Exemples :</p><pre class="code"><code class="css boc-nogutter boc-nocontrols">li:nth-child(n+3) { }</code></pre><p>permet de cibler tous les <code
class="element">li</code> à partir du troisième.</p><pre class="code"><code class="css boc-nogutter boc-nocontrols">li:nth-child(3) { }</code></pre><p>permet de ne cibler que le 3ème <code
class="element">li</code>.</p><p><a
href="/blog/doc/nth-child-css3-css2.html" class="demonstration">Démonstration</a></p><p>Il est possible de reproduire ces deux sélecteurs CSS3 avec les sélecteurs CSS2.1 (compatible IE7+)</p><h4>Cibler tous les éléments sauf les N premiers en CSS2</h4><p
class="center"><img
src="http://www.creativejuiz.fr/blog/wp-content/uploads/2012/04/nth-child-css2.png" alt="" title="" width="604" height="90" class="aligncenter size-full wp-image-2373" /></p><p>Si vous lisez régulièrement les actualités d&#8217;Alsacreations.com, vous avez probablement croisé mon article sur <a
href="http://www.alsacreations.com/astuce/lire/1312-selectionner-les-freres-d-un-element-en-css-nth-child.html">la&nbsp;sélection&nbsp;avancée&nbsp;des&nbsp;frères&nbsp;d&#8217;un&nbsp;élément</a>. Cet article fait référence &#8211; entre autres choses &#8211; au sélecteur d&#8217;adjacence direct représenté par un &laquo;&nbsp;+&nbsp;&raquo;.</p><p>Ce code permet de sélectionner tous les <code
class="element">li</code> frères directs d&#8217;un autre <code
class="element">li</code>. C&#8217;est à dire tous les <code
class="element">li</code> sauf le premier, puisqu&#8217;il n&#8217;a pas de frère avant lui.</p><pre class="code"><code class="css boc-nogutter boc-nocontrols">li + li { }</code></pre><p>De la même manière, ce code permet de cibler tous les <code
class="element">li</code> sauf les deux premiers :</p><pre class="code"><code class="css boc-nogutter boc-nocontrols">li + li + li { }</code></pre><p>Ainsi de suite. On a ici reproduit notre sélecteur CSS3 <code>li:nth-child(n+3)</code>.</p><h4>Cibler le Nième élément en CSS2</h4><p
class="center"><img
src="http://www.creativejuiz.fr/blog/wp-content/uploads/2012/04/nth-child-adjacence-css2.png" alt="" title="" width="604" height="85" class="aligncenter size-full wp-image-2374" /></p><p>Cette fois nous allons avoir besoin de la pseudo-classe <code
class="pseudo-classe">first-child</code> qui permet de cibler le premier enfant d&#8217;un élément.<br
/> C&#8217;est pratique, car on sait déjà comment <strong>cibler le premier</strong> élément :</p><pre class="code"><code class="css boc-nogutter boc-nocontrols">li:first-child { }</code></pre><p>Pour <strong>cibler le second</strong>, il faut combiner le sélecteur précédent au sélecteur d&#8217;adjacence directe pour obtenir un sélecteur qui dit &laquo;&nbsp;l&#8217;élément directement frère du premier&nbsp;&raquo; :</p><pre class="code"><code class="css boc-nogutter boc-nocontrols">li:first-child + li { }</code></pre><p>Cela permet ici de cibler le deuxième élément.</p><p>On peut également dire &laquo;&nbsp;l&#8217;élément directement frère de l&#8217;élément directement frère du premier&nbsp;&raquo;</p><pre class="code"><code class="css boc-nogutter boc-nocontrols">li:first-child + li + li { }</code></pre><p>Là on cible <strong>le troisième élément</strong>&hellip; bon, vous avez compris le truc j&#8217;imagine ?</p><p><a
href="/blog/doc/nth-child-css3-css2.html#ex3" class="demonstration">Démonstration</a></p><p>N&#8217;hésitez pas si vous avez des suggestions d&#8217;amélioration, ou des remarques sur cet article.</p><p
class="message">Ce sujet fait relai à celui de Raphaël Goetter dans son article <a
href="http://blog.goetter.fr/post/13309597151/cibler-le-nieme-element-en-css2">Cibler le Nieme élément en CSS2</a>. Il est simplement abordé à ma sauce.</p><div
class="sources"><h4>Sources et liens utiles</h4><ul><li><a
href="http://www.alsacreations.com/astuce/lire/1312-selectionner-les-freres-d-un-element-en-css-nth-child.html">Sélection avancée des frères d&#8217;un élément &#8211; Alsacréations</a></li><li><a
href="http://blog.goetter.fr/post/13309597151/cibler-le-nieme-element-en-css2">Cibler le Nieme élément en CSS2 &#8211; La tête dans le flux</a></li></div> ]]></content:encoded> <wfw:commentRss>http://www.creativejuiz.fr/blog/tutoriels/nth-child-css2-compatible-ie7/feed</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>WebDesign Magazine Hors série N° 14 &#8211; Trucs et astuces</title><link>http://www.creativejuiz.fr/blog/tutoriels/webdesign-magazine-hors-serie-14-trucs-astuces</link> <comments>http://www.creativejuiz.fr/blog/tutoriels/webdesign-magazine-hors-serie-14-trucs-astuces#comments</comments> <pubDate>Mon, 09 Apr 2012 10:03:19 +0000</pubDate> <dc:creator>Geoffrey</dc:creator> <category><![CDATA[Livres]]></category> <category><![CDATA[Tutoriels]]></category> <category><![CDATA[astuce]]></category> <category><![CDATA[magazine]]></category> <category><![CDATA[oracom]]></category> <category><![CDATA[publication]]></category> <category><![CDATA[webdesign]]></category> <guid
isPermaLink="false">http://www.creativejuiz.fr/blog/?p=2347</guid> <description><![CDATA[Ce court article pour vous signaler ma participation au magazine WebDesign Hors Série numéro 14. Cet opus présente un certain nombre d&#8217;articles orientés sur les trucs et astuces (et bidouilles, mais promis, je ne vous ai pas pondu de bidouille :p) que je n&#8217;ai hélas pas eu le temps de lire entièrement. GeekPress Un petit [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://www.creativejuiz.fr/blog/wp-content/uploads/2012/04/webdesign-mag-hs-14.png" alt="" title="" width="100" height="100" class="first alignleft size-full wp-image-2348" /> Ce court article pour vous signaler ma participation au magazine WebDesign Hors Série numéro 14. Cet opus présente un certain nombre d&#8217;articles orientés sur les trucs et astuces (et bidouilles, mais promis, je ne vous ai pas pondu de bidouille :p) que je n&#8217;ai hélas pas eu le temps de lire entièrement.<span
id="more-2347"></span></p><h4>GeekPress</h4><p>Un petit nouveau (que je connais) a ajouté son grain de sel dans ce magazine, il s&#8217;agit de Jonathan, le gérant de <a
href="http://geekpress.fr">GeekPress.fr</a>, un blog spécialisé dans les astuces et le développement WordPress.<br
/> Comme il est très joueur, il n&#8217;a pas proposé d&#8217;article sur le CMS, mais un dossier sur les &laquo;&nbsp;concurrents&nbsp;&raquo; de jQuery, cette bibliothèque JavaScript tant aimée des webdesigners.<br
/> Un très bon dossier que je vous invite à lire !</p><h4>Mon article</h4><p><img
src="http://www.creativejuiz.fr/blog/wp-content/uploads/2012/04/webdesign-mag-astuces-14.jpg" alt="" title="" width="250" height="323" class="alignright size-full wp-image-2349" /></p><p>Concernant l&#8217;astuce que j&#8217;ai proposé, il s&#8217;agit d&#8217;exemples supplémentaires à l&#8217;article abordé sur ce blog :<br
/> <a
href="/blog/tutoriels/travailler-vos-liens-ancres-avec-jquery-css#css">Travailler vos liens avec jQuery et CSS</a><br
/> sauf que dans cet article je n&#8217;aborde que des solutions CSS (2.1) qui correspondent à la fin de l&#8217;article du blog.<br
/> Pour rappel, CSS 3 est à la mode, mais par pitié, <a
href="http://blog.goetter.fr/post/20724748032/papa-cest-quoi-un-mirage-css3-mon-fils" title="Article de Raphaël Goetter - Petite critique de CSS3 en ce début 2012">apprenez d&#8217;abord CSS 2.1</a>, c&#8217;est pour votre bien <img
src='http://www.creativejuiz.fr/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p><p>Voilà !<br
/> Si vous êtes lecteur du magazine et que vous avez des questions, c&#8217;est ici que ça se passe.<br
/> Si vous n&#8217;êtes pas lecteur du magazine, vous pouvez quand même poser des questions ici <img
src='http://www.creativejuiz.fr/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p><p>Bon lundi de Pâques !</p> ]]></content:encoded> <wfw:commentRss>http://www.creativejuiz.fr/blog/tutoriels/webdesign-magazine-hors-serie-14-trucs-astuces/feed</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Menu déroulant en CSS3 avec transition et max-height</title><link>http://www.creativejuiz.fr/blog/tutoriels/menu-deroulant-css3-transition-max-height</link> <comments>http://www.creativejuiz.fr/blog/tutoriels/menu-deroulant-css3-transition-max-height#comments</comments> <pubDate>Tue, 03 Apr 2012 07:12:43 +0000</pubDate> <dc:creator>Geoffrey</dc:creator> <category><![CDATA[CSS / CSS3]]></category> <category><![CDATA[Tutoriels]]></category> <category><![CDATA[Veille technologique]]></category> <category><![CDATA[CSS3]]></category> <category><![CDATA[déroulant]]></category> <category><![CDATA[menu]]></category> <category><![CDATA[transition]]></category> <guid
isPermaLink="false">http://www.creativejuiz.fr/blog/?p=2332</guid> <description><![CDATA[Il y a quelques temps déjà, Lea Verou proposait d&#8217;utiliser la propriété max-height afin d&#8217;effectuer des animations sur un élément sans toucher à la propriété height. Avec une petite adaptation, il est possible de créer un menu déroulant au survol avec un petit délai créé grâce à la propriété CSS 3 transition. Démonstration Le sujet [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://www.creativejuiz.fr/blog/wp-content/uploads/2012/04/css3-menu-deroulant.png" alt="" title="" width="100" height="100" class="first alignleft size-full wp-image-2340" /> Il y a quelques temps déjà, <a
href="http://jsfiddle.net/leaverou/zwvNY/">Lea Verou proposait</a> d&#8217;utiliser la propriété <code>max-height</code> afin d&#8217;effectuer des animations sur un élément sans toucher à la propriété <code>height</code>. Avec une petite adaptation, il est possible de créer un menu déroulant au survol avec un petit délai créé grâce à la propriété CSS 3 <code>transition</code>.<span
id="more-2332"></span></p><p
class="center"><a
href="/blog/doc/menu-css3-dropdown-max-height.html" class="demonstration">Démonstration</a></p><p
class="message important">Le sujet du menu déroulant est très sensible. De par sa nature, il est bien souvent considéré comme peu ergonomique, inaccessible et dans certains cas il est l&#8217;illustration d&#8217;un mauvais travail sur l&#8217;arborescence d&#8217;un site. Bref, l&#8217;article ici présente une démonstration en CSS, non une étude approfondie des tenants et aboutissants d&#8217;un menu déroulant.</p><h4>Un bout de HTML</h4><p>Le code HTML est assez classique, il s&#8217;agit d&#8217;imbriquer des listes non-ordonnées.</p><pre class="code"><code class="html">&lt;ul id="menu"&gt;
	&lt;li&gt;&lt;a href="#"&gt;Menu 1&lt;/a&gt;
		&lt;ul&gt;
			&lt;li&gt;&lt;a href="#"&gt;Level 1.1&lt;/a&gt;&lt;/li&gt;
			&lt;li&gt;&lt;a href="#"&gt;Level 1.2&lt;/a&gt;&lt;/li&gt;
		&lt;/ul&gt;
	&lt;/li&gt;&lt;li&gt;&lt;a href="#"&gt;Menu 2&lt;/a&gt;
		&lt;ul&gt;
			&lt;li&gt;&lt;a href="#"&gt;Level 2.1&lt;/a&gt;&lt;/li&gt;
			&lt;li&gt;&lt;a href="#"&gt;Level 2.2&lt;/a&gt;&lt;/li&gt;
			&lt;li&gt;&lt;a href="#"&gt;Level 2.3&lt;/a&gt;&lt;/li&gt;
			&lt;li&gt;&lt;a href="#"&gt;Level 2.4&lt;/a&gt;&lt;/li&gt;
		&lt;/ul&gt;
	&lt;/li&gt;&lt;li&gt;&lt;a href="#"&gt;Menu 3&lt;/a&gt;
		&lt;ul&gt;
			&lt;li&gt;&lt;a href="#"&gt;Level 3.1&lt;/a&gt;&lt;/li&gt;
			&lt;li&gt;&lt;a href="#"&gt;Level 3.2&lt;/a&gt;&lt;/li&gt;
			&lt;li&gt;&lt;a href="#"&gt;Level 3.3&lt;/a&gt;&lt;/li&gt;
		&lt;/ul&gt;
	&lt;/li&gt;
&lt;/ul&gt;</code></pre><p>Les chevrons fermants et ouvrants des <code
class="element">li</code> de premier niveau sont collés pour éviter le <code>white-space</code>. (pour en savoir plus : <a
href="/blog/tutoriels/display-inline-block-une-valeur-trop-peu-utilisee">Article sur display inline-block &#8211; Creative Juiz</a>)</p><h4>Place au CSS</h4> <figure
id="attachment_2344" aria-labelledby="figcaption_attachment_2344" class="wp-caption aligncenter" style="width: 468px"><img
src="http://www.creativejuiz.fr/blog/wp-content/uploads/2012/04/drop-down-menu-css3.png" alt="" title="" width="458" height="174" class="size-full wp-image-2344" /><figcaption
id="figcaption_attachment_2344" class="wp-caption-text">Le menu déroulant terminé</figcaption></figure><p>Je ne vais pas détailler ici la partie sur la création d&#8217;un menu horizontal. Je vous invite à lire le tutoriel &laquo;&nbsp;<a
href="/blog/tutoriels/creer-menu-horizontal-centre-css-sans-javascript">Créer un menu horizontal centré</a>&nbsp;&raquo; qui reprend une partie des explications.</p><pre class="code"><code class="css">/* partie positionnement et déco */
#menu a {
	display:block;
	color: #fff;
	text-decoration:none;
}
#menu > li,
#menu > li li {
	position: relative;
	display:inline-block;
	width: 110px;
	padding: 6px 15px;
	background-color: #777;
	background-image: linear-gradient(#aaa, #888 50%, #777 50%,#999);
}
#menu > li li { background: transparent none; }
#menu > li li a { color: #444; }
#menu > li li:hover { background:#eee; }
#menu > li:first-child {
	border-right: 1px solid #777;
	border-radius: 8px 0 0 8px;
}
#menu > li + li {
	border-left: 1px solid #aaa;
	border-right: 1px solid #777;
}
#menu > li:last-child {
	border-right:0;
	border-left: 1px solid #aaa;
	border-radius: 0 8px 8px 0 ;
}
#menu > li:hover {
	background-color: #999;
	background-image: linear-gradient(#ccc, #aaa 50%, #999 50%,#bbb);
}
/* (presque) fin de la partie positionnement/déco */
/* dans cette déclaration, on fixe le max-height */
#menu ul {
	position: absolute;
	top: 2em; left:0;
	max-height:0em;
	margin:0; padding:0;
	background-color:#ddd;
	background-image: linear-gradient(#fff,#ddd);
	overflow:hidden;
	transition: 1s max-height 0.3s;
	border-radius: 0 0 8px 8px;
}
/* ici on change la valeur de max-height au :hover */
#menu > li:hover ul {
	/* need an adaptation, lower is better, but see it large <img src='http://www.creativejuiz.fr/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  */
	max-height:13em;
}</code></pre><p>Concentrons nous sur l&#8217;utilisation de <code>max-height</code> et <code>transition</code> pour effectuer notre animation.<br
/> Lorsqu&#8217;on fixe, ligne 41, la valeur de <code>max-height</code> à <code>0</code>, on lui dit clairement : ta hauteur maximale sera nulle (l&#8217;élément ne sera pas visible).<br
/> Pour que cela fonctionne, il faut coupler cette propriété à un débordement caché (ligne 45).</p><p>Ligne 46, nous prévoyons une transition sur la propriété <code>max-height</code> que nous allons faire varier par la suite. Cette transition se déroulera sur <code>1s</code> et se déclanchera <code>0.3s</code> après le survol de l&#8217;élément, et ce pour le confort de l&#8217;utilisateur. (ça évite d&#8217;avoir des sous-menus qui se déroulent dès qu&#8217;on effleure le menu)</p><p>Enfin, au survol de l&#8217;élément <code
class="element">li</code>, nous faisons varier la hauteur maximale du sous-menu (ligne 52).<br
/> En prévoyant large (mais pas trop), vous créerez un effet de délai avant l&#8217;animation de repliement. Ici <code>8em</code> seraient suffisant, j&#8217;en prévoit 13.</p><p
class="center"><a
href="/blog/doc/menu-css3-dropdown-max-height.html" class="demonstration">Démonstration</a></p><p>N&#8217;hésitez pas à commenter si vous avez des zones floues <img
src='http://www.creativejuiz.fr/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /><br
/> Amusez-vous bien !</p><div
class="sources"><h4>Sources et liens utiles</h4><ul><li><a
href="http://dabblet.com/gist/1922992/" hreflang="en">Démo sur Dabblet</a></li><li><a
href="http://blog.goetter.fr/post/19567164775/max-height-a-la-rescousse-des-transitions-css3">Max-height à la rescousse des Animations CSS3 &#8211; Goetter</a></li></ul></div> ]]></content:encoded> <wfw:commentRss>http://www.creativejuiz.fr/blog/tutoriels/menu-deroulant-css3-transition-max-height/feed</wfw:commentRss> <slash:comments>14</slash:comments> </item> <item><title>CSS3 &#8211; Effet parallaxe (sans JavaScript)</title><link>http://www.creativejuiz.fr/blog/tutoriels/css3-effet-parallaxe-sans-javascript</link> <comments>http://www.creativejuiz.fr/blog/tutoriels/css3-effet-parallaxe-sans-javascript#comments</comments> <pubDate>Tue, 27 Mar 2012 06:37:03 +0000</pubDate> <dc:creator>Geoffrey</dc:creator> <category><![CDATA[CSS / CSS3]]></category> <category><![CDATA[Tutoriels]]></category> <category><![CDATA[Veille technologique]]></category> <category><![CDATA[animation]]></category> <category><![CDATA[CSS3]]></category> <category><![CDATA[Parallaxe]]></category> <category><![CDATA[target]]></category> <category><![CDATA[transition]]></category> <guid
isPermaLink="false">http://www.creativejuiz.fr/blog/?p=2147</guid> <description><![CDATA[Retour des tutoriels CSS avec quelque chose d&#8217;un peu original pour cet article : un effet parallaxe uniquement en CSS3. C&#8217;est à la suite de l&#8217;article de Simon Kern sur Alsacréations que m&#8217;est venue l&#8217;envie de tenter d&#8217;utiliser CSS pour reproduire cet effet initialement conçu avec JavaScript. L&#8217;article zoom sur l&#8217;effet parallaxe de Simon est [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://www.creativejuiz.fr/blog/wp-content/uploads/2012/03/css3-parallax-effect.png" alt="" title="css3-parallax-effect" width="100" height="100" class="first alignleft size-full wp-image-2330" /> Retour des tutoriels CSS avec quelque chose d&#8217;un peu original pour cet article : un effet parallaxe uniquement en CSS3.<br
/> C&#8217;est à la suite de l&#8217;article de Simon Kern sur Alsacréations que m&#8217;est venue l&#8217;envie de tenter d&#8217;utiliser CSS pour reproduire cet effet initialement conçu avec JavaScript.<span
id="more-2147"></span></p><p>L&#8217;article <a
href="http://www.alsacreations.com/tuto/lire/1417-zoom-sur-effet-parallaxe.html">zoom sur l&#8217;effet parallaxe</a> de Simon est bien conçu, je vous invite à le lire si vous préférez l&#8217;utilisation de jQuery, ou si vous souhaitez découvrir une alternative ou un complément à ce tutoriel.<br
/> J&#8217;en profite pour remercier Simon qui m&#8217;a autorisé à reprendre son design ainsi que la base du code qu&#8217;il a conçu pour l&#8217;article sur Alsacréations.</p><p
class="center"><a
class="demonstration" href="/trytotry/css3-parallax/" hreflang="en">Démonstration</a></p><p>Place à l&#8217;explication !</p><h4>Concept</h4><p>Pour réaliser cet effet il nous faut plusieurs éléments qui vont nous permettre de simuler différents plans. Ces plans vont se mouvoir dans le même sens mais à vitesses différées afin de donner l&#8217;impression que certains sont en premier plan (mouvements rapides) d&#8217;autres sont en arrières plan (mouvements plus lents).</p><p>Lorsque un tel effet est mis en place sur un site web, il l&#8217;est souvent pour offrir une transition originale entre deux vues, un peut comme lors d&#8217;un diaporama pour passer d&#8217;une slide à l&#8217;autre.</p><h4>Schématisation</h4><p>Nous utiliserons trois plans pour réaliser cet effet : un fond imagé en CSS (dernier plan), notre contenu qui se trouve naturellement dans le flot du document (second plan), et des éléments placés ci et là (premier plan) pour ajouter de la profondeur.</p> <figure
id="attachment_2312" aria-labelledby="figcaption_attachment_2312" class="wp-caption aligncenter" style="width: 618px"><img
class="size-full wp-image-2312" src="http://www.creativejuiz.fr/blog/wp-content/uploads/2012/03/parallax-schema.png" alt="" width="608" height="500" /><figcaption
id="figcaption_attachment_2312" class="wp-caption-text">L&#39;encadré gris représente un slide, le fond gris une image de fond, le bloc jaune un bloc de contenu, et le personnage blanc un élément de premier plan</figcaption></figure><p>Le principe de l&#8217;animation étant établi, il nous faut également garder en tête que CSS ne permet pas de positionner les éléments en fonction de la position du contenu dans la page, ou en fonction de la position de la souris.<br
/> Nous allons donc utiliser la pseudo classe <code
class="pseudo-el">target</code> afin de déterminer à quelle slide nous nous trouvons, et effectuer les animations en conséquence.</p><h4>Base HTML</h4><p>Voici un code allégé qui reprend le contenu du document de <a
href="/trytotry/css3-parallax/" hreflang="en">démonstration</a>. (je n&#8217;ai repris que le contenu de <code
class="element">body</code>)</p><pre class="code"><code class="html">&lt;!-- éléments cachés pour jouer avec :target --&gt;
&lt;span id="s1"&gt;&lt;/span&gt;
&lt;span id="s2"&gt;&lt;/span&gt;
&lt;span id="s3"&gt;&lt;/span&gt;
&nbsp;
&lt;!-- Le gros conteneur qui va glisser --&gt;
&lt;div id="wrap"&gt;
&nbsp;
	&lt;!-- La navigation --&gt;
	&lt;ul id="nav"&gt;
		&lt;li&gt;&lt;a href="#s1"&gt;Splash&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="#s2"&gt;Lorem Schnapsum&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="#s3"&gt;Credits&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;
&nbsp;
	&lt;!-- La slide 1 --&gt;
	&lt;div id="slide1"&gt;
		&lt;div class="slide_inside"&gt;
			&lt;!-- Le logo --&gt;
			&lt;h1&gt;&lt;img src="images/logo-stop-wars.png" alt="Stop Wars"&gt;&lt;/h1&gt;
		&lt;/div&gt; &lt;!-- /.slide_inside--&gt;
	&lt;/div&gt; &lt;!-- /#slide1 --&gt;
&nbsp;
	&lt;!-- La slide 2 --&gt;
	&lt;div id="slide2"&gt;
		&lt;div class="slide_inside"&gt;
			&lt;!-- Les deux éléments en 1er plan --&gt;
			&lt;!-- Mettez ici les images que vous voulez <img src='http://www.creativejuiz.fr/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  --&gt;
			&lt;img src="images/bomb-squad-trooper.png" id="trooper" alt=""&gt;
			&lt;img src="images/clone.png" id="clone" alt=""&gt;
&nbsp;
			&lt;h2&gt;Star Wars Parallax&lt;/h2&gt;
			&lt;p&gt;Lorem Salu bissame !&lt;/p&gt;
		&lt;/div&gt; &lt;!-- /.slide_inside--&gt;
	&lt;/div&gt; &lt;!-- /#slide2 --&gt;
&nbsp;
	&lt;!-- La slide 2 --&gt;
	&lt;div id="slide3"&gt;
		&lt;div class="slide_inside"&gt;
			&lt;h2&gt;Credits&lt;/h2&gt;
			[&hellip;]
		&lt;/div&gt; &lt;!-- /.slide_inside--&gt;
	&lt;/div&gt; &lt;!--  /#slide3 --&gt;
&lt;/div&gt;</code></pre><p>Pour reprendre la structure de manière schématique, nous avons à peu près cela :</p><p
class="center"><img
src="http://www.creativejuiz.fr/blog/wp-content/uploads/2012/03/stop-wars-schema.jpg" alt="Trois zones, chacune d'elle possède un &quote;.slide_inside&quote;" title="" width="608" height="713" class="aligncenter size-full wp-image-2317" /></p><p>Nous aurions pu utiliser HTML5 sans aucun problème, le principe est le même.<br
/> Maintenant nous devons passer au CSS.</p><h4>Beaucoup de styles</h4><p>Dimensionnons nos conteneurs et plaçons nos images de fond. Le code suivant est commenté pour vous aider à le comprendre.</p><pre class="code"><code class="css">body {
	margin: 0; padding: 0; /* annulation des marges */
	overflow: hidden; /* on cache le débordement de contenu */
	color: #fff;
	background: #000;
}
&nbsp;
#wrap {
	/* position du conteneur pour le préparer à bouger */
	position: relative;
	top: 0;
	/* on prépare la transition à venir */
	transition: top 1.4s cubic-bezier(.49,.22,.52,1.35);
}
&nbsp;
#nav {
	/* on fixe le menu en haut */
	position: fixed;
	top: 0; left: 0; right: 0;
	padding: 1em 0;
	margin: 0;
	/* on centre les liens */
	text-align: center;
	background: #000;
}
#nav li {
	/* on aligne les éléments de liste */
	display: inline;
	margin:0;
}
#nav a {
	/* on applique des marges aux liens */
	display: inline-block;
	margin: 0 3em;
	color: #eee;
	/* on applique une petite lueur */
	text-shadow: 0 0 5px #fff;
	/* on prévoit une petite transition (lueur) */
	transition: all 1s;
}</code></pre><p>Ça c&#8217;était pour l&#8217;aspect du cadre, nous allons mettre en styles les différents slides et leur attribuer une image de fond tout en prévoyant les transitions.<br
/> Nous allons en profiter pour styler les contenus.</p><pre class="code"><code class="css">/* slides */
#slide1, #slide2, #slide3 {
	/* height à adapter avec media queries */
	height: 1000px;
	padding-top:100px;
	/* préparation des transitions */
	transition: background-position 1.4s  cubic-bezier(.49,.22,.52,1.35);
}
/* attribution des images de fond */
#slide1 { background:url(images/slide1-bg.jpg) center 0 no-repeat fixed; }
#slide2 { background: url(images/slide2-bg.jpg) center 0 no-repeat fixed; }
#slide3 { background: url(images/slide3-bg.jpg) center 0 no-repeat fixed; }
&nbsp;
/* Contenus des slides */
.slide_inside {
	width: 770px;
	margin: 0 auto;
	position: relative;
	background-color: rgba(0, 0, 0, .6);
	padding: 50px;
}
#slide1 .slide_inside {
	text-align: center;
	background-color: transparent;
}
#slide2 .slide_inside p {
	width: 500px;
	text-align: justify;
}
#slide3 .slide_inside {
	margin-top: 50px;
}</code></pre><p
class="message important">Attention, Webkit semble ne pas supporter la valeur 1.35 de la fonction <code>cubic-bezier()</code>, il conviendra de corriger le tir en utilisant la syntaxe <code>-webkit-transition: top 1.4s cubic-bezier(.49,.22,.52,1);</code></p><p>Les images de fond et les contenus sont prêts.<br
/> On va maintenant positionner et déformer (<code>transform</code>) nos petits personnages en prévoyant également leurs transitions.</p><pre class="code"><code class="css">/* positionnement des personnages animés */
#trooper, #clone {
	position: absolute;
	left:-180px; top: 300px;
	/* on tourne légèrement les images */
	transform: rotate(10deg);
	/* et on prévoit une transition */
	transition: all 1.4s cubic-bezier(.49,.22,.52,1);
}
/* positionnement différé d'un des 2 personnages */
#clone {
	left: -280px;
	top: 400px;
}</code></pre><p>Voilà, tous nos éléments sont positionnés.<br
/> Maintenant il faut revoir le positionnement de tous ces éléments en fonction de l&#8217;élément ciblé lors d&#8217;un clic, c&#8217;est là que la pseudo classe <code
class="pseudo-class">target</code> va jouer son rôle.</p><h4>Animation en fonction de la cible</h4><p>Le principe va être le même pour chaque élément ciblé par notre menu de navigation.<br
/> Je vais donc expliquer le code pour le second élément ciblé (lorsque nous cliquons sur le deuxième élément de menu).</p><p>Nous allons utiliser la méthode proposée par Vincent De Oliveira dans son article &laquo;&nbsp;<a
href="http://www.css3create.com/Astuce-Empecher-le-scroll-avec-l-utilisation-de-target" title="Article sur CSS3Create">Empêcher le scroll avec l&#8217;utilisation de target</a>&nbsp;&raquo; afin d&#8217;éviter qu&#8217;un saut dans la page soit effectué lorsque l&#8217;on demande à rejoindre une ancre.</p><pre class="code"><code class="css">/* décalage du conteneur vers le haut */
#s2:target ~ #wrap {
	top:-1000px;
}
&nbsp;
/* décalage des fonds de chaque slide */
#s2:target ~ #wrap #slide1 { background-position: 50% 36%; }
#s2:target ~ #wrap #slide2 { background-position: 50% 0%; }
#s2:target ~ #wrap #slide3 { background-position: 50% -30%; }
&nbsp;
/* mouvements d'un des personnages */
#s2:target ~ #wrap #trooper {
	left: -180px;
	top: -100px;
	transform: rotate(-7deg);
}
&nbsp;
/* mouvements de l'autre personnage */
#s2:target ~ #wrap #clone {
	left: -350px;
	top: 50px;
	transform: rotate(0deg);
}
&nbsp;
/* juste pour la déco (lueur sur le lien cliqué) */
#s2:target ~ #wrap #nav li:first-child + li a {
	text-shadow: 0 0 5px #eca603, 0 0 5px #eca603, 0 0 5px #eca603, 0 0 5px #eca603;
}</code></pre><p>Pour traduire l&#8217;un des sélecteurs CSS avancés en français, on pourrait dire : &laquo;&nbsp;Lorsque <code>#s2</code> est ciblé, je cherche un <code>#wrap</code> directement ou indirectement frère et je style l&#8217;élément <code>#clone</code> qui se trouve dedans&nbsp;&raquo; (interprétation du sélecteur de la ligne 19).</p><p>Le principe est le même lorsque l&#8217;on cible les autres slides.<br
/> Le plus dur pour vous maintenant, c&#8217;est de trouver quels changements appliquer, à quelle vitesse (distance/temps) et dans quelle condition.</p><p>Je vous donne le code CSS pour les deux slides restantes. (quand même !)</p><pre class="code"><code class="css">/* vers Slide 1 */
#s1:target ~ #wrap { top:0px; }
#s1:target ~ #wrap #nav li:first-child a { text-shadow: 0 0 5px #eca603, 0 0 5px #eca603, 0 0 5px #eca603, 0 0 5px #eca603; }
#s1:target ~ #wrap #slide1 { background-position: 50% 0%; }
#s1:target ~ #wrap #slide2 { background-position: 50% -35%; }
#s1:target ~ #wrap #slide3 { background-position: 50% -60%; }
#s1:target ~ #wrap #trooper { left: -180px; top: 300px; transform: rotate(10deg); }
#s1:target ~ #wrap #clone { left: -280px; top: 300px; transform: rotate(10deg); }
&nbsp;
/* vers Slide 3 */
#s3:target ~ #wrap { top:-2150px; }
#s3:target ~ #wrap #nav li:last-child a { text-shadow: 0 0 5px #eca603, 0 0 5px #eca603, 0 0 5px #eca603, 0 0 5px #eca603; }
#s3:target ~ #wrap #slide1 { background-position: 50% 60%; }
#s3:target ~ #wrap #slide2 { background-position: 50% 35%; }
#s3:target ~ #wrap #slide3 { background-position: 50% 0%; }
#s3:target ~ #wrap #trooper { left:-1500px;top:-1000px; transform: rotate(-15deg); }
#s3:target ~ #wrap #clone { left:-1000px;top: -800px; transform: rotate(-15deg); }</code></pre><p>Le code CSS complet se trouve ici : <a
href="http://www.creativejuiz.fr/trytotry/css3-parallax/style.css">CSS de la démo</a></p><p>Vous aurez noté que les éléments ciblés sont nos <code
class="element">span</code> du tout début du code HTML. À partir de ce type de cible, nous pouvons parcourir tout le DOM afin de sélectionner l&#8217;élément à styler.</p><p>N&#8217;hésitez pas si vous avez des questions <img
src='http://www.creativejuiz.fr/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /></p><p
class="center"><a
class="demonstration" href="/trytotry/css3-parallax/" hreflang="en">Démonstration</a></p><div
class="sources"><h4>Liens utiles</h4><ul><li><a
href="http://www.css3create.com/Astuce-Empecher-le-scroll-avec-l-utilisation-de-target" title="Article sur CSS3Create">CSS3Create &#8211; Empêcher le scroll avec l&#8217;utilisation de target</a</li><li><a
href="http://cubic-bezier.com" hreflang="en" lang="en">Cubic Bezier Tool</a><li><a
href="/trytotry/css3-parallax/" hreflang="en">Démonstration</a></li></ul></div> ]]></content:encoded> <wfw:commentRss>http://www.creativejuiz.fr/blog/tutoriels/css3-effet-parallaxe-sans-javascript/feed</wfw:commentRss> <slash:comments>10</slash:comments> </item> <item><title>WordPress &#8211; Supprimer des blocs dans le sélecteur de format TinyMCE</title><link>http://www.creativejuiz.fr/blog/wordpress/supprimer-blocs-dans-selecteur-format-tinymce</link> <comments>http://www.creativejuiz.fr/blog/wordpress/supprimer-blocs-dans-selecteur-format-tinymce#comments</comments> <pubDate>Thu, 15 Mar 2012 09:28:30 +0000</pubDate> <dc:creator>Geoffrey</dc:creator> <category><![CDATA[WordPress]]></category> <category><![CDATA[astuce]]></category> <category><![CDATA[custom]]></category> <category><![CDATA[éditeur]]></category> <category><![CDATA[hook]]></category> <category><![CDATA[TinyMCE]]></category> <guid
isPermaLink="false">http://www.creativejuiz.fr/blog/?p=2267</guid> <description><![CDATA[En début de semaine je vous présentais une méthode pour ajouter un sélecteur de styles personnalisés à votre éditeur visuel sur WordPress. Aujourd&#8217;hui, une petit brève pour vous dire comment limiter le nombre de blocs dans le sélecteur de blocs (le sélecteur par défaut du TinyMCE de WordPress). Nous utilisons à nouveau le hook tiny_mce_before_init [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://www.creativejuiz.fr/blog/wp-content/uploads/2012/03/supprimer-block-wordpress.png" alt="" title="" width="100" height="100" class="alignleft first size-full wp-image-2298" /> En début de semaine je vous présentais une méthode pour ajouter un sélecteur de styles personnalisés à votre éditeur visuel sur WordPress.<br
/> Aujourd&#8217;hui, une petit brève pour vous dire comment limiter le nombre de blocs dans le sélecteur de blocs (le sélecteur par défaut du TinyMCE de WordPress).<span
id="more-2267"></span></p><p>Nous utilisons à nouveau le hook <code>tiny_mce_before_init</code></p><pre class="code"><code class="php">&lt;?php
add_filter('tiny_mce_before_init', 'juiz_custom_block_select');
if ( !function_exists('juiz_custom_block_select')) {
	function juiz_custom_block_select($settings) {
		// on retire `adress`, `h1` et `h2`
		$settings['theme_advanced_blockformats'] = 'p,pre,h3,h4,h5,h6';
		return $settings;
	}
}
?&gt;</code></pre><p>Il suffit de lister les éléments que vous souhaitez conserver, les autres seront temporairement désactivés.<br
/> Il vous suffira de les rajouter dans la liste pour les réactiver.</p> <figure
id="attachment_2307" aria-labelledby="figcaption_attachment_2307" class="wp-caption aligncenter" style="width: 360px"><img
src="http://www.creativejuiz.fr/blog/wp-content/uploads/2012/03/format-bloc-custom.png" alt="" title="" width="350" height="190" class="size-full wp-image-2307" /><figcaption
id="figcaption_attachment_2307" class="wp-caption-text">Retrait d&#039;éléments non utilisés</figcaption></figure><p>Il est possible de fusionner ce code avec celui que nous avons vu sur l&#8217;article <a
href="/blog/wordpress/ajouter-styles-perso-editeur-tinymce">Ajouter des styles perso dans l&#8217;éditeur TinyMCE</a>. Cela donnerait :</p><pre class="code"><code class="php">&lt;?php
// ajout du filtre pour le sélecteur de styles
add_filter( 'mce_buttons_2', 'juiz_mce_buttons_2' );
&nbsp;
if ( !function_exists('juiz_mce_buttons_2')) {
	function juiz_mce_buttons_2( $buttons ) {
		array_unshift( $buttons, 'styleselect' );
&nbsp;
		return $buttons;
	}
}
&nbsp;
// filtre pour la gestion des blocs et styles
add_filter('tiny_mce_before_init', 'juiz_custom_blocks_and_styles_select');
if ( !function_exists('juiz_custom_blocks_and_styles_select')) {
	function juiz_custom_blocks_and_styles_select($settings) {
		// on retire `adress`, `h1` et `h2`
		$settings['theme_advanced_blockformats'] = 'p,pre,h3,h4,h5,h6';
&nbsp;
		// on ajoute nos styles perso
		$style_formats = array (
			array(
				'title' =&gt; __('Italique et gras'),
				'inline' =&gt; 'span',
				'styles' =&gt; array(
					'fontStyle' =&gt; 'italic',
					'fontWeight' =&gt; 'bold'
				)
			),
			array(
				'title' =&gt; __('Bouton'),
				'selector' =&gt; 'a',
				'classes' =&gt; 'button'
			),
			array(
				'title' =&gt; __('Exergue Box'),
				'block' =&gt; 'div',
				'classes' =&gt; 'highlight',
				'wrapper' =&gt; true
			)
		);
&nbsp;
		$settings['style_formats'] = json_encode( $style_formats );
&nbsp;
		return $settings;
	}
}
?&gt;</code></pre><p>En espérant que ces astuces vous faciliterons la vie, ou celle de vos clients.</p><div
class="tdm"><h4>Astuces TinyMCE</h4><ul><li><a
href="/blog/wordpress/ajouter-styles-perso-editeur-tinymce">Ajouter des styles perso à l&#8217;éditeur TinyMCE</a></li><li><span
class="current">Supprimer des blocs dans le sélecteur TinyMCE</span></li></ul></div><div
class="sources"><h4>Sources et liens utiles</h4><ul><li><a
href="/blog/wordpress/ajouter-styles-perso-editeur-tinymce">CreativeJuiz &#8211; Ajouter des styles perso dans l&#8217;éditeur TinyMCE</a></li><li><a
href="http://wordpress.stackexchange.com/questions/3882/can-i-add-a-custom-format-to-the-format-option-in-the-text-panel">WordPress StackExchange &#8211; Question 3882</a></li></ul></div> ]]></content:encoded> <wfw:commentRss>http://www.creativejuiz.fr/blog/wordpress/supprimer-blocs-dans-selecteur-format-tinymce/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> </channel> </rss>
