{"id":253,"date":"2014-01-23T16:53:27","date_gmt":"2014-01-23T14:53:27","guid":{"rendered":"http:\/\/geekcommunicant.com\/blog\/?p=253"},"modified":"2019-04-20T17:40:05","modified_gmt":"2019-04-20T15:40:05","slug":"javascripthtml5-tout-est-dans-le-placement","status":"publish","type":"post","link":"https:\/\/geekcommunicant.com\/blog\/2014\/01\/23\/javascripthtml5-tout-est-dans-le-placement\/","title":{"rendered":"[JavaScript\/HTML5] Tout est dans le placement"},"content":{"rendered":"\n<p>\u00c0 la fin de l&rsquo;<a href=\"https:\/\/geekcommunicant.com\/blog\/2013\/08\/22\/et-maintenant-ajoutons-quelques-couleurs\/\" target=\"_blank\" rel=\"noopener noreferrer\">article pr\u00e9c\u00e9dent<\/a> j&rsquo;avais utilis\u00e9 une image comme motif. Comme on ne pouvait pas le deviner l&rsquo;image utilis\u00e9e \u00e9tait la suivante.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><a href=\"https:\/\/geekcommunicant.com\/blog\/wp-content\/uploads\/summer-girls-13.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"375\" src=\"https:\/\/geekcommunicant.com\/blog\/wp-content\/uploads\/summer-girls-13.jpg\" alt=\"summer-girls-13\" class=\"wp-image-254\" srcset=\"https:\/\/geekcommunicant.com\/blog\/wp-content\/uploads\/summer-girls-13.jpg 500w, https:\/\/geekcommunicant.com\/blog\/wp-content\/uploads\/summer-girls-13-300x225.jpg 300w, https:\/\/geekcommunicant.com\/blog\/wp-content\/uploads\/summer-girls-13-400x300.jpg 400w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a><\/figure><\/div>\n\n\n\n<!--more-->\n\n\n\n<p>Les canvas ne permettent pas de placement pr\u00e9cis des motifs. Mais il existe un moyen: le compositage. Cette m\u00e9thode fonctionne un peu comme les calques et masques des logiciels de type Photoshop. Cet \u00e9tape suppl\u00e9mentaire permet le positionnement pr\u00e9cis de l&rsquo;image utilis\u00e9e comme fond.<\/p>\n\n\n\n<p>Le compositage s&rsquo;effectue via la propri\u00e9t\u00e9 <code>globalCompositeOperation<\/code>, qui s&rsquo;utilise de la mani\u00e8re suivante:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\nctx.globalCompositeOperation=&#039;source-atop&#039;;\n<\/pre><\/div>\n\n\n<p>La propri\u00e9t\u00e9 <code>source-atop<\/code> utilis\u00e9e ci-dessus signifie qu&rsquo;\u00e0 la fin ne reste visible que la partie de la source (\u00e9l\u00e9ments ajout\u00e9s ult\u00e9rieurement) comprise dans la destination (\u00e9l\u00e9ments d\u00e9j\u00e0 en place). Pour la liste de toutes les valeurs possibles, rendez-vous sur <a href=\"https:\/\/www.w3schools.com\/tags\/canvas_globalcompositeoperation.asp\" target=\"_blank\" rel=\"noopener noreferrer\">w3schools<\/a>.<\/p>\n\n\n\n<p>Avec le r\u00e9glage ci-dessus, pour un texte avec une image en fond, il faut d&rsquo;abord placer le texte, puis placer l&rsquo;image, \u00e0 l&rsquo;aide de la m\u00e9thode <code>drawImage<\/code>:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\n\/\/Avec: image \u00e0 utiliser, coordonn\u00e9es de l&#039;image, dimensions de l&#039;image\nctx.drawImage(img,0,-85,500,375);\n<\/pre><\/div>\n\n\n<p>En adaptant le code existant, cela donne :<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\nsetTimeout(function(){\n\tvar img = new Image();\n\timg.onload = function(){\n\t\tvar c = document.getElementById(&#039;canvas&#039;);\n\t\tvar ctx = c.getContext(&#039;2d&#039;);\n\t\tctx.font = &#039;85px Knewave&#039;;\n\t\tctx.textAlign = &#039;center&#039;;\n\t\tctx.shadowColor = &#039;#000&#039;;\n\t\tctx.shadowBlur = 20;\n\t\tctx.fillText(&#039;Summer&#039;,250,100);\n\t\tctx.fillText(&#039;is magic&#039;,250,180);\n\t\tctx.globalCompositeOperation=&#039;source-atop&#039;;\n\t\tctx.drawImage(img,0,-85,500,375);\n\t};\n\timg.src = &#039;https:\/\/geekcommunicant.com\/blog\/wp-content\/uploads\/summer-girls-13.jpg&#039;;\n},1000);\n<\/pre><\/div>\n\n\n<p>Nous obtenons alors :<\/p>\n\n\n\n<iframe loading=\"lazy\" src=\"https:\/\/geekcommunicant.com\/iframes\/canvas07.html\" width=\"100%\" height=\"300\"><\/iframe>\n\n\n\n<p>Pas tr\u00e8s joli&#8230; Mais si vous regardez le code utilis\u00e9, vous en verrez la cause: le texte, plac\u00e9 avant l&rsquo;image, a une ombre, et c&rsquo;est ce qui cr\u00e9\u00e9 les \u00ab\u00a0bavures\u00a0\u00bb.<\/p>\n\n\n\n<p>Pour placer l&rsquo;ombre sur le texte avec l&rsquo;image, il faut utiliser un canvas interm\u00e9diaire: on composite le texte sans ombre avec l&rsquo;image sur un canvas interm\u00e9diare, et on dessine ce canvas avec une ombre sur le canvas final. Le canvas interm\u00e9diaire est masqu\u00e9 via le CSS et la propri\u00e9t\u00e9 <code>display:none;<\/code>.<\/p>\n\n\n\n<p>Le contenu de notre <code>body<\/code> devient alors :<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n&lt;canvas id=&quot;canvas&quot; width=&quot;500&quot; height=&quot;250&quot;&gt;&lt;\/canvas&gt;\n&lt;canvas id=&quot;temp&quot; width=&quot;500&quot; height=&quot;250&quot;&gt;&lt;\/canvas&gt; \/\/le canvas temporaire, masqu\u00e9 via CSS\n \n&lt;script type=&quot;text\/javascript&quot;&gt;\n\twindow.onload = function() {\n\t\tsetTimeout(function(){\n\t\t\tvar img = new Image();\n\t\t\timg.onload = function(){\n\t\t\t\t\/\/ici, on composite l&#039;image avec le texte\n\t\t\t\tvar c = document.getElementById(&quot;temp&quot;);\n\t\t\t\tvar ctx = c.getContext(&quot;2d&quot;);\n\t\t\t\tctx.font = &quot;85px Knewave&quot;;\n\t\t\t\tctx.textAlign = &quot;center&quot;;\n\t\t\t\tctx.fillText(&quot;Summer&quot;,250,100);\n\t\t\t\tctx.fillText(&quot;is magic&quot;,250,180);\n\t\t\t\tctx.globalCompositeOperation=&quot;source-atop&quot;;\n\t\t\t\tctx.drawImage(img,0,-85,500,375);\n\t\t\t\t\/\/ici, on place l&#039;ombre sous le texte imag\u00e9\n\t\t\t\tvar c1 = document.getElementById(&quot;canvas&quot;);\n\t\t\t\tvar ctx1 = c1.getContext(&quot;2d&quot;);\n\t\t\t\tctx1.shadowColor = &quot;#000&quot;;\n\t\t\t\tctx1.shadowBlur = 20;\n\t\t\t\tctx1.drawImage(temp,0,0);\n\t\t\t};\n\t\t\timg.src = &quot;https:\/\/geekcommunicant.com\/blog\/wp-content\/uploads\/summer-girls-13.jpg&quot;;\n\t\t},1000);\n\t};\n&lt;\/script&gt;\n<\/pre><\/div>\n\n\n<p>R\u00e9sultat :<\/p>\n\n\n\n<iframe loading=\"lazy\" src=\"https:\/\/geekcommunicant.com\/iframes\/canvas08.html\" width=\"100%\" height=\"300\"><\/iframe>\n\n\n\n<p>Et voil\u00e0, j&rsquo;esp\u00e8re que cette s\u00e9rie d&rsquo;articles sur l&rsquo;utilisation des canvas vous aura \u00e9clair\u00e9.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00c0 la fin de l&rsquo;article pr\u00e9c\u00e9dent j&rsquo;avais utilis\u00e9 une image comme motif. Comme on ne pouvait pas le deviner l&rsquo;image utilis\u00e9e \u00e9tait la suivante.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[19],"tags":[20],"class_list":["post-253","post","type-post","status-publish","format-standard","hentry","category-javascript","tag-canvas"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p2IoOb-45","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":727,"url":"https:\/\/geekcommunicant.com\/blog\/2019\/04\/15\/retour-premiere-carte-interactive\/","url_meta":{"origin":253,"position":0},"title":"Retour sur ma premi\u00e8re carte interactive","author":"geekc","date":"15\/04\/2019","format":false,"excerpt":"Dans mon dernier article (voir), j'ai indiqu\u00e9 que la premi\u00e8re solution de carte interactive que j'avais pr\u00e9sent\u00e9e dans une s\u00e9rie de deux articles (1 et 2) ne fonctionnait pas sous Chrome. R\u00e9cemment, en consultant le code d'une page de reserves-naturelles.org, je me suis aper\u00e7u que la carte des r\u00e9gions de\u2026","rel":"","context":"Dans &quot;JavaScript&quot;","block_context":{"text":"JavaScript","link":"https:\/\/geekcommunicant.com\/blog\/category\/javascript\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1000,"url":"https:\/\/geekcommunicant.com\/blog\/2022\/12\/16\/amusons-nous-avec-canvas-retour\/","url_meta":{"origin":253,"position":1},"title":"Amusons-nous avec les canvas &#8211; le retour","author":"geekc","date":"16\/12\/2022","format":false,"excerpt":"Il y a quelques ann\u00e9es, j\u2019avais \u00e9crit une s\u00e9rie d\u2019articles expliquant comment cr\u00e9er \u00e0 l\u2019aide du\u00a0 tag <canvas> un texte ombr\u00e9 avec une image en fond utilisant une police Google Fonts. La technique ayant un peu \u00e9volu\u00e9 depuis, et ayant fait de nouveaux essais de mon c\u00f4t\u00e9, je pense qu\u2019il\u2026","rel":"","context":"Dans &quot;JavaScript&quot;","block_context":{"text":"JavaScript","link":"https:\/\/geekcommunicant.com\/blog\/category\/javascript\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekcommunicant.com\/blog\/wp-content\/uploads\/image.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":230,"url":"https:\/\/geekcommunicant.com\/blog\/2013\/08\/22\/et-maintenant-ajoutons-quelques-couleurs\/","url_meta":{"origin":253,"position":2},"title":"[JavaScript\/HTML5] Et maintenant ajoutons quelques couleurs","author":"geekc","date":"22\/08\/2013","format":false,"excerpt":"Dans mon pr\u00e9c\u00e9dent article Amusons-nous avec les canvas, nous \u00e9tions arriv\u00e9s au r\u00e9sultat ci-dessous: Nous avons donc ici un effet que l'on aurait pu obtenir en CSS. Mais gr\u00e2ce aux <canvas> nous pouvons \u00e0 pr\u00e9sent remplir notre texte avec autre chose qu'une unique couleur ; avec les <canvas> on peut\u2026","rel":"","context":"Dans &quot;JavaScript&quot;","block_context":{"text":"JavaScript","link":"https:\/\/geekcommunicant.com\/blog\/category\/javascript\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1081,"url":"https:\/\/geekcommunicant.com\/blog\/2023\/01\/20\/gloubi-tuto-menu-images-reactives\/","url_meta":{"origin":253,"position":3},"title":"Gloubi tuto &#8211; menu avec images r\u00e9actives","author":"geekc","date":"20\/01\/2023","format":false,"excerpt":"Nouvelle semaine, nouveau gloubi-tuto. Cette fois-ci, on s\u2019attaque \u00e0 un autre script de menu. M\u2019enfin script\u2026 pas cette-fois. M\u00eame si sur gloubiweb cela est pr\u00e9sent\u00e9 comme un script, il s\u2019agit en fait de CSS. Ce menu, qui est visible sur cette page, utilise la technique des sprites CSS. Pr\u00e9sentation de\u2026","rel":"","context":"Dans &quot;CSS&quot;","block_context":{"text":"CSS","link":"https:\/\/geekcommunicant.com\/blog\/category\/css\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":211,"url":"https:\/\/geekcommunicant.com\/blog\/2013\/08\/11\/amusons-nous-avec-les-canvas\/","url_meta":{"origin":253,"position":4},"title":"[JavaScript\/HTML5] Amusons-nous avec les canvas","author":"geekc","date":"11\/08\/2013","format":false,"excerpt":"Aujourd'hui nous allons voir comment ajouter du texte aux nouveaux \u00e9l\u00e9ments <canvas> du HTML5. Comme les plus attentifs d'entre-vous l'auront d\u00e9j\u00e0 remarqu\u00e9, le titre de l'article r\u00e9v\u00e8le d\u00e9j\u00e0 une partie du contenu de l'article ; effectivement, pour utiliser les canvas, il faut obligatoirement passer par JavaScript. Le HTML La d\u00e9claration\u2026","rel":"","context":"Dans &quot;JavaScript&quot;","block_context":{"text":"JavaScript","link":"https:\/\/geekcommunicant.com\/blog\/category\/javascript\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1058,"url":"https:\/\/geekcommunicant.com\/blog\/2023\/01\/06\/retour-compteur-caracteres\/","url_meta":{"origin":253,"position":5},"title":"Le retour du compteur de caract\u00e8res","author":"geekc","date":"06\/01\/2023","format":false,"excerpt":"Apr\u00e8s \u00eatre revenu derni\u00e8rement sur ma s\u00e9rie de tutos d\u2019introduction aux canvas, j\u2019ai d\u00e9cid\u00e9 de m\u2019attaquer \u00e0 l\u2019un de mes anciens articles me valant le plus d\u2019affichage sur le moteur de recherche d\u2019Alphabet\u00a0: le compteur de caract\u00e8res. Comme pour mes derniers articles traitant de JavaScript, une fois de plus je\u2026","rel":"","context":"Dans &quot;JavaScript&quot;","block_context":{"text":"JavaScript","link":"https:\/\/geekcommunicant.com\/blog\/category\/javascript\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/geekcommunicant.com\/blog\/wp-json\/wp\/v2\/posts\/253","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/geekcommunicant.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/geekcommunicant.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/geekcommunicant.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/geekcommunicant.com\/blog\/wp-json\/wp\/v2\/comments?post=253"}],"version-history":[{"count":0,"href":"https:\/\/geekcommunicant.com\/blog\/wp-json\/wp\/v2\/posts\/253\/revisions"}],"wp:attachment":[{"href":"https:\/\/geekcommunicant.com\/blog\/wp-json\/wp\/v2\/media?parent=253"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/geekcommunicant.com\/blog\/wp-json\/wp\/v2\/categories?post=253"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/geekcommunicant.com\/blog\/wp-json\/wp\/v2\/tags?post=253"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}