{"id":991,"date":"2022-12-09T19:00:21","date_gmt":"2022-12-09T18:00:21","guid":{"rendered":"https:\/\/geekcommunicant.com\/blog\/?p=991"},"modified":"2022-12-26T23:17:43","modified_gmt":"2022-12-26T22:17:43","slug":"gloubi-tuto-texte-degrade","status":"publish","type":"post","link":"https:\/\/geekcommunicant.com\/blog\/2022\/12\/09\/gloubi-tuto-texte-degrade\/","title":{"rendered":"Gloubi tuto &#8211; un texte en d\u00e9grad\u00e9"},"content":{"rendered":"\n<p>Pour ce deuxi\u00e8me gloubi tuto, on s\u2019attaque \u00e0 un script qui a eu son petit succ\u00e8s sur Skyblog&nbsp;: le texte \u00ab&nbsp;arc-en-ciel&nbsp;\u00bb (en d\u00e9grad\u00e9s).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Script original et explication<\/h2>\n\n\n\n<p>Pour voir le script original, qui fonctionne encore dans les navigateurs modernes, rendez-vous ici sur le site de notre <a href=\"http:\/\/gloubiweb.free.fr\/scripts\/javascript41.htm\" target=\"_blank\" rel=\"noreferrer noopener\">N\u00e9m\u00e9sis<\/a> dans la deuxi\u00e8me guerre du gloubi.<\/p>\n\n\n\n<p>Le script fonctionne comme suit&nbsp;:<\/p>\n\n\n\n<p>Avant d\u2019appeler la principale fonction de notre script, on construit un tableau de correspondance d\u00e9cimal vers hexad\u00e9cimal \u00e0 l\u2019aide de deux boucles imbriqu\u00e9es.<\/p>\n\n\n\n<!--more-->\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\nvar tohex = new Array(256);\nvar hex = &quot;0123456789ABCDEF&quot;;\nvar count = 0;\nfor (x=0; x&lt;16; x++) {\n    for (y=0; y&lt;16; y++) {\n        tohex&#x5B;count] = hex.charAt(x) + hex.charAt(y);\n        count++;\n    }\n}\n<\/pre><\/div>\n\n\n<p>Vient ensuite la fonction principale du script. Celle-ci prend deux param\u00e8tres d\u2019entr\u00e9es: le texte \u00e0 colorer et les couleurs \u00e0 utiliser.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\nfunction gradient (thetext,thecolors) { ... }\n<\/pre><\/div>\n\n\n<p>On commence par construire un tableau qui contient les codes RGB (avec des valeurs allant de 0 \u00e0 255) des diff\u00e9rentes couleurs. Les couleurs individuelles sont s\u00e9par\u00e9es \u00e0 l\u2019aide de la m\u00e9thode <code>substring()<\/code> des objets de type string. Chaque couleur est ensuite trait\u00e9e par paire de chiffres hexad\u00e9cimaux, chaque paire \u00e9tant convertie en base 10 avec la fonction <code>parseInt()<\/code>.<\/p>\n\n\n\n<p>Ce traitement est assur\u00e9 par les fonctions <code>ColorList()<\/code> et <code>ColorCode()<\/code> du script original.<\/p>\n\n\n\n<p><code>ColorList()<\/code> se charge de la s\u00e9paration des couleurs individuelles :<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\nfunction ColorList(hexcodes) {\n    var i = 0;\n    var c = 0;\n    this.codes = new Array(Math.round(hexcodes.length\/7));\n    while (i &lt; hexcodes.length) {\n        if (isNaN(parseInt(hexcodes.substring(i,i+6),16))) ++i;\n        else {\n            this.codes&#x5B;c] = new ColorCode(hexcodes.substring(i,i+6));\n            i += 7;\n            ++c;\n        }\n    }\n    this.len = c;\n}\n<\/pre><\/div>\n\n\n<p>Tandis que <code>ColorCode()<\/code> se charge de la conversion en composantes RGB :<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\nfunction ColorCode(hexcode) {\n    if (hexcode.length == 7) {\n        this.r = parseInt(hexcode.substring(1,3),16);\n        this.g = parseInt(hexcode.substring(3,5),16);\n        this.b = parseInt(hexcode.substring(5,7),16);\n    }\n    else if (hexcode.length == 6) {\n        this.r = parseInt(hexcode.substring(0,2),16);\n        this.g = parseInt(hexcode.substring(2,4),16);\n        this.b = parseInt(hexcode.substring(4,6),16);\n    }\n    else {\n        this.r = this.g = this.b = 0;\n        alert(&quot;Error: ColorCode constructor failed&quot;);\n    }\n    if (isNaN(this.r)||isNaN(this.g)||isNaN(this.b))\n        alert(&quot;Error: ColorCode constructor failed&quot;);\n}\n<\/pre><\/div>\n\n\n<p>Ensuite on traite le texte caract\u00e8re par caract\u00e8re. Pour chacun de ces caract\u00e8res, on d\u00e9termine selon sa position dans la cha\u00eene les deux couleurs entre lesquelles celui-ci se situe (fonctions <code>lowcolorindex()<\/code> et <code>highcolorindex()<\/code>) et \u00e0 partir de ces deux couleurs et de l\u2019emplacement dans la cha\u00eene on utilise une fonction d\u2019interpolation (<code>interpolate()<\/code>) pour d\u00e9terminer une valeur pour chacune des composantes (red, green, blue) de la couleur du caract\u00e8re.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\nfunction interpolate (x1, y1, x3, y3, x2) {\n    if (x3 == x1) return y1\n    else return (x2-x1)*(y3-y1)\/(x3-x1) + y1\n}\n\nfunction lowcolorindex (x, y, z) {\n    if (y == 1) return 0\n    else return Math.floor( (x*(z-1))\/(y-1) )\n}\n\nfunction hicolorindex (x, y, z, low) { \n    if ( low*(y-1) == x*(z-1) ) return low\n    else if (y == 1) return 0\n    else return Math.floor( (x*(z-1))\/(y-1) + 1 )\n}\n<\/pre><\/div>\n\n\n<!--nextpage-->\n\n\n\n<h2 class=\"wp-block-heading\">Mes modifications<\/h2>\n\n\n\n<p>La premi\u00e8re modification majeure apport\u00e9e est la signature de la fonction principale. Celle-ci ne prend plus qu\u2019un seul param\u00e8tre, l\u2019\u00e9l\u00e9ment du DOM cibl\u00e9 pour l\u2019arc-en-cielisation.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nfunction colorText(target) { ... }\n<\/pre><\/div>\n\n\n<p>Le texte utilis\u00e9 est celui contenu dans l\u2019\u00e9l\u00e9ment du DOM (r\u00e9cup\u00e9r\u00e9 via la propri\u00e9t\u00e9 <code>innerHTML<\/code>), et pour les couleurs, celles-ci sont renseign\u00e9es dans un attribut &lsquo;data-colors&rsquo; de la cible, et pour les r\u00e9cup\u00e9rer, on utilise la m\u00e9thode <code><a rel=\"noreferrer noopener\" href=\"https:\/\/developer.mozilla.org\/fr\/docs\/Web\/API\/Element\/getAttribute\" target=\"_blank\">getAttribute<\/a><\/code>.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\nvar text = target.innerHTML;\nvar colors = target.getAttribute(&#039;data-colors&#039;);\n<\/pre><\/div>\n\n\n<p>Deuxi\u00e8me changement relativement important, j\u2019ai supprim\u00e9 le tableau de correspondance d\u00e9cimal\/hexad\u00e9cimal et la double boucle pour le remplir. En effet, pas besoin de construire une table de correspondance, pour convertir un entier d\u00e9cimal en hexad\u00e9cimal on peut utiliser la m\u00e9thode <code><a href=\"https:\/\/developer.mozilla.org\/fr\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Number\/toString\" target=\"_blank\" rel=\"noreferrer noopener\">toString()<\/a><\/code> des objets de type nombre.<\/p>\n\n\n\n<p>La conversion des codes hexad\u00e9cimaux en composantes d\u00e9cimale a \u00e9t\u00e9 rapatri\u00e9e dans la fonction principale et l\u00e9g\u00e8rement modifi\u00e9e&nbsp;: le premier tableau (celui des codes hexad\u00e9cimaux) est construit en utilisant la m\u00e9thode split(), et dans la boucle de conversion, plut\u00f4t qu\u2019utiliser une structure if, else if (selon que le code hexad\u00e9cimal commence ou pas par un #), j\u2019utilise une variable d\u2019offset.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\nvar colorsHex = colors.split(&#039; &#039;);\nvar colorsRgb = new Array(); \n\ncolorsHex.forEach((c) =&gt; {\n    let color = new Object();\n\n    let offset = 0;\n\n    if(c.charAt(0) == &#039;#&#039;){\n        offset = 1;\n    }\n\n    color.r = parseInt(c.substring(0+offset,2+offset), 16);\n    color.g = parseInt(c.substring(2+offset,4+offset), 16);\n    color.b = parseInt(c.substring(4+offset), 16);   \n\n    colorsRgb.push(color);\n});\n<\/pre><\/div>\n\n\n<p>Dans la boucle principale, les changements sont&nbsp;: trois lignes suppl\u00e9mentaires pour la conversion d\u00e9cimal vers hexad\u00e9cimal, avec ajout d\u2019un z\u00e9ro si nombre \u00e0 un chiffre, et l\u2019utilisation de <code>&lt;span&gt;<\/code> plut\u00f4t que la balise <code>&lt;font&gt;<\/code>, maintenant d\u00e9pr\u00e9ci\u00e9e.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\nfor (i=0; i&lt;numchars; ++i) {\n    let lci = lowcolorindex(i, numchars, numcolors);\n    let hci = hicolorindex(i, numchars, numcolors, lci);\n\n    let rr = Math.round(interpolate( lci\/(numcolors-1), colorsRgb&#x5B;lci].r, hci\/(numcolors-1), colorsRgb&#x5B;hci].r, i\/(numchars-1)));\n    let gg = Math.round(interpolate( lci\/(numcolors-1), colorsRgb&#x5B;lci].g, hci\/(numcolors-1), colorsRgb&#x5B;hci].g, i\/(numchars-1)));\n    let bb = Math.round(interpolate( lci\/(numcolors-1), colorsRgb&#x5B;lci].b, hci\/(numcolors-1), colorsRgb&#x5B;hci].b, i\/(numchars-1)));\n\n    let r = (rr.toString(16).length == 1?&#039;0&#039;:&#039;&#039;)+rr.toString(16);\n    let g = (gg.toString(16).length == 1?&#039;0&#039;:&#039;&#039;)+gg.toString(16);\n    let b = (bb.toString(16).length == 1?&#039;0&#039;:&#039;&#039;)+bb.toString(16);\n\n    coloredText += &#039;&lt;span style=&quot;color:#&#039;+r+g+b+&#039;;&quot;&gt;&#039;+text.charAt(i)+&#039;&lt;\/span&gt;&#039;;\n}\n<\/pre><\/div>\n\n\n<p>Les m\u00e9thodes <code>interpolate()<\/code>, <code>hicolorindex()<\/code> et <code>lowcolorindex()<\/code> sont quant-\u00e0 elles gard\u00e9es en l\u2019\u00e9tat.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>Comme d\u2019habitude, le <a href=\"https:\/\/geekcommunicant.com\/demos\/gloubi-texte-degrade.html\" target=\"_blank\" rel=\"noreferrer noopener\">r\u00e9sultat final<\/a> et le code complet sont visibles dans la section <a rel=\"noreferrer noopener\" href=\"https:\/\/geekcommunicant.com\/demos\/gloubi-texte-degrade.html\" target=\"_blank\">d\u00e9monstration<\/a> du site.<\/p>\n\n\n\n<p>Mais je n\u2019en ai pas fini avec les textes multicolores\u00a0! En effet, il est maintenant possible avec CSS3 de produire un effet similaire. Restez \u00e0 l\u2019\u00e9coute pour en savoir plus\u00a0!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pour ce deuxi\u00e8me gloubi tuto, on s\u2019attaque \u00e0 un script qui a eu son petit succ\u00e8s sur Skyblog&nbsp;: le texte \u00ab&nbsp;arc-en-ciel&nbsp;\u00bb (en d\u00e9grad\u00e9s). Script original et explication Pour voir le script original, qui fonctionne encore dans les navigateurs modernes, rendez-vous &hellip; <a href=\"https:\/\/geekcommunicant.com\/blog\/2022\/12\/09\/gloubi-tuto-texte-degrade\/\">Continuer la lecture <span class=\"meta-nav\">&rarr;<\/span><\/a><\/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":[52,51,31],"class_list":["post-991","post","type-post","status-publish","format-standard","hentry","category-javascript","tag-gloubiscript","tag-gloubituto","tag-javascript"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p2IoOb-fZ","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":1074,"url":"https:\/\/geekcommunicant.com\/blog\/2023\/01\/13\/gloubi-script-texte-arriere-plan-defilant\/","url_meta":{"origin":991,"position":0},"title":"Gloubi script &#8211; texte avec un arri\u00e8re-plan d\u00e9filant","author":"geekc","date":"13\/01\/2023","format":false,"excerpt":"Aujourd\u2019hui nouveau tuto sur un gloubi script d\u2019effet sur texte. Cette fois ci, il s\u2019agit de texte avec arri\u00e8re-plan d\u00e9filant. Principe du script Le script original est disponible sur sa propre page sur le site de notre gloubi adversaire. Il fonctionne selon le principe de calques\u00a0: au-dessus du calque 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":1085,"url":"https:\/\/geekcommunicant.com\/blog\/2023\/01\/27\/gloubi-tuto-texte-changeant-couleur\/","url_meta":{"origin":991,"position":1},"title":"Gloubi tuto &#8211; texte changeant de couleur","author":"geekc","date":"27\/01\/2023","format":false,"excerpt":"Cette fois-ci encore, j\u2019ai d\u00e9cid\u00e9 de m\u2019attaquer \u00e0 un autre gloubi script d\u2019effet sur texte, le texte changeant de couleur. Une fois de plus, d\u00fb \u00e0 l\u2019\u00e9volution des technologies, plus besoin de JavaScript pour obtenir un r\u00e9sultat identique (ou en tout cas tr\u00e8s proche). Fonctionnement du script On indique au\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":1108,"url":"https:\/\/geekcommunicant.com\/blog\/2023\/02\/10\/gloubi-tuto-menu-avec-description-du-lien\/","url_meta":{"origin":991,"position":2},"title":"Gloubi tuto &#8211; menu avec description du lien","author":"geekc","date":"10\/02\/2023","format":false,"excerpt":"Voici venu le temps d\u2019un nouveau gloubi tuto sur un autre script de menu. Aujourd\u2019hui, nous allons nous attaquer au menu interactif avec description du lien. Fonctionnement du script Le menu est mis en forme avec un simple tableau \u00e0 une seule colonne, avec un case vide en pied 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":1050,"url":"https:\/\/geekcommunicant.com\/blog\/2022\/12\/30\/gloubi-tuto-menu-interactif-deroulant\/","url_meta":{"origin":991,"position":3},"title":"Gloubi tuto &#8211; menu interactif d\u00e9roulant","author":"geekc","date":"30\/12\/2022","format":false,"excerpt":"Cette semaine, attaquons-nous \u00e0 un autre script de menu pr\u00e9sent\u00e9 chez notre gloubi adversaire. Ce script est visible sur cette page, et est toujours fonctionnel dans les navigateurs modernes. Fonctionnement Le menu produit par ce script se pr\u00e9sente sous la forme d\u2019un tableau dans un tableau (je parle l\u00e0 des\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":976,"url":"https:\/\/geekcommunicant.com\/blog\/2022\/12\/02\/gloubi-tuto-un-menu-interactif-hello-kitty\/","url_meta":{"origin":991,"position":4},"title":"Gloubi tuto &#8211; un menu interactif Hello Kitty","author":"geekc","date":"02\/12\/2022","format":false,"excerpt":"Bienvenue sur ce premier gloubi tuto (pour en savoir plus sur les gloubi tutos) qui concerne un menu interactif avec Hello Kitty. Pr\u00e9sentation et explication de l\u2019existant Pour voir la source du script actuel, RDV sur cette page du site de notre nouvel adversaire dans la guerre du gloubi. Le\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":991,"position":5},"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":[]}],"_links":{"self":[{"href":"https:\/\/geekcommunicant.com\/blog\/wp-json\/wp\/v2\/posts\/991","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=991"}],"version-history":[{"count":0,"href":"https:\/\/geekcommunicant.com\/blog\/wp-json\/wp\/v2\/posts\/991\/revisions"}],"wp:attachment":[{"href":"https:\/\/geekcommunicant.com\/blog\/wp-json\/wp\/v2\/media?parent=991"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/geekcommunicant.com\/blog\/wp-json\/wp\/v2\/categories?post=991"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/geekcommunicant.com\/blog\/wp-json\/wp\/v2\/tags?post=991"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}