{"id":1547,"date":"2026-09-10T09:49:59","date_gmt":"2026-09-10T07:49:59","guid":{"rendered":"https:\/\/iconoclaste.net\/blog\/?p=1547"},"modified":"2026-09-10T13:48:44","modified_gmt":"2026-09-10T11:48:44","slug":"jungla-in-jungle","status":"publish","type":"post","link":"https:\/\/iconoclaste.net\/blog\/2026\/09\/10\/jungla-in-jungle\/","title":{"rendered":"Jungla in jungle"},"content":{"rendered":"\n<!--JUNGLE GIRL \u2013 jouet iconoclaste.net -->\n\n<div id=\"iconoclaste-junglegirl\">\n  <div id=\"jg-stage\">\n    <img id=\"jg-img\" src=\"https:\/\/iconoclaste.net\/blog\/wp-content\/uploads\/2026\/09\/JungleGirl_1_1.webp\" alt=\"Jungle Girl\" loading=\"eager\" decoding=\"async\">\n\n    <div id=\"jg-preload\">\n      <div class=\"jg-progress-wrap\">\n        <span>chargement des images<\/span>\n        <div class=\"jg-progress-bar\">\n          <div class=\"jg-progress-fill\" id=\"jg-progress-fill\"><\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<style>\n  #iconoclaste-junglegirl {\n    position: relative;\n    width: 100%;\n    max-width: 100%;\n    margin: 0 auto 1.5em;\n    line-height: 0;\n    background: transparent;\n    cursor: pointer;\n    -webkit-tap-highlight-color: transparent;\n    user-select: none;\n    -webkit-user-select: none;\n    text-align: center;\n  }\n\n  #jg-stage {\n    position: relative;\n    width: 100%;\n    line-height: 0;\n  }\n\n  #iconoclaste-junglegirl img {\n    display: block;\n    width: 100%;\n    height: auto;\n    margin: 0 auto;\n    border: 1px solid #000;\n    box-sizing: border-box;\n    outline: none;\n    box-shadow: none;\n    vertical-align: top;\n    pointer-events: none;\n    background: #000;\n  }\n\n  #jg-preload {\n    position: absolute;\n    left: 0;\n    right: 0;\n    bottom: 12px;\n    display: flex;\n    justify-content: center;\n    pointer-events: none;\n    z-index: 2;\n  }\n\n  #jg-preload.hidden {\n    display: none;\n  }\n\n  .jg-progress-wrap {\n    width: 70%;\n    max-width: 280px;\n    text-align: center;\n    font-family: Courier New, Courier, monospace;\n    font-size: 11px;\n    letter-spacing: 0.04em;\n    color: #ff33ff;\n    text-shadow: 0 0 4px #000;\n  }\n\n  .jg-progress-bar {\n    margin-top: 6px;\n    height: 4px;\n    background: rgba(255, 51, 255, 0.25);\n    overflow: hidden;\n  }\n\n  .jg-progress-fill {\n    width: 0%;\n    height: 100%;\n    background: #ff33ff;\n    transition: width 0.15s linear;\n  }\n<\/style>\n\n<script>\n(function () {\n  \"use strict\";\n\n  if (window.__iconoclasteJungleGirlInit) return;\n  window.__iconoclasteJungleGirlInit = true;\n\n  const BASE  = \"https:\/\/iconoclaste.net\/blog\/wp-content\/uploads\/2026\/09\/JungleGirl_\";\n  const EXT   = \".webp\";\n  const SPEED = 150;\n\n  const SEQ_A = [1, 2, 3, 4, 5, 4, 3, 2].map(function (n) {\n    return BASE + \"1_\" + n + EXT;\n  });\n  const SEQ_B = [1, 2, 3, 4, 5, 6, 5, 4, 3, 2].map(function (n) {\n    return BASE + \"2_\" + n + EXT;\n  });\n\n  const root    = document.getElementById(\"iconoclaste-junglegirl\");\n  const img     = document.getElementById(\"jg-img\");\n  const preload = document.getElementById(\"jg-preload\");\n  const fill    = document.getElementById(\"jg-progress-fill\");\n\n  if (!root || !img) return;\n\n  let phase    = \"A\";\n  let idx      = 0;\n  let timer    = null;\n  let ready    = false;\n  let hovering = false;\n\n  const allSrc = SEQ_A.concat(SEQ_B);\n\n  function unique(list) {\n    const seen = {};\n    const out = [];\n    for (let i = 0; i < list.length; i++) {\n      if (!seen[list[i]]) {\n        seen[list[i]] = true;\n        out.push(list[i]);\n      }\n    }\n    return out;\n  }\n\n  function setFrame(src) {\n    if (img.src !== src) img.src = src;\n  }\n\n  function currentSeq() {\n    return phase === \"B\" ? SEQ_B : SEQ_A;\n  }\n\n  function tick() {\n    const seq = currentSeq();\n    idx = (idx + 1) % seq.length;\n    setFrame(seq[idx]);\n  }\n\n  function startLoop() {\n    if (timer) clearInterval(timer);\n    timer = setInterval(tick, SPEED);\n  }\n\n  function goA() {\n    if (phase === \"A\") return;\n    phase = \"A\";\n    idx = 0;\n    setFrame(SEQ_A[0]);\n  }\n\n  function goB() {\n    if (phase === \"B\") return;\n    phase = \"B\";\n    idx = 0;\n    setFrame(SEQ_B[0]);\n  }\n\n  function preloadAll(srcs, done) {\n    const list = unique(srcs);\n    let loaded = 0;\n    const total = list.length;\n    if (!total) { done(); return; }\n\n    function bump() {\n      loaded++;\n      if (fill) fill.style.width = Math.round((loaded \/ total) * 100) + \"%\";\n      if (loaded >= total) done();\n    }\n\n    list.forEach(function (src) {\n      const im = new Image();\n      im.onload = bump;\n      im.onerror = bump;\n      im.src = src;\n    });\n  }\n\n  function onEnter() {\n    if (!ready) return;\n    hovering = true;\n    goB();\n  }\n\n  function onLeave() {\n    if (!ready) return;\n    hovering = false;\n    goA();\n  }\n\n  function onClick(e) {\n    if (!ready) return;\n    e.preventDefault();\n    if (hovering) return;\n    if (phase === \"A\") goB();\n    else goA();\n  }\n\n  preloadAll(allSrc, function () {\n    ready = true;\n    if (preload) preload.classList.add(\"hidden\");\n    phase = \"A\";\n    idx = 0;\n    setFrame(SEQ_A[0]);\n    startLoop();\n  });\n\n  root.addEventListener(\"pointerenter\", onEnter);\n  root.addEventListener(\"pointerleave\", onLeave);\n  root.addEventListener(\"click\", onClick);\n})();\n<\/script>\n\n\n\n<p class=\"wp-block-paragraph\">Animation et design des personnages : <a href=\"https:\/\/www.daz3d.com\/\" data-type=\"link\" data-id=\"https:\/\/www.daz3d.com\/\"><mark style=\"background-color:#ff33ff\" class=\"has-inline-color has-white-color\">DAZ STUDIO<\/mark><\/a> [Ex-Poser], le reste Toshop.<br><\/p>\n","protected":false},"excerpt":{"rendered":"<p>chargement des images Animation et design des personnages : DAZ STUDIO [Ex-Poser], le reste Toshop.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[269],"tags":[319,101,248,124],"class_list":["post-1547","post","type-post","status-publish","format-standard","hentry","category-experiences","tag-femme-en-detresse","tag-girl","tag-monster","tag-squelette"],"_links":{"self":[{"href":"https:\/\/iconoclaste.net\/blog\/wp-json\/wp\/v2\/posts\/1547","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/iconoclaste.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/iconoclaste.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/iconoclaste.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/iconoclaste.net\/blog\/wp-json\/wp\/v2\/comments?post=1547"}],"version-history":[{"count":3,"href":"https:\/\/iconoclaste.net\/blog\/wp-json\/wp\/v2\/posts\/1547\/revisions"}],"predecessor-version":[{"id":1550,"href":"https:\/\/iconoclaste.net\/blog\/wp-json\/wp\/v2\/posts\/1547\/revisions\/1550"}],"wp:attachment":[{"href":"https:\/\/iconoclaste.net\/blog\/wp-json\/wp\/v2\/media?parent=1547"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/iconoclaste.net\/blog\/wp-json\/wp\/v2\/categories?post=1547"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/iconoclaste.net\/blog\/wp-json\/wp\/v2\/tags?post=1547"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}