Deck Joist Span Calculator

ANALife Services AuthorityNational Calculator Authority›Deck Joist Span 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 Joist Span Calculator

Calculate the maximum allowable span for deck joists based on lumber species, size, spacing, and load conditions per IRC Table R507.6.

Lumber Species / Grade

Douglas Fir-Larch #1 & Better Douglas Fir-Larch #2 Hem-Fir #1 & Better Hem-Fir #2 Southern Pine #1 Southern Pine #2 Spruce-Pine-Fir #1 & Better Spruce-Pine-Fir #2 Redwood #1 Western Red Cedar #1

Joist Size

2×6 2×8 2×10 2×12

Joist Spacing (inches on center)

12" 16" 24"

Total Design Load (psf)

40 psf (10 DL + 30 LL — Residential) 50 psf (10 DL + 40 LL — Standard Deck) 60 psf (10 DL + 50 LL — Heavy Use)

Actual Joist Span (ft) — optional, for stress check

Calculate

function decCalc() { // ─── IRC Table R507.6 Maximum Joist Spans (feet-inches) ─────────────────── // Structure: spanTable[species][size][spacing_index] = span in decimal feet // spacing_index: 0=12", 1=16", 2=24" // Load basis: 40 psf total (10 DL + 30 LL). Adjustment applied for other loads. const spanTable = { douglas_fir_larch_1: { "2x6": [9.6, 8.8, 7.7], "2x8": [12.7, 11.7, 10.1], "2x10": [16.1, 14.9, 12.11], "2x12": [18.0, 16.6, 14.5] }, douglas_fir_larch_2: { "2x6": [9.4, 8.7, 7.6], "2x8": [12.5, 11.5, 10.0], "2x10": [15.10,14.7, 12.8], "2x12": [17.9, 16.4, 14.3] }, hem_fir_1: { "2x6": [9.1, 8.4, 7.4], "2x8": [12.0, 11.1, 9.8], "2x10": [15.3, 14.1, 12.3], "2x12": [17.5, 16.1, 14.0] }, hem_fir_2: { "2x6": [8.9, 8.2, 7.2], "2x8": [11.9, 10.11,9.6], "2x10": [15.1, 13.11,12.1], "2x12": [17.3, 15.11,13.10] }, southern_pine_1: { "2x6": [10.1, 9.3, 8.1], "2x8": [13.4, 12.3, 10.8], "2x10": [17.0, 15.8, 13.7], "2x12": [19.6, 18.0, 15.7] }, southern_pine_2: { "2x6": [9.11, 9.1, 7.11], "2x8": [13.1, 12.0, 10.5], "2x10": [16.8, 15.4, 13.4], "2x12": [19.1, 17.7, 15.3] }, spruce_pine_fir_1: { "2x6": [9.4, 8.7, 7.6], "2x8": [12.5, 11.5, 10.0], "2x10": [15.10,14.7, 12.8], "2x12": [17.9, 16.4, 14.3] }, spruce_pine_fir_2: { "2x6": [9.1, 8.4, 7.4], "2x8": [12.1, 11.2, 9.9], "2x10": [15.5, 14.3, 12.5], "2x12": [17.8, 16.3, 14.2] }, redwood_1: { "2x6": [8.7, 7.11, 6.11], "2x8": [11.4, 10.6, 9.1], "2x10": [14.6, 13.4, 11.7], "2x12": [16.8, 15.4, 13.4] }, western_cedar_1: { "2x6": [8.4, 7.8, 6.8], "2x8": [11.0, 10.2, 8.10], "2x10": [14.1, 13.0, 11.3], "2x12": [16.2, 14.11,13.0] } };

// Lumber section properties (actual dressed dimensions) const sectionProps = { "2x6": { b: 1.5, d: 5.5 }, "2x8": { b: 1.5, d: 7.25 }, "2x10": { b: 1.5, d: 9.25 }, "2x12": { b: 1.5, d: 11.25 } };

// Fb (psi) and E (psi) reference design values const lumberProps = { douglas_fir_larch_1: { Fb: 1000, E: 1700000 }, douglas_fir_larch_2: { Fb: 900, E: 1600000 }, hem_fir_1: { Fb: 975, E: 1600000 }, hem_fir_2: { Fb: 850, E: 1300000 }, southern_pine_1: { Fb: 1250, E: 1700000 }, southern_pine_2: { Fb: 1100, E: 1600000 }, spruce_pine_fir_1: { Fb: 875, E: 1500000 }, spruce_pine_fir_2: { Fb: 800, E: 1400000 }, redwood_1: { Fb: 825, E: 1100000 }, western_cedar_1: { Fb: 700, E: 1100000 } };

// Load adjustment factor (relative to 40 psf baseline) // Span ∝ (w_base / w_design)^(1/3) for bending-controlled members const loadAdjFactor = { 40: 1.0, 50: Math.pow(40/50, 1/3), 60: Math.pow(40/60, 1/3) };

const species = document.getElementById("dec-species").value; const size = document.getElementById("dec-size").value; const spacing = parseInt(document.getElementById("dec-spacing").value); const load = parseInt(document.getElementById("dec-load").value); const actualFt = parseFloat(document.getElementById("dec-actual").value);

const spacingIdx = { 12: 0, 16: 1, 24: 2 }[spacing];

// Parse table value (stored as feet.inches float, e.g. 12.7 = 12'-7") function parseSpan(val) { const ft = Math.floor(val); const inc = Math.round((val - ft) * 100); return ft + inc / 12; // convert to decimal feet }

const rawSpan = spanTable[species][size][spacingIdx]; const baseSpanFt = parseSpan(rawSpan); const adjFactor = loadAdjFactor[load]; const maxSpanFt = baseSpanFt * adjFactor;

const maxSpanIn = maxSpanFt * 12; const maxFt = Math.floor(maxSpanFt); const maxIn = Math.round((maxSpanFt - maxFt) * 12);

// ─── Engineering verification (bending & deflection) ────────────────────── const sp = sectionProps[size]; const lp = lumberProps[species]; const b = sp.b; const d = sp.d; const S = (b * d * d) / 6; // Section modulus (in³) const I = (b * d * d * d) / 12; // Moment of inertia (in⁴) const w = (load * spacing / 12); // Uniform load (lb/ft) const wIn = w / 12; // lb/in

// Size factor CF for bending (NDS Supplement Table 4A) const CF = { "2x6": 1.3, "2x8": 1.2, "2x10": 1.1, "2x12": 1.0 }[size]; const CD = 1.0; // Load duration factor (normal) const CM = 1.0; // Wet service (assume dry) const Fb_adj = lp.Fb * CD * CM * CF; // Adjusted Fb (psi)

// Max span from bending: M = wL²/8 ≤ Fb'·S // L_bend = sqrt(8 · Fb' · S / w_in) in inches const L_bend_in = Math.sqrt((8 * Fb_adj * S) / wIn); const L_bend_ft = L_bend_in / 12;

// Max span from deflection: Δ = 5wL⁴/(384EI) ≤ L/360 // L_defl = (384 · E · I / (5 · w_in · 360))^(1/3) const L_defl_in = Math.pow((384 * lp.E * I) / (5 * wIn * 360), 1/3); const L_defl_ft = L_defl_in / 12;

const engMaxFt = Math.min(L_bend_ft, L_defl_ft);

// ─── Actual span check ──────────────────────────────────────────────────── let actualCheck = ""; if (!isNaN(actualFt) && actualFt > 0) { const actualIn = actualFt * 12; const M_actual = (wIn * actualIn * actualIn) / 8; const fb_actual = M_actual / S; const defl_actual = (5 * wIn * Math.pow(actualIn, 4)) / (384 * lp.E * I); const defl_limit = actualIn / 360; const bendRatio = (fb_actual / Fb_adj * 100).toFixed(1); const deflRatio = (defl_actual / defl_limit * 100).toFixed(1); const pass = actualFt Actual Span Check: ${actualFt} ft

CheckValueLimitRatioStatus Bending Stress${fb_actual.toFixed(0)} psi${Fb_adj.toFixed(0)} psi${bendRatio}%${parseFloat(bendRatio) Deflection${defl_actual.toFixed(3)}"${defl_limit.toFixed(3)}" (L/360)${deflRatio}%${parseFloat(deflRatio)

${icon} ${pass ? "Span is ACCEPTABLE" : "Span EXCEEDS maximum — reduce span or upgrade lumber"}

`; }

const html = ` ### Results

IRC Table R507.6 Max Span${maxFt}'-${maxIn}" (${maxSpanFt.toFixed(2)} ft) Bending-Controlled Max Span${L_bend_ft.toFixed(2)} ft Deflection-Controlled Max Span (L/360)${L_defl_ft.toFixed(2)} ft Governing Criterion${L_bend_ft Adjusted Fb (F'b)${Fb_adj.toFixed(0)} psi Tributary Width per Joist${(spacing/12).toFixed(2)} ft Design Load per Joist${w.toFixed(1)} lb/ft Section Modulus S${S.toFixed(2)} in³ Moment of Inertia I${I.toFixed(2)} in⁴

${actualCheck}`;

document.getElementById("dec-result").innerHTML = html; }

#### Formulas Used

1. Bending-controlled maximum span:

M = wL²/8 ≤ F'b · S  →  Lbend = √(8 · F'b · S / w)

Where: w = uniform load per joist (lb/in), F'b = adjusted bending stress (psi), S = bd²/6 (in³)

2. Deflection-controlled maximum span (L/360 live load limit):

Δ = 5wL⁴ / (384EI) ≤ L/360  →  Ldefl = ∛(384 · E · I / (5 · w · 360))

Where: E = modulus of elasticity (psi), I = bd³/12 (in⁴)

3. Adjusted bending design value:

F'b = Fb · CD · CM · CF

CD = 1.0 (normal duration), CM = 1.0 (dry service), CF = size factor (1.0–1.3)

4. Load adjustment for non-40 psf loads:

Ladj = Ltable · (40 / wdesign)1/3

5. Tributary load per joist:

w = Total Load (psf) × Spacing (ft)

#### Assumptions & References

More Calculators

Read Next

Study Time Planner Authority Network America › Life Services Authority › National Calculator Authority .calc-container { max-width: 640px;...

References