Pular para o conteúdo
#0353DWEBGL

3D Globe Hero

Globo WebGL no background.

Categoria:
Hero
Subcategoria:
Hero
Complexidade:
Avançado
Performance:
Pesado
Compatibilidade:
React · Next.js · HTML · Tailwind

Preview

Preview executado em iframe sandbox isolado. Efeitos de scroll: role dentro do preview. Em touch, interações de mouse viram animação automática.

Prompt

Transforme o efeito personalizado em uma instrução técnica clara para sua IA.

Stack

Código

import { useEffect, useRef } from "react";

// 3D Globe Hero — gerado pelo Effect Prompt Lab
// Isolado em Shadow DOM para não vazar CSS. Cleanup automático no unmount.
const SETTINGS = {
  "primary": "#8b5cf6",
  "secondary": "#22d3ee",
  "background": "#0b0b12",
  "text": "#f5f5f7",
  "speed": 1,
  "duration": 2,
  "delay": 0,
  "intensity": 60,
  "opacity": 100,
  "blur": 12,
  "glow": 24,
  "scale": 1,
  "rotation": 0,
  "depth": 120,
  "perspective": 900,
  "count": 40,
  "direction": "right",
  "loop": true,
  "autoplay": true,
  "mouse": true,
  "scroll": true,
  "mobile": true,
  "reducedMotion": true,
  "start": 0,
  "end": 100,
  "prefix": "",
  "suffix": "",
  "separator": ".",
  "images": [
    "aurora",
    "city",
    "ocean",
    "forest",
    "desert"
  ],
  "headline": "Sua próxima página começa aqui",
  "transition": "fade",
  "zoom": 1.2,
  "parallax": 40,
  "scrub": 1
};

const CSS = ":host{--fx-primary:#8b5cf6;--fx-secondary:#22d3ee;--fx-bg:#0b0b12;--fx-text:#f5f5f7;--fx-speed:1;--fx-dur:2.00s;--fx-delay:0s;--fx-intensity:0.6;--fx-opacity:1;--fx-blur:12px;--fx-glow:24px;--fx-scale:1;--fx-rot:0deg;--fx-depth:120px;--fx-persp:900px;--fx-dir-x:1;--fx-dir-y:0;--fx-iter:infinite;--fx-play:running}\n.hero{position:relative;min-height:100vh;display:grid;place-items:center;overflow:hidden;text-align:center;isolation:isolate}\n.bg{position:absolute;inset:0;overflow:hidden;z-index:0}\n.hc{position:relative;z-index:2;max-width:780px;padding:24px}\n.hc small{display:inline-block;padding:6px 12px;border:1px solid rgba(255,255,255,.18);border-radius:99px;font:600 11px system-ui;letter-spacing:.14em;text-transform:uppercase;margin-bottom:18px;background:rgba(255,255,255,.06);backdrop-filter:blur(6px)}\n.hc h1{font:800 clamp(30px,6vw,66px)/1.03 system-ui;letter-spacing:-.035em}\n.hc p{margin:16px auto 24px;max-width:520px;opacity:.72;font-size:17px;line-height:1.5}\n.hc a{display:inline-block;padding:14px 26px;border-radius:12px;background:var(--fx-primary);color:#fff;text-decoration:none;font-weight:600;box-shadow:0 10px 30px -10px var(--fx-primary)}";
const HTML = "<section class=\"hero\"><div class=\"bg\" aria-hidden=\"true\"></div><div class=\"hc\"><small>Global</small><h1 data-fx-headline>Sua próxima página começa aqui</h1><p>Construa experiências memoráveis com movimento, profundidade e performance.</p><a href=\"#\" onclick=\"return false\">Explorar agora</a></div></section>";
const RUNTIME = "(function(){\nvar FX=window.FX;\nFX.reduced=!!FX.reducedMotion&&window.matchMedia('(prefers-reduced-motion: reduce)').matches;\nFX.isTouch=window.matchMedia('(hover: none)').matches;\nif(FX.reduced)document.documentElement.classList.add('fx-reduced');\nwindow.$=function(s,r){return (r||document).querySelector(s)};\nwindow.$$=function(s,r){return Array.prototype.slice.call((r||document).querySelectorAll(s))};\nFX.clamp=function(v,a,b){return Math.min(b,Math.max(a,v))};\nFX.lerp=function(a,b,t){return a+(b-a)*t};\nFX.tick=function(fn){var id,t0=performance.now(),run=true;function f(t){if(run&&!document.hidden)fn((t-t0)/1000*FX.speed,t);if(run)id=requestAnimationFrame(f)}id=requestAnimationFrame(f);return{stop:function(){run=false;cancelAnimationFrame(id)}}};\nFX.pointer=function(el,cb){el=el||document.body;var last=-1e9;function mv(e){var p=e.touches?e.touches[0]:e;var r=el.getBoundingClientRect();last=performance.now();cb((p.clientX-r.left)/r.width,(p.clientY-r.top)/r.height,true,p.clientX-r.left,p.clientY-r.top)}\nif(FX.mouse){el.addEventListener('mousemove',mv);el.addEventListener('touchmove',mv,{passive:true});el.addEventListener('touchstart',mv,{passive:true});}\nif(FX.autoplay&&!FX.reduced)FX.tick(function(t){if(performance.now()-last>2500){var x=.5+Math.sin(t*.9)*.3,y=.5+Math.cos(t*1.3)*.25;var r=el.getBoundingClientRect();cb(x,y,false,x*r.width,y*r.height)}})};\nFX.progress=function(el){var r=el.getBoundingClientRect();var d=r.height-innerHeight;return d<=0?0:FX.clamp(-r.top/d,0,1)};\nFX.visible=function(el){var r=el.getBoundingClientRect();return FX.clamp((innerHeight-r.top)/(innerHeight+r.height),0,1)};\nFX.onScroll=function(cb){var q=false;function h(){if(q)return;q=true;requestAnimationFrame(function(){q=false;cb(scrollY)})}if(FX.scroll)addEventListener('scroll',h,{passive:true});cb(scrollY)};\nFX.inView=function(els,cb,th){var io=new IntersectionObserver(function(es){es.forEach(function(e){cb(e.target,e.isIntersecting,e)})},{threshold:th||.2});els.forEach(function(e){io.observe(e)});return io};\nFX.img=function(i,w,h){var s=(FX.images&&FX.images[i%5])||('fx'+i);if(/^(https?:|data:|\\/)/.test(s))return s;return 'https://picsum.photos/seed/'+encodeURIComponent(s+(i>=5?i:''))+'/'+(w||800)+'/'+(h||600)};\nFX.canvas=function(el){var c=document.createElement('canvas');c.style.cssText='position:absolute;inset:0;width:100%;height:100%;display:block';el.appendChild(c);var ctx=c.getContext('2d');var o={c:c,ctx:ctx,w:0,h:0};function rs(){var d=Math.min(2,devicePixelRatio||1);o.w=el.clientWidth;o.h=el.clientHeight;c.width=o.w*d;c.height=o.h*d;ctx.setTransform(d,0,0,d,0,0)}rs();addEventListener('resize',rs);return o};\nFX.hex=function(h,a){h=h.replace('#','');if(h.length===3)h=h.split('').map(function(x){return x+x}).join('');var n=parseInt(h,16);return 'rgba('+(n>>16&255)+','+(n>>8&255)+','+(n&255)+','+(a==null?1:a)+')'};\nwindow.$$=window.$$;document.querySelectorAll('[data-fx-headline]').forEach(function(e){if(FX.headline)e.textContent=FX.headline});\nFX.fmt=function(v,dec){var s=Math.round(v).toString();if(FX.separator)s=s.replace(/\\B(?=(\\d{3})+(?!\\d))/g,FX.separator);return (FX.prefix||'')+s+(FX.suffix||'')};\n})();";
const EFFECT = "var el=$('.bg'),o=FX.canvas(el),pts=[],N=FX.count*20;for(var i=0;i<N;i++){var y=1-2*(i+.5)/N,r=Math.sqrt(1-y*y),t=i*2.39996;pts.push([Math.cos(t)*r,y,Math.sin(t)*r])}var arcs=[];for(var k=0;k<8;k++)arcs.push([pts[Math.floor(Math.random()*N)],pts[Math.floor(Math.random()*N)],Math.random()]);var m={x:.5};FX.pointer(document.body,function(x){m.x=x});FX.tick(function(t){var c=o.ctx,w=o.w,h=o.h;c.clearRect(0,0,w,h);var R=Math.min(w,h)*.42*FX.scale,cx=w/2,cy=h*.62,a=t*.25+(m.x-.5)*1.5,ca=Math.cos(a),sa=Math.sin(a),tl=.35;function pr(p){var x=p[0]*ca-p[2]*sa,z=p[0]*sa+p[2]*ca,y=p[1]*Math.cos(tl)-z*Math.sin(tl);z=p[1]*Math.sin(tl)+z*Math.cos(tl);return[cx+x*R,cy+y*R,z]}var g=c.createRadialGradient(cx,cy,R*.2,cx,cy,R*1.3);g.addColorStop(0,FX.hex(FX.primary,.25));g.addColorStop(1,'rgba(0,0,0,0)');c.fillStyle=g;c.fillRect(0,0,w,h);pts.forEach(function(p){var q=pr(p);if(q[2]<0)return;c.fillStyle=FX.hex(FX.secondary,.25+q[2]*.7);c.fillRect(q[0],q[1],1.6,1.6)});arcs.forEach(function(A){var p=(t*.4+A[2])%1;c.strokeStyle=FX.hex(FX.primary,.9);c.lineWidth=1.5;c.beginPath();for(var s=0;s<=p;s+=.02){var v=[FX.lerp(A[0][0],A[1][0],s),FX.lerp(A[0][1],A[1][1],s),FX.lerp(A[0][2],A[1][2],s)];var l=Math.hypot(v[0],v[1],v[2])||1,e=1+Math.sin(s*Math.PI)*.25;var q=pr([v[0]/l*e,v[1]/l*e,v[2]/l*e]);s?c.lineTo(q[0],q[1]):c.moveTo(q[0],q[1])}c.stroke()})});";

export default function Fx3DGlobeHero() {
  const hostRef = useRef<HTMLDivElement>(null);

  useEffect(() => {
    const host = hostRef.current;
    if (!host) return;
    // Para produção, prefira portar o EFFECT para hooks nativos (useEffect + refs).
    const iframe = document.createElement("iframe");
    iframe.title = "3D Globe Hero";
    iframe.setAttribute("sandbox", "allow-scripts");
    iframe.style.cssText = "width:100%;height:100%;border:0;display:block";
    iframe.srcdoc =
      "<!doctype html><html><head><style>" + CSS.replace(":host", ":root") + "</style></head><body>" + HTML +
      "<script>window.FX=" + JSON.stringify(SETTINGS) + ";" + RUNTIME + ";(function(){" + EFFECT + "})()<\/script></body></html>";
    host.appendChild(iframe);
    return () => {
      iframe.remove(); // destrói RAF, listeners e observers do efeito
    };
  }, []);

  return <div ref={hostRef} className="relative h-[480px] w-full overflow-hidden rounded-2xl" aria-label="3D Globe Hero" />;
}

Dependências

  • Three.jsnpm i three
  • WebGLNativo do navegador — sem instalação

O preview usa JS nativo equivalente. Em produção, use Three.js somente se o projeto justificar.

Referências

Nenhuma referência cadastrada ainda. Adicione URLs, screenshots ou vídeos que inspiram este efeito.

Efeitos semelhantes

#021
NOVOPOPULARGSAP

Hero · Cinco imagens

Five Images Scroll Hero

Hero sticky com cinco imagens: a 01 domina, a 02 entra com parallax, a 03 aumenta, a 04 cruza lateralmente e a 05 assume o background, com textos sincronizados.

⚡ Moderado◆ Avançado⧉ GSAP, ScrollTrigger
Visualizar
#026
POPULARLEVEGSAP

Hero · Hero

Scroll Zoom Hero

Imagem inicia pequena e ocupa a viewport com scroll.

⚡ Leve◆ Intermediário⧉ GSAP, ScrollTrigger
Visualizar
#025
NOVOGSAP

Hero · Cinco imagens

Five Image Horizontal Flight

Cinco cenas viajam horizontalmente durante scroll vertical.

⚡ Moderado◆ Avançado⧉ GSAP, ScrollTrigger
Visualizar
#030
LEVESEM DEPSCSS

Hero · Hero

Grid Fade Hero

Grid + gradiente + conteúdo entrando em cascata.

⚡ Muito leve◆ Fácil⧉ CSS
Visualizar