Calculadora de volumen acuario

Calculadora de volumen acuario

    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}

    Please fill the required field.