Why your site looks empty on a 2K monitor
3 min readCSSresponsiveTailwind
The layout is drawn at 1440, but screens come at 2560 and 3440. How to make a site scale as a whole instead of just stretching its margins - and why that need not break accessibility.
Open almost any modern landing page on a 2560px monitor. You will most likely see exactly what you saw on a laptop, with enormous empty margins on both sides. The container hit its max-width and stopped; the screen did not.
This is not a mistake. It is how the standard approach works: fixed breakpoints and a container with a ceiling. The question is different - is that what you want to show a client who bought an expensive monitor.
What most people do, and why it is not enough
The usual answer is to add one more breakpoint and bump a few headings there. The trouble is that it bumps *a few*. Everything else stays: spacing, icons, borders, card heights. You get a page where the headline has grown and the button under it has not.
A different approach: one unit instead of breakpoints
If the layout is drawn at 1440, then every size in it is a fraction of 1440. Instead of recalculating them by hand at each breakpoint, you can declare one variable meaning “one pixel of the 1440 canvas” and express everything through it.
:root {
--u: max(1px, 0.06944vw);
}From there sizes are multiplications rather than pixels: 16px of text becomes calc(16 * var(--u)), a 24px gap becomes calc(24 * var(--u)). At 1440 everything matches the design exactly. At 2560 everything is 1.78 times larger together: type, spacing, icons, radii.
In Tailwind this happens in one place - the theme. Rewrite the spacing scale, the font sizes and the max-widths through that unit and every class you have already written becomes proportional, without touching a single component.
The main objection: what about accessibility
The standard complaint about vw sizing is that the reader cannot enlarge the text, while WCAG 1.4.4 requires enlargement up to 200%. And that is fair for plain vw.
This is exactly what the max(1px, …) is for. When someone presses Ctrl+, the browser shrinks the CSS viewport: 1440 at 200% becomes 720. That is below 1440, so the unit hits its floor and becomes exactly 1px - the text returns to its base size and is then rendered at the zoom factor. Zoom behaves precisely as it would on a fixed-pixel site.
The same floor solves a second problem: nothing shrinks below 1440. The unit equals a pixel there and the site behaves like an ordinary responsive layout with your usual breakpoints. The scaling only ever works upward.
Where it breaks
Honestly about the traps, because there are several and all of them are found the same way - by measuring, not by reading the code.
- Arbitrary values that bypass the theme. A class like text-[11px] written straight into a component knows nothing about the theme and stays 11px forever. Every one of them has to be found.
- SVG attributes. An icon with width="14" height="14" will not scale, because that is an attribute and not CSS. The size has to come from a class.
- Nested coordinate systems. If a block is already scaled by a transform, the unit inside it multiplies a second time and the content drifts away from its frame.
- Tailwind classes that are not in the scale. Writing py-18 when step 18 does not exist gives you no error - just silently no padding.
How to check that it worked
Not by eye. Open the page at 1440 and at 2560, read the computed font-size of the same elements and divide one by the other. It should be 1.78 for all of them - the headline, the navigation, the body copy. Where it is 1.00, you have found something that was missed.
Proportionality is a property the whole page either has or none of it does. Half the elements scaled looks worse than none of them.