CSS env() and safe-area-inset-top Guide
The CSS env() function allows developers to insert
user-agent-defined environment variables directly into their
stylesheets, making it essential for responsive web design on modern
mobile devices. When smartphones introduced hardware features like
camera notches, screen cutouts, and dynamic islands, standard full-bleed
layouts began overlapping with physical display obstructions. By
utilizing env(safe-area-inset-top), developers can
determine the exact pixel measurement of these top cutouts and add the
appropriate spacing to keep navigation bars, headers, and essential
content fully visible.
What is the CSS env() Function?
The env() function acts similarly to CSS custom
properties (var(--custom-property)), but instead of reading
variables declared in CSS, it retrieves values provided by the browser
and operating system. These values dynamically reflect the user's
viewing context, particularly hardware boundaries.
The syntax supports an optional fallback value if the environment variable is not defined:
property: env(variable-name, fallback-value);The Role of safe-area-inset-top
Mobile browsers define safe areas to represent the rectangular region of a display that is completely unobstructed by system user interfaces or hardware cutouts. Four environment variables control these boundaries:
safe-area-inset-topsafe-area-inset-rightsafe-area-inset-bottomsafe-area-inset-left
On devices featuring a display notch, camera hole-punch, or status
bar, safe-area-inset-top resolves to the height of that
specific obstruction. On devices with standard rectangular displays, the
value resolves to 0px.
Enabling Safe Area Variables with viewport-fit
By default, mobile browsers prevent web content from clipping under
notches by automatically adding letterboxing or safe margins around the
entire webpage. To let your background color or layout extend behind the
notch while controlling interior spacing via CSS, you must first
configure the HTML viewport meta tag with
viewport-fit=cover.
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">Without viewport-fit=cover, the browser handles spacing
automatically, and env(safe-area-inset-top) will evaluate
to 0px.
Practical Implementation
Once viewport-fit=cover is set, you can apply
safe-area-inset-top to fixed headers, navigation menus, or
body wrappers.
Basic Usage
header {
position: fixed;
top: 0;
left: 0;
width: 100%;
padding-top: env(safe-area-inset-top, 20px);
background-color: #ffffff;
}In this example, if the device has a notch, the header gains enough
top padding to push its content below the cutout. If the browser does
not recognize the variable, it defaults to 20px.
Combining with Existing Spacing
If a header already requires internal padding, using
env() alone may place the content directly flush against
the bottom of the notch. Use the CSS calc() function to add
standard spacing to the safe area value:
.header-content {
padding-top: calc(1rem + env(safe-area-inset-top, 0px));
}This approach guarantees that the design maintains a consistent
baseline padding of 1rem on desktop displays while
automatically expanding to accommodate any hardware cutout on mobile
devices.