Global O-Ring and Seal has developed these o-ring groove design and gland dimension guidelines to help you size a correct gland for face/flange, static, dynamic and dovetail seals. Use the interactive O-Ring Groove Design Calculator below to apply them in seconds — choose an AS568 series and groove type to get gland depth, width, squeeze and corner radii, with built-in compression, extrusion/pressure and concentricity checks.
Numerous factors go into a gland/groove design — static or dynamic application, pressure, the fluid being sealed, and the tolerances of both the o-ring and the groove — so treat the calculator as a starting point and confirm it against your application. The full design tables, dimensional references and engineering guidance behind the tool are in the Supporting Documentation below.
';
}
function scnCard(r, tag, depth){
var isBest=tag.indexOf("Best")===0, isClose=tag.indexOf("Closest")===0;
var cls = isBest?"is-best":(isClose?"is-near":"is-alt");
var tcls = isBest?"best":(isClose?"near":"alt");
// squeeze cell — judged against this size's own cross-section range
var sqNote = r.sqOk?"in range":(r.sq>r.sqMax?"too tight":"too loose");
var sqCls = r.sqOk?"ok":(r.sq>r.sqMax?"bad":"bad");
var fillNote = r.fill==null?"":(r.fillOk?"ok":(r.fill>100?"won't fit":"tight"));
var fillCls = r.fill==null?"ok":(r.fillOk?"ok":(r.fill>100?"bad":"warn"));
var dimNote = r.dimOk?"ok":(r.dim<0?"loose":"too much");
var dimCls = r.dimOk?"ok":"bad";
var why = r.ok ? "All three checks pass for this seal type."
: "Closest standard size, but "+
[!r.sqOk?"squeeze is "+(r.sq>r.sqMax?"too high":"too low"):null,
!r.fillOk?(r.fill>100?"the O-ring is too big for this groove":"the groove is nearly full"):null,
!r.dimOk?"the diameter doesn't match well":null].filter(Boolean).join(", ")+".";
var sizeLine = dimBoth(r.id)+" ID × "+dimBoth(r.cs)+" CS";
var head='AS568 -'+r.d, shopHref=SHOP+r.d, shopLabel='Shop size -'+r.d+' →';
if(r.sys==="M"){ var idmm=(r.id_mm!=null?r.id_mm:r.id*25.4), csmm=(r.cs_mm!=null?r.cs_mm:r.cs*25.4);
head='Metric '+fmtN(idmm)+'×'+fmtN(csmm)+' mm';
sizeLine=fmtN(idmm)+' mm ID × '+fmtN(csmm)+' mm CS ('+r.id.toFixed(3)+'″ × '+r.cs.toFixed(3)+'″)';
shopHref=SHOP+encodeURIComponent(csmm+'X'+idmm); shopLabel='Shop this size →'; } // size-landing (all materials), matches AS568 behavior
return '
'+
'
'+head+' '+sizeLine+'
'+
'
'+tag+''+
'
'+
metric("Squeeze", r.sq.toFixed(1)+"%", sqCls, sqNote)+
metric(r.dimLabel, (r.dim>=0?"+":"")+r.dim.toFixed(1)+"%", dimCls, dimNote)+
metric("Gland fill", r.fill==null?"—":r.fill.toFixed(0)+"%", fillCls, fillNote)+
'
'+
'
';
}
function customPanel(depth, gID, gOD, idealPct, hasPass){
var sid=idealPct;
var csIdeal = depth/(1-sid/100);
var idIdeal = (state.seal==="rod"||state.seal==="face-internal") ? (gOD-2*csIdeal) : gID;
var spec = "O-ring ID ≈ "+dimBoth(idIdeal)+" · cross-section ≈ "+dimBoth(csIdeal)+
" · groove: ID "+dimBoth(gID)+", OD "+dimBoth(gOD)+", depth "+dimBoth(depth);
var head = hasPass ? "Prefer an exact fit? A custom size hits the ideal squeeze" : "This looks like a non-standard groove";
var lead = hasPass
? "The standard size(s) above will work. If you want squeeze right in the middle of the range, a made-to-spec O-ring is the exact match:"
: "No off-the-shelf AS568 size lands cleanly in this groove — which is normal for grooves that weren’t cut to a standard. Here’s the O-ring that fits it, which we can make to order:";
return '
';
}
function render(){
var box=$("#fResults");
if(metricState==="idle"){ loadMetric(function(){ if(metricState==="loaded") render(); }); }
var gID=num($("#fID")), gOD=num($("#fOD")), depth=num($("#fDepth")), width=num($("#fWidth"));
// need at least (ID & OD) or depth, plus width
if((gID==null||gOD==null) && depth==null){
box.innerHTML='
Enter at least the groove ID and OD (or a depth), plus the width, then press Find my O-ring.
'; return;
}
var giIn=gID!=null?toIn(gID):null, goIn=gOD!=null?toIn(gOD):null,
dIn=depth!=null?toIn(depth):null, wIn=width!=null?toIn(width):null;
if(giIn!=null&&goIn!=null&&goIn<=giIn){
box.innerHTML='
Groove OD must be larger than groove ID. Double-check the two diameters.
'; return;
}
var isFace = state.seal.indexOf("face")===0;
if(isFace){
if(wIn==null && giIn!=null && goIn!=null) wIn=(goIn-giIn)/2;
if(dIn==null){ box.innerHTML='
For a face seal, enter the axial groove depth (how deep the groove is cut into the face).
'; return; }
if(wIn==null){ box.innerHTML='
Add the groove width (or the ID and OD so we can work it out).
'; return; }
} else {
if(dIn==null && giIn!=null && goIn!=null) dIn=(goIn-giIn)/2;
if(wIn==null){ box.innerHTML='
Add the groove width so we can check gland fill (how much room the O-ring has).
'; return; }
if(dIn==null){ box.innerHTML='
Enter the groove depth, or both ID and OD so we can work it out.
'; return; }
}
var ev=evaluate(giIn,goIn,dIn,wIn);
var depthUsed=ev.depth, mode=ev.mode;
if(depthUsed==null||depthUsed<=0){
box.innerHTML='
Couldn’t work out the groove depth. Enter it directly.
'; return;
}
if(!isFace && depth==null){ $("#fDepth").value=(state.unit==="mm"?(depthUsed*25.4):depthUsed).toFixed(3); }
if(isFace && width==null){ $("#fWidth").value=(state.unit==="mm"?(wIn*25.4):wIn).toFixed(3); }
var allPass=ev.list.filter(function(r){return r.ok;});
var asPass=allPass.filter(function(r){return r.sys!=="M";}); // AS568 (inch)
var mPass =allPass.filter(function(r){return r.sys==="M";}); // metric
var asClosest=ev.list.filter(function(r){return r.sys!=="M";})[0]; // best AS568 even if it doesn't fully pass
var mClosest =ev.list.filter(function(r){return r.sys==="M";})[0];
var cards=[];
if(asPass.length){ // inch fits -> AS568 leads, metric is the bonus option
cards.push({r:asPass[0],tag:"Best match"});
if(mPass.length) cards.push({r:mPass[0],tag:"Also fits — metric"});
if(asPass[1]&&cards.length<3) cards.push({r:asPass[1],tag:"Alternative"});
} else if(mPass.length){ // metric fits but no standard inch size does -> always still surface an AS568
cards.push({r:mPass[0],tag:"Best match"});
if(asClosest) cards.push({r:asClosest,tag:"Closest AS568"});
if(mPass[1]&&cards.length<3) cards.push({r:mPass[1],tag:"Alternative"});
} else { // nothing passes cleanly -> show the closest of each
if(asClosest) cards.push({r:asClosest,tag:"Closest AS568"});
if(mClosest) cards.push({r:mClosest,tag:"Closest metric"});
}
var html='';
html+='
Using gland depth '+dimBoth(depthUsed)+
' · '+(state.seal.indexOf("face")===0?"face seal":state.motion+" seal")+
'. Squeeze is judged by cross-section — inch sizes per AS568 / Parker O-Ring Handbook ORD 5700, metric per ISO 3601-2. Each result below shows the target range and source it was checked against.
';
html+='
';
if(cards.length){
cards.forEach(function(c){ html+=scnCard(c.r, c.tag, depthUsed); });
} else {
ev.list.slice(0,3).forEach(function(r){ html+=scnCard(r,"Closest standard",depthUsed); });
}
html+='
';
if(!allPass.length){ html+=customPanel(depthUsed, giIn!=null?giIn:(goIn-2*depthUsed), goIn!=null?goIn:(giIn+2*depthUsed), MODE_IDEAL[mode], false); }
box.innerHTML=html;
var copyBtn=document.getElementById("fCopy");
if(copyBtn){ copyBtn.addEventListener("click",function(){
var t=document.getElementById("fSpec").textContent;
if(navigator.clipboard){ navigator.clipboard.writeText(t); copyBtn.textContent="Copied ✓"; setTimeout(function(){copyBtn.textContent="Copy these specs";},1500); }
}); }
}
// ---- 3-of-4 dimensions: auto-calculate & lock the dependent field ----
var FMAP={id:"#fID",od:"#fOD",depth:"#fDepth",width:"#fWidth"};
var fLocked=null;
function fLockEl(el,on){ if(!el)return; el.disabled=!!on; var c=el.closest(".gc-dim"); if(c)c.classList.toggle("is-locked",!!on); }
function fRaw(el){ var x=parseFloat(el.value); return isNaN(x)?null:x; }
function fFmt(x){ return (Math.round(x*1000)/1000).toString(); }
function syncLock(){
var isFace=state.seal.indexOf("face")===0;
var third=isFace?"width":"depth", free=isFace?"depth":"width";
fLockEl($(FMAP[free]),false);
function uv(k){ if(k===fLocked) return null; return fRaw($(FMAP[k])); }
var vid=uv("id"), vod=uv("od"), vth=uv(third);
["id","od",third].forEach(function(k){ if(k!==fLocked) fLockEl($(FMAP[k]),false); });
var have=(vid!=null?1:0)+(vod!=null?1:0)+(vth!=null?1:0);
if(have>=2){
if(vid!=null&&vod!=null){ if(vod>vid){ fLocked=third; var e=$(FMAP[third]); e.value=fFmt((vod-vid)/2); fLockEl(e,true);} else { fLocked=null; } }
else if(vid!=null&&vth!=null){ fLocked="od"; var e2=$(FMAP.od); e2.value=fFmt(vid+2*vth); fLockEl(e2,true); }
else { if(vod>2*vth){ fLocked="id"; var e3=$(FMAP.id); e3.value=fFmt(vod-2*vth); fLockEl(e3,true);} else { fLocked=null; } }
} else { fLocked=null; }
}
function resetLocks(){ fLocked=null; ["id","od","depth","width"].forEach(function(k){ fLockEl($(FMAP[k]),false); }); }
["#fID","#fOD","#fDepth","#fWidth"].forEach(function(s){ var el=$(s); if(el) el.addEventListener("input",syncLock); });
// wire toggles
$("#fSeal").addEventListener("click",function(e){var b=e.target.closest("button");if(!b)return;state.seal=b.getAttribute("data-seal");
$("#fSeal").querySelectorAll("button").forEach(function(x){x.classList.toggle("is-active",x===b);});
$("#fSealHint").textContent=SEALHINT[state.seal];
$("#fMotion").style.display = state.seal.indexOf("face")===0 ? "none":"flex";
if(fLocked){ $(FMAP[fLocked]).value=""; fLocked=null; } syncLock();
if($("#fResults").innerHTML.trim()!=="") render();
});
$("#fMotion").addEventListener("click",function(e){var b=e.target.closest("button");if(!b)return;state.motion=b.getAttribute("data-motion");
$("#fMotion").querySelectorAll("button").forEach(function(x){x.classList.toggle("is-active",x===b);}); if($("#fResults").innerHTML.trim()!=="")render();});
$("#fUnit").addEventListener("click",function(e){var b=e.target.closest("button");if(!b)return;state.unit=b.getAttribute("data-unit");
$("#fUnit").querySelectorAll("button").forEach(function(x){x.classList.toggle("is-active",x===b);});
root.querySelectorAll("[data-unitlbl]").forEach(function(x){x.textContent=state.unit;});
syncLock();
if($("#fResults").innerHTML.trim()!=="")render();});
$("#fGo").addEventListener("click",render);
$("#fClear").addEventListener("click",function(){["#fID","#fOD","#fDepth","#fWidth"].forEach(function(s){$(s).value="";});resetLocks();$("#fResults").innerHTML="";});
root.querySelectorAll(".gc-dim input").forEach(function(inp){inp.addEventListener("keydown",function(e){if(e.key==="Enter")render();});});
})();
';}
function setBadge(el,level,text){el.className="gc-vbadge is-"+level;el.textContent=text;}
function renderCompression(seriesKey,typeKey){var c=compressionCheck(seriesKey,typeKey);var pct=function(x){return x.toFixed(1)+"%";};var bracketStr=c.bracketLo+"%–"+c.bracketHi+"%";var html="";
html+=card("is-green","Nominal Squeeze",pct(c.nominal),"CS "+c.cs_nom.toFixed(3)+"″ · D "+c.d_nom.toFixed(3)+"″");
var klassHigh=(c.high>c.bracketHi+1)?"is-muted":"";html+=card(klassHigh,"Worst-Case High Squeeze",pct(c.high),"CS max "+c.cs_max.toFixed(3)+"″ / gland min "+c.d_min.toFixed(3)+"″");
var klassLow=(c.low