============================================================ */ (function(){ 'use strict'; function init(){ var root = document.getElementById('zssb'); if(!root) return; /* ── State ──────────────────────────────────────── */ var s1Type = 'sleeper'; // 'sleeper' or 'offduty' var s2Type = 'sleeper'; /* ── Toggle button setup ────────────────────────── */ function setupToggle(slpId, offId, callback){ var slpBtn = document.getElementById(slpId); var offBtn = document.getElementById(offId); if(!slpBtn || !offBtn) return; slpBtn.addEventListener('click', function(){ slpBtn.classList.add('active'); offBtn.classList.remove('active'); callback('sleeper'); }); offBtn.addEventListener('click', function(){ offBtn.classList.add('active'); slpBtn.classList.remove('active'); callback('offduty'); }); } setupToggle('zssb-s1-sleeper', 'zssb-s1-offduty', function(t){ s1Type = t; }); setupToggle('zssb-s2-sleeper', 'zssb-s2-offduty', function(t){ s2Type = t; }); /* ── Format decimal hours → "Xh Ym" ─────────────── */ function fmtHrs(h){ if(isNaN(h) || h < 0) return '0h 0m'; var hh = Math.floor(h); var mm = Math.round((h - hh) * 60); if(mm === 60){ hh++; mm = 0; } if(hh === 0 && mm === 0) return '0h 0m'; if(hh === 0) return mm + 'm'; if(mm === 0) return hh + 'h'; return hh + 'h ' + mm + 'm'; } /* ── Add decimal hours to a time string ─────────── */ function addHrs(timeStr, hrs){ if(!timeStr || timeStr === '') return null; var parts = timeStr.split(':'); if(parts.length < 2) return null; var totalMins = parseInt(parts[0], 10) * 60 + parseInt(parts[1], 10) + Math.round(hrs * 60); totalMins = ((totalMins % 1440) + 1440) % 1440; var h = Math.floor(totalMins / 60); var m = totalMins % 60; return (h < 10 ? '0' : '') + h + ':' + (m < 10 ? '0' : '') + m; } /* ── Convert 24hr "HH:MM" → 12hr "H:MM AM/PM" ─── */ function to12hr(t24){ if(!t24) return null; var p = t24.split(':'); var h = parseInt(p[0], 10); var m = p[1]; var ampm = h >= 12 ? 'PM' : 'AM'; h = h % 12; if(h === 0) h = 12; return h + ':' + m + ' ' + ampm; } /* ── Warning helpers ─────────────────────────────── */ function showWarn(msg){ var w = document.getElementById('zssb-warn'); var wm = document.getElementById('zssb-wmsg'); if(w && wm){ wm.textContent = msg; w.classList.add('show'); } } function hideWarn(){ var w = document.getElementById('zssb-warn'); if(w) w.classList.remove('show'); } /* ── Status bar progress ─────────────────────────── */ function setStatus(step){ var pills = ['zssb-pill-1', 'zssb-pill-2', 'zssb-pill-3']; for(var i = 0; i < pills.length; i++){ var el = document.getElementById(pills[i]); if(el){ el.classList[i < step ? 'add' : 'remove']('active'); } } } /* ════════════════════════════════════════════════ MAIN CALCULATION — FMCSA 49 CFR §395.1(g) ════════════════════════════════════════════════ */ function calc(){ hideWarn(); setStatus(2); /* Read inputs */ var drivenBefore = parseFloat(document.getElementById('zssb-driven').value) || 0; var drivenBetween = parseFloat(document.getElementById('zssb-driven-between').value) || 0; var s1h = parseFloat(document.getElementById('zssb-s1-hrs').value) || 0; var s1m = parseFloat(document.getElementById('zssb-s1-min').value) || 0; var s2h = parseFloat(document.getElementById('zssb-s2-hrs').value) || 0; var s2m = parseFloat(document.getElementById('zssb-s2-min').value) || 0; var s1Start = document.getElementById('zssb-s1-start').value; var s2Start = document.getElementById('zssb-s2-start').value; /* Convert to decimal hours */ var split1 = s1h + (s1m / 60); var split2 = s2h + (s2m / 60); /* ── Validation ────────────────────────────────── */ if(split1 <= 0 && split2 <= 0){ showWarn('Please enter the duration for at least one split rest period.'); return; } if(split1 < 0 || split2 < 0){ showWarn('Rest period durations cannot be negative.'); return; } if(drivenBefore < 0 || drivenBetween < 0){ showWarn('Driving hours cannot be negative.'); return; } var totalDriven = drivenBefore + drivenBetween; if(totalDriven > 11){ showWarn('Total hours driven (' + totalDriven.toFixed(2) + ' hrs) exceeds the 11-hour driving limit.'); return; } /* ── FMCSA Split Sleeper Berth Logic ───────────── RULE 1: Combined rest >= 10 hours RULE 2: The longer period must be >= 7 hrs AND in sleeper berth RULE 3: The shorter period must be >= 2 hrs (sleeper or off-duty) ─────────────────────────────────────────────────── */ var totalRest = split1 + split2; var combinedOk = totalRest >= 10; var longSplit = Math.max(split1, split2); var shortSplit = Math.min(split1, split2); var longIsS1 = split1 >= split2; var longType = longIsS1 ? s1Type : s2Type; /* Long split: must be >= 7 hrs AND sleeper berth */ var longOk = (longSplit >= 7) && (longType === 'sleeper'); /* Short split: must be >= 2 hrs (any type) */ var shortOk = (shortSplit >= 2); /* Single-split detection (only one period entered) */ var oneSplit = (split1 > 0 && split2 === 0) || (split1 === 0 && split2 > 0); var isCompliant = false; var reason = ''; if(oneSplit){ isCompliant = false; reason = 'Only one split period entered. Please enter both Split 1 and Split 2 durations to check full FMCSA compliance.'; } else { var failReasons = []; if(!longOk){ if(longSplit < 7){ failReasons.push('Longer split (' + fmtHrs(longSplit) + ') is under the required 7-hour minimum.'); } else { failReasons.push('Longer split (' + fmtHrs(longSplit) + ') must be in the sleeper berth, not off-duty.'); } } if(!shortOk){ failReasons.push('Shorter split (' + fmtHrs(shortSplit) + ') is under the required 2-hour minimum.'); } if(!combinedOk){ failReasons.push('Combined rest (' + fmtHrs(totalRest) + ') is under the 10-hour minimum required.'); } isCompliant = longOk && shortOk && combinedOk; if(isCompliant){ reason = 'Both splits meet FMCSA requirements. Your 14-hour clock is paused during both rest periods and restarts at the end of Split 2.'; } else { reason = failReasons.join(' '); } } /* ── Remaining drive time ───────────────────────── */ var driveRemaining = Math.max(0, 11 - totalDriven); /* ── Timeline data (if start times provided) ──── */ var timelineData = null; if(s1Start && s1Start !== ''){ var s1End = addHrs(s1Start, split1); var midDrive = s2Start && s2Start !== '' ? s2Start : (s1End ? addHrs(s1End, drivenBetween) : null); var s2End = midDrive ? addHrs(midDrive, split2) : null; timelineData = { s1Start: to12hr(s1Start), s1End: to12hr(s1End), s2Start: s2Start && s2Start !== '' ? to12hr(s2Start) : (midDrive ? to12hr(midDrive) : null), s2End: to12hr(s2End), resumeTime: s2End ? to12hr(s2End) : null }; } /* ── Render results ──────────────────────────────── */ renderResults(isCompliant, reason, { split1: split1, split2: split2, totalRest: totalRest, longSplit: longSplit, shortSplit: shortSplit, longOk: longOk, shortOk: shortOk, combinedOk: combinedOk, longType: longType, drivenBefore: drivenBefore, drivenBetween: drivenBetween, totalDriven: totalDriven, driveRemaining:driveRemaining, s1Type: s1Type, s2Type: s2Type, oneSplit: oneSplit }, timelineData); setStatus(3); } /* ════════════════════════════════════════════════ RENDER RESULTS ════════════════════════════════════════════════ */ function renderResults(isCompliant, reason, d, tl){ /* Element refs */ var resEl = document.getElementById('zssb-res'); var banner = document.getElementById('zssb-banner'); var bannerStatus= document.getElementById('zssb-banner-status'); var bannerReason= document.getElementById('zssb-banner-reason'); var bannerSvg = document.getElementById('zssb-banner-svg'); var cardsEl = document.getElementById('zssb-cards'); var breakdownEl = document.getElementById('zssb-breakdown'); var timelineEl = document.getElementById('zssb-timeline'); var tlWrap = document.getElementById('zssb-timeline-wrap'); /* ── Compliance Banner ──────────────────────────── */ if(d.oneSplit){ banner.className = 'compliance-banner non-compliant'; bannerStatus.textContent = 'Incomplete — Enter Both Splits'; bannerSvg.innerHTML = ''; } else if(isCompliant){ banner.className = 'compliance-banner compliant'; bannerStatus.textContent = '✅ FMCSA Compliant — Valid Split'; bannerSvg.innerHTML = ''; } else { banner.className = 'compliance-banner non-compliant'; bannerStatus.textContent = '❌ Non-Compliant — Invalid Split'; bannerSvg.innerHTML = ''; } bannerReason.textContent = reason; /* ── Summary Cards ──────────────────────────────── */ var cards = []; if(!d.oneSplit){ cards.push({ v: fmtHrs(d.split1), u: d.s1Type === 'sleeper' ? 'SLEEPER' : 'OFF-DUTY', n: 'Split 1 Duration', cls: d.s1Type === 'sleeper' ? 'blue' : 'orange' }); cards.push({ v: fmtHrs(d.split2), u: d.s2Type === 'sleeper' ? 'SLEEPER' : 'OFF-DUTY', n: 'Split 2 Duration', cls: d.s2Type === 'sleeper' ? 'blue' : 'orange' }); cards.push({ v: fmtHrs(d.totalRest), u: 'TOTAL REST', n: 'Combined Off-Duty', cls: d.combinedOk ? 'green' : 'red' }); cards.push({ v: fmtHrs(d.driveRemaining), u: 'REMAINING', n: 'Drive Time Left', cls: d.driveRemaining > 4 ? 'green' : (d.driveRemaining > 2 ? 'orange' : 'red') }); } cardsEl.innerHTML = cards.map(function(c){ return '
' + '
' + c.v + '
' + '
' + c.u + '
' + '
' + c.n + '
' + '
'; }).join(''); /* ── Breakdown Table ────────────────────────────── */ var rows = []; if(!d.oneSplit){ rows.push({lbl: 'Split 1 (' + (d.s1Type === 'sleeper' ? 'Sleeper Berth' : 'Off-Duty') + ')', val: fmtHrs(d.split1), cls: ''}); rows.push({lbl: 'Split 2 (' + (d.s2Type === 'sleeper' ? 'Sleeper Berth' : 'Off-Duty') + ')', val: fmtHrs(d.split2), cls: ''}); rows.push({lbl: 'Combined Rest Total', val: fmtHrs(d.totalRest) + (d.totalRest >= 10 ? ' ✓' : ' ✗ (Need ≥10h)'), cls: d.combinedOk ? 'ok' : 'fail'}); rows.push({lbl: 'Longer Split ≥7 hrs in Sleeper Berth', val: d.longOk ? '✓ Pass' : '✗ Fail', cls: d.longOk ? 'ok' : 'fail'}); rows.push({lbl: 'Shorter Split ≥2 hrs (any type)', val: d.shortOk ? '✓ Pass' : '✗ Fail', cls: d.shortOk ? 'ok' : 'fail'}); rows.push({lbl: 'Hours Driven Before Split 1', val: fmtHrs(d.drivenBefore), cls: 'info'}); rows.push({lbl: 'Hours Driven Between Splits', val: fmtHrs(d.drivenBetween), cls: 'info'}); rows.push({lbl: 'Total Hours Driven', val: fmtHrs(d.totalDriven) + ' / 11 hrs max', cls: d.totalDriven < 11 ? 'ok' : 'fail'}); rows.push({lbl: 'Drive Time Remaining After Splits', val: fmtHrs(d.driveRemaining), cls: d.driveRemaining > 0 ? 'ok' : 'fail'}); rows.push({lbl: '14-Hour Clock Paused During Splits', val: isCompliant ? 'Yes — Both periods excluded' : 'Not applicable (fix issues above)', cls: isCompliant ? 'ok' : 'fail'}); } breakdownEl.innerHTML = rows.map(function(r){ return '
' + '' + r.lbl + '' + '' + r.val + '' + '
'; }).join(''); /* ── Timeline ───────────────────────────────────── */ if(!d.oneSplit){ tlWrap.style.display = 'block'; var items = []; items.push({ dot: 'drive', label: 'Started Driving', desc: 'Drove ' + fmtHrs(d.drivenBefore) + ' before first rest period.' }); items.push({ dot: 'sleep', label: 'Split 1 Begins' + (tl && tl.s1Start ? ' at ' + tl.s1Start : ''), desc: fmtHrs(d.split1) + ' ' + (d.s1Type === 'sleeper' ? 'in Sleeper Berth' : 'Off-Duty') + (tl && tl.s1End ? ' → Ends: ' + tl.s1End : '') }); if(d.drivenBetween > 0){ items.push({ dot: 'drive', label: 'Resumed Driving Between Splits', desc: 'Drove ' + fmtHrs(d.drivenBetween) + ' between the two rest periods.' }); } items.push({ dot: 'sleep', label: 'Split 2 Begins' + (tl && tl.s2Start ? ' at ' + tl.s2Start : ''), desc: fmtHrs(d.split2) + ' ' + (d.s2Type === 'sleeper' ? 'in Sleeper Berth' : 'Off-Duty') + (tl && tl.s2End ? ' → Ends: ' + tl.s2End : '') }); if(isCompliant){ items.push({ dot: 'done', label: '14-Hour Clock Restarts' + (tl && tl.resumeTime ? ' at ' + tl.resumeTime : ''), desc: 'Both splits complete. ' + fmtHrs(d.driveRemaining) + ' drive time remaining.' }); } else { items.push({ dot: 'off', label: 'Non-Compliant — Cannot Resume', desc: 'Fix the split issues above before resuming driving.' }); } timelineEl.innerHTML = items.map(function(it){ return '
' + '
' + '
' + '
' + it.label + '
' + '
' + it.desc + '
' + '
'; }).join(''); } else { tlWrap.style.display = 'none'; } /* ── Show results panel ─────────────────────────── */ resEl.classList.add('show'); setTimeout(function(){ resEl.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); }, 100); } /* ════════════════════════════════════════════════ RESET ════════════════════════════════════════════════ */ function resetAll(){ /* Clear number inputs */ var numIds = ['zssb-driven', 'zssb-driven-between', 'zssb-s1-hrs', 'zssb-s1-min', 'zssb-s2-hrs', 'zssb-s2-min']; numIds.forEach(function(id){ var el = document.getElementById(id); if(el) el.value = ''; }); /* Clear time inputs */ ['zssb-s1-start', 'zssb-s2-start'].forEach(function(id){ var el = document.getElementById(id); if(el) el.value = ''; }); /* Reset toggle states */ s1Type = 'sleeper'; s2Type = 'sleeper'; ['zssb-s1-sleeper', 'zssb-s2-sleeper'].forEach(function(id){ var el = document.getElementById(id); if(el) el.classList.add('active'); }); ['zssb-s1-offduty', 'zssb-s2-offduty'].forEach(function(id){ var el = document.getElementById(id); if(el) el.classList.remove('active'); }); /* Hide warning and results */ hideWarn(); var resEl = document.getElementById('zssb-res'); if(resEl) resEl.classList.remove('show'); setStatus(1); } /* ── Event Listeners ──────────────────────────────── */ var calcBtn = document.getElementById('zssb-btn'); if(calcBtn) calcBtn.addEventListener('click', calc); var rstBtn = document.getElementById('zssb-reset'); if(rstBtn) rstBtn.addEventListener('click', resetAll); /* Enter key triggers calculation */ var numFields = ['zssb-driven', 'zssb-driven-between', 'zssb-s1-hrs', 'zssb-s1-min', 'zssb-s2-hrs', 'zssb-s2-min']; numFields.forEach(function(id){ var el = document.getElementById(id); if(el) el.addEventListener('keydown', function(e){ if(e.key === 'Enter') calc(); }); }); } /* end init() */ /* ── Safe DOM-ready execution ───────────────────────── */ if(document.readyState === 'loading'){ document.addEventListener('DOMContentLoaded', init); } else { init(); } })();
Concrete Ramp Calculator
Volume, slope %, ADA compliance & bag count — instant, accurate results worldwide.
Ramp Dimensions
Ramp Length (Run) — horizontal distance
ft
Ramp Width
ft
Rise (Height Difference) — vertical lift
in
Base Slab Thickness — at thinnest point
in
Concrete Bag Size
Waste / Over-pour Buffer
Rise Run (Length) θ
Blue area = concrete volume
Red arrow = Rise (vertical)
Green arrow = Run (horizontal)
θ = Slope angle
Purple = Base thickness
!
Please enter valid positive values for all dimension fields.
Slope Meter
0.00%
0% 8.33% (ADA max) 12.5% 20%+
Formulas, References & Notes
  • Volume Formula: V = Length × Width × Avg Thickness — where Avg Thickness = (Rise + Base Thickness) ÷ 2
  • Slope %: Slope = (Rise ÷ Run) × 100
  • Slope Angle: θ = arctan(Rise ÷ Run) in degrees
  • Slope Ratio: 1 : (Run ÷ Rise) rounded to nearest whole
  • Surface Area: Hypotenuse × Width where Hyp = √(Run² + Rise²)
  • Unit conversions: 1 yd³ = 27 ft³  |  1 ft³ = 0.02832 m³  |  1 ft = 0.3048 m
  • ADA Standard (US): Max running slope 1:12 (8.33%). Source: ADA.gov
  • Bag yields: 80 lb ≈ 0.60 ft³ | 60 lb ≈ 0.45 ft³ | 50 lb ≈ 0.375 ft³ | 40 kg ≈ 0.020 m³ | 25 kg ≈ 0.012 m³
  • Results are estimates. Always verify with a licensed engineer for structural or public-access ramps.
  • Tool by ZoCalculator.com — free, accurate, and built for global use.

Concrete Ramp Calculator: Find Volume & Materials Instantly

Planning a concrete ramp pour without knowing exactly how much material you need is one of the costliest mistakes in any construction project. This concrete ramp calculator gives you an instant, accurate estimate of concrete volume, material quantities, and slope compliance — whether you're building a wheelchair access ramp, a loading dock approach, or a residential garage ramp. It's built for homeowners, contractors, and civil engineers who want fast answers without manual math.


What This Calculator Tells You

Enter your ramp dimensions and the tool instantly calculates:

  • Total concrete volume required (in cubic feet, cubic yards, and cubic meters)
  • Ramp slope ratio and percentage (rise over run)
  • Slope angle in degrees for structural verification
  • Estimated bags of concrete needed (based on 60 lb or 80 lb bags)
  • Ramp surface area for formwork and finishing estimates
  • ADA or accessibility slope compliance check (where applicable)

How the Calculator Works (The Formula & Logic)

The concrete ramp slope calculator uses a straightforward geometric approach. A ramp is essentially a rectangular prism with one tapered end — treated as a rectangular solid with an average depth.

Core Formula:

Volume = Length × Width × Average Thickness

Where: Average Thickness = (Rise + Base Thickness) ÷ 2

Slope Calculation:

Slope (%) = (Rise ÷ Run) × 100

Slope Angle (°) = arctan(Rise ÷ Run)

Concrete Bag Estimate:

Bags Needed = (Volume in ft³) ÷ Yield per Bag

One 80 lb bag yields ≈ 0.60 ft³; one 60 lb bag yields ≈ 0.45 ft³

These formulas power every ramp concrete calculator result on ZoCalculator.com, giving you reliable outputs that match real-world pour conditions.


Standard Ramp Slope Ratings & Classifications

Slope RatioSlope %DegreesTypical Use
1:20 (or flatter)5% or less≤ 2.9°ADA-compliant wheelchair ramps
1:128.33%4.8°Maximum ADA accessible ramp slope
1:1010%5.7°Residential utility ramps
1:812.5%7.1°Light vehicle / bike ramps
1:616.7%9.5°Vehicle loading ramps (short runs)
1:425%14.0°Steep service ramps (not accessible)

ADA Standard: The Americans with Disabilities Act mandates a maximum running slope of 1:12 (8.33%) for wheelchair accessibility.


Step-by-Step Practical Example

Let's say you're pouring a concrete ramp for a garage entrance. Here are your dimensions:

  • Length (Run): 10 feet
  • Width: 4 feet
  • Rise (height difference): 0.5 feet
  • Base slab thickness: 0.33 feet (4 inches)

Step 1 – Calculate Average Thickness: Average Thickness = (Rise + Base Thickness) ÷ 2 = (0.5 + 0.33) ÷ 2 = 0.415 feet

Step 2 – Calculate Volume: Volume = Length × Width × Average Thickness = 10 × 4 × 0.415 = 16.6 cubic feet = 0.615 cubic yards

Step 3 – Estimate Bags: Using 80 lb bags (yield = 0.60 ft³ each): Bags = 16.6 ÷ 0.60 = ≈ 28 bags

Step 4 – Check Slope: Slope % = (0.5 ÷ 10) × 100 = 5% — ADA compliant ✅


How to Use Zo Calculator's Concrete Ramp Tool

Using the concrete calculator for ramp projects on ZoCalculator.com is quick and requires no engineering background:

  1. Enter the Ramp Length (Run): This is the horizontal distance the ramp covers from start to end.
  2. Enter the Ramp Width: The side-to-side measurement of your ramp surface.
  3. Enter the Rise: The vertical height difference between the top and bottom of the ramp.
  4. Enter the Slab Thickness: The minimum base thickness of the concrete at the thinnest point (typically 4 inches for light use, 6 inches for vehicles).
  5. Select Your Bag Size: Choose 60 lb or 80 lb pre-mix concrete bags for the bag count estimate.
  6. Hit Calculate: Instantly see your volume in cubic feet and cubic yards, slope %, angle in degrees, bag count, and slope compliance status.

Review the slope classification table directly on the results page to confirm your ramp meets local code or ADA requirements before you pour.


Practical Applications and Real-World Uses

The ramp concrete calculator serves a wide range of professionals and DIYers:

  • Accessibility ramp construction: Architects and builders use slope percentage outputs to verify ADA compliance before breaking ground.
  • Residential garage ramps: Homeowners use it to estimate concrete bags needed for a driveway transition or step ramp, avoiding over-ordering.
  • Loading dock and warehouse approaches: Logistics facility managers calculate volume and slope angle to ensure forklift safety and drainage.
  • Skateparks and recreational ramps: Landscape designers use it for surface area and material cost estimation.
  • Curb cut installations: Municipal contractors use slope ratio data to meet federal sidewalk accessibility standards.
  • Civil engineering students: A reliable reference tool for practicing real-world concrete volume problems using actual formulas.

Important Notes & Technical Limitations

This concrete calculator ramp tool is designed for general planning and estimation. Please keep the following in mind:

  1. No waste factor included by default: Real pours typically require an additional 5–10% concrete for spillage, uneven sub-base, and overfill. Always add a waste buffer before ordering.
  2. Assumes a simple wedge shape: The tool calculates a linear, flat-surface ramp. Curved ramps, stepped ramps, or ramps with variable width require professional engineering calculations.
  3. Bag yield is approximate: Pre-mix concrete bag yields vary slightly by brand and water ratio. Verify with your specific product's data sheet.
  4. Not a substitute for engineering review: For commercial, structural, or public-access ramps, always have designs reviewed by a licensed structural engineer or comply with local building codes.

Helpful References & Sources

  • ADA.gov – Official U.S. Americans with Disabilities Act guidelines for ramp slope, width, and landing requirements.
  • Portland Cement Association – Technical data on concrete mix design, yield, and slab thickness for flatwork.
  • Wikipedia.org/wiki/Concrete – General reference on concrete composition, curing, and standard construction applications.

🙋 Frequently Asked Questions (FAQs)

How much concrete do I need for a ramp?

The amount of concrete needed for a ramp depends on its length, width, rise, and base slab thickness. Using the formula Volume = Length × Width × Average Thickness converts your dimensions into cubic feet or yards. For most residential ramps, a compact 10-foot ramp will require between 0.5 and 1.0 cubic yards of concrete.

What is the standard slope for a concrete ramp?

The standard slope for an ADA-compliant concrete ramp is a maximum of 1:12, which equals 8.33%. This means for every 12 inches of horizontal run, the ramp can rise no more than 1 inch. Steeper slopes up to 1:8 (12.5%) are permitted for non-accessible residential or service ramps.

How do I calculate the slope of a concrete ramp?

To calculate ramp slope, divide the rise (vertical height) by the run (horizontal length) and multiply by 100 to get a percentage. For example, a ramp that rises 6 inches over 6 feet (72 inches) has a slope of 6 ÷ 72 × 100 = 8.33%. The concrete ramp slope calculator on ZoCalculator.com does this automatically the moment you input your dimensions.

How thick should a concrete ramp be?

For pedestrian and wheelchair ramps, a minimum thickness of 4 inches (about 100mm) is standard. For vehicle-rated ramps — such as driveway approaches or loading docks — a thickness of 5 to 6 inches is recommended. Always factor in local frost depth, soil conditions, and expected load when choosing slab thickness.

Can I use pre-mix concrete bags for a ramp pour?

Yes, pre-mix bags are suitable for small ramp projects, typically those under 0.5 cubic yards. For larger pours, ordering ready-mix concrete from a batch plant is more cost-effective and ensures consistent mix quality. The concrete ramp calculator estimates the exact number of 60 lb or 80 lb bags so you can decide which approach makes more sense for your project scale.

What is the maximum slope for a wheelchair ramp?

The maximum running slope for a wheelchair ramp under ADA standards is 1:12 (8.33%). Cross slopes — the side-to-side tilt — must not exceed 1:48 (2.08%). Ramps exceeding 6 inches in rise must also include level rest landings at the top, bottom, and any turn points.

How do I calculate concrete volume in cubic yards?

First calculate the volume in cubic feet using the formula: Length × Width × Thickness. Then divide by 27 (since there are 27 cubic feet in one cubic yard). For example, 16.6 cubic feet ÷ 27 = 0.615 cubic yards. The ramp concrete calculator handles this unit conversion automatically in its output.

What mix ratio of concrete should I use for a ramp?

A standard 3,000 PSI concrete mix (ratio of 1 part cement : 2 parts sand : 3 parts aggregate) works well for most residential ramps. For outdoor ramps exposed to freeze-thaw cycles or vehicle traffic, a 4,000 PSI mix with air entrainment is recommended for added durability and crack resistance.

Is a concrete ramp cheaper than asphalt?

In most cases, yes. Concrete ramps tend to cost more upfront than asphalt, but they last significantly longer — typically 30–50 years versus 15–20 years for asphalt — making them more economical over time. The total cost depends on thickness, slope length, reinforcement (rebar or wire mesh), and local labor rates. Use the concrete calculator for ramp to estimate your material cost before getting contractor quotes.

Do I need a permit to pour a concrete ramp?

In most municipalities, any structural concrete work — including ramps attached to a building or crossing a public sidewalk — requires a building permit. For private residential ramps, requirements vary by jurisdiction, but ramps serving as public access under ADA must meet federal and local code. Always check with your local building department before starting your pour.


Explore Related Calculators on Zo Calculator