Weight Axis
The weight axis is the workhorse of variable fonts. It lets you vary the thickness of characters from ultralight to extrabold inside a single file using the wght tag in the OpenType format. You control it with the standard CSS font-weight property where values like 350 or 723 are valid and the browser calculates the precise glyph shapes at render time by interpolating between the defined masters. This eliminates the need for separate static font files for each weight cutting the number of network requests from five down to one in most cases. A typical implementation sees a variable font with weight axis land at 140 kilobytes after subsetting while the equivalent static set of Regular Medium Semibold Bold and Black might total 280 kilobytes across five files. Popular fonts like Inter offer a full 100 to 900 range making it a reliable choice for both UI and editorial work. Roboto Flex goes even wider to 1000 for those rare cases where you need an ultra condensed black. The axis data itself adds size to the file but that cost disappears once you stop loading multiple static cuts. Teams that audit the axis range before writing CSS avoid the silent clamping that happens when you request 800 from a font that only goes to 700. Vercel proved this in their 2024 Geist rollout where one subsetted file handled every interface weight and cut their font payload by 40 percent compared to their previous static setup.
The weight axis is not a cure all for typography problems. It is not automatically smaller than static fonts and it is not the correct choice when your design only calls for two weights. Two static files at 35 kilobytes each will always outperform one 150 kilobyte variable font in first paint time and overall payload. The axis is not an invitation to skip best practices like subsetting with pyftsubset or setting up proper fallbacks with size-adjust. It is not the same as using font-bold in a design tool because the variable version interpolates smoothly while static snaps to the closest cut. Many product teams in 2023 learned this the hard way when they dropped a full variable font on their marketing site without trimming unused glyphs and watched their LCP jump from 1.2 seconds to 2.8 seconds. The axis does not fix fonts that were not designed for variable use. Afterthought axes in some typefaces deliver poor interpolation with ugly steps at certain values so you must test at your actual sizes and not trust the foundry specimen.
Concrete examples prove the point. GitHub shipped Mona Sans as a variable font in 2022 with a strong weight axis that covered their entire UI from 400 in body text to 700 in headings. They subsetted aggressively for Latin only keeping the file at 108 kilobytes and used font-variation-settings only for fine tuning in marketing pages. The result was smooth hover transitions on their octocat logo and navigation that would have required two separate static fonts otherwise. Linear followed suit in their 2024 interface by implementing Inter variable strictly within the 500 to 600 range for optimal readability in their dense tables and menus. Their scroll driven hero headings increase weight from 400 to 700 based on scroll position using a JavaScript listener mapped to the axis delivering a sophisticated effect that static fonts could never match. The New York Times custom variable serif for their 2023 site redesign combined the weight axis with optical size to let article titles shift from light to bold as users scrolled without any layout disruption. Apple Music leverages the weight axis in their variable San Francisco font for the web player where playlist titles animate from 500 to 900 on selection creating clear feedback with zero additional file size. Figma uses it across their variable Inter for every canvas element from small labels at 450 to bold components at 700 proving the axis scales from product UI to design tool with the right subsetting strategy in place.
Activate the weight axis when your design system specifies three or more weights or when your interactions call for animated transitions between thicknesses. It delivers the biggest win on editorial sites where headlines compress and expand with viewport changes or on product interfaces that benefit from subtle hover lifts. Pair it with preload links in the head and font-display swap to prevent jank and always generate metric matched fallbacks using tools like Fontaine or Next.js font provider. The axis shines when combined with a token system that maps design values directly to axis numbers so Figma 600 becomes CSS 600 with no translation layer. Avoid the weight axis on minimal sites that use only Regular and one bold cut because the byte savings never materialize and you will ship slower experiences. Do not use it without verifying the exact min and max values in the font because mismatched CSS will produce clamped results that break your animations and look inconsistent across browsers. Skip full range declarations if you only need 400 to 700 and use axis range subsetting tools to trim the unused data for even smaller files. Test every implementation on slow 3G with DevTools open because a weight axis that works in the design file can still cause CLS if your fallback metrics are off by even 3 percent.
The weight axis pays its way the moment you need more than two cuts or any animation but it becomes expensive theater the second you use it on a project that would have been faster with static files.
Read the full guide
Related terms
Keep exploring
Variable font
A font file that exposes one or more axes (weight, width, slant, optical size, or custom) that can shift at runtime without loading additional files.
Static Font
A static font is a single-weight font file with fixed outlines and no axes. You need a separate file for every weight, width, or style you intend to use.
Font Variation Settings
Font variation settings is the CSS property that controls specific values along each axis of a variable font at runtime. Instead of hoping font-weight lands on the right stop you set exact numbers for wght wdth opsz or any custom axis the designer exposed.
Font Subsetting
Font subsetting trims a font file to only the exact glyphs, language ranges, and variable axes your project uses. It turns a 580 KB Recursive variable monster into a focused 140 KB file that still interpolates across every weight, slant, and custom axis you actually declare in CSS.