{"id":87,"date":"2010-05-26T14:20:46","date_gmt":"2010-05-26T13:20:46","guid":{"rendered":"http:\/\/saladtomatonion.com\/blog\/?p=87"},"modified":"2019-09-06T14:43:30","modified_gmt":"2019-09-06T12:43:30","slug":"du-dessin-vectoriel-dans-une-page-web-sans-adobe-flash","status":"publish","type":"post","link":"https:\/\/saladtomatonion.com\/blog\/2010\/05\/26\/du-dessin-vectoriel-dans-une-page-web-sans-adobe-flash\/","title":{"rendered":"Du dessin vectoriel dans une page web&#8230; sans Adobe Flash"},"content":{"rendered":"<p><a href=\"http:\/\/saladtomatonion.com\/blog\/wp-content\/uploads\/2010\/05\/beziers.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignright size-full wp-image-172\" title=\"Beziers curve\" src=\"http:\/\/saladtomatonion.com\/blog\/wp-content\/uploads\/2010\/05\/beziers.png\" alt=\"\" width=\"128\" height=\"93\" \/><\/a>Peu de personnes se sont frott\u00e9es au dessin interactif dans une page web. Lorsque l&rsquo;on veut dessiner de fa\u00e7on vectorielle (c&rsquo;est \u00e0 dire pour r\u00e9sumer que le dessin est \u00ab\u00a0lisse\u00a0\u00bb \u00e0 toutes les \u00e9chelles), on n&rsquo;a pas r\u00e9ellement d&rsquo;autre choix que d&rsquo;utiliser du Flash (qui est une technologie propri\u00e9taire). Sauf si on s&rsquo;int\u00e9resse au SVG, au VML, et \u00e0 <a href=\"https:\/\/dmitrybaranovskiy.github.io\/raphael\" target=\"_blank\" rel=\"noopener noreferrer\">Rapha\u00eblJS<\/a>.<\/p>\n<p><!--more-->Je ne reviendrai pas sur le d\u00e9bat houleux entre Apple et Adobe concernant, entre autres, le portage d&rsquo;un Flash Player sur les plateformes <em>touch<\/em> (iPhone, iPad, iPod touch).\u00a0 Cependant, il se trouve que ce dont je vais parler ici fonctionne effectivement sur mon iPhone.<\/p>\n<p>Le <a href=\"http:\/\/fr.wikipedia.org\/wiki\/SVG\" target=\"_blank\" rel=\"noopener noreferrer\">SVG<\/a> (<a href=\"http:\/\/upload.wikimedia.org\/wikipedia\/commons\/5\/5b\/ExempleSimple.svg\" target=\"_blank\" rel=\"noopener noreferrer\">un exemple de fichier SVG ici<\/a>) c&rsquo;est un format ouvert d\u00e9riv\u00e9 du XML destin\u00e9 \u00e0 d\u00e9crire des trac\u00e9s vectoriels. Le logiciel <a href=\"http:\/\/www.inkscape.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">Inkscape<\/a>, un Illustrator open-source sauvegarde les fichiers justement dans ce format. Un format XML, \u00e7a veut donc dire des \u00e9l\u00e9ments du DOM manipulables comme toutes les autres balises HTML!<\/p>\n<p>Il existe une limite. Le SVG est bien interpr\u00e9t\u00e9 par Firefox, Opera ou Safari, mais Internet Explorer ne sait pas quoi en faire, pas avant la version 9 apparemment. Cependant, il sait afficher un autre type de description vectorielle : le <a href=\"http:\/\/fr.wikipedia.org\/wiki\/Vector_Markup_Language\" target=\"_blank\" rel=\"noopener noreferrer\">VML<\/a>.<\/p>\n<p>C&rsquo;est l\u00e0 qu&rsquo;intervient <a href=\"http:\/\/raphaeljs.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Rapha\u00eblJS<\/a> en se positionnant comme couche d&rsquo;abstraction sur le choix SVG\/VML, et comme outil efficace pour la cr\u00e9ation et la manipulation des balises de dessin.<\/p>\n<p>Rapha\u00eblJS propose une interface simple pour dessiner des primitives ou des courbes param\u00e9tr\u00e9es, de changer leurs param\u00e8tres, et d&rsquo;animer tout \u00e7a.<\/p>\n<p>Tout commence par la d\u00e9finition d&rsquo;une surface de dessin, qu&rsquo;on peut cr\u00e9er \u00e0 partir de rien, ou bien inclure dans un \u00e9l\u00e9ment existant. Voici un exemple :<\/p>\n<pre class=\"js:nogutter:nocontrols\" style=\"padding-left: 2em;\">\/*\n  Cr\u00e9ation d'une surface de dessin\n  \u00e0 l'int\u00e9rieur de l'\u00e9l\u00e9ment d'id \"mondiv\"\n  et de 500 pixels de c\u00f4t\u00e9\n*\/\nsurface = Raphael(\"mondiv\", 500, 500);\n<\/pre>\n<p>C&rsquo;est ensuite cette surface qui dispose des m\u00e9thodes utilis\u00e9es pour le dessin<\/p>\n<pre class=\"js:nogutter:nocontrols\" style=\"padding-left: 2em;\">obj = surface.line(0,0,100,100);\n<\/pre>\n<p>On remarque que j&rsquo;ai gard\u00e9 une r\u00e9f\u00e9rence sur l&rsquo;objet cr\u00e9\u00e9 (obj), mais j&rsquo;aurais tr\u00e8s bien pu ne pas le faire. Dans mon cas, je peux r\u00e9utiliser cette r\u00e9f\u00e9rence pour d&rsquo;autres op\u00e9rations :<\/p>\n<pre class=\"js:nogutter:nocontrols\" style=\"padding-left: 2em;\">obj.attr(\"stroke-width\",5).move(50,50);\n\/\/ \u00e9paisseur du trait \u00e0 5\n\/\/ d\u00e9placement aux coordonn\u00e9es 50,50<\/pre>\n<p>Les op\u00e9rations sur les objets de dessins revoient toujours une r\u00e9f\u00e9rence sur eux-m\u00eames, je peux donc encha\u00eener les commandes!<\/p>\n<p>Je vous enjoins \u00e0 aller voir les exemples sur <a href=\"https:\/\/dmitrybaranovskiy.github.io\/raphael\" target=\"_blank\" rel=\"noopener noreferrer\">le site de Rapha\u00eblJS<\/a>, et particuli\u00e8rement <a href=\"https:\/\/dmitrybaranovskiy.github.io\/raphael\/curver.html\" target=\"_blank\" rel=\"noopener noreferrer\">le tigre<\/a> ou <a href=\"https:\/\/dmitrybaranovskiy.github.io\/raphael\/curver.html\" target=\"_blank\" rel=\"noopener noreferrer\">le curver<\/a>. Essayez le zoom de page pour plonger dans les d\u00e9tails des dessins!<\/p>\n<p>Et enfin, un exemple maison. Cliquez dans l&rsquo;image pour un peu d&rsquo;interaction!<\/p>\n<iframe class=\"\" src=\"http:\/\/saladtomatonion.com\/blog\/wp-content\/uploads\/2010\/05\/raphael-sample.html\" style=\"width: 500px; height: 330px; \" frameborder=\"0\" scrolling=\"\" onload=\"scro11me(this)\"><\/iframe><script type=\"text\/javascript\">function scro11me(f){f.contentWindow.scrollTo(0,0); }<\/script>\n<p>Et le code de tout \u00e7a, en consid\u00e9rant que j&rsquo;ai un <code>&lt;div id=\"paper\" \/&gt;<\/code> dans le code HTML de ma page :<\/p>\n<pre class=\"js:nogutter:nocontrols\" style=\"padding-left: 2em;\">\/\/ Cr\u00e9ation de la surface de dessin.\n\/\/ Elle est attach\u00e9e \u00e0 un div dont l'id est \"paper\"\npaper = Raphael(\"paper\", 500, 330);\n\n\/\/ Dessin de trois cercles, donc je fais varier les centres,\n\/\/ les diam\u00e8tres, la couleur...\npaper.circle(250,165,200)\n     .attr(\"fill\", \"#DDDDDD\")\n     .attr(\"stroke\",\"Transparent\")\n     .attr(\"opacity\",0.5);\npaper.circle(30,250,100)\n     .attr(\"fill\", \"#DDEEFF\")\n     .attr(\"stroke\",\"Transparent\")\n     .attr(\"opacity\",0.7);\npaper.circle(600,50,250)\n     .attr(\"fill\", \"#FF9999\")\n     .attr(\"stroke\",\"Transparent\")\n     .attr(\"opacity\",0.5);\n\n\/\/ D\u00e9fition du callback d'\u00e9v\u00e9nement click sur ma surface\npaper.canvas.onclick = function(clickevent){\n    \/\/randint(min, max) renvoie un entier al\u00e9atoire\n    r = randint(10,100); \n\n    \/\/ dessin d'un cercle de taille 0 au point du clic\n    \/\/ dont l'\u00e9paisseur du trait et la couleur son d\u00e9finis\n    \/\/ et dont on anime le diam\u00e8tre jusqu'\u00e0 la taille finale\n    paper.circle(clickevent.layerX,clickevent.layerY,0)\n        .attr({\"stroke-width\":Math.ceil(r\/5),\"stroke\":Raphael.getColor()})\n        .animate({\"r\":r}, Math.ceil(500 + (r-10)*4), \"bounce\");\n};\n<\/pre>\n<p>Aussi simple que \u00e7a! En poussant un peu plus loin, on peut m\u00eame faire du drag&amp;drop sur les \u00e9l\u00e9ments, conditionner le dessin sur le chargement AJAX de donn\u00e9es, ou encore utiliser <a href=\"http:\/\/jquery.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">jQuery<\/a> pour manipuler le tout!<\/p>\n<p>On a donc l\u00e0 une alternative \u00e0 Flash plut\u00f4t int\u00e9ressante. Je dirais que dans l&rsquo;\u00e9tat actuel des choses, on peut essentiellement utiliser Rapha\u00eblJS comme un petit outil pour facilement ajouter des d\u00e9corations dans des pages, ou encore dessiner des graphes, ou manipuler des repr\u00e9sentations de donn\u00e9es un peu \u00e9volu\u00e9es&#8230; Cependant on n&rsquo;a pas de r\u00e9el moteur d&rsquo;ex\u00e9cution et de logiciel d&rsquo;\u00e9dition pour simplement cr\u00e9er et jouer une animation comme on peut le faire avec Flash&#8230; On attend qu&rsquo;un \u00e9diteur logiciel fabrique ces briques manquantes!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Peu de personnes se sont frott\u00e9es au dessin interactif dans une page web. Lorsque l&rsquo;on veut dessiner de fa\u00e7on vectorielle (c&rsquo;est \u00e0 dire pour r\u00e9sumer que le dessin est \u00ab\u00a0lisse\u00a0\u00bb \u00e0 toutes les \u00e9chelles),&#46;&#46;&#46;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","jetpack_publicize_message":"","jetpack_is_tweetstorm":false,"jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false}}},"categories":[4],"tags":[49,20,23,21,26,24,25,19],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/saladtomatonion.com\/blog\/wp-json\/wp\/v2\/posts\/87"}],"collection":[{"href":"https:\/\/saladtomatonion.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/saladtomatonion.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/saladtomatonion.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/saladtomatonion.com\/blog\/wp-json\/wp\/v2\/comments?post=87"}],"version-history":[{"count":55,"href":"https:\/\/saladtomatonion.com\/blog\/wp-json\/wp\/v2\/posts\/87\/revisions"}],"predecessor-version":[{"id":1434,"href":"https:\/\/saladtomatonion.com\/blog\/wp-json\/wp\/v2\/posts\/87\/revisions\/1434"}],"wp:attachment":[{"href":"https:\/\/saladtomatonion.com\/blog\/wp-json\/wp\/v2\/media?parent=87"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/saladtomatonion.com\/blog\/wp-json\/wp\/v2\/categories?post=87"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/saladtomatonion.com\/blog\/wp-json\/wp\/v2\/tags?post=87"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}