Why Is My Background Image Not Covering the Full Section?

Background image not covering full section problems usually happen when background-size:cover is missing, the section has no height, the background is applied to the wrong element, or a shorthand rule resets the background size.

Background Image Fix

Why is my background image not covering the full section?

A background image not covering full section can leave blank space, repeat as a tiny tile, stop halfway down the hero, or only cover the content area instead of the whole section. The fix usually comes down to four things: the section needs real height, the image needs background-size:cover, the background must be on the right element, and later CSS must not reset your background settings.

  • background-size
  • section height
  • background-position
  • mobile hero

What the bug looks like

The image repeats, leaves blank space, covers only the top, does not reach the bottom, or only covers a small inner block.

Why it happens

A background image covers the element it is applied to, not the section you imagined in the design.

What usually fixes it

Apply the background to the real section, give the section height, and use background-size:cover with safe position and repeat values.

Error 1

background-size:cover is missing

By default, a background image does not automatically stretch to cover the section. If the image is smaller than the section, it can repeat. If it is a different ratio, it may leave empty space unless you tell it how to fit.

Broken code

Natural size / repeat
.hero {
  background-image: url(hero.jpg);
  background-position: center;
}

Broken visual result

Image does not fill section
not covered
Hero section The background uses its natural size instead of covering the section.
The browser needs a sizing instruction. A background image does not automatically become a cover image.

Correct code

Cover the section
.hero {
  background-image: url(hero.jpg);
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
}

Fixed visual result

Image fills the section
covered
Hero section The image covers the full section without tiling.
cover fills the section, while no-repeat prevents tiling.
Error 2

The section has no real height

A background image only paints inside the element’s box. If the section has little content and no height or padding, the background may technically cover the section, but the section itself is too short.

Broken code

Short section
.hero {
  background-image: url(hero.jpg);
  background-size: cover;
  background-position: center;
}

Broken visual result

Background covers only a tiny area
section too short
Hero The element itself has little height.
The image may be covering the element correctly, but the element is not tall enough.

Correct code

Give section height
.hero {
  min-height: 70vh;
  padding: 96px 24px;
  background-image: url(hero.jpg);
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
}

Fixed visual result

Section has a real area
full section
Hero section The section has enough height for the background to cover.
Use min-height and padding to create the section area the image should cover.
Error 3

The background is applied to the wrong element

A common layout mistake is applying the background to an inner content wrapper instead of the full section. The image then covers only the wrapper, not the whole hero or section area.

Broken code

Background on inner wrapper
.hero {
  min-height: 70vh;
}

.hero-content {
  background-image: url(hero.jpg);
  background-size: cover;
}

Broken visual result

Only the inner block is covered
wrong element
Inner wrapper The background is not on the outer section.
A background only covers the element it is attached to.

Correct code

Background on section
.hero {
  min-height: 70vh;
  background-image: url(hero.jpg);
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
}

.hero-content {
  max-width: 720px;
}

Fixed visual result

The full section is covered
right element
Hero section The outer section owns the background.
Put the background on the element whose full area needs to be painted.
Error 4

A later background shorthand resets your cover settings

The background shorthand can reset multiple background properties. If you set background-size:cover first, then later use background:, your cover setting can disappear.

Broken code

Shorthand reset
.hero {
  background-image: url(hero.jpg);
  background-size: cover;
}

.hero.is-dark {
  background: linear-gradient(rgba(0,0,0,.5), rgba(0,0,0,.5)), url(hero.jpg);
}

Broken visual result

Cover got reset
reset
Hero section A later background shorthand changed the result.
A later shorthand can remove the cover behavior you thought was still active.

Correct code

Keep size after shorthand
.hero.is-dark {
  background:
    linear-gradient(rgba(0,0,0,.5), rgba(0,0,0,.5)),
    url(hero.jpg);
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
}

Fixed visual result

Cover restored
cover kept
Hero section The shorthand and cover settings work together.
After a background: shorthand, set background-size, position, and repeat again.
Premium pattern

A production-minded full-section background pattern

A reliable hero background pattern puts the image on the real section, creates a real section area, uses a layered overlay, and repeats the important background rules in one place.

Premium code

Full-section hero background
.hero {
  min-height: min(760px, 82vh);
  padding: clamp(72px, 10vw, 140px) 24px;
  display: grid;
  place-items: center;
  color: white;

  background:
    linear-gradient(rgba(15, 23, 42, .58), rgba(15, 23, 42, .58)),
    url("hero.jpg");
  background-size: cover;
  background-position: var(--hero-position, center);
  background-repeat: no-repeat;
}

@media (max-width: 640px) {
  .hero {
    min-height: 70vh;
    background-position: var(--hero-position-mobile, center);
  }
}

Premium visual result

Background covers the full section
premium
Premium hero Full-section background, overlay, height, and focal point all work together.
Premium background CSS does not guess. It defines the section size, image fit, overlay, and mobile position clearly.

Fast practical rule

If a background image is not covering the full section, inspect the section box first. Then set background-size:cover, background-position:center, background-repeat:no-repeat, and make sure no later background: shorthand resets those values.

Debug checklist

  • Inspect the section and confirm it has the height and width you expect.
  • Make sure the background image is applied to the outer section, not only an inner wrapper.
  • Set background-size:cover when the image should fill the whole section.
  • Set background-repeat:no-repeat to avoid tiling.
  • Use background-position to control the focal point.
  • Check whether a later background: shorthand reset your size, repeat, or position.
  • Avoid background-size:contain when the goal is full-section coverage.
  • Use mobile-specific background positions when the subject shifts on narrow screens.
Best first move Add a temporary border to the section. If the border is short, the section is short.
Most common cause background-size:cover is missing or got reset by a later shorthand.
Most sneaky cause The background is on the content wrapper, not the full-width section.
Better mindset Background images cover element boxes. Fix the box before blaming the image.

Final takeaway

A background image not covering full section is usually not an image problem. It is usually a section sizing, background sizing, wrong element, or CSS reset problem.

Put the background on the real section, give that section enough height, use background-size:cover, prevent repeat, and keep your background shorthand from resetting the important rules.

Want more fixes like this?

Browse more background image, responsive layout, and CSS debugging guides in the FrontFixer library.

Why Is My Image Cropped Wrong on Mobile?

Image cropped wrong on mobile problems usually happen when a desktop image is forced into a mobile container with object-fit:cover, a fixed height, the wrong object-position, or a background image with the wrong focal point.

Mobile Image Crop Fix

Why is my image cropped wrong on mobile?

An image cropped wrong on mobile can cut off a face, product, logo, headline area, or important detail. The image is not necessarily broken. The browser is usually doing exactly what the CSS asked: filling a narrow mobile box with cover. The fix is to control the image ratio, focal point, object position, and mobile crop rules instead of letting the browser guess.

  • object-fit
  • object-position
  • aspect-ratio
  • background-position

What the bug looks like

The subject disappears, a face is cut off, a product is too zoomed in, or only the wrong side of the image is visible.

Why it happens

The mobile container has a different shape than the image, so the browser crops the image to fill the box.

What usually fixes it

Use a better aspect ratio, adjust object-position, avoid tiny fixed heights, or provide a mobile-specific crop.

Error 1

object-fit:cover is cropping the wrong part

object-fit:cover is not bad. It is often the right choice for cards and hero images. But on mobile, a narrow container can crop the subject if the focal point stays in the wrong place.

Broken code

Default center crop
.hero-image {
  width: 100%;
  height: 220px;
  object-fit: cover;
  object-position: center center;
}

Broken visual result

Important area is cut
bad crop
Mobile hero

The crop fills the box but cuts away the focal point.

Cover fills the container, but the default center crop does not protect the subject.

Correct code

Control focal point
.hero-image {
  width: 100%;
  height: 220px;
  object-fit: cover;
  object-position: center 28%;
}

Fixed visual result

Subject stays visible
focal point
Mobile hero

The crop still fills the box, but the important area stays in view.

object-position tells the browser which part of the image should stay visible.
Error 2

The mobile image container is too short

A short fixed-height container makes the crop more aggressive. If the image has important vertical detail, a tiny mobile height can remove the top, bottom, or center of the subject.

Broken code

Fixed short height
@media (max-width: 640px) {
  .image-wrap {
    height: 120px;
    overflow: hidden;
  }

  .image-wrap img {
    width: 100%;
    height: 100%;
    object-fit: cover;
  }
}

Broken visual result

Container forces harsh crop
too short
Article card

The image box is too short for the visual content.

A short mobile container can crop too much even when the image width is responsive.

Correct code

Use aspect ratio
.image-wrap {
  aspect-ratio: 4 / 3;
  overflow: hidden;
}

.image-wrap img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

Fixed visual result

Crop has room
aspect ratio
Article card

The image keeps a consistent shape without being squeezed flat.

aspect-ratio is usually safer than a tiny fixed height for responsive images.
Error 3

background-size:cover uses the wrong background position

Background images have the same crop problem as normal images. If you use background-size:cover without adjusting background-position, mobile can show the wrong part of the image.

Broken code

Background centered blindly
.hero {
  background-image: url(hero.jpg);
  background-size: cover;
  background-position: center;
}

Broken visual result

Wrong part of background
wrong focus
Background hero

The background fills the section, but the subject is not where mobile needs it.

Background cover needs a mobile-aware focal point, not just center center.

Correct code

Mobile background focal point
.hero {
  background-image: url(hero.jpg);
  background-size: cover;
  background-position: center top;
}

@media (max-width: 640px) {
  .hero {
    background-position: 35% center;
  }
}

Fixed visual result

Background focuses correctly
positioned
Background hero

The mobile background position keeps the important part visible.

For background images, background-position is your focal point control.
Error 4

You need a mobile-specific crop, not just CSS positioning

Sometimes the desktop image is simply the wrong shape for mobile. If the important content is spread across a wide image, no amount of object-position will make every detail fit in a narrow crop.

Broken code

One image for every screen
<img
  class="hero-image"
  src="desktop-wide-image.jpg"
  alt="Product preview"
>

Broken visual result

Desktop crop does not translate
wrong source
Product image

The desktop composition is too wide for mobile.

One desktop image may not be enough when mobile needs a different composition.

Correct code

Use picture source
<picture>
  <source
    media="(max-width: 640px)"
    srcset="mobile-crop.jpg"
  >
  <img
    class="hero-image"
    src="desktop-wide-image.jpg"
    alt="Product preview"
  >
</picture>

Fixed visual result

Mobile gets the right crop
mobile source
Product image

The mobile version is composed for the mobile container.

<picture> lets you serve a mobile crop when CSS alone cannot protect the subject.
Premium pattern

A production-minded responsive image crop pattern

A reliable responsive image pattern controls the container ratio, image fitting behavior, focal point, and optional mobile source. It does not depend on one desktop crop magically working everywhere.

Premium code

Safe responsive image crop
<picture class="media">
  <source
    media="(max-width: 640px)"
    srcset="image-mobile.jpg"
  >
  <img
    class="media__image"
    src="image-desktop.jpg"
    alt="Descriptive image alt text"
  >
</picture>
.media {
  display: block;
  overflow: hidden;
  border-radius: 18px;
  aspect-ratio: 16 / 9;
}

.media__image {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: var(--image-focus, center);
}

@media (max-width: 640px) {
  .media {
    aspect-ratio: 4 / 3;
  }

  .media__image {
    object-position: var(--image-focus-mobile, center 30%);
  }
}

Premium visual result

Responsive crop with focal control
premium
Premium media block

The crop changes safely on mobile without losing the important subject.

Premium image CSS does not avoid cropping forever. It makes the crop intentional.

Fast practical rule

If an image is cropped wrong on mobile, do not remove object-fit:cover immediately. First adjust the container ratio and object-position. If the desktop composition still fails, use a mobile-specific crop with <picture>.

Debug checklist

  • Inspect the image container height, width, and aspect ratio on mobile.
  • Check whether the image uses object-fit:cover or a background with background-size:cover.
  • Adjust object-position to protect the image’s focal point.
  • For background images, adjust background-position at mobile breakpoints.
  • Replace tiny fixed heights with aspect-ratio where possible.
  • Use object-fit:contain only when showing the full image matters more than filling the box.
  • Use <picture> when mobile needs a different crop or composition.
  • Test real images, not only placeholder rectangles, because focal points change the result.
Best first move Change object-position in DevTools and see whether the important subject comes back.
Most common cause A desktop image is being forced into a narrow mobile container with cover.
Most sneaky cause A background image has the right size but the wrong mobile background position.
Better mindset Cropping is not always a bug. Uncontrolled cropping is the bug.

Final takeaway

An image cropped wrong on mobile is usually a responsive composition problem. The image is being forced into a mobile shape, and the browser has to decide what to cut.

Control the crop intentionally. Use a safer aspect ratio, choose the right object-position or background-position, and use a mobile-specific crop when the desktop image cannot work on a narrow screen.

Want more fixes like this?

Browse more image, mobile, and responsive CSS debugging guides in the FrontFixer library.

Why Is My CSS Grid Not Equal Height?

CSS grid not equal height problems usually happen when grid items are not stretching, inner cards do not use height 100%, rows are being compared incorrectly, or card content is not arranged with a consistent internal layout.

CSS Grid Equal Height Fix

Why is my CSS grid not equal height?

CSS Grid can make columns line up beautifully, but equal-height cards still break when one card has more text, another has a taller image, or the grid item stretches while the card inside it does not. The fix depends on what “equal height” means: equal inside the same row, equal across all rows, or equal internal content alignment.

  • CSS Grid
  • equal height cards
  • align-items
  • grid-auto-rows

What the bug looks like

Cards in a grid look uneven, buttons sit at different levels, or shorter cards do not stretch to match taller cards.

Why it happens

The grid, grid item, card wrapper, and inner content layout are not all following the same height strategy.

What usually fixes it

Use stretch alignment, make the card fill the grid area, and use a flex column inside the card for consistent content alignment.

Error 1

align-items:start prevents equal height stretching

CSS Grid items stretch by default. But if the grid container uses align-items:start, each item keeps its own content height. That makes cards in the same row look uneven.

Broken code

Stretch disabled
.card-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 16px;
  align-items: start;
}

Broken visual result

Cards have different heights
uneven
Feature grid

The row does not stretch items to the same height.

Short card Longer card with more content and more height Medium card
align-items:start tells the grid items not to stretch vertically.

Correct code

Stretch items
.card-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 16px;
  align-items: stretch;
}

Fixed visual result

Cards stretch in the row
equal row
Feature grid

The grid items stretch to match the tallest item in the row.

Short card Longer card with more content and more height Medium card
For same-row equal height, let grid items stretch instead of aligning them at the start.
Error 2

The grid item is equal height, but the card inside is not

Sometimes the grid item is stretching correctly, but the visible card inside it still uses content height. In that case, make the card fill the grid item with height:100%.

Broken code

Inner card stays short
.grid {
  display: grid;
  align-items: stretch;
}

.card {
  /* visible card still uses content height */
}

Broken visual result

The wrapper stretches, not the card
inner issue
Card wrappers

The grid area may be equal, but the visible card does not fill it.

Short inner card Tall inner card with extra text Medium inner card
The equal-height grid area is invisible if the inner card does not fill it.

Correct code

Card fills grid item
.grid {
  display: grid;
  align-items: stretch;
}

.card {
  height: 100%;
}

Fixed visual result

Visible cards match
height 100%
Card wrappers

The visible card fills the grid area, so the row looks equal.

Short inner card Tall inner card with extra text Medium inner card
When a card is nested inside a grid item, make the visible card fill the available height.
Error 3

You expect all rows to have the same height

CSS Grid naturally equalizes items inside the same row. It does not always make every row in the whole grid the same height. If you want rows across the grid to match, use grid-auto-rows:1fr carefully.

Broken code

Rows use content height
.card-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  grid-auto-rows: auto;
  gap: 16px;
}

Broken visual result

Rows are different heights
auto rows
Multi-row grid

Each row follows its own tallest content.

Short Short Much taller card with more content Medium
Different rows can have different heights because each row is sized by its own content.

Correct code

Equal implicit rows
.card-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  grid-auto-rows: 1fr;
  gap: 16px;
}

.card {
  height: 100%;
}

Fixed visual result

Rows share equal height
1fr rows
Multi-row grid

Implicit rows can share the available row height pattern.

Short Short Much taller card with more content Medium
Use grid-auto-rows:1fr only when equal row height is really the visual goal.
Error 4

The cards are equal height, but the content inside is not aligned

Sometimes the card heights are equal, but the CTAs, badges, or prices appear at different vertical positions. That is an internal card layout problem. Use a flex column inside the card and push the CTA to the bottom.

Broken code

Content stacks naturally
.card {
  height: 100%;
}

.card-button {
  /* button follows content */
}

Broken visual result

Buttons sit unevenly
inside uneven
Pricing grid

The card boxes match, but the internal buttons do not line up.

BasicChoose Pro plan with more details and longer descriptionChoose TeamChoose
Equal outer height does not automatically align internal content.

Correct code

Flex column card
.card {
  height: 100%;
  display: flex;
  flex-direction: column;
}

.card-button {
  margin-top: auto;
}

Fixed visual result

Buttons align at bottom
aligned CTAs
Pricing grid

The card content uses a column layout, so CTAs line up.

BasicChoose Pro plan with more details and longer descriptionChoose TeamChoose
Use flex inside the grid card when you need internal elements to align consistently.
Premium pattern

A production-minded equal-height CSS Grid pattern

A strong equal-height card grid uses responsive tracks, stretch alignment, safe column sizing, cards that fill their grid area, and flex column content inside each card.

Premium code

Equal-height card system
.card-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 240px), 1fr));
  grid-auto-rows: 1fr;
  align-items: stretch;
  gap: clamp(16px, 2vw, 24px);
}

.card-grid > * {
  min-width: 0;
}

.card {
  height: 100%;
  display: flex;
  flex-direction: column;
  min-width: 0;
}

.card-media {
  aspect-ratio: 16 / 9;
  object-fit: cover;
}

.card-content {
  display: flex;
  flex: 1;
  flex-direction: column;
}

.card-action {
  margin-top: auto;
}

Premium visual result

Equal height and aligned content
premium
Production card grid

The grid, cards, and inner content all follow the same height strategy.

StarterView Professional plan with longer detailsView TeamView
Premium equal-height grids do not rely on fake fixed heights. They use grid for rows and flex for internal card alignment.

Fast practical rule

If CSS grid is not equal height, check align-items first. Then make the visible card use height:100%. If the card content still looks uneven, use display:flex, flex-direction:column, and margin-top:auto for bottom-aligned CTAs.

Debug checklist

  • Check whether the grid has align-items:start, center, or another value that prevents stretching.
  • Use align-items:stretch when same-row equal height is desired.
  • If the visible card is nested inside the grid item, add height:100% to the card.
  • Use display:flex and flex-direction:column inside cards when buttons need to align at the bottom.
  • Use margin-top:auto for card CTAs that should sit at the same vertical level.
  • Use grid-auto-rows:1fr only when equal row height across multiple rows is actually needed.
  • Normalize image areas with aspect-ratio or consistent media height.
  • Keep responsive behavior in mind: equal-height desktop cards may stack naturally on mobile.
Best first moveRemove align-items:start and test whether the grid items stretch.
Most common causeThe grid item stretches, but the visible card inside does not use height:100%.
Most sneaky causeThe cards are equal height, but internal buttons or badges are not aligned.
Better mindsetGrid controls the outside. Flex often controls the inside of each card.

Final takeaway

A CSS grid not equal height problem is usually not solved by forcing a random fixed height. The real fix is to know which level needs equal height: the grid item, the visible card, the grid row, or the content inside the card.

Let grid stretch the outside, make the card fill the grid area, and use flex inside the card for aligned internal content. That gives you equal-height cards without fragile fixed-height hacks.

Want more fixes like this?

Browse more CSS Grid, card layout, and responsive debugging guides in the FrontFixer library.

Why Is My Grid Column Overflowing?

Grid column overflowing problems usually happen when CSS Grid columns use 1fr without minmax(0,1fr), fixed widths, long text, images, percentage columns plus gap, or missing responsive grid rules.

CSS Grid Overflow Fix

Why is my grid column overflowing?

A grid column overflowing can make a card stick out of the layout, create mobile horizontal scroll, cut off content, or make the whole page wider than the screen. The confusing part is that 1fr sounds flexible, but grid items still have automatic minimum sizes. Long text, images, fixed columns, and gaps can force a grid column wider than you expected.

  • CSS Grid
  • minmax(0, 1fr)
  • Long text
  • Mobile overflow

What the bug looks like

One grid column pushes outside the container, the last card is cut off, or the page gets horizontal scroll.

Why it happens

Grid tracks and grid items have minimum sizing behavior that can be stronger than the flexible layout you expected.

What usually fixes it

Use minmax(0,1fr), min-width:0, responsive minmax() tracks, and safe image/text rules.

Error 1

1fr columns are being pushed by long content

A grid column can overflow even with 1fr because the grid item’s automatic minimum size may be based on its content. Long text can force the column wider unless the track and item are allowed to shrink.

Broken code

1fr can still overflow
.grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 12px;
}

.card-title {
  white-space: nowrap;
}

Broken visual result

Column pushed wider
overflow
Dashboard grid

Long content makes the first column wider than expected.

VeryLongUnbreakableGridColumnTitle Stats
1fr does not automatically mean “ignore long content.”

Correct code

minmax + min-width
.grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: 12px;
}

.grid > * {
  min-width: 0;
}

.card-title {
  overflow-wrap: anywhere;
}

Fixed visual result

Column can shrink
fits
Dashboard grid

The column is allowed to shrink and the content can wrap safely.

VeryLongUnbreakableGridColumnTitle Stats
minmax(0,1fr) tells the grid track it can shrink below the content’s automatic minimum.
Error 2

Fixed grid columns are too wide for mobile

Fixed grid columns can look clean on desktop and break immediately on smaller containers. If the container is narrower than the combined column widths and gaps, the grid will overflow.

Broken code

Fixed desktop columns
.grid {
  display: grid;
  grid-template-columns: 220px 220px;
  gap: 12px;
}

Broken visual result

Fixed columns overflow
fixed width
Product grid

The columns keep desktop widths inside a smaller container.

Product Details
Fixed column widths cannot adapt when the available space gets smaller.

Correct code

Responsive columns
.grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 180px), 1fr));
  gap: 12px;
}

.grid > * {
  min-width: 0;
}

Fixed visual result

Columns adapt
responsive
Product grid

The grid can reduce columns or stack before overflowing.

Product Details
Use responsive minmax() tracks instead of fixed desktop columns.
Error 3

Percentage columns plus gap are wider than the container

Two columns at 50% already equal the full container width. If you add a gap between them, the grid becomes wider than the container unless the column math accounts for the gap.

Broken code

100% + gap
.grid {
  display: grid;
  grid-template-columns: 50% 50%;
  gap: 18px;
}

Broken visual result

Gap adds extra width
gap overflow
Two-column section

The columns already take 100%, then the gap makes the grid too wide.

Left Right
Gap is real layout space. It is added between the tracks.

Correct code

fr columns include gap better
.grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 12px;
}

.grid > * {
  min-width: 0;
}

Fixed visual result

Gap fits inside layout
fits
Two-column section

The columns share the remaining space after the gap is considered.

Left Right
Fractional tracks are usually safer than percentage tracks when using grid gaps.
Error 4

An image inside the grid column is wider than the column

Sometimes the grid column is not the original problem. A child image, card, table, code block, or button inside the column is wider than the column and forces the grid track to expand.

Broken code

Image forces width
.grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
}

.card img {
  width: 260px;
}

Broken visual result

Child content breaks track
wide child
Image grid

The image is wider than the grid column can safely hold.

svg%3E Text
A fixed-width child can make the entire grid column overflow.

Correct code

Media respects column
.grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
}

.card img {
  display: block;
  max-width: 100%;
  height: auto;
}

Fixed visual result

Child content fits
safe image
Image grid

The image is constrained by the column instead of expanding it.

svg%3E Text
Constrain media and other child content so it cannot force the grid track wider.
Premium pattern

A production-minded CSS Grid column pattern

A reliable grid pattern gives columns a safe minimum, allows child content to shrink, wraps long text, constrains media, and uses responsive tracks instead of fixed desktop assumptions.

Premium code

Safe responsive grid
.grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 220px), 1fr));
  gap: clamp(12px, 2vw, 24px);
}

.grid > * {
  min-width: 0;
}

.grid img,
.grid video {
  display: block;
  max-width: 100%;
  height: auto;
}

.grid h3,
.grid p,
.grid a {
  overflow-wrap: anywhere;
}

@media (max-width: 520px) {
  .grid {
    grid-template-columns: 1fr;
  }
}

Premium visual result

Responsive grid, no overflow
premium
Production grid

The tracks, content, media, and gap all respect the container.

Feature card LongResponsiveGridContent Image safe
Premium grid CSS does not hide overflow. It prevents the column from creating it.

Fast practical rule

If a grid column is overflowing, try grid-template-columns:minmax(0,1fr) and min-width:0 on the grid child before using overflow-x:hidden. Then check long text, images, fixed widths, and percentage columns plus gap.

Debug checklist

  • Inspect the grid columns and check whether 1fr tracks need minmax(0,1fr).
  • Add min-width:0 to grid children that contain long text or nested content.
  • Look for fixed column widths that are too large for mobile containers.
  • Avoid 50% 50% plus gap unless the gap is accounted for.
  • Check images, videos, tables, code blocks, and buttons inside the grid column.
  • Use max-width:100% on media inside grid items.
  • Use overflow-wrap:anywhere for long words, URLs, or unbreakable labels.
  • Use responsive grid tracks like auto-fit with minmax().
Best first move Replace 1fr with minmax(0,1fr) on the overflowing track.
Most common cause Long content or images force the column wider than the layout expects.
Most sneaky cause 50% 50% columns plus gap quietly become wider than 100%.
Better mindset Grid columns are flexible only when their minimum sizing rules allow them to be flexible.

Final takeaway

A grid column overflowing is usually caused by minimum sizing, not by CSS Grid being broken. The column is being forced wider by long content, fixed widths, percentage tracks plus gap, or media that does not respect the column.

Start with minmax(0,1fr) and min-width:0. Then make text, images, gaps, and responsive tracks safe. That fixes the real grid overflow instead of hiding it.

Want more fixes like this?

Browse more CSS Grid, overflow, and responsive debugging guides in the FrontFixer library.

Why Is My Flexbox Gap Creating Overflow?

Flexbox gap creating overflow problems usually happen when flex items use percentage widths, fixed widths, nowrap rows, large gaps, or long content without leaving space for the gap itself.

Flexbox Overflow Fix

Why is my flexbox gap creating overflow?

A flexbox gap creating overflow bug can make a layout look perfect until the gap is added. Suddenly the row becomes wider than the container, mobile horizontal scroll appears, cards stick out of the viewport, or buttons refuse to fit. The issue is usually simple: the item widths already add up to 100%, then gap adds extra space on top.

  • Flex gap
  • Horizontal overflow
  • flex-basis
  • Mobile wrapping

What the bug looks like

The flex row sticks out of its container, creates horizontal scroll, or makes the last card partially disappear.

Why it happens

The items and the gap are both contributing to the total row width, but the math does not leave room for the gap.

What usually fixes it

Let flex calculate widths, subtract the gap from flex-basis, allow wrapping, and add min-width:0 where content needs to shrink.

Error 1

Each flex item is 33.333%, then gap is added on top

This is the classic flex gap overflow mistake. Three cards at one-third each already equal 100%. Adding two gaps makes the row wider than the container.

Broken code

100% + gap
.cards {
  display: flex;
  gap: 18px;
}

.card {
  flex: 0 0 33.333%;
}

Broken visual result

Row is wider than container
overflow
Feature cards

The cards add up to 100%, then the gap adds extra width.

Card 1 Card 2 Card 3
The gap is not free space. It counts in the final row width.

Correct code

Subtract gap from basis
.cards {
  display: flex;
  gap: 12px;
}

.card {
  flex: 1 1 calc((100% - 24px) / 3);
  min-width: 0;
}

Fixed visual result

Gap is included in the math
fits
Feature cards

The card width leaves room for the gaps inside the same row.

Card 1 Card 2 Card 3
For three columns with two gaps, subtract the total gap before dividing the width.
Error 2

The flex row is not allowed to wrap

A row can overflow simply because it is forced to stay on one line. If the viewport becomes too narrow, the items and gaps need permission to wrap onto the next line.

Broken code

nowrap row
.cards {
  display: flex;
  flex-wrap: nowrap;
  gap: 18px;
}

.card {
  flex: 0 0 180px;
}

Broken visual result

Cards cannot wrap
nowrap
Product cards

Fixed cards plus gap are forced into one line.

Item 1 Item 2 Item 3
The browser cannot create a second row because wrapping is disabled.

Correct code

Wrap when needed
.cards {
  display: flex;
  flex-wrap: wrap;
  gap: 12px;
}

.card {
  flex: 1 1 140px;
  min-width: 0;
}

Fixed visual result

Cards wrap safely
wrapped
Product cards

The row can create a new line before it overflows.

Item 1 Item 2 Item 3
flex-wrap:wrap lets the layout protect the viewport.
Error 3

Minimum widths are too large for the available space

Even with wrapping enabled, large minimum widths can make flex items overflow before they find a usable layout. This is common with cards, pricing boxes, badges, and responsive feature rows.

Broken code

Large minimum width
.cards {
  display: flex;
  gap: 18px;
}

.card {
  flex: 1 1 0;
  min-width: 170px;
}

Broken visual result

Minimum width wins
min-width
Stats row

Each item refuses to shrink below a size that no longer fits.

Metric 1 Metric 2 Metric 3
A large minimum width plus gap can overflow even when flex-grow is enabled.

Correct code

Responsive minimum
.cards {
  display: flex;
  flex-wrap: wrap;
  gap: 12px;
}

.card {
  flex: 1 1 140px;
  min-width: min(100%, 140px);
}

Fixed visual result

Minimum width respects the container
safe min
Stats row

The item minimum works with the viewport instead of fighting it.

Metric 1 Metric 2 Metric 3
Use responsive minimums and wrapping so small containers are still safe.
Error 4

Long content inside flex items refuses to shrink

Flex items can have an automatic minimum content size. Long text, nowrap labels, URLs, buttons, and badges can force an item wider than expected unless you allow it to shrink with min-width:0 and safe text wrapping.

Broken code

Text refuses to shrink
.card {
  flex: 1 1 0;
  min-width: auto;
  white-space: nowrap;
}

Broken visual result

Content pushes the row
long text
Action row

A long label makes the flex item wider than the available space.

Start free trial now Compare all pricing plans
The content width can be stronger than the flexible width you expected.

Correct code

Shrink-safe content
.card {
  flex: 1 1 140px;
  min-width: 0;
  white-space: normal;
  overflow-wrap: anywhere;
}

Fixed visual result

Content can fit
text safe
Action row

The content can wrap and the flex items can shrink safely.

Start free trial now Compare all pricing plans
min-width:0 is a small rule that fixes many flex overflow surprises.
Premium pattern

A production-minded flex gap pattern

A reliable flex gap layout lets the browser distribute space, allows wrapping, gives items a flexible basis, and protects long content from forcing overflow.

Premium code

Safe responsive flex row
.card-row {
  display: flex;
  flex-wrap: wrap;
  gap: clamp(12px, 2vw, 24px);
}

.card {
  flex: 1 1 min(100%, 220px);
  min-width: 0;
}

.card > * {
  min-width: 0;
}

.card-title,
.card-text {
  overflow-wrap: anywhere;
}

@media (max-width: 520px) {
  .card-row {
    gap: 12px;
  }

  .card {
    flex-basis: 100%;
  }
}

Premium visual result

Flexible, wrapped, no overflow
premium
Responsive card row

The gap is part of the layout system, not an extra surprise.

Card one Card two Card three
Premium flexbox gap CSS is not about removing gap. It is about giving gap real space in the layout.

Fast practical rule

If flexbox gap is creating overflow, do not start with overflow-x:hidden. First check whether your item widths already equal 100%. Then allow wrapping, subtract the gap when needed, and add min-width:0 to flex items with long content.

Debug checklist

  • Check whether flex item widths already add up to 100% before the gap is included.
  • If using fixed columns, subtract the total gap from the available width.
  • Add flex-wrap:wrap when the row should adapt to smaller screens.
  • Use flexible values like flex:1 1 220px instead of rigid desktop widths.
  • Add min-width:0 to flex items that contain text, buttons, badges, or nested content.
  • Reduce large desktop gaps at mobile breakpoints or use clamp().
  • Inspect long text and nowrap labels inside the flex items.
  • Check the parent container if the whole row is wider than the viewport even before gap is added.
Best first move Temporarily remove gap. If overflow disappears, your item width math is the problem.
Most common cause Items are set to percentage widths that already total 100%.
Most sneaky cause Long content inside the flex item prevents shrinking unless min-width:0 is added.
Better mindset Gap is real layout space. Your flex item widths must make room for it.

Final takeaway

A flexbox gap creating overflow problem usually means the row width math is wrong. The items take too much space, then the gap adds extra width that the container cannot hold.

Give the gap real room. Use wrapping, flexible basis values, safe minimum widths, and min-width:0 for long content. That keeps the layout responsive without hiding the real overflow bug.

Want more fixes like this?

Browse more Flexbox, overflow, and responsive CSS debugging guides in the FrontFixer library.

Why Is My Label Not Aligned With the Input?

Label not aligned with input problems usually happen when the label and input use different display modes, baseline alignment, grid columns, flex alignment, line-height, or mobile form rules.

Form Alignment Fix

Why is my label not aligned with the input?

A label not aligned with input can make a form look unfinished even when the HTML works. The label may sit too high, too low, too far left, or break strangely on mobile. The real cause is usually not the label text itself. It is the layout system around the field: inline elements, baseline alignment, flex/grid rules, line-height, widths, or mobile breakpoints.

  • Form labels
  • Flex alignment
  • CSS Grid forms
  • Responsive forms

What the bug looks like

The label sits above, below, or beside the input in a way that feels slightly broken or inconsistent.

Why it happens

The label and input are not part of a clear field layout. They are being aligned by browser defaults or mismatched CSS.

What usually fixes it

Use a field wrapper, choose stacked or row layout intentionally, and align the label/input with grid or flex rules.

Error 1

The label is inline while the input behaves like a block

Labels are inline by default. Inputs have their own inline-block behavior. Mixing defaults with custom widths often creates fields that look almost aligned, but not quite.

Broken code

Inline mismatch
<label>Email</label>
<input class="form-input">

.form-input {
  width: 68%;
}

Broken visual result

Awkward alignment
default flow
Signup form

The label and input are not inside a clear field layout.

Browser defaults are doing the alignment, not a deliberate form layout.

Correct code

Field wrapper
<div class="form-field">
  <label for="email">Email</label>
  <input id="email" class="form-input">
</div>

.form-field {
  display: grid;
  gap: 8px;
}

.form-input {
  width: 100%;
}

Fixed visual result

Label and input belong together
aligned
Signup form

The wrapper defines the relationship between label and input.

A field wrapper makes stacked label alignment predictable and accessible.
Error 2

Flexbox is aligning the label by the wrong axis

In horizontal forms, labels and inputs often need vertical center alignment. If flex alignment uses baseline or default stretching in the wrong way, the label can sit too high or too low compared with the input.

Broken code

Baseline mismatch
.form-row {
  display: flex;
  align-items: baseline;
  gap: 12px;
}

.form-row label {
  width: 76px;
}

Broken visual result

Label sits visually off
baseline
Profile form

The row uses baseline alignment, so the label does not feel centered with the field.

Baseline alignment can be useful for text, but inputs are boxes with height and padding.

Correct code

Center row alignment
.form-row {
  display: flex;
  align-items: center;
  gap: 12px;
}

.form-row label {
  width: 76px;
  flex: 0 0 auto;
}

.form-row input {
  min-width: 0;
  flex: 1;
}

Fixed visual result

Label and input align as a row
centered
Profile form

The row centers the label against the input box, not just the text baseline.

align-items:center is usually better for one-line horizontal form rows.
Error 3

The grid columns are too rigid

CSS Grid is great for forms, but rigid label columns can make inputs start in odd places or overflow. The input column should be allowed to shrink safely with minmax(0,1fr) and the input should use min-width:0.

Broken code

Rigid grid
.form-grid {
  display: grid;
  grid-template-columns: 90px 1fr;
  gap: 8px 12px;
  align-items: start;
}

Broken visual result

Input feels disconnected
rigid grid
Billing form

The label and input columns are not aligned for the actual content height.

Rigid columns and top alignment often make compact form rows look visually uneven.

Correct code

Flexible grid
.form-grid {
  display: grid;
  grid-template-columns: minmax(90px, auto) minmax(0, 1fr);
  gap: 8px 12px;
  align-items: center;
}

.form-grid input {
  min-width: 0;
}

Fixed visual result

Grid columns cooperate
flexible
Billing form

The label column and input column align as one form row.

Flexible grid columns keep the row aligned without creating overflow pressure.
Error 4

The desktop label layout was not changed for mobile

A two-column label/input layout can work on desktop and feel cramped on mobile. When the screen is narrow, stacking the label above the input often creates a cleaner and more readable form.

Broken code

Desktop columns on mobile
.form-field {
  display: grid;
  grid-template-columns: 110px 1fr;
  gap: 8px;
}

Broken visual result

Mobile feels cramped
too tight
Mobile form

The desktop column layout leaves little space for the input.

Keeping label and input side by side can make mobile forms look misaligned and cramped.

Correct code

Stack on mobile
.form-field {
  display: grid;
  gap: 8px;
}

@media (min-width: 700px) {
  .form-field {
    grid-template-columns: 120px minmax(0, 1fr);
    align-items: center;
  }
}

Fixed visual result

Mobile form breathes
stacked
Mobile form

The label stacks above the input where space is limited.

Use mobile-first stacked fields, then add columns only when there is enough space.
Premium pattern

A production-minded form label pattern

A reliable label/input pattern starts mobile-first, keeps labels associated with inputs, uses predictable spacing, and only switches to a two-column layout when the screen has enough room.

Premium code

Responsive field system
.form-field {
  display: grid;
  gap: 8px;
}

.form-field label {
  font-size: .85rem;
  font-weight: 700;
  line-height: 1.3;
}

.form-field input {
  box-sizing: border-box;
  width: 100%;
  min-width: 0;
  min-height: 48px;
  padding: 12px 14px;
  border: 1px solid #cbd5e1;
  border-radius: 14px;
  font: inherit;
  line-height: 1.35;
}

@media (min-width: 700px) {
  .form-field--row {
    grid-template-columns: 140px minmax(0, 1fr);
    align-items: center;
  }
}

Premium visual result

Aligned, readable, responsive
premium
Premium form field

The label and input stay visually connected across screen sizes.

Premium form layout is boring in the best way: labels, inputs, spacing, and breakpoints all follow one system.

Fast practical rule

If a label is not aligned with input, stop adding random margins. Wrap the label and input in one field, choose stacked or row layout intentionally, and use grid or flex alignment to control the relationship.

Debug checklist

  • Check whether each input has a real associated <label> with for and matching id.
  • Wrap each label and input inside a clear field container.
  • For stacked fields, use display:grid and a small consistent gap.
  • For horizontal fields, use align-items:center when the label should align with the input box.
  • Use a consistent label column width when multiple fields are in rows.
  • Add min-width:0 to inputs inside grid or flex layouts.
  • Stack labels above inputs on mobile when horizontal rows become cramped.
  • Check line-height, padding, and input height if the label still feels visually off.
Best first move Create a field wrapper and control spacing with gap, not random margins.
Most common cause The label and input are not part of the same layout system.
Most sneaky cause The desktop two-column form is still being used on a narrow mobile screen.
Better mindset Form alignment starts with structure before decoration.

Final takeaway

A label not aligned with input usually means the form field has no clear layout system. Browser defaults, inline labels, baseline alignment, rigid columns, or desktop-only form rows are controlling the result.

Start with correct HTML structure, then choose stacked or horizontal layout intentionally. Once the label and input live in the same field system, alignment becomes predictable instead of fragile.

Want more fixes like this?

Browse more HTML, form, and responsive CSS debugging guides in the FrontFixer library.

Why Is My Input Placeholder Cut Off?

Input placeholder cut off problems usually happen when an input has a fixed height, bad line-height, too much vertical padding, content-box sizing, or mobile font rules that make the placeholder taller than the field.

Form Input Fix

Why is my input placeholder cut off?

An input placeholder can look clipped at the top, chopped at the bottom, vertically off-center, or squeezed inside the field. This usually happens when the input height, padding, line-height, border, and font-size do not agree. The fix is to stop forcing the placeholder into a tiny box and give the input a safe, predictable sizing system.

  • Input height
  • Line-height
  • Box sizing
  • Mobile forms

What the bug looks like

The placeholder text looks chopped, vertically squeezed, too high, too low, or partially hidden inside the input.

Why it happens

The input is being forced into a height that does not match its text, padding, border, and line-height.

What usually fixes it

Use min-height, sane padding, line-height:1.35, box-sizing:border-box, and mobile-safe font sizes.

Error 1

The input has a fixed height that is too small

A fixed height can work with one font size and break with another. If the input is too short for the placeholder text, the placeholder can look cut off or vertically cramped.

Broken code

Too short
.form-input {
  height: 32px;
  font-size: 17px;
  line-height: 32px;
  padding: 0 14px;
}

Broken visual result

Placeholder is squeezed
cut off
Signup form

The input height is too small for the placeholder style.

A fixed height can clip or squeeze placeholder text when the font is larger than expected.

Correct code

Safe min-height
.form-input {
  min-height: 46px;
  font-size: 16px;
  line-height: 1.4;
  padding: 12px 14px;
}

Fixed visual result

Placeholder has room
fits
Signup form

The input gives the placeholder enough vertical space.

Use min-height instead of forcing text into a tiny fixed-height field.
Error 2

Vertical padding is larger than the input can handle

If an input has a fixed height and large top/bottom padding, the placeholder has almost no actual text area left. The result can look like the placeholder is cut off even when the font-size is normal.

Broken code

Padding fights height
.form-input {
  height: 42px;
  padding: 16px 14px;
  line-height: 1;
}

Broken visual result

Text area is crushed
bad padding
Contact form

The padding consumes the input height.

Padding plus height must leave enough space for the actual text line.

Correct code

Balanced spacing
.form-input {
  min-height: 46px;
  padding: 11px 14px;
  line-height: 1.35;
}

Fixed visual result

Spacing and height agree
balanced
Contact form

The placeholder sits comfortably inside the input.

Let height, padding, and line-height work together instead of competing.
Error 3

box-sizing:content-box makes the input size harder to predict

With content-box, width and height apply only to the content area. Padding and borders are added on top. That can make form inputs taller, wider, or more cramped than you expect.

Broken code

Unpredictable box
.form-input {
  box-sizing: content-box;
  height: 42px;
  padding: 12px 18px;
  border: 4px solid #cbd5e1;
}

Broken visual result

Sizing is harder to control
content-box
Account form

Padding and border do not behave like part of the declared input size.

Content-box sizing often makes forms harder to debug across browsers and breakpoints.

Correct code

Border-box input
.form-input {
  box-sizing: border-box;
  width: 100%;
  min-height: 46px;
  padding: 11px 14px;
  border: 1px solid #cbd5e1;
}

Fixed visual result

Predictable form field
border-box
Account form

The input size includes padding and border, making layout safer.

box-sizing:border-box makes form sizing more predictable and easier to maintain.
Error 4

Mobile font and input rules changed the placeholder size

Inputs often look fine on desktop and broken on mobile because a breakpoint changes height, padding, or font-size. Mobile browsers can also apply native input behavior that makes cramped fields look worse.

Broken code

Mobile field too small
@media (max-width: 640px) {
  .form-input {
    height: 38px;
    font-size: 13px;
    padding: 7px 10px;
  }
}

Broken visual result

Mobile placeholder feels cramped
mobile rule
Mobile checkout

The mobile rule shrinks the input too aggressively.

Mobile inputs need enough height and readable font size, not just smaller desktop values.

Correct code

Mobile-safe input
@media (max-width: 640px) {
  .form-input {
    min-height: 48px;
    font-size: 16px;
    line-height: 1.35;
    padding: 12px 14px;
  }
}

Fixed visual result

Readable mobile field
mobile safe
Mobile checkout

The input remains comfortable and readable on mobile.

A 16px mobile input font can also help avoid unwanted iOS zoom behavior.
Premium pattern

A production-minded input placeholder pattern

A reliable input pattern uses border-box sizing, a comfortable minimum height, balanced padding, readable font-size, and a normal line-height. That keeps placeholders from getting cut off across desktop and mobile.

Premium code

Stable form input system
.form-field {
  display: grid;
  gap: 8px;
}

.form-label {
  font-size: .85rem;
  font-weight: 700;
}

.form-input {
  box-sizing: border-box;
  width: 100%;
  min-height: 48px;
  padding: 12px 14px;
  border: 1px solid #cbd5e1;
  border-radius: 14px;
  font: inherit;
  font-size: 16px;
  line-height: 1.35;
}

.form-input::placeholder {
  color: #94a3b8;
  opacity: 1;
}

@media (max-width: 640px) {
  .form-input {
    min-height: 48px;
    padding-inline: 14px;
  }
}

Premium visual result

Clean placeholder, stable input
premium
Premium form field

The input system keeps placeholder text readable and vertically balanced.

Premium form CSS is predictable: height, padding, line-height, and box-sizing all agree.

Fast practical rule

If an input placeholder is cut off, remove the tiny fixed height first. Then use min-height, balanced padding, line-height:1.35, box-sizing:border-box, and a mobile-safe font size.

Debug checklist

  • Inspect the input’s computed height, line-height, padding, and font-size.
  • Replace tiny fixed heights with a safer min-height.
  • Use line-height:1.35 or another normal readable value.
  • Reduce vertical padding if the input has a fixed height.
  • Set box-sizing:border-box so padding and border are included in the input size.
  • Check mobile breakpoints for smaller height or changed font-size.
  • Use at least font-size:16px on mobile when possible for better readability and less browser zoom weirdness.
  • Test with real placeholder text, not only short words like “Email.”
Best first move Remove the fixed height and replace it with min-height.
Most common cause Height, padding, and line-height are fighting each other.
Most sneaky cause A mobile breakpoint shrinks the input after it looked fine on desktop.
Better mindset Inputs need a sizing system, not a guessed height.

Final takeaway

An input placeholder cut off problem usually comes from a sizing mismatch. The input height, padding, font-size, line-height, border, and box-sizing are not working together.

Start by replacing fixed height with min-height, then balance padding and line-height. Once the input uses border-box sizing and mobile-safe font rules, the placeholder becomes predictable instead of clipped.

Want more fixes like this?

Browse more form, CSS, and responsive debugging guides in the FrontFixer library.

Why Is My Button Wider Than the Screen on Mobile?

Button wider than screen on mobile problems usually happen when a button uses a fixed width, nowrap text, large padding, icons, flex rows, or a parent container that does not allow the button to shrink safely.

Mobile Button Overflow Fix

Why is my button wider than the screen on mobile?

A button wider than the screen on mobile can create horizontal scroll, cut off CTA text, push the page sideways, or make the layout feel broken. The button is usually not “randomly too big.” It is often being forced wide by a fixed width, white-space:nowrap, too much padding, an icon label combination, or a flex row that refuses to wrap.

  • Mobile CTA
  • Horizontal overflow
  • nowrap text
  • flex wrapping

What the bug looks like

A CTA button sticks out of the viewport, gets cut off, forces horizontal scrolling, or breaks a mobile hero section.

Why it happens

Desktop button assumptions are being reused on mobile: fixed width, nowrap text, oversized padding, or non-wrapping flex rows.

What usually fixes it

Use max-width:100%, fluid width, safe wrapping, smaller mobile padding, and responsive button groups.

Error 1

The button has a fixed desktop width

A fixed-width button can look perfect on desktop and still be wider than the mobile screen. If the viewport is 320px wide and the button is 360px wide, overflow is guaranteed.

Broken code

Fixed width
.cta-button {
  width: 360px;
  padding: 14px 24px;
}

Broken visual result

Button overflows
wider than screen
Mobile hero

The button keeps a desktop width inside a narrow viewport.

Start Your Free Trial
A fixed width ignores the available mobile space.

Correct code

Fluid width cap
.cta-button {
  width: min(100%, 360px);
  max-width: 100%;
  padding: 14px 20px;
}

Fixed visual result

Button respects screen
fits
Mobile hero

The button can shrink with the viewport instead of pushing past it.

Start Your Free Trial
width:min(100%, 360px) keeps the desktop cap while protecting mobile screens.
Error 2

white-space:nowrap forces long button text off-screen

white-space:nowrap is useful for short labels, but it becomes dangerous when the CTA text is long. On mobile, a long label may need to wrap or shorten.

Broken code

Text cannot wrap
.cta-button {
  white-space: nowrap;
  padding-inline: 28px;
}

Broken visual result

Long label breaks layout
nowrap
Checkout section

The text stays on one line even when the screen cannot fit it.

Continue to Secure Checkout Now
The label refuses to wrap, so the button expands beyond the viewport.

Correct code

Safe text behavior
.cta-button {
  max-width: 100%;
  white-space: normal;
  text-align: center;
  line-height: 1.25;
  padding: 12px 18px;
}

Fixed visual result

Text can fit safely
safe text
Checkout section

The CTA can wrap cleanly without creating horizontal scroll.

Continue to Secure Checkout Now
For long CTAs, allow wrapping or use shorter mobile copy.
Error 3

The button group does not wrap on mobile

Sometimes one button is fine, but two buttons together create the overflow. A row with primary and secondary CTAs needs to wrap or stack on narrow screens.

Broken code

No wrapping
.button-group {
  display: flex;
  gap: 12px;
  flex-wrap: nowrap;
}

.button {
  white-space: nowrap;
}

Broken visual result

CTA row overflows
row overflow
Hero actions

The button group stays in one row even when it cannot fit.

Get Started View Demo
The row refuses to wrap, so the combined button width becomes wider than the screen.

Correct code

Responsive button group
.button-group {
  display: flex;
  gap: 12px;
  flex-wrap: wrap;
}

.button {
  flex: 1 1 160px;
  max-width: 100%;
}

@media (max-width: 480px) {
  .button {
    flex-basis: 100%;
  }
}

Fixed visual result

Buttons stack safely
wrapped
Hero actions

The buttons can wrap or stack instead of forcing horizontal overflow.

Get Started View Demo
A responsive button group lets the layout adapt instead of breaking the viewport.
Error 4

Icon, gap, and padding make the button wider than expected

A button label may fit by itself, but once you add an icon, a large gap, and big padding, the total width can overflow on mobile. The fix is to let the button shrink and wrap safely.

Broken code

Icon adds width
.cta-button {
  display: inline-flex;
  gap: 14px;
  min-width: 310px;
  padding-inline: 28px;
  white-space: nowrap;
}

Broken visual result

Icon button overflows
too wide
App download

The icon, gap, padding, and text combine into a mobile overflow bug.

Download the mobile app
Small pieces of width add up quickly on a narrow screen.

Correct code

Shrink-safe icon button
.cta-button {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  max-width: 100%;
  min-width: 0;
  white-space: normal;
  padding: 12px 18px;
}

.cta-button svg {
  flex: 0 0 auto;
}

Fixed visual result

Icon button fits
fits
App download

The icon stays stable, and the text can wrap inside the safe width.

Download the mobile app
Let the text wrap, keep the icon stable, and reduce mobile padding.
Premium pattern

A production-minded mobile button pattern

A reliable mobile button pattern protects the viewport, supports long text, handles icons, and lets button groups wrap without creating horizontal scroll.

Premium code

Responsive CTA system
.button-group {
  display: flex;
  flex-wrap: wrap;
  gap: 12px;
}

.cta-button {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: .6rem;
  width: min(100%, 320px);
  max-width: 100%;
  min-height: 48px;
  padding: 12px 20px;
  border-radius: 999px;
  text-align: center;
  line-height: 1.25;
  white-space: normal;
}

.cta-button svg {
  flex: 0 0 auto;
}

@media (max-width: 480px) {
  .button-group {
    flex-direction: column;
    align-items: stretch;
  }

  .cta-button {
    width: 100%;
    padding-inline: 16px;
  }
}

Premium visual result

CTA system fits the viewport
no overflow
Premium mobile hero

The button system handles long labels, icons, and small screens without creating horizontal scroll.

Start Your Free Trial Today View Product Demo
Premium button CSS is not about making every CTA tiny. It is about giving buttons safe rules for narrow screens.

Fast practical rule

If a button is wider than screen on mobile, first remove fixed width and white-space:nowrap. Then add max-width:100%, reduce mobile padding, and let button groups wrap or stack.

Debug checklist

  • Inspect the button width in DevTools and look for fixed values like width:360px.
  • Add max-width:100% to protect the viewport.
  • Check whether white-space:nowrap is forcing long text onto one line.
  • Reduce large mobile padding, especially padding-inline.
  • Check icons, gaps, and min-width values inside the button.
  • Make button groups wrap with flex-wrap:wrap or stack under a mobile breakpoint.
  • Inspect the parent container; the button may be revealing a larger overflow bug.
  • Test real CTA text, not only short placeholder labels like “Click.”
Best first move Add max-width:100% and remove fixed desktop width.
Most common cause A desktop CTA width or nowrap label is reused on mobile.
Most sneaky cause Icon + gap + padding + long text creates overflow even when the width looks normal.
Better mindset Buttons should protect the viewport before they protect the perfect desktop shape.

Final takeaway

A button wider than screen on mobile is usually caused by desktop button CSS being used in a narrow viewport. Fixed widths, nowrap text, large padding, icons, and non-wrapping flex rows can all push a CTA outside the screen.

Start by protecting the viewport with max-width:100%. Then make the text and button group responsive. A good mobile CTA can still look premium without forcing horizontal scroll.

Want more fixes like this?

Browse more mobile, overflow, and responsive CSS debugging guides in the FrontFixer library.

Why Is My Dropdown Closing When I Move the Mouse?

Dropdown closes when moving mouse problems usually happen because there is a hover gap between the trigger and the menu, the dropdown is positioned too far away, pointer-events are disabled, or the menu is being covered by another layer.

Dropdown Hover Fix

Why is my dropdown closing when I move the mouse?

A dropdown can open correctly and still close the moment you move your mouse toward it. That usually means the mouse leaves the hover area before it reaches the menu. The most common cause is an invisible gap between the trigger and the dropdown, but z-index, pointer-events, positioning, and mobile hover behavior can create the same frustrating bug.

  • Hover gap
  • Pointer events
  • z-index
  • Mobile menu

What the bug looks like

The dropdown opens on hover, but disappears before your cursor reaches the menu item you want to click.

Why it happens

The hover state is attached to an area that does not include the full path from trigger to dropdown.

What usually fixes it

Remove the hover gap, add a hover bridge, keep the dropdown inside the hoverable parent, and avoid hover-only menus on mobile.

Error 1

There is a gap between the trigger and the dropdown

The dropdown closes because the mouse leaves the hoverable parent while crossing the empty space between the button and the menu. Visually, the gap may look tiny, but to CSS hover it is a complete state break.

Broken code

Hover dead zone
.nav-item {
  position: relative;
}

.dropdown {
  position: absolute;
  top: 70px;
  left: 0;
}

.nav-item:hover .dropdown {
  display: block;
}

Broken visual result

Cursor crosses a dead zone
Products gap
Landing pages Components Templates
The menu disappears because the cursor leaves the hoverable parent before reaching the dropdown.

Correct code

Hover bridge
.nav-item {
  position: relative;
}

.dropdown {
  position: absolute;
  top: 100%;
  left: 0;
  padding-top: 12px;
}

.dropdown::before {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  top: -12px;
  height: 12px;
}

Fixed visual result

Safe hover path
Products
Landing pages Components Templates
The dropdown includes a safe invisible bridge, so the hover state does not break.
Error 2

The dropdown is shown on the wrong hover target

If the hover is attached only to the button, the dropdown closes as soon as the cursor leaves the button. The hover should usually live on a wrapper that contains both the trigger and the menu.

Broken code

Button-only hover
.menu-button:hover + .dropdown {
  display: block;
}

.dropdown {
  display: none;
}

Broken visual result

Hover area too small
Services
Design Development Debugging
The menu depends on hovering the button, but the user must leave the button to reach the menu.

Correct code

Wrapper hover
.nav-item:hover .dropdown,
.nav-item:focus-within .dropdown {
  opacity: 1;
  visibility: visible;
  pointer-events: auto;
}

.nav-item {
  position: relative;
}

Fixed visual result

Wrapper owns the interaction
Services
Design Development Debugging
The hoverable wrapper contains both the trigger and the dropdown, so the menu stays open.
Error 3

pointer-events makes the dropdown unusable

Some dropdowns are hidden with opacity and visibility, but developers forget to restore pointer-events when the menu opens. The result feels like the dropdown closes or cannot be reached, even though it is visible.

Broken code

Clicks pass through
.dropdown {
  opacity: 0;
  pointer-events: none;
}

.nav-item:hover .dropdown {
  opacity: 1;
  /* pointer-events still none */
}

Broken visual result

Visible but not interactive
Account
Profile Settings Logout
Pointer problem The menu can look open but ignore the mouse.
A visible dropdown still needs pointer events enabled when open.

Correct code

Interactive open state
.dropdown {
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
}

.nav-item:hover .dropdown,
.nav-item:focus-within .dropdown {
  opacity: 1;
  visibility: visible;
  pointer-events: auto;
}

Fixed visual result

Visible and clickable
Account
Profile Settings Logout
The open state should restore opacity, visibility, and pointer events together.
Error 4

The dropdown is hover-only on mobile

Touch devices do not behave like desktop hover. A mobile dropdown that depends only on :hover can open inconsistently, close immediately, or trap the user. Mobile menus usually need a click/tap state.

Broken code

Hover-only mobile menu
.nav-item:hover .dropdown {
  display: block;
}

@media (max-width: 768px) {
  .dropdown {
    position: absolute;
  }
}

Broken visual result

Touch behavior is unstable
Mobile nav

The menu depends on hover, which is not a reliable mobile interaction.

Tap menu
Home Services Contact
Hover-only dropdowns are fragile on touch screens.

Correct code

Click/tap state
.dropdown {
  display: none;
}

.nav-item.is-open .dropdown {
  display: block;
}

@media (hover: hover) {
  .nav-item:hover .dropdown {
    display: block;
  }
}

Fixed visual result

Mobile has its own state
Mobile nav

The menu can use tap/click state on mobile and hover only where hover exists.

Tap menu
Home Services Contact
Use hover as an enhancement, not the only way to open a mobile dropdown.
Premium pattern

A production-minded dropdown hover pattern

A strong dropdown pattern keeps the trigger and menu inside one parent, removes hover gaps, supports keyboard focus with :focus-within, restores pointer events when open, and treats touch screens differently from hover devices.

Premium code

Safe dropdown system
.nav-item {
  position: relative;
}

.dropdown {
  position: absolute;
  top: 100%;
  left: 0;
  min-width: 220px;
  padding-top: 12px;
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  transform: translateY(6px);
  transition: .18s ease;
  z-index: 100;
}

.dropdown::before {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  top: -12px;
  height: 12px;
}

.nav-item:hover .dropdown,
.nav-item:focus-within .dropdown,
.nav-item.is-open .dropdown {
  opacity: 1;
  visibility: visible;
  pointer-events: auto;
  transform: translateY(0);
}

@media (hover: none) {
  .nav-item:hover .dropdown {
    opacity: 0;
    visibility: hidden;
    pointer-events: none;
  }

  .nav-item.is-open .dropdown {
    opacity: 1;
    visibility: visible;
    pointer-events: auto;
  }
}

Premium visual result

No hover gap, no panic close
Resources
Guides Components Debug checklist
Premium dropdowns do not depend on a perfect mouse path. They create a safe interaction area.

Fast practical rule

If a dropdown closes when moving mouse, look for the gap first. Move the dropdown closer to the trigger, keep both inside the same hoverable parent, and add an invisible hover bridge before touching complicated JavaScript.

Debug checklist

  • Move the mouse slowly from the trigger to the dropdown and watch where it closes.
  • Check whether there is a visible or invisible gap between the button and the menu.
  • Attach hover to the wrapper that contains both the trigger and the dropdown.
  • Add :focus-within so keyboard users can keep the dropdown open.
  • Restore pointer-events:auto when the menu is open.
  • Check whether another layer is covering the dropdown with a higher z-index.
  • Avoid hover-only behavior on touch screens.
  • Use click/tap state for mobile menus and hover as a desktop enhancement.
Best first move Temporarily give the dropdown area a background color so you can see the hover path.
Most common cause The dropdown is too far below the trigger, creating a dead zone.
Most sneaky cause The menu is visible, but pointer-events:none is still active.
Better mindset Dropdowns need an interaction area, not just a visual box.

Final takeaway

A dropdown closes when moving mouse because CSS hover is unforgiving. If the cursor leaves the hoverable area for even a moment, the dropdown closes. Most of the time, the fix is not complicated JavaScript. It is a better hover area.

Keep the trigger and menu inside one wrapper, remove the gap, add a hover bridge, restore pointer events, and use click/tap state for mobile. The dropdown will feel stable because the interaction path is stable.

Want more fixes like this?

Browse more hover, dropdown, menu, and CSS interaction debugging guides in the FrontFixer library.

Why Is My Tooltip Hidden Behind Other Elements?

Tooltip hidden behind elements problems usually happen when the tooltip is clipped by overflow, trapped in a stacking context, placed under a higher z-index element, or positioned relative to the wrong parent.

Tooltip Layer Fix

Why is my tooltip hidden behind other elements?

A tooltip can be coded correctly and still appear behind a card, header, image, dropdown, modal, or nearby section. The problem is rarely the text itself. It is usually a layout-layer problem: overflow:hidden, low z-index, stacking context, transformed parents, or a tooltip that is positioned inside the wrong container.

  • Tooltip z-index
  • Overflow clipping
  • Stacking context
  • Position absolute

What the bug looks like

The tooltip appears cut in half, shows under a card, disappears behind a header, or cannot escape its container.

Why it happens

Tooltips are floating UI, but they are often placed inside normal layout containers that clip or trap them.

What usually fixes it

Remove clipping from the parent, raise the tooltip layer, avoid stacking traps, or render the tooltip in a safer page-level layer.

Error 1

The tooltip is clipped by overflow:hidden

This is one of the most common tooltip bugs. The card needs rounded corners or image cropping, so it uses overflow:hidden. But the tooltip also lives inside that card, so the parent cuts it off.

Broken code

Parent clips tooltip
.card {
  position: relative;
  overflow: hidden;
}

.tooltip {
  position: absolute;
  bottom: 100%;
  z-index: 20;
}

Broken visual result

Tooltip gets cut off
Product card

The tooltip is inside a parent that clips anything outside the card.

Info This tooltip needs to escape the card, but overflow cuts it.
A higher z-index cannot fix clipping caused by parent overflow.

Correct code

Visible floating area
.card {
  position: relative;
  overflow: visible;
}

.tooltip {
  position: absolute;
  bottom: calc(100% + 8px);
  z-index: 20;
}

Fixed visual result

Tooltip can escape
Product card

The tooltip can float outside the card because the parent no longer clips it.

Info This tooltip can now appear above the card.
If the component must crop images, put the cropped image in its own wrapper instead of clipping the whole card.
Error 2

The tooltip has a lower z-index than nearby content

If the tooltip is not clipped but still appears behind another card, header, image, or panel, the problem is layer order. The tooltip needs to be above the nearby interactive content.

Broken code

Low tooltip layer
.tooltip {
  position: absolute;
  z-index: 2;
}

.feature-card {
  position: relative;
  z-index: 10;
}

Broken visual result

Another element paints above it
Pricing option

The tooltip is visible, but another content layer overlaps it.

Info Low z-index tooltip hidden by a card.
Feature card This layer is above the tooltip.
The tooltip is not clipped. It is simply behind a higher layer.

Correct code

Tooltip layer wins
.tooltip {
  position: absolute;
  z-index: 100;
}

.feature-card {
  position: relative;
  z-index: 1;
}

Fixed visual result

Tooltip above nearby content
Pricing option

The tooltip has a deliberate layer above nearby cards.

Info Tooltip layer is now above the card.
Feature card The card no longer covers the tooltip.
Use a controlled z-index scale instead of guessing random numbers.
Error 3

A transformed parent creates a stacking context trap

A tooltip can have z-index:9999 and still lose if it is inside a parent stacking context. Common triggers include transform, filter, opacity, isolation, and positioned parents with z-index.

Broken code

Tooltip trapped
.card {
  transform: translateZ(0);
  z-index: 1;
}

.card .tooltip {
  position: absolute;
  z-index: 9999;
}

Broken visual result

Huge z-index still loses
Transformed card

The tooltip is inside a lower stacking context.

Info Even z-index 9999 cannot escape this parent.
Page layer
z-index only competes inside the stacking context where the element lives.

Correct code

Move tooltip to safe layer
<body>
  <main class="page">...</main>
  <div class="tooltip-layer">...</div>
</body>

Fixed visual result

Tooltip escapes the trap
Transformed card

The component can stay transformed.

Info
Page layer
Tooltip is rendered in a safer page-level layer.
For complex UI, render floating elements in a dedicated layer outside transformed components.
Error 4

The tooltip is positioned relative to the wrong parent

position:absolute uses the nearest positioned ancestor. If the trigger is inside one element but the tooltip is positioned relative to another, the tooltip can appear in the wrong place and hide behind unrelated content.

Broken code

No local anchor
.tooltip-wrap {
  /* missing position: relative */
}

.tooltip {
  position: absolute;
  bottom: 100%;
  left: 0;
}

Broken visual result

Tooltip floats from wrong place
Tooltip anchored to the wrong ancestor.
Settings row

The trigger is here, but the tooltip is not anchored locally.

Info
Other content The tooltip can collide with this.
The tooltip may look hidden because it is not positioned where you think it is.

Correct code

Local tooltip anchor
.tooltip-wrap {
  position: relative;
  display: inline-flex;
}

.tooltip {
  position: absolute;
  bottom: calc(100% + 8px);
  left: 0;
  z-index: 100;
}

Fixed visual result

Tooltip anchored correctly
Settings row

The tooltip is positioned relative to the trigger area.

Info Tooltip is anchored to the right local parent.
Other content No longer fighting the tooltip.
Use a local wrapper for simple tooltips and a page-level layer for complex floating UI.
Premium pattern

A production-minded tooltip layer pattern

A stronger tooltip system separates normal layout from floating UI. Simple tooltips can use a local relative wrapper, but complex tooltips should use a dedicated high-level layer so cards, grids, overflow, and transforms do not trap them.

Premium code

Safe tooltip system
:root {
  --layer-tooltip: 1000;
}

.tooltip-anchor {
  position: relative;
  display: inline-flex;
}

.tooltip {
  position: absolute;
  left: 50%;
  bottom: calc(100% + 10px);
  z-index: var(--layer-tooltip);
  transform: translateX(-50%);
  max-width: min(260px, calc(100vw - 32px));
}

.card-media {
  overflow: hidden;
}

.card-body {
  overflow: visible;
}
/* For complex apps */
.tooltip-layer {
  position: fixed;
  inset: 0;
  z-index: var(--layer-tooltip);
  pointer-events: none;
}

.tooltip-layer .tooltip {
  position: absolute;
  pointer-events: auto;
}

Premium visual result

Floating layer, predictable result
Premium card

The card layout stays clean, and the tooltip has a predictable layer.

Info
Clean tooltip It floats above cards, grids, headers, and nearby sections.
Premium tooltip CSS does not depend on luck. It uses a clear anchor, safe overflow, and a controlled layer.

Fast practical rule

If a tooltip is hidden behind other elements, do not only increase z-index. First check whether the parent is clipping the tooltip with overflow:hidden. Then check stacking context, positioned ancestors, and whether the tooltip should live in a higher page-level layer.

Debug checklist

  • Inspect the tooltip and confirm it has a real position, usually position:absolute or position:fixed.
  • Check the parent container for overflow:hidden, overflow:auto, or overflow:clip.
  • Temporarily set the parent to overflow:visible to see if clipping is the cause.
  • Compare the tooltip z-index with nearby cards, headers, overlays, and dropdowns.
  • Look for stacking context creators like transform, filter, opacity, isolation, and positioned parents.
  • Make sure the tooltip is positioned relative to the intended wrapper.
  • Avoid placing app-level floating UI inside cards, sliders, or overflow-heavy layout wrappers.
  • Use a simple layer scale for tooltip, dropdown, header, modal, and overlay values.
Best first move Toggle parent overflow in DevTools. If the tooltip appears, you found the clipping parent.
Most common cause A card uses overflow:hidden for rounded corners and accidentally clips the tooltip.
Most sneaky cause A transformed parent traps the tooltip in a lower stacking context.
Better mindset Tooltips are floating UI. They should not be trapped by normal content layout.

Final takeaway

A tooltip hidden behind other elements is usually a layer and containment problem, not a text problem. The tooltip may be clipped by overflow, trapped in a stacking context, placed under another z-index layer, or positioned relative to the wrong parent.

Start with overflow, then inspect stacking context, then fix the tooltip’s layer strategy. For simple UI, a local relative wrapper can work. For complex UI, a dedicated tooltip layer is safer and easier to debug.

Want more fixes like this?

Browse more z-index, tooltip, overlay, and CSS debugging guides in the FrontFixer library.