Effets javascript avec Prototype et Scriptaculous
Par NiKo le dimanche 19 mars 2006, 13:19 - Dev
- Lien permanent -
25 commentaires -
Tags :
On a vu fleurir moult trolls velus à propos du web 2.0 et sa débauche d’AJAX et de javaScript inaccessibles, je ne les nourrirai pas ici. Par contre et pour ceux que ça interesse, les librairies prototype et script.aculo.us proposent des outils et effets très sympathiques. Voici quelques exemples très simples d’utilisation.
Installation
Le plus simple est de récupérer la dernière version de scriptaculous qui contient elle même une version toujours récente de prototype. Ceci fait, decompactez l’archive et copiez les librairies dans un répertoires de votre serveur web. Pour ma part, je mets tout ça dans un répertoire js. Il ne reste qu’à les appeller dans l’entête de votre document HTML :
<html> <head> <title>Mon test</title> <script type="text/javascript" src="js/prototype.js"></script> <script type="text/javascript" src="js/scriptaculous.js"></script> </head> ...
Utilisation
Réalisons un petit document HTML pour commencer à utiliser quelques effets scriptaculaires :
<html> <head> <title>Mon test</title> <script type="text/javascript" src="js/prototype.js"></script> <script type="text/javascript" src="js/scriptaculous.js"></script> </head> <body> <h1 id="title"> <a href="#">Lorem ipsum dolor sit amet</a> </h1> <p id="mytext" style="display:none"> Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut fringilla arcu at turpis. Fusce libero. Morbi libero dolor, vestibulum id, facilisis quis, malesuada vel, mi. Curabitur rutrum sapien at ante. Sed consectetuer accumsan sapien. Suspendisse scelerisque malesuada magna. Ut laoreet, sapien facilisis venenatis pharetra, metus libero malesuada purus, id ultrices dolor odio id nunc. Nullam vestibulum. Vivamus lectus lacus, volutpat ut, varius sit amet, gravida at, nisi. Suspendisse sodales auctor mi. Mauris est.</p> </body> </html>
Vous noterez que ce document fort simple n’affiche pour l’instant que le titre du document - nanti d’un lien hypertexte vide - du fait du style display:none appliqué au paragraphe principal. Pour que le texte de l’article apparaisse en fondu lors d’un clic sur le titre, il suffit d’utiliser ce simple appel javascript sur le lien de la balise de titre :
<h1 id="title"> <a href="#" onclick="new Effect.Appear('mytext', 1)">Lorem ipsum dolor sit amet</a> </h1>
Magique non ? Simple, assurément. La méthode Appear() de l’objet Effect accèpte deux arguments : le premier est l’identifiant unique de l’objet DOM de la page courante (dans notre exemple, l’id mytext est attribué à notre paragraphe). Le second paramètre est la durée en secondes de l’effet. Amusez-vous à en modifier la valeur et à tester le résultat.
De la même manière, vous pouvez appliquer d’autres effets à ce pauvre bloc de texte ; pour en tester une grande partie, ajoutez cette portion de code à notre page de test :
<p> <a href="#" onclick="new Effect.BlindDown('mytext', 1)">BlindDown</a> | <a href="#" onclick="new Effect.BlindUp('mytext', 1)">BlindUp</a> | <a href="#" onclick="new Effect.Highlight('mytext', 1)">Highlight</a> | <a href="#" onclick="new Effect.Grow('mytext', 1)">Grow</a> | <a href="#" onclick="new Effect.Shrink('mytext', 1)">Shrink</a> | <a href="#" onclick="new Effect.Squish('mytext', 1)">Squish</a> | <a href="#" onclick="new Effect.SwitchOff('mytext', 1)">SwitchOff</a> | <a href="#" onclick="new Effect.Shake('mytext', 1)">Shake</a> | <a href="#" onclick="new Effect.Pulsate('mytext', 1)">Pulsate</a> | <a href="#" onclick="new Effect.Fold('mytext', 1)">Fold</a> | <a href="#" onclick="new Effect.DropOut('mytext', 1)">DropOut</a> | <input type="button" value="Reset" onclick="new Effect.Appear('mytext', 1)" /> </p>
Voila une page vous permettant de tester les exemples :
Notez également la possibilité d’utiliser un méthode de scrolling doux lors de la navigation au sein d’une même page grâce à l’utilisation d’ancres nommées, et ce grâce à l’effet ScrollTo : encore une fois, un exemple vaut mieux qu’un long discours :
La syntaxe de l’appel à cette fonction est extrêmement simple :
<a href="#nav1" onclick="new Effect.ScrollTo('nav1',{duration:1});return false;">Lorem ipsum dolor sit amet</a>
Vous l’aurez compris, il faut passer en premier argument l’id DOM que vous ciblez (qui fera office d‘ancre nommée), et en second paramètre la durée du défilement.
Vous trouverez sur le wiki officiel de la librairie une liste complète d’exemples d’utilisation des effets combinés.
Et l’accessibilité dans tout ça ?
L’influence de l’utilisation d’effets javascript sur l’accessibilité n’est que de votre ressort. Dans notre exemple précédent, la page est potentiellement inaccessible puisque notre paragraphe mytext possède un attribut de style display:none, non lu par quelques lecteurs d’écran du marché. Qu’à cela ne tienne, il nous faut impérativement gérer le contenu de l’attribut href de nos balises de liens utilisant javascript, de manière à ce que javascript ne soit pas nécessaire à la consultation des informations et qu’un clic sur le lien nous amène à une page affichant le contenu de notre paragraphe. Par exemple, on pourrait imaginer :
<a href="afficher_article.php?full=1" onclick="new Effect.Appear('mytext', 1)">Test d'accessibilité</a>
Parfait, notre lien est cliquable et nous redirige vers une autre page. Ah oui, mais nous avons un problème : du coup ce lien prend la main sur notre effet javascript… Qu’à cela ne tienne, le problème est résolu en renvoyant la valeur false lors de l’execution de l’action clic sur le lien :
<a href="afficher_article.php?full=1" onclick="new Effect.Appear('mytext', 1);return false">Test d'accessibilité</a>
AJAX rend vos pages plus brillantes
Prototype et Scriptaculous proposent des outils qui vous simplifient la vie pour faire de l’AJAX. Par exemple, la fameuse autocompletion du champ recherche relève du jeu d’enfant. Imaginons que vous souhaitiez proposer l’autocompletion d’un champ de formulaire pour le choix d’un prénom. Voici le formulaire de base :
<form action="" method="post"> <label for="prenom">Quel est votre prénom ?</label> <input type="text" size="30" name="prenom" id="prenom" /> </form>
Scriptaculous propose un objet Ajax très pratique et disposant nativement d’une méthode Updater() permettant de s’acquitter de la tâche qui nous interesse. Voici le code final :
<form action="" method="post"> <label for="prenom">Quel est votre prénom ?</label> <input type="text" size="30" name="prenom" id="prenom" /> <div id="prn_update"></div> </form> <script type="text/javascript"> new Ajax.Autocompleter ( 'prenom', // ID of the source field 'prn_update', // ID of the DOM element to update 'prenoms.php', // Remote script URI {method: 'post', paramName: 'prenom'} ); </script>
Je pense que le code parle de lui-même, mais au cas où cela ne soit pas clair pour tout le monde, détaillons ensemble les différents éléments :
<div id="prn_update"></div>
Cet élément sera le receptacle de nos appels asynchrones au script prenoms.php ; c’est dans cet élément que seront inscrites les informations reçues, en l’occurence ici la liste des prénoms correspondants aux lettres saisies dans l’élément de formulaire prenom.
new Ajax.Autocompleter ( 'prenom', // ID of the source field
Le premier argument de notre objet sera l’identifiant DOM du champ de formulaire à qui l’on destine l’autocompletion.
'prn_update', // ID of the DOM element to update
Ce deuxième argument est l’identifiant DOM du receptacle des informations reçues.
'prenoms.php', // Remote script URI
Le troisième argument n’est autre que l’URI du script qui nous fournira nos données. A titre d’exemple, pour notre liste de prénoms, le script PHP pourrait être :
<?php $p = array("Aaron", "Abdallah", "Abdel", "Vous pouvez completer cette liste a votre guise...", "Yvon", "Zoubida", "Zouhir", "Zorobabel"); $q = $_POST['prenom']; $i = 0; if ($q != "") { echo '<ul>'; foreach($p as $prn) { if (substr(strtolower($prn),0,strlen($q)) == strtolower(stripslashes($q))) { echo '<li><a href="#" onclick="return false">'.htmlentities($prn).'</a></li>'; if (++$i >= 10) die('<li>...</li></ul>'); } } echo '</ul>'; } ?>
Enfin, le quatrième argument de notre objet Ajax.Updater est un objet javascript de paramétrage de la requête :
{method: 'post', paramName: 'prenom'} );
La propriété method spécifie la méthode HTTP que vous souhaitez utiliser pour interroger votre script (dans notre cas, post) et paramName déclare le nom de la variable à passer au script pour l’interrogation ; dans notre cas nous passons prenom qui sera ainsi correctement interprétée et traitée par notre script PHP en utilisant $_POST['prenom'].
Bien évidemment, il est possible de grandement améliorer l’esthétique du menu généré grâce à l’utilisation de règles CSS appropriées. Par exemple :
#prn_update { border: 1px solid #999; background: #fafafa; } #prn_update ul { margin: 0; padding: 0; list-style: none; } #prn_update a { display: block; padding: .2em .3em; text-decoration: none; color: #333; } .selected { background: lightyellow; }
Enfin, voila un lien vers l’exemple en live :
Conclusion
Nous avons à peine survolé un dixième des capacités de ces librairies au potentiel pour le moins énorme. Et comme vous avez pu le constater, la facilité de mise en place et d’utilisation sont au rendez-vous, les résultats spéctaculaires et améliorant de façon significative la navigation et la consultation des informations.
Attention toutefois à ne pas surcharger vos pages d’effets et veillez toujours à ce que ces derniers restent au service de l’efficacité et de l’utilisabilité de vos interfaces, en n’oubliant jamais de garder les problématiques d’accessibilité à l’esprit 
25 commentaires (Ajouter un commentaire)
En voila un bon article, justement je suis en train de m'y intéresser mais attention il ne faut pas que les effets viennent à l'encontre de l'ergonomie, simple exemple : le script qui permet de mettre son site perso dans un commentaire me demande deux clics contre un seul auparavant.
Si le nombre de posteurs de commentaires sans url est supérieur à l'autre catégorie, cette modification est justifiée. Dans le cas contraire...
Keep up good job
ps : la prévisualisation là c'est bien !
pps : la prévisualisation ne tient pas compte des retours à la ligne alors que le commentaire final si.
ppps : si je suis chiant... euh non rien finalement
Excellent billet. Merci !
Article très intéressant ! Couplé à Behaviour pour ne pas poluer le code HTML ça devient même mieux
Par contre je trouve dommage que l'on ne puisse pas renseigner l'Email et le Site web quand on poste un commentaire si JavaScript est désactivé
Assez intéressant, merci
Nickel !
C'est donc comme ça que tu as personnalisé les cases "email" et "site web"...
Très bon article, ça peut toujours servir. 
Thomas > Très juste pour Behavior que j'ai pas encore tout à fait l'habitude d'utiliser. Pour les champs inaccessibles dans mon formulaire de commentaire, je corrige ça de suite
Hey
Pour l'effet d'accordéon dont je te parlais, il est totalement plus fluide avec moofx. Sinon Prototype vaut vraiment le coup qu'on fasse connaissance avec lui
ps: sympa l'effet pour la preview ^^
Moofx est beaucoup plus légère que Scriptaculous, c'est certain. Par contre, certains effets sont indisponibles, comme le scroll fluide. Le choix doit se faire en fonction de ses priorités
Oui, il est certains que beaucoups d'effets sont supportés par Scriptaculous. Je suis en train de faire des tests de comportements avec cette librairie et aussi OpenRico. Je n'ai pas encore assez avancé pour déterminer quelle librairie j'allais utiliser pour l'Extranet que je développe.
Non, le scroll fluide est maintenant intégré à Moo.fx. Teste les liens "back to top" par ici. Voilà, maintenant que t'es à court d'arguments, t'as plus qu'à l'adopter.
Ps: des backslashs apparaissent dans le div de prévisualisation lorsqu'on utilise des guillemets.
Rhââ, c'est récent ça chez moo.fx
Bon, c'est vrai que pour le poids elle est vraiment balaise cette librairie
Je suis vraiment une tanche avec JavaBidule mais il me semble que l'on peut coupler cet article avec celui traduit sur Pompage.
À voir...
Ça me donne quand même envis d'apprendre deux trois trucs ton article
Vincent > Je sais pas, c'est plus dans l'idée de Behavior justement... Là mon article se concentre plus sur les effets disponibles, pas trop sur l'organisation... Mais tu as raison, je vais faire une suite intégrant la séparation du code javascript du code HTML
Cette lib est bien pratique, je suis un adepte de l'utilisation des drag'n drop pour mettre à jour des listes de données.
Par contre, certains tests unitaires me font planter firefox.
Pour en revenir à moo.fx (que j'utilise), cette lib est essentielement accés "effets" ce qui n'est pas le cas de Scriptaculous qui propose bien plus de fonctions. S'il ne s'agit que de faire de l'eye candy sur ses pages je voterais plus pour moo.fx.
Pour ceux que ça interesse il y à aussi dojo qui est à mi chemin entre les deux.
mika, je tiens à saluer bien bas ton splendide (gr)avatar
Voir aussi le dictionnaire en Ajax. Même principe que ton exemple, mais en plus impressionnant (et en anglais).
Niko me disait : mika, je tiens à saluer bien bas ton splendide (gr)avatar
Ce à quoi je répond : heulywoooooood !!!! John t'en remercie Niko.
Scriptaculous, ça gere ! J'ai découvert sa puissance via ton article! Salut
Bonjour,
J'ai moi aussi découvert ajax grace à vous ! Mais j'ai aussi découvert une erreur avec le formulaire de rechercher ci dessus, je n'appercois pas le div pre_update dans IE biensur :???: ! Quelqu'un aurai deja reparer ce probleme ?
++
Est-ce que tu pourrais rajouter quelques lignes au sujet de l'autocomplétion customizée ? merci, et bravo pour ton boulot!
Quelques lignes à quel sujet précisément ?
Ce guide explique comment obtenir ça pour l'autocomplétion : demo.script.aculo.us/ajax/autocompleter
Ce que j'aimerais savoir maintenant, c'est comment obtenir ça : demo.script.aculo.us/ajax/autocompleter_customized
c'est à dire la possibilité d'ajouter des infos sur le mot tapé.
perso, je ne m'en sors pas, merci pour ton aide si tu peux.
La discussion continue ailleurs
Un billet qui en dit long
Vous l'avez peut-être déjà rencontré dans les commentaires de ce blog et si vous la connaissez, vous savez qu'elle a un style à fleur de peau, très sensible et déjà fortement marqué. Mélissande nous livre sur ce billet de très bonnes photos...
Dictionnaire en Ajax
Initialement publié le 28 février 2006 à 00:36:28 Pas de doute, on n’en est qu’au début d’Ajax : Dictionnaire anglais en Ajax. Tapez Empyrean, par exemple… Quelqu’un code ça pour le wiktionnaire ? (via Totem consult) NiKo explique...