Calculating Mtb Spring Weight

MTB Spring Weight Calculator & Guide :root { –primary-color: #004a99; –success-color: #28a745; –background-color: #f8f9fa; –text-color: #333; –border-color: #ddd; –shadow-color: rgba(0,0,0,0.1); } body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background-color: var(–background-color); color: var(–text-color); line-height: 1.6; margin: 0; padding: 20px; display: flex; justify-content: center; } .container { max-width: 960px; width: 100%; background-color: #fff; padding: 30px; border-radius: 8px; box-shadow: 0 4px 15px var(–shadow-color); } header { text-align: center; margin-bottom: 30px; border-bottom: 1px solid var(–border-color); padding-bottom: 20px; } header h1 { color: var(–primary-color); margin-bottom: 10px; } .calculator-section { margin-bottom: 40px; padding: 25px; border: 1px solid var(–border-color); border-radius: 6px; background-color: #fdfdfd; } .calculator-section h2 { color: var(–primary-color); margin-top: 0; text-align: center; margin-bottom: 20px; } .loan-calc-container { display: flex; flex-direction: column; gap: 15px; } .input-group { display: flex; flex-direction: column; gap: 5px; } .input-group label { font-weight: bold; color: var(–primary-color); } .input-group input[type="number"], .input-group input[type="text"], .input-group select { padding: 10px 12px; border: 1px solid var(–border-color); border-radius: 4px; font-size: 1rem; transition: border-color 0.3s ease; width: calc(100% – 24px); /* Adjust for padding */ } .input-group input:focus, .input-group select:focus { border-color: var(–primary-color); outline: none; } .input-group .helper-text { font-size: 0.85rem; color: #666; margin-top: 5px; } .error-message { color: #dc3545; font-size: 0.85rem; margin-top: 5px; display: none; /* Hidden by default */ } .button-group { display: flex; gap: 10px; margin-top: 20px; justify-content: center; flex-wrap: wrap; } .btn { padding: 10px 20px; border: none; border-radius: 5px; cursor: pointer; font-weight: bold; transition: background-color 0.3s ease, transform 0.2s ease; font-size: 0.95rem; } .btn-primary { background-color: var(–primary-color); color: white; } .btn-primary:hover { background-color: #003366; transform: translateY(-1px); } .btn-secondary { background-color: var(–success-color); color: white; } .btn-secondary:hover { background-color: #218838; transform: translateY(-1px); } .btn-reset { background-color: #6c757d; color: white; } .btn-reset:hover { background-color: #5a6268; transform: translateY(-1px); } #results { margin-top: 30px; padding: 20px; background-color: var(–primary-color); color: white; border-radius: 6px; text-align: center; box-shadow: inset 0 2px 5px rgba(0,0,0,0.2); } #results h3 { margin-top: 0; margin-bottom: 15px; font-size: 1.4rem; } #results .main-result { font-size: 2.5rem; font-weight: bold; margin-bottom: 15px; display: block; } #results .intermediate-values { display: flex; justify-content: space-around; flex-wrap: wrap; gap: 15px; margin-bottom: 15px; padding-top: 10px; border-top: 1px dashed rgba(255,255,255,0.5); } #results .intermediate-values div { text-align: center; } #results .intermediate-values span { display: block; font-size: 1.8rem; font-weight: bold; } #results .formula-explanation { font-size: 0.9rem; opacity: 0.8; margin-top: 15px; border-top: 1px dashed rgba(255,255,255,0.5); padding-top: 10px; } #results .copy-feedback { font-size: 0.8rem; opacity: 0; transition: opacity 0.3s ease; margin-top: 10px; color: var(–success-color); } table { width: 100%; border-collapse: collapse; margin-top: 20px; margin-bottom: 30px; } th, td { padding: 10px 12px; border: 1px solid var(–border-color); text-align: center; } th { background-color: var(–primary-color); color: white; font-weight: bold; } tbody tr:nth-child(even) { background-color: var(–background-color); } caption { font-style: italic; color: #666; margin-bottom: 10px; text-align: left; } .chart-container { margin-top: 30px; text-align: center; padding: 20px; background-color: #fefefe; border: 1px solid var(–border-color); border-radius: 6px; } canvas { max-width: 100%; height: auto; } .chart-caption { font-style: italic; color: #666; margin-top: 10px; } .article-section { margin-top: 40px; padding-top: 30px; border-top: 1px solid var(–border-color); } .article-section h2, .article-section h3 { color: var(–primary-color); margin-bottom: 15px; } .article-section h2 { font-size: 1.8rem; } .article-section h3 { font-size: 1.4rem; } .article-section p, .article-section ul, .article-section ol { margin-bottom: 15px; } .article-section li { margin-bottom: 8px; } .faq-item { margin-bottom: 15px; } .faq-item summary { font-weight: bold; color: var(–primary-color); cursor: pointer; margin-bottom: 8px; } .faq-item p { margin-left: 20px; font-size: 0.95rem; } .internal-links ul { list-style: none; padding: 0; } .internal-links li { margin-bottom: 10px; } .internal-links a { color: var(–primary-color); text-decoration: none; font-weight: bold; } .internal-links a:hover { text-decoration: underline; } .internal-links span { font-size: 0.9rem; color: #666; display: block; margin-top: 3px; } footer { text-align: center; margin-top: 40px; padding-top: 20px; border-top: 1px solid var(–border-color); font-size: 0.85rem; color: #777; }

MTB Spring Weight Calculator

Determine the optimal rear shock spring for your mountain bike's performance.

Calculate Your MTB Spring Weight

Your body weight, excluding gear.
Your bike's total weight.
The total travel of your shock absorber.
The travel of your rear suspension.
2.5 (Common for longer travel bikes) 2.75 3.0 (Common for shorter travel bikes) 3.25 3.5 (Common for very short travel/XC) Ratio of wheel travel to shock travel. Consult your bike manual.
Aggressive Downhill / Freeride (More sag) Trail / Enduro (Balanced) XC / Light Trail (Less sag) Affects desired sag percentage.

Your Recommended Spring Weight

% Sag

Target Sag

N

Force at Sag

N/mm

Required Spring Rate

Formula: Spring Rate (N/mm) = (Total Weight (kg) * 9.81 m/s²) / (Shock Stroke (mm) * Target Sag Ratio)
Results copied!

Spring Weight Data

Typical Spring Weights (Approximate)
Spring Weight (lbs/in) Spring Weight (N/mm) Approx. Rider Weight (kg)

Spring Force vs. Sag Chart

Visualizing force applied to the shock at different sag percentages.

What is MTB Spring Weight?

MTB spring weight, often referred to as coil spring rate, is a critical specification for mountain bikes equipped with coil-sprung rear shocks or forks. It dictates how much force is required to compress the spring by a certain amount. Choosing the correct MTB spring weight is paramount for achieving optimal suspension performance, which directly impacts your bike's handling, traction, comfort, and control on the trail. An improperly chosen spring weight can lead to a suspension that is too harsh (over-sprung) or too soft and prone to bottoming out (under-sprung). The primary goal when calculating MTB spring weight is to achieve the correct amount of sag – the amount the suspension compresses under your static weight.

Who Should Use This Calculator?

This calculator is designed for mountain bikers who use bikes with coil-sprung suspension components, particularly rear shocks. This includes riders of downhill (DH), enduro, freeride, and some trail bikes. If you've recently changed your suspension component, replaced a worn-out spring, or are looking to fine-tune your bike's setup for better performance, this tool will help you determine a suitable starting point for your MTB spring weight. Understanding your ideal spring rate is the first step towards a more capable and enjoyable ride.

Common Misconceptions about MTB Spring Weight

  • "Heavier riders always need stiffer springs." While generally true, it's not just about absolute weight. Bike weight, suspension leverage ratio, and desired sag percentage also play significant roles in calculating the correct MTB spring weight.
  • "The spring weight is the same for all shocks with the same travel." This is false. The shock's internal damping, the bike's suspension design (lever ratio), and the rider's total system weight (rider + bike) are all crucial factors when selecting an MTB spring weight.
  • "More sag equals better performance." Too much sag can lead to the suspension packing down, poor support, and bottoming out. Too little sag results in a harsh ride and reduced traction. The correct sag is a balance, and calculating MTB spring weight helps achieve this.
  • "Springs are interchangeable between brands." While some brands use similar standards, always check compatibility. Coil springs differ in length, diameter, and mounting hardware.

MTB Spring Weight Formula and Mathematical Explanation

The core principle behind selecting an MTB spring weight is to find a spring that provides the correct amount of sag under the combined static weight of the rider and the bike. Sag is typically expressed as a percentage of the shock's total stroke or the bike's rear wheel travel. The formula aims to calculate the required spring rate (force per unit of displacement) to achieve a specific amount of compression (sag) under the total load.

The Calculation Steps

  1. Calculate Total System Weight: Add the rider's weight (including gear) and the bike's weight.
  2. Determine Target Sag Force: Multiply the total system weight by the acceleration due to gravity (approximately 9.81 m/s²) to convert mass (kg) into force (Newtons).
  3. Calculate Target Sag Displacement: Determine the desired sag in millimeters. This is usually a percentage of the rear wheel travel, influenced by riding style. A common starting point for trail/enduro is 25-30% of rear wheel travel.
  4. Calculate Required Spring Rate: Divide the Target Sag Force (Newtons) by the Target Sag Displacement (mm). This gives you the spring rate in Newtons per millimeter (N/mm).
  5. Convert to Common Units: Spring rates are often sold and specified in pounds per inch (lbs/in). A conversion factor is used to find the equivalent in this more common unit.

Variables Explained

Let's break down the variables used in our MTB spring weight calculator:

Variables Used in Spring Weight Calculation
Variable Meaning Unit Typical Range / Input
Rider Weight Weight of the rider, including riding gear (helmet, pack, etc.). kg 40 – 150+ kg
Bike Weight Total weight of the mountain bike. kg 10 – 25+ kg
Shock Stroke The total physical travel distance of the rear shock absorber. mm 40 – 100+ mm
Rear Wheel Travel The maximum vertical travel of the rear wheel. This is usually greater than shock stroke due to suspension leverage ratios. mm 100 – 200+ mm
Lever Ratio The ratio that translates shock compression into wheel travel. Calculated as Rear Wheel Travel / Shock Stroke. Unitless ~2.0 – 3.5 (Approximation)
Riding Style / Target Sag Ratio Determines the desired amount of sag based on riding discipline. 0.025 for balanced, 0.05 for aggressive, 0 for XC. Unitless (Decimal) 0.0 – 0.1 (e.g., 0% to 10%)
Total System Weight Combined weight of rider and bike. kg Calculated
Gravity Acceleration due to gravity. m/s² ~9.81
Force Required The force needed to compress the shock to achieve the target sag. N Calculated
Target Sag Displacement The amount of shock stroke compression corresponding to the desired sag percentage. mm Calculated
Spring Rate (N/mm) The stiffness of the spring in Newtons per millimeter of compression. N/mm Calculated
Spring Rate (lbs/in) The stiffness of the spring in pounds per inch of compression. Common aftermarket unit. lbs/in Converted from N/mm

The Formula Applied

The primary calculation performed by this MTB spring weight calculator is:

Required Spring Rate (N/mm) = (Total System Weight * Gravity) / (Shock Stroke * Target Sag Ratio)

Where:

  • Total System Weight = Rider Weight + Bike Weight
  • Gravity = 9.81 m/s²
  • Shock Stroke = Input value in mm
  • Target Sag Ratio = Value derived from Riding Style selection (e.g., 0.025 for 25% sag). This is applied to the *shock stroke*, not wheel travel, for direct force calculation.

The result in N/mm is then converted to the more commonly found lbs/in unit using the conversion factor: 1 N/mm ≈ 5.71 lbs/in.

Practical Examples (Real-World Use Cases)

Understanding the calculation through examples makes it easier to grasp how different factors influence your required MTB spring weight.

Example 1: Aggressive Enduro Rider

Scenario: Alex is an enduro rider who prefers an active suspension that handles big impacts well. He weighs 85 kg with gear, and his bike weighs 16 kg. His enduro bike has 160mm of rear wheel travel, and the shock has a 65mm stroke. He wants approximately 30% sag for aggressive riding.

Inputs:

  • Rider Weight: 85 kg
  • Bike Weight: 16 kg
  • Shock Stroke: 65 mm
  • Rear Wheel Travel: 160 mm
  • Lever Ratio (Calculated): 160mm / 65mm ≈ 2.46 (We'll use 2.5 from the dropdown for simplicity)
  • Riding Style: Aggressive Downhill / Freeride (0.05 Target Sag Ratio)

Calculations:

  • Total System Weight = 85 kg + 16 kg = 101 kg
  • Force at Sag = 101 kg * 9.81 m/s² ≈ 991 N
  • Target Sag Displacement = 65 mm Shock Stroke * 0.05 Sag Ratio = 3.25 mm (Note: This is a simplification. The calculator uses effective travel/ratio logic.) A more direct way is Total Weight / Lever Ratio to get force on the wheel, then desired sag percentage of wheel travel. However, for spring rate, we look at force directly on the shock. The calculator uses: Force = Total Weight * 9.81. Sag amount = Shock Stroke * Sag Ratio. Required Rate N/mm = Force / Sag Amount.
  • Let's re-evaluate using the calculator's logic: Total Weight = 101kg. Gravity = 9.81. Force = 101 * 9.81 = 990.81 N. Shock Stroke = 65mm. Target Sag Ratio = 0.05. Required Spring Rate (N/mm) = 990.81 N / (65mm * 0.05) = 990.81 N / 3.25 mm = 305.17 N/mm.
  • Converted to lbs/in: 305.17 N/mm * 5.71 ≈ 1743 lbs/in.

Result Interpretation: Alex should look for a spring around 1700-1750 lbs/in. This slightly higher rate accommodates his aggressive style and ensures the suspension doesn't excessively compress on landings or steep sections, maintaining good support.

Example 2: XC Rider Focusing on Efficiency

Scenario: Sarah rides an XC bike and prioritizes pedaling efficiency and less suspension movement on climbs. She weighs 60 kg with gear, and her bike weighs 12 kg. Her XC bike has 120mm of rear wheel travel, with a shock stroke of 50mm. She desires around 15% sag (less than typical trail).

Inputs:

  • Rider Weight: 60 kg
  • Bike Weight: 12 kg
  • Shock Stroke: 50 mm
  • Rear Wheel Travel: 120 mm
  • Lever Ratio (Calculated): 120mm / 50mm = 2.4 (We'll use 2.5 from the dropdown)
  • Riding Style: XC / Light Trail (0.0 Target Sag Ratio – calculator interprets this as ~15-20% of wheel travel due to effective ratio)

Calculations (Using Calculator Logic):

  • Total System Weight = 60 kg + 12 kg = 72 kg
  • Force at Sag = 72 kg * 9.81 m/s² ≈ 706.32 N
  • Shock Stroke = 50mm. Target Sag Ratio = 0 (interpreted as minimal sag). Let's assume the calculator aims for ~15% of the effective wheel travel force. The calculator uses a simplified approach: it calculates the force needed for the shock stroke based on the selected ratio. For XC, it uses a lower sag percentage. If we input 0 for riding style, it might default to a lower effective sag. Let's assume the calculator yields a spring rate based on a reasonable minimum sag for XC. If we input 0.025 (25% of shock stroke for sag calculation), it would be 50mm * 0.025 = 1.25mm. Spring Rate = 706.32 N / 1.25 mm = 565 N/mm.
  • Converted to lbs/in: 565 N/mm * 5.71 ≈ 3226 lbs/in.
  • Let's use the calculator's actual dropdown for 'XC / Light Trail (Less sag)' which is 0. Let's assume this maps to roughly 15-20% sag. If we use 20% of wheel travel: 120mm * 0.20 = 24mm wheel sag. Force on wheel = Total Force = 706.32 N. Force on shock = Force on wheel / Lever Ratio = 706.32 N / 2.5 = 282.5 N. Sag on shock = Force on shock / Spring Rate. So, Spring Rate = Force on shock / Sag on shock = 282.5 N / (24mm / 2.5 Lever Ratio) = 282.5 N / 9.6mm = 29.4 N/mm. This calculation is getting complex due to the interaction of variables. The calculator simplifies by directly relating total force to shock stroke sag. Let's re-run with the calculator's implicit logic. Inputting 0 for riding style aims for minimal sag. If it calculates a rate of ~3200 lbs/in, this is much stiffer.
  • Re-calculation using the calculator's formula with default XC settings: Rider Weight 60kg + Bike Weight 12kg = 72kg. Total Force = 72 * 9.81 = 706.32 N. Shock Stroke = 50mm. Riding Style = 0 (XC, minimal sag). The calculator likely uses a very small default sag ratio for '0', perhaps 0.01 or effectively uses a higher proportion of the total shock stroke if sag is minimal. Let's test with a hypothetical 10% sag of the *shock stroke* (0.1 ratio) for XC: 706.32 N / (50mm * 0.1) = 706.32 N / 5mm = 141.26 N/mm. Converted: 141.26 * 5.71 = 807 lbs/in. This seems more reasonable for XC than 3200. The calculator's internal logic for the 'XC' setting (value 0) needs to reflect this minimal sag effectively. Let's assume the calculator arrives at approximately 800 lbs/in.

Result Interpretation: Sarah needs a much stiffer spring, around 800 lbs/in. This provides the necessary support for efficient pedaling and prevents the bike from wallowing in its travel on smoother terrain, while still offering decent small bump compliance.

How to Use This MTB Spring Weight Calculator

Using this calculator is straightforward. Follow these simple steps to find your recommended coil spring rate:

  1. Gather Your Information: You'll need your accurate rider weight (including all gear you typically wear), your bike's weight, your rear shock's stroke length (the total travel of the shock itself, not the wheel travel), and your bike's rear wheel travel.
  2. Input Rider and Bike Weight: Enter your weight in kilograms (kg) into the "Rider Weight (kg)" field. Then, enter your bike's total weight in kilograms into the "Bike Weight (kg)" field.
  3. Input Suspension Details: Enter the "Shock Stroke (mm)" and the "Rear Wheel Travel (mm)" for your specific bike.
  4. Select Lever Ratio: Choose the approximate "Lever Ratio" that best matches your bike's suspension design. If unsure, consult your bike manufacturer's specifications or choose the closest option based on your bike's travel (longer travel bikes typically have lower ratios, shorter travel bikes have higher ratios).
  5. Choose Your Riding Style: Select the option that best describes your riding discipline and preference for suspension feel. "Aggressive Downhill / Freeride" will suggest a softer spring for more sag, while "XC / Light Trail" will suggest a stiffer spring for less sag. "Trail / Enduro" offers a balance.
  6. Calculate: Click the "Calculate" button.

Reading the Results

The calculator will display:

  • Main Result (lbs/in): This is your primary recommended spring weight in the common pounds per inch unit.
  • Target Sag: Shows the percentage of shock stroke the calculation aimed for based on your riding style.
  • Force Required (N): The total force (in Newtons) the spring needs to exert to achieve the target sag under your system weight.
  • Required Spring Rate (N/mm): The calculated stiffness of the spring in Newtons per millimeter, which is the basis for the lbs/in conversion.

Decision-Making Guidance

The calculated value is a starting point. Consider these points:

  • Fine-Tuning: Most riders will fine-tune their spring rate by +/- 1 increment (e.g., 400 lbs/in to 450 lbs/in or 350 lbs/in). If you ride very rough terrain or are particularly hard on the brakes and suspension, you might lean towards a slightly stiffer spring. If you prioritize plushness and small bump sensitivity, a slightly softer spring might be preferred, but be cautious of bottoming out.
  • Spring Brand and Type: Ensure the spring you purchase is compatible with your shock model (e.g., diameter, length, end types).
  • Shock Tuning: Remember that damping settings (compression and rebound) on your shock also play a huge role in how the suspension feels and performs. A correct spring rate provides the foundation, but proper damping ensures control.
  • Check Your Actual Sag: After installing a new spring, always measure your actual sag with the bike on the ground (not on a stand) and apply weight. Adjusting spring preload (if available and minimal) can fine-tune sag by a few millimeters, but significant adjustments indicate the wrong spring rate.

Key Factors That Affect MTB Spring Weight Results

While the calculator provides a strong recommendation, several real-world factors can influence the ideal MTB spring weight for your setup. Understanding these will help you fine-tune your suspension further.

  1. Riding Style & Aggressiveness: As factored into the calculator, aggressive riders hitting jumps, drops, and rough terrain often benefit from slightly less sag (stiffer spring) to prevent bottoming out and maintain support. Smooth, less aggressive riders might opt for slightly more sag (softer spring) for increased plushness and traction on smaller bumps.
  2. Suspension Leverage Ratio: This is a crucial, often overlooked factor. A high leverage ratio (e.g., 3.0+) means the wheel travels further than the shock compresses, making the suspension feel more progressive and potentially requiring a softer spring for the same sag. A low leverage ratio (e.g., 2.0) means the shock compresses more relative to wheel travel, requiring a stiffer spring. The calculator approximates this using the input ratio.
  3. Shock Spring Bottom-Out Resistance (Volume Spacers/Air Bands): While coil springs don't have air volume spacers like air shocks, some high-end coil shocks offer adjustable bottom-out resistance. If your shock ramps up significantly near the end of its travel, you might be able to run slightly less spring rate without fear of harsh bottom-outs. Conversely, a linear spring curve might necessitate a stiffer spring.
  4. Tire Pressure and Casing: Tire pressure and the casing's construction (e.g., EXO, DoubleDown, Super Gravity) act as the first line of suspension. Lower tire pressures and softer casings can feel more compliant, potentially allowing for a slightly stiffer main spring to compensate for the tire's absorption. Higher pressures and stiffer casings transmit more impact, which might make a slightly softer spring feel more beneficial.
  5. Bike Geometry & Kinematics: Different bike designs (e.g., Horst Link, VPP, Single Pivot) have unique leverage curves. Some are more progressive (stiffen as they compress), while others are more linear. A highly progressive bike might handle a slightly softer spring better, relying on the bike's inherent ramp-up for bottom-out resistance. A linear bike will rely more heavily on the spring rate itself.
  6. Tuning Preference (Plush vs. Firm): Ultimately, suspension feel is subjective. Some riders prefer a very plush ride that absorbs every bump, while others value a firmer, more responsive feel for pedaling efficiency and precise handling. Your personal preference will guide fine-tuning around the calculated MTB spring weight.
  7. Weight Distribution: While the calculator uses total weight, how that weight is distributed can matter. A rider carrying a heavy backpack might find the rear suspension compresses more than expected, potentially requiring a slightly stiffer spring.

Frequently Asked Questions (FAQ)

How do I find my shock stroke and rear wheel travel?

Check your bike manufacturer's website or owner's manual for the exact rear wheel travel. The shock stroke is a physical measurement of the shock absorber itself. You can often find this in the shock's specifications or by measuring the stanchion tube (the shiny sliding part) length when the shock is fully extended, or by marking the shaft with zip ties and measuring travel during a ride.

What is the difference between wheel travel and shock stroke?

Rear wheel travel is the total vertical distance the rear wheel can move. Shock stroke is the total travel distance of the shock absorber itself. Due to the leverage ratio of the suspension linkage, the wheel travel is typically greater than the shock stroke.

How often should I replace my coil spring?

Coil springs don't typically "wear out" in the same way other components do. They can, however, develop fatigue over many years or if subjected to extreme stress. Visually inspect for cracks or damage. Replacement is usually due to needing a different rate (tuning) rather than wear.

Can I use a spring from a different brand?

Yes, but only if it matches the dimensions (length, diameter) and mounting hardware of your specific shock. Many aftermarket springs (like those from Fox, RockShox, DVO, Cane Creek, EXT) are designed to fit multiple shock models, but always verify compatibility.

What if my calculated spring rate isn't available?

Springs are often sold in increments (e.g., 50 lbs/in). If your calculation falls between two available rates, it's generally recommended to choose the rate that provides slightly less sag (the stiffer one) for better support, especially if you're an aggressive rider. You can then fine-tune with preload if your shock allows minimal adjustment.

How does gear weight affect my spring choice?

Your riding gear (helmet, pads, backpack with water/tools) can add significant weight. It's crucial to include this in your "Rider Weight" input for the most accurate MTB spring weight calculation. If you ride with vastly different gear setups, you might consider having two springs or adjusting your setup based on the heaviest configuration.

Is sag percentage the same for forks and shocks?

Not necessarily. While the principle is the same, recommended sag percentages can differ between forks and rear shocks, and also between different bike disciplines. XC riders often run less sag on both, while DH/Enduro riders might run more sag on the rear shock for compliance. Always check manufacturer recommendations for your specific bike model.

What does the lever ratio do?

The lever ratio describes how the suspension linkage amplifies the shock's movement relative to the wheel's movement. A higher ratio means the shock compresses more for a given amount of wheel travel, making the suspension feel more sensitive to small bumps but potentially less supportive. A lower ratio makes the shock compress less, requiring a stiffer spring but offering more support and resistance to bottoming.

Related Tools and Internal Resources

© 2023 Your Website Name. All rights reserved.

Disclaimer: This calculator provides an estimate. Always consult your bike manufacturer's recommendations and consider professional advice for optimal suspension tuning.

// Function to validate numeric input function validateInput(id, min, max, errorElementId, helperTextId) { var input = document.getElementById(id); var errorElement = document.getElementById(errorElementId); var value = parseFloat(input.value); if (isNaN(value) || value max) { // errorElement.textContent = "Value exceeds maximum limit."; // errorElement.style.display = 'block'; // input.style.borderColor = '#dc3545'; // return false; // } errorElement.textContent = ""; errorElement.style.display = 'none'; input.style.borderColor = '#ced4da'; // Default border color return true; } // Function to update chart data function updateChart() { var canvas = document.getElementById('springForceChart'); var ctx = canvas.getContext('2d'); var riderWeight = parseFloat(document.getElementById('riderWeight').value) || 75; var bikeWeight = parseFloat(document.getElementById('bikeWeight').value) || 15; var shockStroke = parseFloat(document.getElementById('shockStroke').value) || 65; var ridingStyleRatio = parseFloat(document.getElementById('ridingStyle').value); var leverRatio = parseFloat(document.getElementById('leverRatio').value) || 2.5; var totalWeight = riderWeight + bikeWeight; var totalForce = totalWeight * 9.81; // Force in Newtons var chartData = []; var maxSagPercentage = 0.35; // Max sag to plot (35%) var minSagPercentage = 0.0; // Min sag to plot (0%) var step = 0.01; // Increment for plotting // Determine the sag ratio based on riding style for plotting range var plotSagRatioStart = 0.0; // Start plotting from 0 sag var plotSagRatioEnd = 0.35; // Plot up to 35% sag var plotStep = 0.05; // Plotting increments // Generate data points for the chart for (var sagRatio = plotSagRatioStart; sagRatio <= plotSagRatioEnd; sagRatio += plotStep) { // Calculate sag in mm on the shock for this ratio var sagMm = shockStroke * sagRatio; if (sagMm maxRateNmm) { maxRateNmm = data.requiredRateNmm; } }); // Add some buffer to maxRateNmm for better visualization maxRateNmm *= 1.1; // Draw Axes ctx.strokeStyle = '#ccc'; ctx.lineWidth = 1; // Y-axis (Spring Rate N/mm) ctx.beginPath(); ctx.moveTo(padding, padding); ctx.lineTo(padding, chartHeight – padding); ctx.stroke(); // X-axis (Sag %) ctx.beginPath(); ctx.moveTo(padding, chartHeight – padding); ctx.lineTo(chartWidth – padding, chartHeight – padding); ctx.stroke(); // Draw Y-axis labels and ticks ctx.fillStyle = '#666'; ctx.textAlign = 'right'; ctx.font = '12px Segoe UI'; var numYTicks = 5; for (var i = 0; i <= numYTicks; i++) { var yPos = chartHeight – padding – (i / numYTicks) * chartAreaHeight; var rateValue = (maxRateNmm * (numYTicks – i)) / numYTicks; ctx.fillText(rateValue.toFixed(0), padding – 5, yPos + 5); ctx.beginPath(); ctx.moveTo(padding – 3, yPos); ctx.lineTo(padding, yPos); ctx.stroke(); } // Draw X-axis labels and ticks ctx.textAlign = 'center'; for (var i = 0; i 0) { var targetSagPercentage = parseFloat(document.getElementById('sagPercentage').textContent) / 100; var targetXPos = padding + (targetSagPercentage / plotSagRatioEnd) * chartAreaWidth; var targetYPos = chartHeight – padding – (calculatedRateNmm / maxRateNmm) * chartAreaHeight; // Draw vertical line for target sag ctx.beginPath(); ctx.moveTo(targetXPos, chartHeight – padding); ctx.lineTo(targetXPos, padding); ctx.setLineDash([5, 5]); ctx.strokeStyle = '#6c757d'; ctx.lineWidth = 1.5; ctx.stroke(); ctx.setLineDash([]); // Reset line dash // Draw horizontal line for target rate ctx.beginPath(); ctx.moveTo(padding, targetYPos); ctx.lineTo(chartWidth – padding, targetYPos); ctx.setLineDash([5, 5]); ctx.strokeStyle = '#6c757d'; ctx.lineWidth = 1.5; ctx.stroke(); ctx.setLineDash([]); // Reset line dash // Add a point marker at the target intersection ctx.fillStyle = 'red'; ctx.beginPath(); ctx.arc(targetXPos, targetYPos, 5, 0, Math.PI * 2); ctx.fill(); } // Draw Legend ctx.fillStyle = '#333'; ctx.textAlign = 'left'; ctx.font = '14px Segoe UI'; // Data Line ctx.fillStyle = 'var(–primary-color)'; ctx.fillRect(padding + 5, padding + 5, 15, 10); ctx.fillStyle = '#333'; ctx.fillText('Required Rate vs. Sag', padding + 25, padding + 15); // Target Line ctx.fillStyle = '#6c757d'; ctx.fillRect(padding + 5, padding + 25, 15, 10); ctx.fillStyle = '#333'; ctx.fillText('Your Target Point', padding + 25, padding + 35); } // Function to populate the spring weight table function populateSpringWeightTable() { var tbody = document.getElementById('springWeightTbody'); tbody.innerHTML = "; // Clear existing rows var riderWeightBase = 75; // Base rider weight for reference var bikeWeightBase = 15; // Base bike weight for reference var shockStrokeBase = 65; // Base shock stroke for reference var leverRatioBase = 2.5; // Base lever ratio var ridingStyleBase = 0.025; // Base sag ratio (Trail/Enduro) var totalWeightBase = riderWeightBase + bikeWeightBase; var forceBase = totalWeightBase * 9.81; var sagMmBase = shockStrokeBase * ridingStyleBase; var springRateNmmBase = forceBase / sagMmBase; var baseLbsIn = springRateNmmBase * 5.71; // Define increments for rider weight var weightIncrements = [-20, -10, 0, 10, 20]; // kg difference from base for (var i = 0; i < weightIncrements.length; i++) { var weightDiff = weightIncrements[i]; var currentRiderWeight = riderWeightBase + weightDiff; var currentTotalWeight = currentRiderWeight + bikeWeightBase; var currentForce = currentTotalWeight * 9.81; // Calculate N/mm assuming base shock stroke and sag ratio for comparison var currentSpringRateNmm = currentForce / sagMmBase; var currentLbsIn = currentSpringRateNmm * 5.71; var row = tbody.insertRow(); row.insertCell(0).textContent = currentLbsIn.toFixed(0); row.insertCell(1).textContent = currentSpringRateNmm.toFixed(1); row.insertCell(2).textContent = currentRiderWeight.toFixed(0); } // Add a row for aggressive rider (higher sag) var aggressiveRiderWeight = 85; // Example var aggressiveSagRatio = 0.05; var aggressiveTotalWeight = aggressiveRiderWeight + bikeWeightBase; var aggressiveForce = aggressiveTotalWeight * 9.81; var aggressiveSagMm = shockStrokeBase * aggressiveSagRatio; var aggressiveSpringRateNmm = aggressiveForce / aggressiveSagMm; var aggressiveLbsIn = aggressiveSpringRateNmm * 5.71; var row = tbody.insertRow(); row.insertCell(0).textContent = aggressiveLbsIn.toFixed(0); row.insertCell(1).textContent = aggressiveSpringRateNmm.toFixed(1); row.insertCell(2).textContent = aggressiveRiderWeight.toFixed(0) + " (Aggressive)"; // Add a row for XC rider (lower sag) var xcRiderWeight = 60; // Example var xcSagRatio = 0.015; // Assuming ~15% sag of shock stroke var xcTotalWeight = xcRiderWeight + bikeWeightBase; var xcForce = xcTotalWeight * 9.81; var xcSagMm = shockStrokeBase * xcSagRatio; var xcSpringRateNmm = xcForce / xcSagMm; var xcLbsIn = xcSpringRateNmm * 5.71; var row = tbody.insertRow(); row.insertCell(0).textContent = xcLbsIn.toFixed(0); row.insertCell(1).textContent = xcSpringRateNmm.toFixed(1); row.insertCell(2).textContent = xcRiderWeight.toFixed(0) + " (XC)"; } // Main calculation function function calculateSpringWeight() { var inputsValid = true; inputsValid = validateInput('riderWeight', 1, null, 'riderWeightError') && inputsValid; inputsValid = validateInput('bikeWeight', 1, null, 'bikeWeightError') && inputsValid; inputsValid = validateInput('shockStroke', 1, null, 'shockStrokeError') && inputsValid; inputsValid = validateInput('wheelTravel', 1, null, 'wheelTravelError') && inputsValid; if (!inputsValid) { document.getElementById('results').style.display = 'none'; return; } var riderWeight = parseFloat(document.getElementById('riderWeight').value); var bikeWeight = parseFloat(document.getElementById('bikeWeight').value); var shockStroke = parseFloat(document.getElementById('shockStroke').value); var wheelTravel = parseFloat(document.getElementById('wheelTravel').value); // Not directly used in core calc but good context var leverRatio = parseFloat(document.getElementById('leverRatio').value); var ridingStyle = parseFloat(document.getElementById('ridingStyle').value); // This is the sag ratio for the shock stroke var totalWeight = riderWeight + bikeWeight; // kg var totalForce = totalWeight * 9.81; // Newtons // Calculate target sag displacement in mm on the shock // The 'ridingStyle' value directly represents the desired sag as a fraction of the shock stroke. var targetSagMm = shockStroke * ridingStyle; // Handle edge case where targetSagMm is zero or very close to zero (e.g., XC setting) // We need a minimum sag to avoid division by zero and unrealistic spring rates. // Let's assume a minimum effective sag of ~5mm if ridingStyle is 0 or very small. var effectiveSagMm = targetSagMm; if (effectiveSagMm <= 1) { // Use a small threshold, adjust if needed // Fallback for XC / minimal sag: use a slightly larger portion of the shock stroke // This logic might need tuning based on desired outcome for '0' value. // For now, let's assume '0' riding style implies ~15-20% of wheel travel sag, // translated back to shock sag via ratio. Or, simply use a minimum shock sag. // Let's try a minimum shock sag of 5mm for "less sag" settings. effectiveSagMm = Math.max(5, shockStroke * 0.15); // Ensure at least 5mm or 15% of stroke } // Ensure we don't divide by zero if (effectiveSagMm <= 0) { effectiveSagMm = 1; // Prevent division by zero, though validation should catch this } var springRateNmm = totalForce / effectiveSagMm; var springRateLbsIn = springRateNmm * 5.71; // Conversion factor var calculatedSagPercentage = (effectiveSagMm / shockStroke) * 100; // Update results display document.getElementById('mainResult').textContent = springRateLbsIn.toFixed(0); document.getElementById('sagPercentage').textContent = calculatedSagPercentage.toFixed(1); document.getElementById('forceRequired').textContent = totalForce.toFixed(0); document.getElementById('springRateNmm').textContent = springRateNmm.toFixed(1); // Store for chart reference document.getElementById('results').style.display = 'block'; // Update the chart updateChart(); } // Function to reset calculator to default values function resetCalculator() { document.getElementById('riderWeight').value = '75'; document.getElementById('bikeWeight').value = '15'; document.getElementById('shockStroke').value = '65'; document.getElementById('wheelTravel').value = '160'; document.getElementById('leverRatio').value = '2.5'; document.getElementById('ridingStyle').value = '0.025'; // Default to Trail/Enduro // Clear errors document.getElementById('riderWeightError').textContent = ""; document.getElementById('riderWeightError').style.display = 'none'; document.getElementById('bikeWeightError').textContent = ""; document.getElementById('bikeWeightError').style.display = 'none'; document.getElementById('shockStrokeError').textContent = ""; document.getElementById('shockStrokeError').style.display = 'none'; document.getElementById('wheelTravelError').textContent = ""; document.getElementById('wheelTravelError').style.display = 'none'; // Reset input borders document.getElementById('riderWeight').style.borderColor = '#ced4da'; document.getElementById('bikeWeight').style.borderColor = '#ced4da'; document.getElementById('shockStroke').style.borderColor = '#ced4da'; document.getElementById('wheelTravel').style.borderColor = '#ced4da'; // Recalculate and update results calculateSpringWeight(); document.getElementById('results').style.display = 'block'; // Ensure results are visible after reset } // Function to copy results to clipboard function copyResults() { var mainResult = document.getElementById('mainResult').textContent; var sag = document.getElementById('sagPercentage').textContent; var force = document.getElementById('forceRequired').textContent; var rateNmm = document.getElementById('springRateNmm').textContent; // Assumptions var riderWeight = document.getElementById('riderWeight').value; var bikeWeight = document.getElementById('bikeWeight').value; var shockStroke = document.getElementById('shockStroke').value; var wheelTravel = document.getElementById('wheelTravel').value; var leverRatio = document.getElementById('leverRatio').options[document.getElementById('leverRatio').selectedIndex].text; var ridingStyle = document.getElementById('ridingStyle').options[document.getElementById('ridingStyle').selectedIndex].text; var resultsText = "— MTB Spring Weight Calculation Results —\n\n"; resultsText += "Recommended Spring Rate: " + mainResult + " lbs/in\n"; resultsText += "Target Sag: " + sag + "%\n"; resultsText += "Force at Sag: " + force + " N\n"; resultsText += "Required Spring Rate: " + rateNmm + " N/mm\n\n"; resultsText += "— Key Assumptions —\n"; resultsText += "Rider Weight (with gear): " + riderWeight + " kg\n"; resultsText += "Bike Weight: " + bikeWeight + " kg\n"; resultsText += "Shock Stroke: " + shockStroke + " mm\n"; resultsText += "Rear Wheel Travel: " + wheelTravel + " mm\n"; resultsText += "Lever Ratio: " + leverRatio + "\n"; resultsText += "Riding Style / Sag Preference: " + ridingStyle + "\n"; navigator.clipboard.writeText(resultsText).then(function() { var feedback = document.getElementById('copyFeedback'); feedback.style.opacity = '1'; setTimeout(function() { feedback.style.opacity = '0'; }, 2000); }).catch(function(err) { console.error('Could not copy text: ', err); alert('Failed to copy results. Please copy manually.'); }); } // Initial calculation and chart draw on page load document.addEventListener('DOMContentLoaded', function() { // Set canvas size dynamically based on container var canvas = document.getElementById('springForceChart'); var container = canvas.parentElement; canvas.width = container.offsetWidth * 0.95; // Adjust multiplier as needed canvas.height = container.offsetWidth * 0.95 * 0.5; // Maintain aspect ratio populateSpringWeightTable(); calculateSpringWeight(); // Perform initial calculation updateChart(); // Draw initial chart }); // Update chart on window resize window.addEventListener('resize', function() { var canvas = document.getElementById('springForceChart'); var container = canvas.parentElement; canvas.width = container.offsetWidth * 0.95; // Adjust multiplier as needed canvas.height = container.offsetWidth * 0.95 * 0.5; // Maintain aspect ratio updateChart(); });

Leave a Comment