Perché la batteria del telefono si scarica velocemente

Offerte Apple ricondizionati in anteprima? Iscriviti al nostro gruppo Telegram:

La batteria del tuo smartphone si scarica velocemente? Questo è uno dei problemi più comuni dei possessori di questa tipologia di dispositivo

LEGGI ANCHE Assistenza tecnica Smartphone Messina 

CONTATTACI

Le cause possono essere molteplici e spaziano dall’uso intensivo del dispositivo a problematiche tecniche legate al software e all’hardware. Vediamo nel dettaglio le ragioni principali per cui la batteria del tuo telefono potrebbe esaurirsi così rapidamente, oltre ad alcuni consigli su come mitigare il problema.

1. Schermo e luminosità

Il display è tra i principali responsabili del consumo della batteria. Se la luminosità è impostata troppo alta o lo schermo resta acceso troppo a lungo senza spegnersi automaticamente, la batteria si esaurirà più rapidamente. Funzionalità come l’Always On Display, che mantiene informazioni visibili anche a schermo spento, possono ridurre significativamente l’autonomia del dispositivo. Anche le notifiche frequenti, che richiedono l’accensione dello schermo, contribuiscono a questo problema.

Soluzione: per risparmiare batteria, consigliamo di ridurre manualmente la luminosità del display o attivare la modalità di “luminosità automatica”, che regola l’intensità in base alla luce ambientale. Impostare il tempo di spegnimento dello schermo su un valore ridotto (ad esempio, 15-30 secondi di inattività) aiuta a minimizzare gli sprechi di energia. Attivare la modalità notte o temi scuri su schermi OLED può fornire un ulteriore risparmio

2. Applicazioni in background

Molte app continuano a funzionare in background, consumando risorse anche quando non vengono utilizzate direttamente. Alcuni servizi, come Google Play Services su Android, sono particolarmente energivori. Le app dei social media, messaggistica, e quelle per la gestione di e-mail, spesso aggiornano i loro contenuti e inviano notifiche anche quando sono chiuse.

Soluzione: accedi alle impostazioni del telefono e verifica quali app stanno consumando più batteria. Potresti disattivare o limitare l’uso delle app in background e disattivare le notifiche per quelle che non sono essenziali. Puoi anche abilitare la modalità di risparmio energetico, che riduce l’attività delle app in background e limita alcune funzioni del dispositivo​

3. Connessioni attive

Le connessioni wireless come GPS, Bluetooth, Wi-Fi e dati mobili possono rimanere attive anche quando non sono strettamente necessarie.

Se ti trovi in aree con scarsa copertura di rete, il telefono potrebbe cercare continuamente un segnale, causando un consumo eccessivo di energia. Inoltre, il GPS attivo in background, anche per applicazioni che non lo utilizzano costantemente, rappresenta un ulteriore fattore di drenaggio della batteria.

Soluzione: disattiva le connessioni non necessarie, come Bluetooth e GPS, quando non le utilizzi. Inoltre, se ti trovi in una zona con scarsa o assente copertura di rete, considera di attivare la modalità aereo per evitare che il telefono cerchi continuamente un segnale.

4. Ricariche frequenti e modalità di ricarica rapida

La ricarica rapida è una caratteristica molto apprezzata nei moderni smartphone ma il suo uso intensivo può avere ripercussioni sulla longevità della batteria. Infatti, la ricarica rapida, erogando un’elevata quantità di energia in poco tempo, tende a generare calore, un fattore che contribuisce a deteriorare le batterie agli ioni di litio nel lungo termine. Il calore è infatti uno dei principali nemici della batteria, poiché può causare danni chimici e ridurre la capacità di mantenere la carica nel tempo​.

Inoltre, le ricariche parziali frequenti possono ridurre il numero complessivo di cicli di ricarica che una batteria è in grado di sostenere durante il suo ciclo di vita. Questo avviene perché le batterie agli ioni di litio funzionano al meglio se mantenute tra il 20% e l’80% di carica. Far scendere frequentemente la carica al di sotto di questa soglia, o caricare completamente il telefono ogni volta, può portare a un’usura prematura​.

Soluzione: per preservare la durata della batteria del tuo smartphone, ci sono alcune pratiche consigliate:

  1. Limitare l’uso della ricarica rapida: sebbene sia comoda, ridurre la frequenza con cui si utilizza la ricarica rapida può aiutare a evitare il surriscaldamento. Molti dispositivi Android di fascia alta, come i Samsung, utilizzano una ricarica adattiva tra 25W e 45W senza un notevole degrado della batteria, grazie ai sistemi di protezione e raffreddamento avanzati​(

    Tuttavia, per modelli più economici, dove la tecnologia di protezione della batteria potrebbe essere meno avanzata, una potenza di ricarica inferiore a 15W potrebbe essere più sicura.

  2. Usare ricariche più lente e stabili: optare per una ricarica più lenta quando possibile aiuta a ridurre lo stress sulla batteria. È inoltre importante utilizzare caricabatterie originali o compatibili, evitando accessori di terze parti che non rispettano gli standard del dispositivo. Caricabatterie rapidi non certificati possono fornire una potenza incoerente, aumentando il rischio di surriscaldamento e danneggiamento della batteria​

  3. Evitare ricariche frequenti non necessarie: per ottimizzare la durata della batteria, è consigliabile evitare di collegare il telefono ogni volta che la carica scende leggermente. Idealmente, bisognerebbe mantenere il livello di carica del telefono tra il 20% e l’80%, evitando di farlo scendere a livelli troppo bassi o di ricaricarlo completamente ogni volta​

     

5. Problemi legati al software

Gli aggiornamenti software, in particolare quelli non andati a buon fine, possono portare a un consumo anomalo della batteria. Anche bug o errori nei sistemi operativi possono far sì che alcune funzioni del telefono continuino a consumare energia anche quando non dovrebbero.

Le app non aggiornate possono essere un ulteriore problema, poiché potrebbero contenere errori che influiscono sulle prestazioni della batteria.

Soluzione: controllare regolarmente la presenza di aggiornamenti del sistema operativo e delle app. Se si nota che dopo un aggiornamento la batteria si consuma più velocemente, considera di eseguire un ripristino alle impostazioni di fabbrica o, se possibile, di reinstallare una versione precedente del software​.

6. Surriscaldamento del dispositivo

Il surriscaldamento può accelerare l’usura della batteria e ridurne la durata. Un dispositivo che si surriscalda può spegnersi improvvisamente o rallentare le sue prestazioni. Questo può essere causato da un uso prolungato di app pesanti, ricariche eccessivamente rapide o da un malfunzionamento della batteria stessa.

Soluzione: evitare di usare il telefono durante la ricarica e tienilo lontano da fonti di calore dirette. Se il telefono si surriscalda spesso, potrebbe essere il momento di sostituire la batteria​.

Mantenere la batteria del tuo smartphone in salute richiede un uso consapevole del dispositivo. Ridurre la luminosità dello schermo, limitare l’uso delle app in background e disattivare le connessioni non necessarie sono solo alcuni dei modi per migliorare l’autonomia della batteria.

Se i problemi persistono, è consigliabile far controllare il dispositivo da un tecnico specializzato o valutare la sostituzione della batteria.

Ricevi in anteprima le offerte su iPhone, MacBook, iMac e iPad ricondizionati.
Unisciti ora al nostro gruppo Telegram:

/* BNO Informatica – Notebook 3D della landing Riparazione computer. Si attiva solo nelle pagine che contengono #bnoLaptop3d, quindi può stare anche nel footer globale. */ (function(run){ if(document.readyState === 'loading'){ document.addEventListener('DOMContentLoaded', run); } else { run(); } })(function(){ (function(){ var stage = document.getElementById('bnoLaptop3d'); if(!stage){ if(window.console) console.info('BNO 3D: in questa pagina non c\'è #bnoLaptop3d'); return; } var section = stage.closest('.inside-section') || stage.parentNode; var root = stage.closest('.bno-landing') || document; var reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches; // Scorrimento verso le sezioni interne gestito via JS: funziona anche con header fisso, // dentro iframe e builder che bloccano i link #ancora function goTo(hash){ var el; try { el = document.querySelector(hash); } catch(e){ return false; } if(!el) return false; var head = 90; // spazio per l'header fisso del tema var y = el.getBoundingClientRect().top + window.pageYOffset - Math.max(head, (window.innerHeight - el.offsetHeight) / 2); window.scrollTo({top: Math.max(0, y), behavior: reduce ? 'auto' : 'smooth'}); if(el.classList.contains('service')){ el.classList.add('is-picked'); setTimeout(function(){ el.classList.remove('is-picked'); }, 2200); } try { history.replaceState(null, '', hash); } catch(e){} return true; } root.addEventListener('click', function(ev){ var a = ev.target.closest && ev.target.closest('a[href^="#"]'); if(!a) return; var h = a.getAttribute('href'); if(h.length > 1 && goTo(h)) ev.preventDefault(); }); var finePointer = window.matchMedia('(pointer: fine)').matches; function fail(){ section.classList.add('no-3d'); } // Three.js si scarica solo quando la sezione sta per entrare nello schermo (non pesa su LCP) var started = false; function load(){ if(started) return; started = true; if(window.THREE) return init(); var s = document.createElement('script'); s.src = 'https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js'; s.onload = init; s.onerror = fail; document.head.appendChild(s); } if('IntersectionObserver' in window){ var io = new IntersectionObserver(function(es){ if(es[0].isIntersecting){ io.disconnect(); load(); } }, {rootMargin:'300px 0px'}); io.observe(stage); } else { window.addEventListener('load', load); } function init(){ try { build(); } catch(err){ fail(); if(window.console) console.warn('Notebook 3D non disponibile:', err); } } function build(){ var T = window.THREE; if(!T) return; var canvas = stage.querySelector('canvas'); var renderer; try { renderer = new T.WebGLRenderer({canvas:canvas, antialias:true, alpha:true}); } catch(e){ return fail(); } if(!renderer.getContext()) return fail(); renderer.setPixelRatio(Math.min(window.devicePixelRatio,2)); renderer.shadowMap.enabled = true; renderer.shadowMap.type = T.PCFSoftShadowMap; renderer.outputEncoding = T.sRGBEncoding; renderer.toneMapping = T.ACESFilmicToneMapping; section.classList.add('is-3d'); var scene = new T.Scene(); var camera = new T.PerspectiveCamera(30, 1, 0.1, 100); camera.position.set(0, 3.7, 9.0); camera.lookAt(0, 1.0, 0); // ambiente riflesso per l'alluminio var pmrem = new T.PMREMGenerator(renderer); var env = new T.Scene(); env.add(new T.Mesh(new T.BoxGeometry(20,20,20), new T.MeshBasicMaterial({color:0x5a6068, side:T.BackSide}))); [[0,9,0,12,.2,12],[-9.5,3,0,.2,6,14],[9.5,3,2,.2,6,6],[0,3,9.5,10,5,.2]].forEach(function(b){ var m = new T.Mesh(new T.BoxGeometry(b[3],b[4],b[5]), new T.MeshBasicMaterial({color:0xffffff})); m.position.set(b[0],b[1],b[2]); env.add(m); }); scene.environment = pmrem.fromScene(env, 0.04).texture; scene.add(new T.HemisphereLight(0xffffff, 0x8a939b, 0.55)); var key = new T.DirectionalLight(0xffffff, 1.0); key.position.set(3, 8, 5); key.castShadow = true; key.shadow.mapSize.set(1024,1024); key.shadow.camera.left=-4; key.shadow.camera.right=4; key.shadow.camera.top=4; key.shadow.camera.bottom=-4; key.shadow.radius = 8; key.shadow.bias = -0.0005; scene.add(key); function mat(o){ var m = new T.MeshStandardMaterial(o); m.color.convertSRGBToLinear(); return m; } var alu = mat({color:0xc4c8cd, roughness:0.32, metalness:0.85}); var aluDk = mat({color:0xaeb3b9, roughness:0.45, metalness:0.7}); var dark = mat({color:0x1a1d22, roughness:0.55, metalness:0.1}); var pcb = mat({color:0x1d5e44, roughness:0.6, metalness:0.1}); var chip = mat({color:0x111316, roughness:0.4, metalness:0.2}); var gold = mat({color:0xd4a64a, roughness:0.3, metalness:0.9}); var batt = mat({color:0x2b2f36, roughness:0.5, metalness:0.2}); var blue = mat({color:0x33a6da, roughness:0.4, metalness:0.1}); var cast = function(m){ m.castShadow = true; m.receiveShadow = true; return m; }; function rshape(w,h,r){ var s = new T.Shape(), x=-w/2, y=-h/2; s.moveTo(x+r,y); s.lineTo(x+w-r,y); s.quadraticCurveTo(x+w,y,x+w,y+r); s.lineTo(x+w,y+h-r); s.quadraticCurveTo(x+w,y+h,x+w-r,y+h); s.lineTo(x+r,y+h); s.quadraticCurveTo(x,y+h,x,y+h-r); s.lineTo(x,y+r); s.quadraticCurveTo(x,y,x+r,y); return s; } // lastra arrotondata distesa: larghezza w (x), profondità d (z), spessore h (y da 0 a h) function slab(w,d,h,r,m){ var g = new T.ExtrudeGeometry(rshape(w,d,r),{depth:h,bevelEnabled:false,curveSegments:10}); g.rotateX(-Math.PI/2); return cast(new T.Mesh(g,m)); } function box(w,h,d,m){ return cast(new T.Mesh(new T.BoxGeometry(w,h,d),m)); } var laptop = new T.Group(); scene.add(laptop); var floor = new T.Mesh(new T.PlaneGeometry(16,16), new T.ShadowMaterial({opacity:0.16})); floor.rotation.x = -Math.PI/2; floor.position.y = -0.75; floor.receiveShadow = true; scene.add(floor); var parts = []; function part(obj, base, off, label){ obj.position.copy(base); laptop.add(obj); var p = {obj:obj, base:base.clone(), off:off, label:label}; parts.push(p); return p; } var V = function(x,y,z){ return new T.Vector3(x,y,z); }; // Scocca inferiore var bottom = new T.Group(); bottom.add(slab(3.2,2.2,0.05,0.14,alu)); part(bottom, V(0,0,0), V(0,-0.5,0)); // Scheda madre con chip e porte var mb = new T.Group(); mb.add(slab(2.9,1.0,0.03,0.05,pcb)); [[-0.2,0.05,0.34,0.3],[0.25,-0.2,0.22,0.22],[-0.95,0.2,0.18,0.12]].forEach(function(c){ var b = box(c[2],0.04,c[3],chip); b.position.set(c[0],0.05,c[1]); mb.add(b); }); [[-1.36,-0.25],[-1.36,0.05],[1.36,-0.1]].forEach(function(p){ var port = box(0.12,0.06,0.18,aluDk); port.position.set(p[0],0.06,p[1]); mb.add(port); }); part(mb, V(0,0.06,-0.5), V(0,0.38,0), {text:'Porte e scheda', href:'#svc-connettori', side:-1, anchor:V(-1.45,0.05,0)}); // Batteria var bt = new T.Group(); bt.add(slab(2.5,0.75,0.07,0.05,batt)); var stripe = box(0.5,0.005,0.75,blue); stripe.position.set(-0.8,0.072,0); bt.add(stripe); part(bt, V(0,0.06,0.5), V(0,0.6,0.5), {text:'Batteria', href:'#svc-batteria', side:1, anchor:V(1.25,0.04,0)}); // SSD var ssd = new T.Group(); ssd.add(slab(0.8,0.26,0.02,0.02,pcb)); var c1 = box(0.3,0.03,0.18,chip); c1.position.set(0.05,0.03,0); ssd.add(c1); var gc = box(0.06,0.01,0.22,gold); gc.position.set(-0.37,0.025,0); ssd.add(gc); part(ssd, V(-0.7,0.1,-0.5), V(-1.25,0.95,0.45), {text:'SSD e dati', href:'#svc-recupero-dati', side:-1, anchor:V(-0.4,0.03,0)}); // Ventola var fan = new T.Group(); var housing = cast(new T.Mesh(new T.CylinderGeometry(0.32,0.32,0.03,40), dark)); housing.position.y = 0.015; fan.add(housing); var ringF = cast(new T.Mesh(new T.TorusGeometry(0.31,0.02,8,40), aluDk)); ringF.rotation.x = Math.PI/2; ringF.position.y = 0.05; fan.add(ringF); var rotor = new T.Group(); rotor.position.y = 0.05; fan.add(rotor); var hub = cast(new T.Mesh(new T.CylinderGeometry(0.08,0.08,0.05,24), aluDk)); rotor.add(hub); for(var i=0;i<9;i++){ var bl = box(0.2,0.012,0.07,dark); bl.position.set(0.16,0,0); var holder = new T.Group(); holder.rotation.y = i*2*Math.PI/9; bl.rotation.x = 0.4; holder.add(bl); rotor.add(holder); } part(fan, V(0.85,0.09,-0.5), V(1.3,1.05,0.4), {text:'Ventola', href:'#svc-surriscaldamento', side:1, anchor:V(0.32,0.05,0)}); // Scocca superiore con trackpad var top = new T.Group(); top.add(slab(3.2,2.2,0.07,0.14,alu)); var pad = slab(1.1,0.62,0.004,0.06,aluDk); pad.position.set(0,0.07,0.66); top.add(pad); part(top, V(0,0.13,0), V(0,1.45,0)); // Tastiera var kc = document.createElement('canvas'); kc.width = 1024; kc.height = 360; var kx = kc.getContext('2d'); kx.fillStyle = '#121418'; kx.fillRect(0,0,1024,360); function drawKey(x,y,w,h){ kx.fillStyle='#262a31'; kx.beginPath(); if(kx.roundRect){kx.roundRect(x,y,w,h,8);} else {kx.rect(x,y,w,h);} kx.fill(); kx.fillStyle='#2f343c'; kx.fillRect(x+4,y+4,w-8,3); } var kw = 64, gap = 6, x0 = 12, y0 = 10, rh = 50; for(var r=0;r<5;r++){ for(var k=0;k<15;k++){ drawKey(x0+k*(kw+gap)*0.97, y0+r*(rh+gap)+ (r===0?0:6), kw*0.97-gap, r===0?30:rh); } } var y5 = y0+5*(rh+gap)+6; drawKey(x0,y5,kw*1.3,rh); drawKey(x0+kw*1.4,y5,kw,rh); drawKey(x0+kw*2.5,y5,kw,rh); drawKey(x0+kw*3.6,y5,kw*6.6,rh); for(var a=0;a<4;a++) drawKey(x0+kw*10.3+a*(kw+gap), y5, kw, rh); var ktex = new T.CanvasTexture(kc); ktex.encoding = T.sRGBEncoding; ktex.anisotropy = 4; var kb = new T.Group(); kb.add(slab(2.75,0.95,0.025,0.03,dark)); var kp = new T.Mesh(new T.PlaneGeometry(2.7,0.92), new T.MeshStandardMaterial({map:ktex, roughness:0.7})); kp.rotation.x = -Math.PI/2; kp.position.y = 0.027; kp.receiveShadow = true; kb.add(kp); part(kb, V(0,0.2,-0.3), V(0,2.0,0.05), {text:'Tastiera', href:'#svc-tastiera', side:-1, anchor:V(-1.38,0.03,0)}); // Schermo (coperchio incernierato) var lidPivot = new T.Group(); var lid = new T.Group(); lid.rotation.x = -0.3; lidPivot.add(lid); var lg = new T.ExtrudeGeometry(rshape(3.2,2.1,0.14),{depth:0.06,bevelEnabled:false,curveSegments:10}); lg.translate(0,1.05,-0.06); lid.add(cast(new T.Mesh(lg, alu))); var bezel = new T.Mesh(new T.PlaneGeometry(3.12,2.02), new T.MeshStandardMaterial({color:0x08090b, roughness:0.2, metalness:0.3})); bezel.position.set(0,1.05,0.001); lid.add(bezel); var sc = document.createElement('canvas'); sc.width = 768; sc.height = 480; var sx = sc.getContext('2d'); var stex = new T.CanvasTexture(sc); stex.encoding = T.sRGBEncoding; stex.anisotropy = 4; var screen = new T.Mesh(new T.PlaneGeometry(2.98,1.86), new T.MeshBasicMaterial({map:stex, toneMapped:false})); screen.position.set(0,1.07,0.003); lid.add(screen); part(lidPivot, V(0,0.2,-1.1), V(0,0.35,-0.75), {text:'Schermo', href:'#svc-schermo', side:1, anchor:V(1.5,1.7,0), anchorObj:lid}); var FONT = 'system-ui,-apple-system,"Segoe UI",Roboto,Arial,sans-serif'; function drawScreen(mode, t){ var g = sx.createLinearGradient(0,0,768,480); g.addColorStop(0,'#0e2f45'); g.addColorStop(1,'#07131d'); sx.fillStyle = g; sx.fillRect(0,0,768,480); sx.textAlign = 'center'; if(mode === 'ok'){ sx.fillStyle = '#ffffff'; sx.font = '900 150px '+FONT; sx.fillText('BNO', 384, 250); sx.fillStyle = '#33a6da'; sx.font = '700 46px '+FONT; sx.fillText('Informatica', 384, 312); sx.fillStyle = 'rgba(255,255,255,.6)'; sx.font = '600 24px '+FONT; sx.fillText('Riparazione computer · Messina', 384, 380); } else { sx.fillStyle = '#ffffff'; sx.font = '800 44px '+FONT; sx.fillText('Diagnosi in corso', 384, 130); sx.fillStyle = 'rgba(255,255,255,.12)'; sx.fillRect(134,170,500,16); var p = (t*0.45) % 1; sx.fillStyle = '#33a6da'; sx.fillRect(134,170,500*p,16); sx.textAlign = 'left'; sx.font = '600 28px '+FONT; ['Batteria','Schermo','SSD e dati','Ventola'].forEach(function(n,i){ var done = p > (i+1)*0.22; sx.fillStyle = done ? '#FFC400' : 'rgba(255,255,255,.35)'; sx.fillText((done ? '✓ ' : '• ') + n, 250, 250 + i*48); }); } stex.needsUpdate = true; } drawScreen('ok',0); // Etichette cliccabili verso i servizi var layer = stage.querySelector('.bno3d-labels'); parts.forEach(function(p){ if(!p.label) return; var a = document.createElement('a'); a.className = 'bno3d-label'; a.href = p.label.href; a.textContent = p.label.text; a.tabIndex = -1; layer.appendChild(a); p.el = a; }); // Interazione var target = {x:0,y:0}, cur = {x:0,y:0}, hovering = false, pinned = false, e = 0; function openAmount(){ return e*e*(3-2*e); } window.addEventListener('pointermove', function(e){ var r = canvas.getBoundingClientRect(); target.x = Math.max(-1, Math.min(1, (e.clientX - (r.left + r.width/2)) / (window.innerWidth*0.5))); target.y = Math.max(-1, Math.min(1, (e.clientY - (r.top + r.height/2)) / (window.innerHeight*0.5))); }, {passive:true}); stage.addEventListener('pointerenter', function(e){ if(e.pointerType === 'mouse') hovering = true; }); stage.addEventListener('pointerleave', function(e){ if(e.pointerType === 'mouse') hovering = false; }); var btn = stage.querySelector('.bno3d-toggle'); function setPinned(v){ pinned = v; btn.textContent = pinned ? 'Richiudi il notebook' : 'Guarda dentro il notebook'; btn.setAttribute('aria-pressed', pinned ? 'true' : 'false'); parts.forEach(function(p){ if(p.el) p.el.tabIndex = pinned ? 0 : -1; }); } btn.addEventListener('click', function(){ setPinned(!pinned); }); // Clic (o tocco) direttamente sul pezzo smontato: porta al servizio parts.forEach(function(p){ if(p.label) p.obj.traverse(function(o){ if(o.isMesh) o.userData.part = p; }); }); var ray = new T.Raycaster(), ndc = new T.Vector2(), hot = null; function pick(ev){ var r = canvas.getBoundingClientRect(); ndc.set(((ev.clientX - r.left) / r.width) * 2 - 1, -((ev.clientY - r.top) / r.height) * 2 + 1); ray.setFromCamera(ndc, camera); var hits = ray.intersectObjects(laptop.children, true); for(var i=0;i 0.6 ? pick(ev) : null; canvas.style.cursor = hot ? 'pointer' : ''; }); canvas.addEventListener('pointerleave', function(){ hot = null; canvas.style.cursor = ''; }); canvas.addEventListener('click', function(ev){ var open = openAmount() > 0.6; var p = open ? pick(ev) : null; if(p){ go(p); return; } if(!finePointer) setPinned(!open); // su touch: tocca per aprire, tocca fuori dai pezzi per chiudere }); // passando sui pulsanti dei componenti il notebook si apre var chipHover = false; section.querySelectorAll('.inside-chip').forEach(function(c){ c.addEventListener('pointerenter', function(){ chipHover = true; }); c.addEventListener('pointerleave', function(){ chipHover = false; }); c.addEventListener('focus', function(){ chipHover = true; }); c.addEventListener('blur', function(){ chipHover = false; }); }); function resize(){ var w = stage.clientWidth, h = stage.clientHeight; renderer.setSize(w, h, false); camera.aspect = w/h; var dist = w/h < 1 ? 9.0 / Math.max(w/h, 0.7) : 9.0; camera.position.set(0, 3.7 * dist/9, dist); camera.lookAt(0, 1.0, 0); camera.updateProjectionMatrix(); } new ResizeObserver(resize).observe(stage); resize(); var visible = true; if('IntersectionObserver' in window) new IntersectionObserver(function(es){ visible = es[0].isIntersecting; }).observe(stage); var clock = new T.Clock(), mode = 'ok', v = new T.Vector3(); function tick(){ requestAnimationFrame(tick); if(!visible){ clock.getDelta(); return; } var dt = Math.min(clock.getDelta(), 0.05), t = clock.elapsedTime; var k = 1 - Math.pow(0.0015, dt); cur.x += (target.x - cur.x) * k; cur.y += (target.y - cur.y) * k; var intro = !reduce && t > 0.8 && t < 3.6; // all'avvio si apre una volta, per far capire che si può fare var want = (hovering || pinned || chipHover || intro) ? 1 : 0; e += (want - e) * (1 - Math.pow(0.02, dt)); var ee = e*e*(3-2*e); laptop.rotation.y = -0.42 + (finePointer ? cur.x * 0.45 : (reduce ? 0 : Math.sin(t*0.5) * 0.3)); laptop.rotation.x = cur.y * 0.1; laptop.position.y = -0.15 * ee; parts.forEach(function(p){ p.lift = (p.lift || 0) + (((p === hot) ? 0.14 : 0) - (p.lift || 0)) * k; p.obj.position.copy(p.base).addScaledVector(p.off, ee); p.obj.position.y += p.lift; }); rotor.rotation.y += dt * (1 + 14*ee); var newMode = ee > 0.5 ? 'scan' : 'ok'; if(newMode === 'scan') drawScreen('scan', t); else if(mode !== 'ok') drawScreen('ok', 0); mode = newMode; renderer.render(scene, camera); var w = stage.clientWidth, h = stage.clientHeight, op = Math.max(0, Math.min(1, (ee - 0.6) / 0.3)); parts.forEach(function(p){ if(!p.el) return; (p.label.anchorObj || p.obj).localToWorld(v.copy(p.label.anchor)); v.project(camera); var x = (v.x + 1) / 2 * w, y = (1 - v.y) / 2 * h; p.el.style.transform = 'translate(' + x.toFixed(1) + 'px,' + y.toFixed(1) + 'px) translate(' + (p.label.side < 0 ? '-100%' : '0') + ',-50%) translateX(' + (p.label.side*14) + 'px)'; p.el.style.opacity = op; p.el.classList.toggle('on', op > 0.5); p.el.classList.toggle('hot', p === hot); }); } tick(); } })(); });