Deck Stair Riser and Tread Calculator
ANA›Life Services Authority›National Calculator Authority›Deck Stair Riser and Tread Calculator
.calc-container { max-width: 640px; margin: 2rem 0; padding: 1.5rem; background: #fff; border: 1px solid #ddd; border-radius: 8px; box-shadow: 0 1px 3px rgba(0,0,0,0.06); font-family: system-ui, -apple-system, sans-serif; } .calc-container h3 { font-family: Georgia, serif; font-size: 1.15rem; color: #1a1a1a; margin-bottom: 1rem; padding-bottom: 0.5rem; border-bottom: 2px solid var(--ac, #3d5a80); } .calc-row { display: flex; align-items: center; gap: 0.75rem; margin-bottom: 0.75rem; flex-wrap: wrap; } .calc-row label { min-width: 160px; font-size: 0.9rem; color: #333; font-weight: 500; } .calc-row input[type="number"], .calc-row select { flex: 1; min-width: 120px; max-width: 200px; padding: 0.5rem 0.6rem; border: 1px solid #ccc; border-radius: 4px; font-size: 0.9rem; font-family: system-ui, sans-serif; color: #1a1a1a; background: #fafaf8; } .calc-row input:focus, .calc-row select:focus { outline: none; border-color: var(--ac, #3d5a80); box-shadow: 0 0 0 2px rgba(26,74,138,0.12); } .calc-row .unit { font-size: 0.82rem; color: #888; min-width: 30px; } .calc-btn { display: inline-block; margin-top: 0.5rem; padding: 0.55rem 1.5rem; background: var(--ac, #3d5a80); color: #fff; border: none; border-radius: 4px; font-size: 0.9rem; font-weight: 600; cursor: pointer; font-family: system-ui, sans-serif; } .calc-btn:hover { opacity: 0.9; } .calc-result { margin-top: 1.25rem; padding: 1rem 1.25rem; background: #f0f6fc; border-left: 3px solid var(--ac, #3d5a80); border-radius: 0 6px 6px 0; display: none; } .calc-result.visible { display: block; } .calc-result-label { font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.06em; color: #666; margin-bottom: 0.25rem; } .calc-result-value { font-size: 1.6rem; font-weight: 700; color: var(--ac, #3d5a80); } .calc-result-detail { font-size: 0.85rem; color: #555; margin-top: 0.5rem; line-height: 1.5; } .calc-note { margin-top: 1rem; font-size: 0.8rem; color: #888; font-style: italic; } .calc-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 0.75rem; margin-top: 0.75rem; } .calc-grid-item { padding: 0.6rem 0.8rem; background: #f8f9fa; border-radius: 4px; border: 1px solid #eee; } .calc-grid-item .label { font-size: 0.75rem; color: #888; text-transform: uppercase; letter-spacing: 0.04em; } .calc-grid-item .value { font-size: 1.1rem; font-weight: 600; color: #1a1a1a; } @media (max-width: 720px) { .calc-row { flex-direction: column; align-items: flex-start; gap: 0.3rem; } .calc-row label { min-width: auto; } .calc-row input[type="number"], .calc-row select { max-width: 100%; width: 100%; } .calc-grid { grid-template-columns: 1fr; } } .calc-chart { margin: 1rem 0; text-align: center; } .calc-chart svg { max-width: 100%; height: auto; } .calc-chart-legend { display: flex; flex-wrap: wrap; justify-content: center; gap: 0.6rem 1.2rem; margin-top: 0.6rem; font-size: 0.8rem; color: #555; } .calc-chart-legend span { display: inline-flex; align-items: center; gap: 0.3rem; } .calc-chart-legend i { display: inline-block; width: 10px; height: 10px; border-radius: 2px; font-style: normal; } .calc-related { max-width: 640px; margin: 2rem 0 1rem; padding: 1.25rem 1.5rem; background: #f8f9fa; border: 1px solid #e8e8e8; border-radius: 8px; } .calc-related h3 { font-family: Georgia, serif; font-size: 1rem; color: #1a1a1a; margin: 0 0 0.75rem; padding-bottom: 0.4rem; border-bottom: 2px solid var(--ac, #3d5a80); } .calc-related-list { list-style: none; padding: 0; margin: 0 0 0.75rem; display: grid; grid-template-columns: 1fr 1fr; gap: 0.4rem 1.5rem; } .calc-related-list li a { font-size: 0.88rem; color: var(--ac, #3d5a80); text-decoration: none; } .calc-related-list li a:hover { text-decoration: underline; } .calc-browse-all { margin: 0.5rem 0 0; font-size: 0.9rem; font-weight: 600; } .calc-browse-all a { color: var(--ac, #3d5a80); text-decoration: none; } .calc-browse-all a:hover { text-decoration: underline; } @media (max-width: 720px) { .calc-related-list { grid-template-columns: 1fr; } }
Deck Stair Riser and Tread Calculator
Calculate the number of risers, riser height, tread depth, stringer length, and total run for deck stairs based on your total rise and preferred dimensions.
Total Rise (inches)
Vertical height from ground to deck surface
Desired Riser Height (inches)
Typical range: 4" – 8.25" (IRC code max 8.25")
Desired Tread Depth (inches)
Horizontal run per step (IRC code min 10")
Tread Thickness (inches)
Thickness of each tread board (typically 1.5" for 2× lumber)
Calculate
function decCalc() { const resultDiv = document.getElementById('dec-result');
const totalRise = parseFloat(document.getElementById('dec-total-rise').value); const desiredRiser = parseFloat(document.getElementById('dec-desired-riser').value); const treadDepth = parseFloat(document.getElementById('dec-tread-depth').value); const treadThickness = parseFloat(document.getElementById('dec-tread-thickness').value);
// ── Validation ────────────────────────────────────────────────────────────── const errors = []; if (isNaN(totalRise) || totalRise 8.25) errors.push("Desired Riser Height must be between 4" and 8.25" (IRC code)."); if (isNaN(treadDepth) || treadDepth 0) { resultDiv.innerHTML = '' + errors.map(e => '').join('') + ''; return; }
// ── Core Calculations ──────────────────────────────────────────────────────── // Number of risers = round(totalRise / desiredRiser) const numRisers = Math.round(totalRise / desiredRiser);
if (numRisers Total rise is too small for the desired riser height.
'; return; }
// Actual riser height (evenly distributed) const actualRiser = totalRise / numRisers;
// Number of treads = numRisers - 1 (top landing is the deck itself) const numTreads = numRisers - 1;
// Total horizontal run const totalRun = numTreads * treadDepth;
// Stringer length (diagonal) using Pythagorean theorem // Stringer length = sqrt(totalRise² + totalRun²) const stringerLength = Math.sqrt(totalRise * totalRise + totalRun * totalRun);
// Stringer angle from horizontal (degrees) const angleRad = Math.atan2(totalRise, totalRun); const angleDeg = angleRad * (180 / Math.PI);
// Comfort check: 2R + T rule (ideal range 24–25 inches) const comfortIndex = 2 * actualRiser + treadDepth;
// Unit rise / unit run ratio check const riserTreadSum = actualRiser + treadDepth; // should be 17–18.5 per many codes
// Warnings const warnings = []; if (actualRiser > 8.25) warnings.push("⚠️ Actual riser height exceeds IRC maximum of 8.25"."); if (actualRiser 25) warnings.push("⚠️ 2R + T = " + comfortIndex.toFixed(2) + "" — ideal comfort range is 24"–25"."); if (angleDeg 50) warnings.push("⚠️ Stair angle " + angleDeg.toFixed(1) + "° is outside the comfortable 20°–50° range.");
// ── Format helpers ─────────────────────────────────────────────────────────── function toFtIn(inches) { const ft = Math.floor(inches / 12); const ins = (inches % 12).toFixed(3).replace(/.?0+$/, ''); return ft > 0 ? ft + ' ft ' + ins + ' in' : ins + ' in'; }
function row(label, value, note) { return '' + label + '' + value + '' + (note || '') + ''; }
// ── Output ─────────────────────────────────────────────────────────────────── let html = '### Results ';
if (warnings.length > 0) { html += '' + warnings.map(w => '').join('') + ''; }
html += 'ParameterValueNotes'; html += row('Number of Risers', numRisers, 'Steps from ground to deck'); html += row('Number of Treads', numTreads, 'Treads = Risers − 1'); html += row('Actual Riser Height', actualRiser.toFixed(4) + ' in (' + toFtIn(actualRiser) + ')', 'IRC max 8.25"'); html += row('Tread Depth', treadDepth.toFixed(4) + ' in (' + toFtIn(treadDepth) + ')', 'IRC min 10"'); html += row('Total Run (horizontal)', totalRun.toFixed(4) + ' in (' + toFtIn(totalRun) + ')', 'Ground footprint'); html += row('Total Rise (vertical)', totalRise.toFixed(4) + ' in (' + toFtIn(totalRise) + ')', 'Input value'); html += row('Stringer Length', stringerLength.toFixed(4) + ' in (' + toFtIn(stringerLength) + ')', 'Diagonal cut length'); html += row('Stair Angle', angleDeg.toFixed(2) + '°', 'From horizontal; ideal 30°–35°'); html += row('2R + T Comfort Index', comfortIndex.toFixed(3) + ' in', 'Ideal: 24"–25"'); html += row('R + T Sum', riserTreadSum.toFixed(3) + ' in', 'Ideal: 17"–18.5"'); html += '';
resultDiv.innerHTML = html; }
#### Formulas Used
Number of Risers: N = round(Total Rise ÷ Desired Riser Height)
Actual Riser Height: R = Total Rise ÷ N
Number of Treads: Treads = N − 1 (the deck surface serves as the top landing)
Total Run: Total Run = Treads × Tread Depth
Stringer Length: L = √(Total Rise² + Total Run²) (Pythagorean theorem)
Stair Angle: θ = arctan(Total Rise ÷ Total Run)
2R + T Comfort Index: 2R + T = 2 × Riser Height + Tread Depth (ideal: 24"–25")
#### Assumptions & References
- Based on IRC Section R311.7 (International Residential Code) stair requirements.
- Maximum riser height: 8.25 inches; minimum riser height: 4 inches.
- Minimum tread depth: 10 inches (nosing not included in this calculator).
- The 2R + T comfort formula is a widely used ergonomic guideline (Blondel's formula, 1675).
- Stair angles between 30° and 35° are generally considered most comfortable; IRC permits up to ~41°.
More Calculators
- Home Charging Station ROI Calculator
- EVSE Circuit Breaker Sizing Calculator
- Extermination ROI Calculator
- EVSE Circuit Breaker and Ampacity Sizing Calculator
- Eviction Cost-Benefit Estimator
- Carer Payment & Allowance Estimator
- Emergency Shelter Capacity Calculator
- Gaps in NI Record Cost Calculator
- National Insurance Class Checker (Employed vs Self-Employed)
- External Review Eligibility Checker
- Insurance Claim Settlement Estimator
- Subrogation Recovery Estimator
Read Next
Ni Class 2 Vs Class 4 Contributions Comparator ANA › Life Services Authority › National Calculator Authority › NI Class 2 vs Class 4 Contributions Comparator .calc-container...
National Insurance Class Checker Employed Vs Self Employed ANA › Life Services Authority › National Calculator Authority › National Insurance Class Checker (Employed vs Self-Employed)...
External Review Eligibility Checker ANA › Life Services Authority › National Calculator Authority › External Review Eligibility Checker .calc-container {...