Heart Rate Zone Calculator
.hr-calculator-wrapper {
max-width: 800px;
margin: 0 auto;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
color: #333;
line-height: 1.6;
}
.hr-calc-box {
background: #f8f9fa;
border: 1px solid #e9ecef;
border-radius: 8px;
padding: 30px;
margin-bottom: 40px;
box-shadow: 0 4px 6px rgba(0,0,0,0.05);
}
.hr-input-group {
margin-bottom: 20px;
}
.hr-input-group label {
display: block;
font-weight: 700;
margin-bottom: 8px;
color: #2c3e50;
}
.hr-input-group input {
width: 100%;
padding: 12px;
border: 1px solid #ced4da;
border-radius: 4px;
font-size: 16px;
box-sizing: border-box;
}
.hr-input-group .help-text {
font-size: 12px;
color: #6c757d;
margin-top: 5px;
}
.hr-btn {
background-color: #e74c3c;
color: white;
border: none;
padding: 15px 30px;
font-size: 18px;
font-weight: bold;
border-radius: 5px;
cursor: pointer;
width: 100%;
transition: background-color 0.3s;
}
.hr-btn:hover {
background-color: #c0392b;
}
.hr-results {
margin-top: 30px;
display: none;
border-top: 2px solid #e9ecef;
padding-top: 20px;
}
.hr-stat-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 20px;
margin-bottom: 25px;
}
.hr-stat-box {
background: white;
padding: 15px;
border-radius: 6px;
border: 1px solid #dee2e6;
text-align: center;
}
.hr-stat-label {
font-size: 13px;
text-transform: uppercase;
color: #7f8c8d;
letter-spacing: 1px;
}
.hr-stat-value {
font-size: 28px;
font-weight: 800;
color: #2c3e50;
margin-top: 5px;
}
.hr-zone-table {
width: 100%;
border-collapse: collapse;
margin-top: 20px;
background: white;
border-radius: 6px;
overflow: hidden;
}
.hr-zone-table th, .hr-zone-table td {
padding: 12px 15px;
text-align: left;
border-bottom: 1px solid #e9ecef;
}
.hr-zone-table th {
background-color: #2c3e50;
color: white;
font-weight: 600;
}
.hr-zone-table tr:last-child td {
border-bottom: none;
}
.zone-color {
width: 15px;
height: 15px;
display: inline-block;
border-radius: 50%;
margin-right: 10px;
}
.hr-content h2 {
color: #2c3e50;
border-bottom: 2px solid #e74c3c;
padding-bottom: 10px;
margin-top: 40px;
}
.hr-content h3 {
color: #34495e;
margin-top: 30px;
}
.formula-box {
background: #ecf0f1;
padding: 15px;
border-left: 4px solid #3498db;
font-family: monospace;
margin: 20px 0;
}
@media (max-width: 600px) {
.hr-stat-grid {
grid-template-columns: 1fr;
}
}
How to Calculate Heart Rate Zones (Calculator)
Understanding your heart rate is essential for effective training and cardiovascular health. Whether you are an elite athlete or just starting your fitness journey, knowing your Maximum Heart Rate (MHR) and training zones helps you exercise at the right intensity. Use the calculator below to determine your target heart rate zones using the Karvonen method.
Your Age (Years)
Calculate My Zones
Maximum Heart Rate (MHR)
— BPM
Target Training Zones
Zone
Intensity
Target Range (BPM)
Benefit
How to Calculate Your Heart Rate Manually
Before you can use formulas, you need to know how to measure your current heart rate. The most common manual method is checking your radial pulse.
Turn your hand over so your palm faces up.
Place two fingertips (index and middle finger) on the thumb side of your wrist.
Feel for a pulsing sensation.
Count the beats for exactly 15 seconds.
Multiply that number by 4 to get your Beats Per Minute (BPM).
The Mathematics: Standard vs. Karvonen Formula
There are two primary ways to calculate target heart rate zones. This calculator uses the Karvonen formula if you provide a resting heart rate, as it is considered more accurate for individuals with varying fitness levels.
1. The Standard Method (Maximum Heart Rate)
This is the simplest method and is purely based on age. It does not account for individual fitness levels.
MHR = 220 – Age
Target HR = MHR × Intensity Percentage
Example: For a 40-year-old wanting to train at 70% intensity:
220 – 40 = 180 (MHR)
180 × 0.70 = 126 BPM.
2. The Karvonen Method (Heart Rate Reserve)
This method incorporates your Resting Heart Rate (RHR), giving a more personalized target range. It calculates the "Heart Rate Reserve" (HRR), which is the difference between your max and resting rates.
MHR = 220 – Age
HRR = MHR – Resting Heart Rate
Target HR = (HRR × Intensity Percentage) + Resting Heart Rate
Example: For a 40-year-old with a resting heart rate of 60 BPM aiming for 70% intensity:
MHR: 180
HRR: 180 – 60 = 120
Calculation: (120 × 0.70) + 60 = 84 + 60 = 144 BPM.
Note: The Karvonen result (144 BPM) is significantly higher than the standard result (126 BPM) because it accounts for the athlete's baseline fitness.
Understanding Heart Rate Zones
Zone 1 (50-60%): Very Light. Warm-up, cool-down, and active recovery.
Zone 2 (60-70%): Light. The "Fat Burning" zone. Improves basic endurance and fat metabolism.
Zone 3 (70-80%): Moderate. Improves aerobic fitness and blood circulation.
Zone 4 (80-90%): Hard. Increases maximum performance capacity for shorter sessions.
Zone 5 (90-100%): Maximum. Develops maximum performance and speed. Sustainable for only short bursts.
function calculateHeartRateZones() {
// 1. Get Inputs
var ageInput = document.getElementById('hr_age');
var restingInput = document.getElementById('hr_resting');
var displayMHR = document.getElementById('display_mhr');
var displayReserve = document.getElementById('display_reserve');
var resultsArea = document.getElementById('hr_results_area');
var tableBody = document.getElementById('zone_table_body');
var methodText = document.getElementById('method_used_text');
var age = parseFloat(ageInput.value);
var restingHR = parseFloat(restingInput.value);
// 2. Validation
if (isNaN(age) || age 120) {
alert("Please enter a valid age between 1 and 120.");
return;
}
// 3. Logic Setup
var maxHeartRate = 220 – age;
var useKarvonen = false;
var hrReserve = 0;
// Check if resting HR is provided and valid
if (!isNaN(restingHR) && restingHR > 30 && restingHR < 200) {
useKarvonen = true;
hrReserve = maxHeartRate – restingHR;
} else {
// Reset to 0 if invalid or empty to use standard formula
restingHR = 0;
}
// 4. Update Header Stats
displayMHR.innerHTML = Math.round(maxHeartRate) + "
BPM ";
if (useKarvonen) {
displayReserve.innerHTML = Math.round(hrReserve) + "
BPM ";
displayReserve.parentElement.style.display = "block";
methodText.innerHTML = "Calculated using the
Karvonen Formula (Best for accuracy).";
} else {
displayReserve.parentElement.style.display = "none";
methodText.innerHTML = "Calculated using the
Standard Formula (Resting Heart Rate not provided).";
}
// 5. Define Zones
var zones = [
{ name: "Zone 1", percentMin: 0.50, percentMax: 0.60, color: "#a8e6cf", benefit: "Warm up / Recovery" },
{ name: "Zone 2", percentMin: 0.60, percentMax: 0.70, color: "#dcedc1", benefit: "Fat Burning & Endurance" },
{ name: "Zone 3", percentMin: 0.70, percentMax: 0.80, color: "#ffd3b6", benefit: "Aerobic Fitness" },
{ name: "Zone 4", percentMin: 0.80, percentMax: 0.90, color: "#ffaaa5", benefit: "Anaerobic Performance" },
{ name: "Zone 5", percentMin: 0.90, percentMax: 1.00, color: "#ff8b94", benefit: "Maximum Effort" }
];
// 6. Build Table HTML
var tableHTML = "";
for (var i = 0; i < zones.length; i++) {
var z = zones[i];
var lowerBPM, upperBPM;
if (useKarvonen) {
// (HRR * %) + RHR
lowerBPM = Math.round((hrReserve * z.percentMin) + restingHR);
upperBPM = Math.round((hrReserve * z.percentMax) + restingHR);
} else {
// MHR * %
lowerBPM = Math.round(maxHeartRate * z.percentMin);
upperBPM = Math.round(maxHeartRate * z.percentMax);
}
tableHTML += "
";
tableHTML += " " + z.name + " ";
tableHTML += "" + (z.percentMin * 100) + "% – " + (z.percentMax * 100) + "% ";
tableHTML += "" + lowerBPM + " – " + upperBPM + " BPM ";
tableHTML += "" + z.benefit + " ";
tableHTML += " ";
}
tableBody.innerHTML = tableHTML;
resultsArea.style.display = "block";
}