首页 > 其他分享 >CSS 网页适配 iPhone全面屏

CSS 网页适配 iPhone全面屏

时间:2023-12-08 10:01:50浏览次数:29  
标签:area 适配 safe bottom inset iPhone env CSS

前言
iPhoneX 取消了物理按键,改成底部小黑条,这一改动导致网页出现了比较尴尬的屏幕适配问题。对于网页而言,顶部(刘海部位)的适配问题浏览器已经做了处理,所以我们只需要关注底部与小黑条的适配问题即可(即常见的吸底导航、返回顶部等各种相对底部 fixed 定位的元素)。

 

适配之前需要了解的几个新知识

安全区域指的是一个可视窗口范围,处于安全区域的内容不受圆角(corners)、齐刘海(sensor housing)、小黑条(Home Indicator)影响,如下图蓝色区域:

 

也就是说,我们要做好适配,必须保证页面可视、可操作区域是在安全区域内。

更详细说明,参考文档:Human Interface Guidelines - iPhoneX

viewport-fit
iOS11 新增特性,苹果公司为了适配 iPhoneX 对现有 viewport meta 标签的一个扩展,用于设置网页在可视窗口的布局方式,可设置三个值:

contain: 可视窗口完全包含网页内容(左图)
cover:网页内容完全覆盖可视窗口(右图)
auto:默认值,跟 contain 表现一致

 

意:网页默认不添加扩展的表现是 viewport-fit=contain,需要适配 iPhoneX 必须设置viewport-fit=cover,这是适配的关键步骤。

更详细说明,参考文档:viewport-fit-descriptor

 

env() 和 constant()
iOS11 新增特性,Webkit 的一个 CSS 函数,用于设定安全区域与边界的距离,有四个预定义的变量:

safe-area-inset-left:安全区域距离左边边界距离
safe-area-inset-right:安全区域距离右边边界距离
safe-area-inset-top:安全区域距离顶部边界距离
safe-area-inset-bottom:安全区域距离底部边界距离
这里我们只需要关注 safe-area-inset-bottom 这个变量,因为它对应的就是小黑条的高度(横竖屏时值不一样)。

注意:当 viewport-fit=contain 时 env() 是不起作用的,必须要配合 viewport-fit=cover使用。对于不支持env() 的浏览器,浏览器将会忽略它。

在这之前,笔者使用的是 constant(),后来,官方文档加了这么一段注释(坑):

The env() function shipped in iOS 11 with the name constant(). Beginning with Safari Technology Preview 41 and the iOS 11.2 beta, constant() has been removed and replaced with env(). You can use the CSS fallback mechanism to support both versions, if necessary, but should prefer env() going forward.

这就意味着,之前使用的 constant() 在 iOS11.2 之后就不能使用的,但我们还是需要做向后兼容,像这样:

padding-bottom: constant(safe-area-inset-bottom); /* 兼容 iOS < 11.2 */
padding-bottom: env(safe-area-inset-bottom); /* 兼容 iOS >= 11.2 */

注意:env() 跟 constant() 需要同时存在,而且顺序不能换。

更详细说明,参考文档:Designing Websites for iPhone X

如何适配
了解了以上所说的几个知识点,接下来我们适配的思路就很清晰了。

第一步:设置网页在可视窗口的布局方式
新增 viweport-fit 属性,使得页面内容完全覆盖整个窗口:

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

前面也有提到过,只有设置了 viewport-fit=cover,才能使用 env()。

第二步:页面主体内容限定在安全区域内
这一步根据实际页面场景选择,如果不设置这个值,可能存在小黑条遮挡页面最底部内容的情况。

body {
padding-bottom: constant(safe-area-inset-bottom);
padding-bottom: env(safe-area-inset-bottom);
}

第三步:fixed 元素的适配
类型一:fixed 完全吸底元素(bottom = 0),比如下图这两种情况:

 

可以通过加内边距 padding 扩展高度:

{
   padding-bottom: constant(safe-area-inset-bottom);
   padding-bottom: env(safe-area-inset-bottom);
}
或者通过计算函数 calc 覆盖原来高度:

{
   height: calc(60px(假设值) + constant(safe-area-inset-bottom));
   height: calc(60px(假设值) + env(safe-area-inset-bottom));
}
注意,这个方案需要吸底条必须是有背景色的,因为扩展的部分背景是跟随外容器的,否则出现镂空情况。

还有一种方案就是,可以通过新增一个新的元素(空的颜色块,主要用于小黑条高度的占位),然后吸底元素可以不改变高度只需要调整位置,像这样:

{
   margin-bottom: constant(safe-area-inset-bottom);
   margin-bottom: env(safe-area-inset-bottom);
}
空的颜色块:

{
   position: fixed;
   bottom: 0;
   width: 100%;
   height: constant(safe-area-inset-bottom);
   height: env(safe-area-inset-bottom);
   background-color: #fff;
}

类型二:fixed 非完全吸底元素(bottom ≠ 0),比如 “返回顶部”、“侧边广告” 等

像这种只是位置需要对应向上调整,可以仅通过外边距 margin 来处理:

{
   margin-bottom: constant(safe-area-inset-bottom);
   margin-bottom: env(safe-area-inset-bottom);
}
或者,你也可以通过计算函数 calc 覆盖原来 bottom 值:

{
   bottom: calc(50px(假设值) + constant(safe-area-inset-bottom));
   bottom: calc(50px(假设值) + env(safe-area-inset-bottom));
}
你也可以使用 @supports 隔离兼容样式
写到这里,我们常见的两种类型的 fixed 元素适配方案已经了解了吧。如果我们只希望 iPhoneX 才需要新增适配样式,我们可以配合 @supports 来隔离兼容样式,当然这个处理对页面展示实际不会有任何影响:

@supports (bottom: constant(safe-area-inset-bottom)) or (bottom: env(safe-area-inset-bottom)) {
div {
   margin-bottom: constant(safe-area-inset-bottom);
   margin-bottom: env(safe-area-inset-bottom);
}
}

 

标签:area,适配,safe,bottom,inset,iPhone,env,CSS
From: https://www.cnblogs.com/ranyonsue/p/17884539.html

相关文章

  • 十套充满逼格的css动画交互设计!UI看了都自愧不如
    大家好,欢迎来到程序视点!对于网页设计师和开发工程师而言,创建一款极具趣味性和实用性的CSS网页动画,能让网站美观不少!CSS动画,就是通过CSS代码搭建网页动画。允许设计师和开发人员,通过编辑网站的CSS代码来添加页面动画,轻松提高网站兼容性的同时,提升网页加载速度。今天就带来了十......
  • 前端大屏适配几种方案
    一、方案一:rem+font-size动态设置HTML根字体大小和body字体大小,会使用到lib-flexible.js插件(functionflexible(window,document){vardocEl=document.documentElementvardpr=window.devicePixelRatio||1//adjustbodyfontsizefunctionsetBodyFontSize(......
  • 阿里巴巴宣布分红 25 亿美元;苹果故意降低 iPhone 性能被判赔偿丨 RTE 开发者日报 Vol.
       开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(RealTimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表......
  • CSS如何给字体加边框
    <h1>字体边框</h1>h1{background-color:black;font-family:"Raleway",sans-serif;font-size:28px;color:red;//下方是加边框的内容text-shadow:4px4px0white,4px-4px0white,-4px-4px0white,-4px4px0white,4px3px0w......
  • 苹果iOS 17.2 RC准正式版发布!iPhone 15 Pro系列独占空间视频来了
    今天凌晨,苹果面向开发者和公测用户发布iOS17.2RC版本,内部版本号为21C62。iOS17.2RC也就是iOS17.2准正式版,如果没有大的Bug,这将是iOS17.2正式版发布前最后一次更新。升级日志显示,iOS17.2RC新增iPhone15Pro系列空间视频拍摄功能、iPhone15Pro系列操作按钮新增“翻译......
  • css3 flex弹性布局详解
    一、flexbox弹性盒子2009年,W3C提出了一种新的方案----Flex布局,可以简便、完整、响应式地实现各种页面布局。目前,它已经得到了所有浏览器的支持,这意味着,现在就能很安全地使用这项功能。二、基本概念Flex是 Flexible Box的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。......
  • CSS超出长度范围显示省略号
    要在CSS中实现超出长度显示省略号的效果,你可以使用以下属性:overflow:该属性定义了当内容溢出元素框时发生的事情,此处我们将它设为hidden,意味着溢出的内容会被隐藏。white-space:该属性设置如何处理元素内的空白,我们将其设为nowrap,这样文本就不会自动换行。text-overflow:此属性定......
  • 用html和css和js实现一个班级点名
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>班级点名系统</title>......
  • CSS的逻辑组合伪类
    CSS的逻辑组合伪类有4种,分别是::not()、:is()、:where()和:has()。否定伪类:not():not 伪类选择器用来匹配不符合一组选择器的元素。由于它的作用是防止特定的元素被选中,它也被称为反选伪类(negationpseudo-class)。也叫否定伪类,是在元素与括号里面的参数不匹配的时候,就会对这......
  • iPhone 13/14可升级iOS 17.2 RC准正式版:新增Qi2无线充电
    今天凌晨,苹果面向开发者和公测用户发布了iOS17.2RC准正式版更新,为iPhone13和iPhone14用户解锁了一项重要的新功能:支持Qi2无线充电。iOS17.2RC准正式版升级更新基本上与正式版没有区别,预计iOS17.2正式版下周就会推送升级更新了。本次更新在修复了多个问题的同时,也新增了多......