Figma to Webflow

How to Keep Fonts and Type Scale Consistent from Figma to Webflow

TS Talha Shahzad··8 min read
The short version
  • Self-host or properly link the exact same font files used in the Figma design.
  • Line-height in px vs percentage renders differently, so convert carefully.
  • Letter-spacing units differ between Figma and CSS, requiring manual translation.
  • Set up a type scale using Webflow variables to maintain consistency site-wide.
  • Browser font smoothing differs from Figma's preview, so always verify in-browser.

If your fonts look different in the browser than they do in Figma, you are not imagining it. Figma and web browsers render text differently, and the gaps show up in weight, spacing, line height, and overall rhythm. The heading that looked perfect in the design file appears slightly bolder, slightly tighter, or slightly off in the live site.

This is one of the most common issues I deal with on Figma to Webflow projects. It is fixable, but only if you understand where the differences come from and address each one deliberately. Here is the full breakdown.

The font file problem

The most common cause of type drift is not a rendering difference. It is a font file mismatch. The designer used one version of the font in Figma, and a different version loads in the browser.

This happens more often than you would expect:

  • The designer uses a locally installed font that includes OpenType features or specific hinting that the web version lacks.
  • The Webflow project loads the font from Google Fonts, but the Google Fonts version has fewer weights or slightly different metrics than the file the designer used.
  • The designer used a variable font in Figma, but the web version is a set of static weight files, or vice versa.
  • The font name is the same but the foundry updated the font files, and the version in Figma is older or newer than the web version.

The fix: Get the exact font files the designer used. Ask for the .woff2 or .ttf files, not just the font name. Upload them to Webflow as custom fonts. This guarantees the browser loads the same glyphs, metrics, and hinting as the design tool.

If the project uses Google Fonts, verify that the Google Fonts version includes every weight and style used in the Figma file. Figma sometimes has access to weights like "Medium" or "SemiBold" that Google Fonts does not serve for that typeface. If a weight is missing, the browser substitutes the nearest available weight, and the result looks wrong.

Self-hosting versus Google Fonts

I recommend self-hosting for production sites. Here is why:

Performance. Self-hosted fonts load from the same domain as the site, which eliminates the DNS lookup, connection, and download overhead of reaching fonts.googleapis.com. This reduces render-blocking time and prevents the flash of unstyled text (FOUT) or invisible text (FOIT) that can happen with external font loading.

Consistency. When you self-host, you control the exact files. Google Fonts can update their files at any time, which in rare cases changes metrics slightly. Self-hosting locks the version.

Privacy. Loading fonts from Google sends visitor data to Google's servers. For sites in regulated industries or privacy-conscious markets, self-hosting avoids that concern.

In Webflow, self-hosting is straightforward. Go to the project's font settings, upload the .woff2 files, assign the font family name, and apply it to your text classes. It takes five minutes and eliminates a whole category of type inconsistency.

Line-height: the unit trap

Line-height is where most of the visual mismatch happens, and it is because Figma and CSS handle units differently.

Figma can show line-height in three ways:

  • Auto (Figma picks a value based on the font's built-in metrics)
  • Pixels (e.g., 32px)
  • Percentage (e.g., 150%)

CSS line-height works differently:

  • A pixel value (32px) is absolute and does not scale with font size changes.
  • A percentage (150%) is relative to the element's font size.
  • A unitless number (1.5) is relative to the font size and is inherited by child elements more predictably than percentage.

The problem shows up when a designer sets line-height in Figma as pixels and the developer enters it in Webflow as pixels. It looks correct at the design's exact font size, but breaks on responsive breakpoints where the font size changes. If the heading is 48px on desktop with 56px line height, and the heading scales to 32px on mobile, a 56px line height on 32px text creates a huge gap between lines.

The fix: Convert pixel line-height to a ratio or percentage.

  • Figma: 56px line height on 48px font = 56/48 = 1.167 ratio or approximately 117%
  • Webflow: Set line-height to 117% or 1.17 (unitless)

Now when the font size changes on mobile, the line height scales proportionally. The visual rhythm stays consistent across breakpoints.

I build this conversion into my design system setup. Every text class gets a proportional line-height from the start, so responsive adjustments do not require manual line-height overrides at every breakpoint.

Letter-spacing: the hidden conversion

Letter-spacing is another unit mismatch that causes subtle but visible differences.

Figma shows letter-spacing as a percentage of font size. A value of 2% means the tracking is 2% of whatever the font size is.

CSS uses em or px for letter-spacing. The em unit is relative to the font size, which makes it the natural equivalent of Figma's percentage.

Want a website that turns visitors into customers, not just compliments?

Book a 15-min intro

The conversion: Divide the Figma percentage by 100 to get the em value.

  • Figma: 2% = CSS: 0.02em
  • Figma: -1% = CSS: -0.01em
  • Figma: 5% = CSS: 0.05em

In Webflow, enter the letter-spacing value in em in the typography panel. If you enter it in pixels instead, it will not scale with font size changes, and the spacing will look wrong at different breakpoints.

A common mistake: Figma shows letter-spacing as 0% for most body text, which means "use the font's default tracking." In CSS, the equivalent is letter-spacing: normal or simply not setting a value. Setting it to 0em or 0px in Webflow is technically the same as normal, but it is worth knowing that not setting it is the correct default.

Setting up a type scale with variables

Instead of styling text ad hoc, build a type scale in Webflow using variables and classes that mirror the Figma file. Here is my approach:

1. List every text style from Figma. Most design systems have somewhere between 6 and 12 text styles. Write them all down with their properties: font family, weight, size, line height, and letter spacing.

2. Create Webflow variables for sizes. Text-Display: 64px, Text-H1: 48px, Text-H2: 36px, down through Text-Body: 16px and Text-Small: 14px. Use rem if you prefer (divide px by 16).

3. Build a class for each text style. Each class references the size variable and sets weight, line height (as percentage or unitless), and letter spacing (in em). This is your type system.

4. Set responsive overrides on the variables. At the tablet breakpoint, reduce display and H1 sizes. At mobile, reduce them further. Because every class references the variable, changing the variable value updates every instance of that text style across the site.

This approach keeps the type scale consistent and makes responsive adjustments efficient. It also gives you a single reference point to compare against the Figma file. If Figma says H2 is 36px with 130% line height and 0% letter spacing, you can verify those exact values in the Webflow variable and class.

Browser font rendering versus Figma preview

Even with identical font files, perfect line height, and correct letter spacing, text in the browser will look slightly different from Figma. This is because Figma and browsers use different rendering engines.

Subpixel antialiasing. Browsers on macOS use subpixel antialiasing by default, which can make text appear slightly heavier (bolder) than in Figma. The fix is adding this to your Webflow project's custom code in the head:

<style>
  * {
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
  }
</style>

This switches to grayscale antialiasing, which produces thinner, crisper text that more closely matches Figma's rendering. Most modern sites use this, and it is one of the first things I add to any Webflow project.

Windows rendering. Windows uses ClearType, which handles subpixel rendering differently from macOS. The same font on the same site can look noticeably different on a Mac versus a PC. There is no CSS fix that makes Windows and Mac rendering identical, but using well-hinted fonts (most professional typefaces are properly hinted) minimizes the gap.

Retina versus non-retina screens. Text looks sharper on high-DPI displays. If the designer works on a Retina MacBook and the client previews on a 1080p monitor, the text will look less crisp. This is not a bug, it is physics. Set expectations with the client that the design preview and the live site may look slightly different depending on their display.

The verification workflow

After building the type system in Webflow, I run a side-by-side comparison before moving to layout:

  1. Open the Figma file and the Webflow staging site next to each other.
  2. Compare each text style: heading sizes, body text, captions. Look at weight, size, spacing, and rhythm.
  3. Check the same text at desktop, tablet, and mobile widths.
  4. If something looks off, trace it back to the source: is it the font file, the line height, the letter spacing, or the rendering?
  5. Fix the root cause in the variable or class, not with a one-off override on an individual element.

This takes 15 to 20 minutes and catches most type issues before they compound into bigger problems across the full build.

The short version

Font inconsistency between Figma and Webflow comes from five sources: mismatched font files, line-height unit differences, letter-spacing conversion errors, missing type scale variables, and rendering engine differences. Fix each one deliberately, and the live site will match the design file closely enough that the client does not notice the gaps.

Skip any of them, and you will spend the review phase answering "why does this heading look different?" on every page. That is a conversation worth preventing.

Prefer to hire through Upwork?
Top Rated Plus, 100% Job Success, 450+ projects shipped. See the reviews and start a contract.
Hire me on Upwork

FAQ

Why does my font look bolder in the browser than in Figma?

Browser font rendering uses subpixel antialiasing by default, which can make text appear slightly heavier than Figma's preview. Applying -webkit-font-smoothing: antialiased in Webflow's custom code normalizes this. Different screens and operating systems also render fonts differently.

Should I use Google Fonts or self-host?

Self-hosting gives you more control and better performance. Google Fonts is convenient but adds a third-party dependency and can cause layout shifts. If you use Google Fonts, make sure Webflow loads the same weights and styles that appear in the Figma file.

How do I convert Figma's letter-spacing to CSS?

Figma shows letter-spacing as a percentage of font size. CSS uses em or px. To convert, divide the Figma percentage by 100 to get the em value. For example, Figma's 2% letter-spacing becomes 0.02em in CSS.

Why does my line-height look wrong in Webflow?

Figma can display line-height in pixels, percentages, or as auto. CSS line-height works differently depending on the unit. If Figma shows 32px line-height on 24px text, set Webflow to either 32px or 133%. Using a unitless value like 1.33 also works and scales better.

All posts
the next step is small

Want a site that does this for you?

15 minutes, no deck, no pressure. Worst case, you leave with a free plan.

keep reading

More notes