将 calc() 与 env(safe-area-inset) 一起使用

Posted

技术标签:

【中文标题】将 calc() 与 env(safe-area-inset) 一起使用【英文标题】:Using calc() with env(safe-area-inset) 【发布时间】:2018-05-27 23:44:30 【问题描述】:

我想使用 env(safe-area-inset-bottom) 将 margin-bottom 添加到元素,但仅当设备是 iPhone X 时。但是,使用 env(safe-area-inset) 添加的边距-bottom) 不够我喜欢,我希望在底部边距上再增加 34px。

    margin-bottom: calc(env(safe-area-inset-bottom) + 34px);

上面的样式确实添加了适当的边距,但是,当设备不是 iPhone X 时,margin-bottom 不会回到 0px。这是因为 calc()。有什么建议?谢谢。

【问题讨论】:

这是因为非 iPhone X 设备仍然支持env(safe-area-inset-bottom),它们很可能会将其报告为零。然后将零添加到 34px。这将使非 iPhone X 设备上的边距底部为 34 像素。 【参考方案1】:

现在回答有点晚了,但是对于偶然发现这个问题的人来说,我的问题是“安全区域插入底部”是 UA 属性并且区分大小写。

来自@Haim Lankry 提到的链接

https://developer.mozilla.org/en-US/docs/Web/CSS/env()

padding: env(safe-area-inset-bottom, 50px); /* zero for all rectangular user agents */
padding: env(Safe-area-inset-bottom, 50px); /* 50px because UA properties are case sensitive */
padding: env(x, 50px 20px); /* as if padding: '50px 20px' were set because x is not a valid environment variable */
padding: env(x, 50px, 20px); /* ignored because '50px, 20px' is not a valid padding value and x is not a valid environment variable */

做这样的事情应该可以(S是大写)

margin-bottom: env(Safe-area-inset-bottom, 80px);

【讨论】:

【参考方案2】:

env css 函数有第二个后备参数。 https://developer.mozilla.org/en-US/docs/Web/CSS/env

env(safe-area-inset-bottom, fallback)

所以你可以这样做:

margin-bottom: calc(env(safe-area-inset-bottom, -34px ) + 34px);

【讨论】:

【参考方案3】:

您可以像这样将 calc 包装在 @supports 查询中:

.rule 
  margin-bottom: 34px;

  @supports (margin-bottom: env(safe-area-inset-bottom)) 
    margin-bottom: calc(env(safe-area-inset-bottom) + 34px);
  

如果你使用的是 sass,你可以像这样编写一个 helper mixin:

@mixin supports-safe-area-insets 
  @supports (padding-top: env(safe-area-inset-top)) 
    @content;
  

你可以这样使用:

.rule 
  margin-bottom: 34px;

  @include supports-safe-area-insets 
    margin-bottom: calc(env(safe-area-inset-bottom) + 34px);
  

【讨论】:

【参考方案4】:

您可以尝试将 34px 乘以 env(safe-area-inset-bottom);所以当 inset 为 0 时,它将是 0 + 34px * 0 = 0px

margin-bottom: calc(env(safe-area-inset-bottom) + 34px * env(safe-area-inset-bottom));

【讨论】:

另外我不确定这是否对您来说是个问题,但如果您在其他浏览器中遇到 calc 作为无效输入的问题,您将需要使用如下回退:第 1 行:margin-bottom: 0px; Line2: margin-bottom: calc(env(safe-area-inset-bottom) + 34px * env(safe-area-inset-bottom));

以上是关于将 calc() 与 env(safe-area-inset) 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

微信小程序的calc不生效处理

确定输入“conscalc: calc”的类型时出错。无法将 coder.StructTypes 与不同的字段集联合

安全区域适配的几种解决方法

安全区域适配的几种解决方法

在CSS中将calc()与attr()结合起来[重复]

Libre Office Calc 与 Excel