You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

iOS 14 WebView与浏览器适配:差异化设置安全区域padding-top

Solution for Conditional Safe Area Padding

Let's solve this problem right away! The core challenge here is to accurately distinguish between regular browsers (including iOS Safari) and iOS 14+ app-integrated WebViews, then apply the correct padding-top value for each scenario. Here's a reliable, step-by-step approach:

Step 1: Set Up the Viewport for Safe Area Support

First, you need to configure your viewport to enable safe area values to work properly. Add this meta tag to your HTML <head>:

<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">

The viewport-fit=cover attribute ensures your page can extend beyond the safe area, which makes the env(safe-area-inset-top) value return the correct offset (it will default to 0 without this).

Step 2: Detect iOS 14+ App WebView with JavaScript

We'll use JavaScript to identify the target environment and add a custom class to the document root. This lets our CSS target the specific scenario easily:

document.addEventListener('DOMContentLoaded', function() {
  function isIOSAppWebView() {
    const userAgent = navigator.userAgent;
    // Check for iOS device, exclude Safari browser, and verify iOS 14+
    const isIOSDevice = /iPhone|iPad|iPod/.test(userAgent);
    const isNotSafariBrowser = !/Safari/.test(userAgent);
    const iosVersionMatch = userAgent.match(/OS (\d+)_(\d+)_?(\d+)?/);
    const iosMajorVersion = iosVersionMatch ? parseInt(iosVersionMatch[1], 10) : 0;

    return isIOSDevice && isNotSafariBrowser && iosMajorVersion >= 14;
  }

  // Add a class to the root element if we're in the target environment
  if (isIOSAppWebView()) {
    document.documentElement.classList.add('ios-app-webview');
  }
});

This script checks the user agent to confirm three key points:

  • We're on an iOS device
  • It's not the Safari browser (we want only app-hosted WebViews)
  • The iOS version is 14 or higher

Step 3: Apply Conditional CSS Styles

Now use the custom class to apply different padding-top values:

#block {
  width: 100px;
  height: 100px;
  background: red;
  padding-top: 10px; /* Default for all browser environments */
}

/* Override padding for iOS 14+ app WebViews */
.ios-app-webview #block {
  padding-top: env(safe-area-inset-top);
}

This setup guarantees:

  • All browsers (including iOS Safari) use the fixed 10px padding
  • Only iOS 14+ app WebViews get the dynamic safe area inset padding

Edge Case Notes

  • If your app's WebView has a unique user agent string (like custom in-app browsers for social apps), adjust the isNotSafariBrowser check to exclude those specific identifiers.
  • The env() function is natively supported in all modern iOS browsers and WebViews, so no fallback is needed for the target environment.

内容的提问来源于stack exchange,提问作者Gregor

火山引擎 最新活动