Heart rate zone training is a method of gauging the intensity of your workouts based on your maximum heart rate (MHR). By training in specific zones, you can target different physiological adaptations, from fat burning and endurance to maximum performance speed.
How This Calculator Works
This calculator primarily uses the standard formula to estimate your Maximum Heart Rate:
MHR = 220 – Age
If you provide your Resting Heart Rate (RHR), the calculator automatically upgrades to the Karvonen Formula. The Karvonen method is generally considered more accurate for individuals with varying fitness levels because it takes into account your Heart Rate Reserve (HRR).
The 5 Training Zones
Zone 1 (50-60%): Very Light. Warm-up and cool-down. Helps with recovery and preparing the muscles for exercise.
Zone 2 (60-70%): Light. The "Fat Burning" zone. Builds basic endurance and aerobic capacity. You should be able to hold a conversation easily.
Zone 3 (70-80%): Moderate. Improves aerobic fitness and blood circulation. Breathing becomes rhythmic and harder.
Zone 4 (80-90%): Hard. Increases maximum performance capacity. This is the anaerobic threshold zone where muscles begin to tire.
Zone 5 (90-100%): Maximum. Develops maximum speed and power. Can only be sustained for very short periods (sprints).
Why Use the Karvonen Formula?
Standard calculations assume everyone of the same age has the same fitness level. However, a trained athlete often has a lower resting heart rate than a sedentary person. By inputting your resting heart rate, the calculation adjusts the zones to fit your specific cardiovascular efficiency, ensuring you aren't training too easy or too hard for your goals.
function calculateZones() {
// 1. Get input values
var ageInput = document.getElementById('hrAge').value;
var rhrInput = document.getElementById('hrResting').value;
var resultsDiv = document.getElementById('hrResults');
var displayMHR = document.getElementById('displayMHR');
var zonesBody = document.getElementById('zonesBody');
var methodDisplay = document.getElementById('methodUsed');
// 2. Validation
var age = parseFloat(ageInput);
var rhr = parseFloat(rhrInput);
if (isNaN(age) || age 120) {
alert("Please enter a valid age between 1 and 120.");
return;
}
// 3. Calculate MHR (Standard 220 – Age)
var mhr = 220 – age;
// 4. Determine Calculation Method (Standard vs Karvonen)
var useKarvonen = false;
if (!isNaN(rhr) && rhr > 0 && rhr < mhr) {
useKarvonen = true;
}
// 5. Define Zone Percentages
var zones = [
{ id: 1, min: 0.50, max: 0.60, name: "Very Light", benefit: "Warm up / Recovery", css: "zone-1" },
{ id: 2, min: 0.60, max: 0.70, name: "Light", benefit: "Fat Burn / Endurance", css: "zone-2" },
{ id: 3, min: 0.70, max: 0.80, name: "Moderate", benefit: "Aerobic Fitness", css: "zone-3" },
{ id: 4, min: 0.80, max: 0.90, name: "Hard", benefit: "Anaerobic / Performance", css: "zone-4" },
{ id: 5, min: 0.90, max: 1.00, name: "Maximum", benefit: "Max Effort / Speed", css: "zone-5" }
];
// 6. Generate Table HTML
var tableHtml = "";
for (var i = 0; i < zones.length; i++) {
var z = zones[i];
var minBpm, maxBpm;
if (useKarvonen) {
// Karvonen Formula: Target HR = ((MHR − RHR) × %Intensity) + RHR
var hrr = mhr – rhr;
minBpm = Math.round((hrr * z.min) + rhr);
maxBpm = Math.round((hrr * z.max) + rhr);
} else {
// Standard Formula: Target HR = MHR * %Intensity
minBpm = Math.round(mhr * z.min);
maxBpm = Math.round(mhr * z.max);
}
tableHtml += "
";
tableHtml += "
Zone " + z.id + "
";
tableHtml += "
" + (z.min * 100) + "% – " + (z.max * 100) + "%
";
tableHtml += "
" + minBpm + " – " + maxBpm + " BPM
";
tableHtml += "
" + z.benefit + "
";
tableHtml += "
";
}
// 7. Update DOM
zonesBody.innerHTML = tableHtml;
displayMHR.innerHTML = mhr + " BPM";
if (useKarvonen) {
methodDisplay.innerHTML = "Calculation based on Karvonen Formula (using Resting HR).";
} else {
methodDisplay.innerHTML = "Calculation based on Standard Formula (% of Max HR).";
}
// Show results
resultsDiv.style.display = "block";
}