Why Your Website Looks Different on Mobile (And How to Fix It)
You checked your website on your laptop and everything looked great. Then you pulled it up on your phone and it was a mess - text too small to read, images spilling off the edge, buttons stacked wrong.
This is one of the most common problems in web development. Here’s why it happens and what to do about it.
Reason 1: Missing or Wrong Viewport Meta Tag
The single most common cause of a desktop site rendering incorrectly on mobile is a missing viewport meta tag.
Without this tag in your <head>:
<meta name="viewport" content="width=device-width, initial-scale=1" />
Mobile browsers default to rendering the page at a virtual width of 980px (desktop width) and then scaling it down to fit the screen. Everything shrinks. Text becomes illegible. This is why older sites look “zoomed out” on mobile.
Fix: Add the viewport meta tag to every HTML page. This tells the browser to use the actual device width as the layout width.
Reason 2: Fixed Pixel Widths
CSS that sets elements to a fixed pixel width breaks on narrow screens:
.container {
width: 1200px; /* doesn't fit on a 390px-wide phone */
}
On mobile, the container overflows its parent, causing horizontal scrolling or clipping.
Fix: Replace fixed widths with relative units or max-width:
.container {
max-width: 1200px;
width: 100%;
}
The max-width approach lets the container fill available space on small screens but constrains it on large ones.
Reason 3: Images Without Max-Width
Images with no width constraints overflow their containers on mobile:
/* Missing: this causes images to overflow on narrow screens */
img {
max-width: 100%;
}
Many CSS resets or base stylesheets include this already, but if you’re working without one, you’ll hit this often.
Fix: Add max-width: 100%; height: auto; to all images globally. Most CSS frameworks (Bootstrap, Tailwind, MUI) include this by default.
Reason 4: Flexbox or Grid Without Responsive Breakpoints
Layouts built with flexbox or CSS grid often look correct on desktop but stack poorly on mobile:
.cards {
display: flex;
gap: 24px;
}
/* No breakpoint - all cards stay side-by-side on any screen width */
On a phone, three side-by-side cards might each be only 120px wide, making content illegible.
Fix: Add media queries to change the layout at smaller sizes:
.cards {
display: flex;
gap: 24px;
flex-wrap: wrap;
}
@media (max-width: 600px) {
.cards {
flex-direction: column;
}
}
Or use CSS Grid with auto-fit:
.cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 24px;
}
The minmax(280px, 1fr) approach automatically collapses to a single column when the container is too narrow.
Reason 5: Font Sizes Too Small on Mobile
Text that’s readable at desktop resolution can become microscopic on a small screen. This is sometimes caused by absolute font sizes defined in pixels with no mobile override.
Fix: Use responsive typography units:
body {
font-size: clamp(14px, 2.5vw, 18px);
}
Or define a mobile base font size at 16px (browsers’ default) and scale up for desktop:
body { font-size: 16px; }
@media (min-width: 768px) {
body { font-size: 18px; }
}
Avoid using font sizes below 16px for body text on mobile - many mobile browsers will zoom in automatically on inputs with smaller fonts, breaking the layout.
Reason 6: Touch Target Sizes Too Small
Buttons and links that work fine with a cursor can be nearly untappable with a finger. Apple’s Human Interface Guidelines recommend minimum tap targets of 44×44pt. Google recommends 48dp.
Fix: Add explicit padding to interactive elements on mobile:
button, a {
min-height: 44px;
padding: 12px 16px;
}
Also ensure there’s enough space between adjacent tap targets so accidental taps don’t trigger the wrong element.
Reason 7: CSS Position: Fixed Issues on iOS Safari
Fixed-position elements (sticky headers, bottom navbars, modal overlays) behave differently on iOS Safari, particularly when the on-screen keyboard appears. The keyboard pushing content up can cause fixed elements to jump or overlap content.
Fix: This is a known Safari quirk. The safest approach for modals is to use position: sticky where possible. For fixed bottom bars, test specifically on an actual iPhone with the keyboard open.
Reason 8: Safari-Specific CSS Differences
Safari - especially mobile Safari on iOS - has CSS rendering differences that Chrome and Firefox don’t. Examples:
gapin flexbox had bugs in older Safari versionsappearance: noneworks differently on Safari for inputs and selects- Safari may not support certain newer CSS features without
-webkit-prefixes
Fix: Test on a real iPhone, not just Chrome DevTools mobile emulation. DevTools emulates the viewport but doesn’t replicate Safari’s rendering engine.
How to Check What Your Site Actually Looks Like on Mobile
There are several ways to see your site on mobile:
- Chrome DevTools device emulation (
F12→ device toolbar) - fast, good for iteration - Your actual phone - exposes real-device rendering differences
- MockupSnap - paste your live URL and get screenshots at iPhone 15 Pro, iPad Air, MacBook, and 1080p desktop viewports, all inside device frames
MockupSnap is particularly useful for a quick visual sanity check: enter your URL, and within 30 seconds you can see exactly how your page renders at each major breakpoint in a real headless browser. If something looks wrong at the iPhone viewport, you’ll see it immediately.
The Debugging Workflow
When your site looks different on mobile, work through this checklist:
- Check the viewport meta tag - most common root cause
- Open Chrome DevTools → device toolbar → check at 375px width (small phone) and 768px (tablet)
- Look for horizontal overflow - if the page scrolls horizontally on mobile, there’s a fixed-width element causing it. In DevTools console:
document.querySelectorAll('*').forEach(el => { if (el.offsetWidth > document.body.offsetWidth) console.log(el) }) - Check images - are they all
max-width: 100%? - Test on a real device - especially Safari on iPhone
- Generate a screenshot with MockupSnap - useful for a final check before launch
Mobile rendering issues are almost always fixable. The key is to have a reliable way to see what mobile users actually see - DevTools emulation gets you most of the way there, but real-device testing catches Safari-specific bugs that emulation misses.