What "Pixel-Perfect" Really Means (and How to Check Your Developer Delivered It)
"Pixel-perfect" is on almost every web developer's website. It sounds precise. In practice, it is one of the most loosely used promises in the industry, and it is the reason so many designers feel a quiet disappointment when they open the staging link.
Let us define it properly, then give you a simple way to check it yourself.
What pixel-perfect should mean
A pixel-perfect build matches the design in everything a visitor can notice:
- Spacing: padding, margins and gaps match the file.
- Typography: same fonts, sizes, weights, line heights and letter spacing.
- Colour: exact values, including hover and focus states.
- Layout: alignment, widths and the grid behave as designed at each breakpoint.
- Components: buttons, cards and forms look and behave the same everywhere.
- Images: the same crops, aspect ratios and focal points as the design.
What it should not mean
A website is not a static picture. Browsers render fonts slightly differently, screens come in hundreds of widths, and real content is longer or shorter than the mock-up. Pixel-perfect means faithful to the design system at the sizes you designed, and sensible in between, not identical to a screenshot at every possible width.
A tolerance table you can agree on
Most arguments about pixel-perfect come from never agreeing what "matches" means. Settle it before the build with something like this:
| Element | Should match exactly | Small differences are fine |
|---|---|---|
| Colours | Hex values, plus hover, focus and pressed states | None |
| Fonts | Family and every weight used | Slight rendering differences between Windows, Mac and phones |
| Type sizes and line heights | At each designed breakpoint | Fluid sizes between breakpoints |
| Spacing | Section padding, gaps and margins at designed widths | Proportional scaling between widths |
| Images | Crop, aspect ratio and focal point | Compression for speed, as long as nothing looks blurry |
| Layout | Alignment and grid at each breakpoint | Wrapping when real content is longer than the mock-up |
Once both sides have signed off on a table like this, the review stops being a matter of taste.
The five-minute check
- Open the Figma frame and the live page side by side at the same width (for example 1440px, then 390px for mobile).
- Check the type first. Headline sizes and line heights are where builds drift most.
- Measure three gaps with your browser's inspector: section padding, card spacing, and the space under the main headline.
- Hover everything. Buttons, links, cards. Missing states are the most common shortcut.
- Resize slowly from desktop to phone. Watch for text overlapping, images squashing or content touching the screen edge.
If those five checks pass, you have a genuinely faithful build.
Which widths to check
You cannot test every screen size, and you do not need to. Check the widths you designed, then a few common ones in between, where layouts tend to break:
- 1440px: a typical laptop or desktop design width.
- 1280px: smaller laptops, where wide layouts often start to feel cramped.
- 1024px and 768px: tablets in landscape and portrait, the widths most often forgotten.
- 390px: a common modern phone width.
- 360px: many Android phones. If text fits here, it fits almost anywhere.
Drag the browser window slowly between them as well. Problems usually appear just before a breakpoint, not exactly on it.
A deeper check before you sign off
The five-minute check catches most problems. Before you approve the launch, spend another half hour on the things that only show up with real use:
- Real content. Paste the longest headline or product name you expect into a card. Does it wrap cleanly, or break the layout?
- Forms. Submit each form with a mistake in it. Error messages should be styled as designed, not left as browser defaults.
- Keyboard. Press Tab through the page. Every link and button should show a visible focus state.
- Image crops on phones. A face cut off at the top of a hero image is a common miss.
- Menus. Open and close the mobile menu, and check every dropdown on desktop.
- Edge states. A blog list with a single post, an empty collection, the 404 page.
- Real phones. One iPhone and one Android, on mobile data, not just office Wi-Fi.
Why builds drift
- No shared design system, so every section is styled by eye.
- Missing mobile frames, so the developer improvises.
- Rushed QA on a resized desktop browser instead of real phones.
- Font files loaded without every weight, so the browser fakes the bold.
- Content changed after sign-off, without the design being updated to match.
Want to remove most of these before they happen? Use our Figma handoff checklist.
Tools that make checking easier
- Your browser's inspector (right-click, Inspect) shows exact font sizes, colours and spacing for any element.
- The device toolbar in the inspector previews common phone sizes, though nothing replaces a real phone.
- Overlay extensions place your Figma export on top of the live page at partial transparency, so misalignments jump out instantly.
- Figma's Dev Mode shows the exact values your developer should have used.
How to report differences so they get fixed
"It does not look right" is hard to act on. Reports that get fixed quickly have the same four parts:
- Where: the page, the section and the screen width.
- What you see: a screenshot of the live page.
- What you expected: a screenshot of, or link to, the Figma frame.
- The value, if you know it: for example, "heading should be 48px, it is 40px".
Keep every issue in one shared list rather than scattered chat messages, and send it as one round. Your developer can then fix everything in a single pass instead of chasing messages for a week.
Where flexibility is smart
Pixel-perfect is about respecting the design, not freezing it. A good developer will sometimes suggest small changes, and you should welcome them when they serve the visitor:
- Increasing a tap target so it is at least 44px on phones.
- Darkening a light grey text colour that fails readability contrast.
- Letting a long headline wrap gracefully instead of shrinking the font.
- Replacing a heavy effect that would make the page slow on mid-range phones.
The key is that changes are proposed and agreed, never made silently.
Write pixel-perfect into the brief
Put it in writing before the build starts: which breakpoints will be checked, on which devices, and how fixes are handled after launch. A clear definition protects both sides and turns a vague promise into a checklist.
Our promise, in writing
Every Figma to Webflow, Figma to WordPress and Figma to Shopify build is checked side by side with your file at each breakpoint before launch. You get 30 days of care after launch, so if anything does not match, we fix it. You own the site, the files and the logins.
Frequently asked questions
Is pixel-perfect the same as responsive?
No. Pixel-perfect is about matching the design at the sizes you designed. Responsive is about how the page behaves at every size in between. A good build needs both: faithful at your breakpoints, and sensible everywhere else.
Do I need mobile frames in Figma for a pixel-perfect build?
It helps a lot. Without a mobile frame, the developer has to decide how every section stacks on a phone. If you only have desktop frames, ask how they will adapt them, and ask to see the mobile version before launch.
Why do fonts look slightly different on the live site?
Browsers and operating systems draw text in slightly different ways, so the same font can look a touch heavier on a Mac than on Windows. Sizes, weights and line heights should still match the file. If a weight looks clearly wrong, check that the right font files were loaded.
How many rounds of fixes should a build need?
One consolidated round is usually enough when the file is clean and the developer checks side by side before sending the link. If you are on a third or fourth round of spacing fixes, the build probably was not checked against the design in the first place.
Can I check a build without knowing code?
Yes. The browser inspector shows sizes and colours when you click an element, and an overlay extension lays your design over the page. The five-minute check above needs no code at all.