Calcula el volumen de tu acuario en segundos!
Con esta calculadora sabrás al instante el volumen de agua de tu tanque. Solo ingresa el largo, ancho y alto para obtener la capacidad exacta. ¡Paso uno para crear el hábitat perfecto!
{source}<div id="acq-calc" style="max-width:600px;margin:0 auto;font-family:Arial,Helvetica,sans-serif;border-radius:14px;overflow:hidden;box-shadow:0 6px 20px rgba(0,0,0,0.12);"><div style="background:linear-gradient(135deg,#1b8ad6,#0a5a9c);padding:18px 20px;color:#fff;text-align:center;">
<div style="font-size:30px;line-height:1;">?</div>
<div style="font-size:18px;font-weight:bold;margin-top:6px;">Calculadora de volumen</div>
<div style="font-size:13px;opacity:0.85;">Calcula los litros de agua de tu acuario</div>
</div>
<div style="background:#fff;padding:20px;">
<div style="font-size:13px;color:#444;margin-bottom:6px;font-weight:bold;">¿Cómo has tomado las medidas?</div>
<div style="display:flex;gap:8px;margin-bottom:10px;">
<button type="button" class="acq-modo" data-modo="exterior" style="flex:1;padding:10px;border:none;border-radius:8px;cursor:pointer;font-size:14px;">Exterior</button>
<button type="button" class="acq-modo" data-modo="interior" style="flex:1;padding:10px;border:none;border-radius:8px;cursor:pointer;font-size:14px;">Interior</button>
</div>
<div style="display:flex;gap:8px;background:#eaf5ff;border-radius:8px;padding:10px 12px;font-size:12.5px;color:#0a5a9c;line-height:1.4;margin-bottom:16px;">
<span style="font-size:15px;">ℹ️</span>
<span id="acq-info-txt"></span>
</div>
<div id="acq-svgbox" style="margin-bottom:16px;"></div>
<div id="acq-grosor-wrap" style="display:none;margin-bottom:14px;">
<label style="display:block;font-size:13px;color:#444;margin-bottom:4px;">Espesor del cristal (mm)</label>
<input id="acq-grosor" type="number" min="0" placeholder="0" style="width:100%;padding:10px;border:1px solid #cdd6df;border-radius:8px;box-sizing:border-box;font-size:15px;">
</div>
<label style="display:block;font-size:13px;color:#444;margin-bottom:4px;">Largo (mm)</label>
<input id="acq-largo" type="number" min="0" placeholder="0" style="width:100%;padding:10px;margin-bottom:14px;border:1px solid #cdd6df;border-radius:8px;box-sizing:border-box;font-size:15px;">
<label style="display:block;font-size:13px;color:#444;margin-bottom:4px;">Ancho (mm)</label>
<input id="acq-ancho" type="number" min="0" placeholder="0" style="width:100%;padding:10px;margin-bottom:14px;border:1px solid #cdd6df;border-radius:8px;box-sizing:border-box;font-size:15px;">
<label style="display:block;font-size:13px;color:#444;margin-bottom:4px;">Alto (mm)</label>
<div id="acq-altura-wrap" style="display:none;margin-bottom:6px;">
<div style="font-size:12px;color:#667788;margin-bottom:6px;">Esa altura es:</div>
<div style="display:flex;gap:8px;">
<button type="button" class="acq-altura" data-altura="total" style="flex:1;padding:8px;border:none;border-radius:8px;cursor:pointer;font-size:13px;">Altura total</button>
<button type="button" class="acq-altura" data-altura="agua" style="flex:1;padding:8px;border:none;border-radius:8px;cursor:pointer;font-size:13px;">Altura agua</button>
</div>
</div>
<input id="acq-alto" type="number" min="0" placeholder="0" style="width:100%;padding:10px;border:1px solid #cdd6df;border-radius:8px;box-sizing:border-box;font-size:15px;">
<div id="acq-altura-note" style="display:none;font-size:11px;color:#8896a5;margin-top:5px;font-style:italic;">*La altura total incluye la base de cristal</div>
<div style="display:flex;gap:10px;margin-top:18px;">
<button id="acq-btn" style="flex:2;padding:12px;background:#1b8ad6;color:#fff;border:none;border-radius:8px;cursor:pointer;font-size:15px;font-weight:bold;">Calcular</button>
<button id="acq-reset" style="flex:1;padding:12px;background:#eef2f6;color:#445566;border:none;border-radius:8px;cursor:pointer;font-size:15px;">Reiniciar</button>
</div>
<div id="acq-resultado" style="margin-top:18px;text-align:center;background:#eaf5ff;border-radius:10px;padding:18px;display:none;">
<div style="font-size:13px;color:#0a5a9c;text-transform:uppercase;letter-spacing:1px;">Volumen de agua</div>
<div style="font-size:34px;font-weight:bold;color:#0a5a9c;line-height:1.1;margin-top:4px;"><span id="acq-litros">0</span> <span style="font-size:18px;">litros</span></div>
</div>
<div id="acq-error" style="margin-top:14px;text-align:center;color:#c0392b;font-size:14px;display:none;"></div>
</div>
</div>
<script>
(function(){var modo='exterior', alturaTipo='agua';
var largo=document.getElementById('acq-largo');
var ancho=document.getElementById('acq-ancho');
var alto=document.getElementById('acq-alto');
var grosor=document.getElementById('acq-grosor');
var alturaWrap=document.getElementById('acq-altura-wrap');
var alturaNote=document.getElementById('acq-altura-note');
var grosorWrap=document.getElementById('acq-grosor-wrap');
var res=document.getElementById('acq-resultado');
var err=document.getElementById('acq-error');
var litrosEl=document.getElementById('acq-litros');
var infoTxt=document.getElementById('acq-info-txt');
var svgbox=document.getElementById('acq-svgbox');
var BASE_MODO='flex:1;padding:10px;border:none;border-radius:8px;cursor:pointer;font-size:14px;';
var BASE_ALT='flex:1;padding:8px;border:none;border-radius:8px;cursor:pointer;font-size:13px;';
var ON='background:#1b8ad6;color:#fff;', OFF='background:#eef2f6;color:#445566;';
var INFO={
interior:'Has medido por el INTERIOR del cristal. Introduce largo, ancho y alto interiores y te diremos el agua que cabe.',
exterior:'Exterior. Indica el espesor del cristal, lo restamos 2 veces en el largo y ancho. La base puede ser contando con el espesor del cristal o solo la altura del agua; escoge lo que te convenga.'
};
function pintarModo(){
var b=document.querySelectorAll('.acq-modo');
for(var i=0;i<b.length;i++){ b[i].style.cssText=BASE_MODO+(b[i].getAttribute('data-modo')===modo?ON:OFF); }
}
function pintarAltura(){
var b=document.querySelectorAll('.acq-altura');
for(var i=0;i<b.length;i++){ b[i].style.cssText=BASE_ALT+(b[i].getAttribute('data-altura')===alturaTipo?ON:OFF); }
}
function setInfo(){ infoTxt.textContent=INFO[modo]; }
function lbl(v){ return (v>0)? (' '+Math.round(v)+' mm') : ''; }
function dibujar(){
var L=parseFloat(largo.value), A=parseFloat(ancho.value), H=parseFloat(alto.value), g=parseFloat(grosor.value);
var dL=(L>0)?L:600, dA=(A>0)?A:350, dH=(H>0)?H:400;
var VBW=340, VBH=210;
var mL=32, mR=28, mT=14, mB=26;
var availW=VBW-mL-mR, availH=VBH-mT-mB;
var s=Math.min(availW/(dL+dA*0.5), availH/(dH+dA*0.4));
var fw=dL*s, hh=dH*s, oxp=dA*0.5*s, oyp=dA*0.4*s;
var figW=fw+oxp, figH=hh+oyp;
var x0=mL+(availW-figW)/2;
var topY=mT+(availH-figH)/2;
var yB=topY+figH;
var FTL=[x0,yB-hh], FTR=[x0+fw,yB-hh];
var BBR=[x0+fw+oxp,yB-oyp], BTL=[x0+oxp,yB-hh-oyp], BTR=[x0+fw+oxp,yB-hh-oyp];
var wf;
if(modo==='exterior' && !isNaN(g) && g>=0){
var gf=(hh>0)?(g*s)/hh:0; if(gf>0.6)gf=0.6;
wf=(alturaTipo==='agua')?0.92:(1-gf-0.04);
} else { wf=0.90; }
if(wf<0.05)wf=0.05; if(wf>0.96)wf=0.96;
var yW=yB-hh*wf;
var nb=4, amp=Math.min(2.6, hh*0.05+1.0);
function F(n){return n.toFixed(1);}
function P(p){return F(p[0])+','+F(p[1]);}
function waveSeg(xa,xb,y){
var steps=nb*2, dx=(xb-xa)/steps, sign=1, ss='';
for(var k=0;k<steps;k++){
var cx=xa+dx*(k+0.5), cy=y+sign*amp, ex=xa+dx*(k+1);
ss+=' Q '+F(cx)+' '+F(cy)+' '+F(ex)+' '+F(y);
sign=-sign;
}
return ss;
}
var o='<svg viewBox="0 0 340 210" style="width:100%;height:auto;border-radius:10px;background:linear-gradient(160deg,#d3e2ea,#aebfcb);">';
o+='<defs>';
o+='<linearGradient id="wfFront" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#a3d4ed"/><stop offset="0.5" stop-color="#5aa6d4"/><stop offset="1" stop-color="#2f7bb0"/></linearGradient>';
o+='<linearGradient id="wfSide" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#7cb8dd"/><stop offset="1" stop-color="#225f92"/></linearGradient>';
o+='<linearGradient id="wfTop" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#e3f4fb"/><stop offset="1" stop-color="#a9dcf0"/></linearGradient>';
o+='</defs>';
o+='<polygon points="'+P(FTL)+' '+P(FTR)+' '+P(BTR)+' '+P(BTL)+'" fill="rgba(220,236,244,0.35)"/>';
o+='<polygon points="'+P([x0+fw,yB])+' '+P(BBR)+' '+P(BTR)+' '+P(FTR)+'" fill="rgba(200,224,236,0.30)"/>';
o+='<rect x="'+F(x0)+'" y="'+F(yB-hh)+'" width="'+F(fw)+'" height="'+F(hh)+'" fill="rgba(225,240,247,0.25)"/>';
o+='<polygon points="'+P([x0+fw,yW])+' '+P([x0+fw+oxp,yW-oyp])+' '+P([x0+fw+oxp,yB-oyp])+' '+P([x0+fw,yB])+'" fill="url(#wfSide)" fill-opacity="0.92"/>';
o+='<path d="M '+F(x0)+' '+F(yB)+' L '+F(x0)+' '+F(yW)+waveSeg(x0,x0+fw,yW)+' L '+F(x0+fw)+' '+F(yB)+' Z" fill="url(#wfFront)" fill-opacity="0.9"/>';
var bub=[[0.18,0.72,2.2],[0.30,0.45,1.6],[0.44,0.82,2.6],[0.55,0.58,1.8],[0.68,0.70,2.2],[0.80,0.50,1.5],[0.36,0.66,1.3],[0.72,0.86,1.7]];
for(var bk=0;bk<bub.length;bk++){
var bx=x0+bub[bk][0]*fw, by=yW+bub[bk][1]*(yB-yW), br=bub[bk][2];
if(by<yW+3||by>yB-3) continue;
o+='<circle cx="'+F(bx)+'" cy="'+F(by)+'" r="'+F(br)+'" fill="rgba(255,255,255,0.30)" stroke="rgba(255,255,255,0.55)" stroke-width="0.6"/>';
}
if((yB-yW)>14){
o+='<path d="M '+F(x0+2)+' '+F(yW+5)+waveSeg(x0+2,x0+fw-2,yW+5)+'" fill="none" stroke="rgba(255,255,255,0.28)" stroke-width="1"/>';
}
o+='<path d="M '+F(x0)+' '+F(yW)+waveSeg(x0,x0+fw,yW)+' L '+F(x0+fw+oxp)+' '+F(yW-oyp)+waveSeg(x0+fw+oxp,x0+oxp,yW-oyp)+' Z" fill="url(#wfTop)" fill-opacity="0.92"/>';
o+='<path d="M '+F(x0+oxp*0.5)+' '+F(yW-oyp*0.5)+waveSeg(x0+oxp*0.5,x0+fw+oxp*0.5,yW-oyp*0.5)+'" fill="none" stroke="rgba(255,255,255,0.45)" stroke-width="1"/>';
o+='<path d="M '+F(x0+oxp*0.25)+' '+F(yW-oyp*0.25)+waveSeg(x0+oxp*0.25,x0+fw+oxp*0.25,yW-oyp*0.25)+'" fill="none" stroke="rgba(255,255,255,0.25)" stroke-width="0.8"/>';
o+='<g fill="none" stroke="#3f7ba0" stroke-opacity="0.85" stroke-width="1.2" stroke-linejoin="round">';
o+='<polygon points="'+P(FTL)+' '+P(FTR)+' '+P(BTR)+' '+P(BTL)+'"/>';
o+='<polygon points="'+P([x0+fw,yB])+' '+P(BBR)+' '+P(BTR)+' '+P(FTR)+'"/>';
o+='<rect x="'+F(x0)+'" y="'+F(yB-hh)+'" width="'+F(fw)+'" height="'+F(hh)+'"/>';
o+='</g>';
o+='<line x1="'+F(x0)+'" y1="'+F(yB-hh)+'" x2="'+F(x0+fw)+'" y2="'+F(yB-hh)+'" stroke="rgba(255,255,255,0.55)" stroke-width="1"/>';
if(modo==='exterior' && g>0){
var gp=g*s, gpMax=Math.min(fw*0.32, hh*0.42); if(gp>gpMax)gp=gpMax; if(gp<1.4)gp=1.4;
var GW='fill="rgba(14,48,68,0.58)"';
o+='<rect x="'+F(x0)+'" y="'+F(yB-hh)+'" width="'+F(gp)+'" height="'+F(hh)+'" '+GW+'/>';
o+='<rect x="'+F(x0+fw-gp)+'" y="'+F(yB-hh)+'" width="'+F(gp)+'" height="'+F(hh)+'" '+GW+'/>';
o+='<rect x="'+F(x0)+'" y="'+F(yB-gp)+'" width="'+F(fw)+'" height="'+F(gp)+'" '+GW+'/>';
o+='<path d="M'+F(x0+gp)+' '+F(yB-hh)+' V '+F(yB-gp)+' H '+F(x0+fw-gp)+' V '+F(yB-hh)+'" fill="none" stroke="rgba(222,246,253,0.9)" stroke-width="0.9"/>';
if(gp>=7){
var txX=x0+gp/2, txY=yB-hh/2;
o+='<text x="'+F(txX)+'" y="'+F(txY)+'" text-anchor="middle" font-size="8.5" fill="#eaf7ff" font-family="Arial" transform="rotate(-90 '+F(txX)+' '+F(txY)+')">'+Math.round(g)+' mm</text>';
}
}
o+='<g font-family="Arial" font-size="11" font-weight="bold" fill="#0c3a52" stroke="#ffffff" stroke-width="2.6" paint-order="stroke">';
o+='<text x="'+F(x0+fw/2)+'" y="'+F(yB+16)+'" text-anchor="middle">Largo'+lbl(L)+'</text>';
var altoX=(x0-10), altoY=(yB-hh/2);
o+='<text x="'+F(altoX)+'" y="'+F(altoY)+'" text-anchor="middle" transform="rotate(-90 '+F(altoX)+' '+F(altoY)+')">Alto'+lbl(H)+'</text>';
var anchoCx=(x0+fw+oxp/2), anchoCy=(yB-oyp/2-hh/2);
var anchoRot=Math.atan2(-oyp,oxp)*180/Math.PI;
o+='<text x="'+F(anchoCx)+'" y="'+F(anchoCy)+'" text-anchor="middle" transform="rotate('+anchoRot.toFixed(1)+' '+F(anchoCx)+' '+F(anchoCy)+')">Ancho'+lbl(A)+'</text>';
o+='</g>';
o+='</svg>';
svgbox.innerHTML=o;
}
function showError(msg){ err.textContent=msg; err.style.display='block'; res.style.display='none'; }
var modoBtns=document.querySelectorAll('.acq-modo');
for(var i=0;i<modoBtns.length;i++){
modoBtns[i].addEventListener('click',function(){
modo=this.getAttribute('data-modo');
pintarModo();
var ex=(modo==='exterior');
alturaWrap.style.display=ex?'block':'none';
alturaNote.style.display=ex?'block':'none';
grosorWrap.style.display=ex?'block':'none';
setInfo(); dibujar();
});
}
var altBtns=document.querySelectorAll('.acq-altura');
for(var j=0;j<altBtns.length;j++){
altBtns[j].addEventListener('click',function(){
alturaTipo=this.getAttribute('data-altura');
pintarAltura(); dibujar();
});
}
largo.addEventListener('input',dibujar);
ancho.addEventListener('input',dibujar);
alto.addEventListener('input',dibujar);
grosor.addEventListener('input',dibujar);
document.getElementById('acq-btn').addEventListener('click',function(){
var l=parseFloat(largo.value), a=parseFloat(ancho.value), h=parseFloat(alto.value);
if(isNaN(l)||isNaN(a)||isNaN(h)||l<=0||a<=0||h<=0){ showError('Introduce largo, ancho y alto (mayores que 0).'); return; }
var li,ai,hi;
if(modo==='interior'){ li=l; ai=a; hi=h; }
else{
var g=parseFloat(grosor.value);
if(isNaN(g)||g<0){ showError('Introduce el espesor del cristal.'); return; }
li=l-2*g; ai=a-2*g; hi=(alturaTipo==='total')?(h-g):h;
}
if(li<=0||ai<=0||hi<=0){ showError('Revisa las medidas: con ese espesor el interior sale 0 o negativo.'); return; }
err.style.display='none';
var litros=(li*ai*hi)/1000000;
litrosEl.textContent=litros.toLocaleString('es-ES',{maximumFractionDigits:2});
res.style.display='block';
});
document.getElementById('acq-reset').addEventListener('click',function(){
largo.value=''; ancho.value=''; alto.value=''; grosor.value='';
modo='exterior'; alturaTipo='agua';
pintarModo(); pintarAltura();
alturaWrap.style.display='block'; alturaNote.style.display='block'; grosorWrap.style.display='block';
res.style.display='none'; err.style.display='none';
setInfo(); dibujar(); largo.focus();
});
alturaWrap.style.display=(modo==='exterior')?'block':'none';
alturaNote.style.display=(modo==='exterior')?'block':'none';
grosorWrap.style.display=(modo==='exterior')?'block':'none';
pintarModo(); pintarAltura(); setInfo(); dibujar();
})();
</script>{/source}