wtto WTTO'S BLOG

使用rem实现宽度自适应

Posted on: 2021年1月23日  at 08:07
使用rem实现宽度自适应

rem 单位是相对于根字体大小的。

元素大小跟随窗口宽度大小自适应,关键是根字体大小随窗口宽度变化而变化。主要用于移动端的 H5。

但是有个问题是如果自适应大小的 H5 页面在宽屏的 PC 端打开,就会让元素变得非常大,从而导致布局全乱了,无法正常查看。

我们可以设置一个最大窗口宽度,当窗口宽度大于这个宽度时,根字体大小就不再变化,然后应用在这个最大的宽度内渲染,可以让其左右居中,两边留白。实现在 PC 宽屏下展示窄屏 H5 的浏览效果。

浏览器默认字体大小是 16px,一般移动端,我们的设计稿尺寸是按照屏幕宽度为 375px 来设计的。所以我们先定个基准:当窗口宽度为 375px 时,根字体大小为 16px。

计算动态根字体大小

根据上述基准,我们可以得出:

根字体大小 = 窗口宽度 * 16px / 375px

:root {
  font-size: calc(100vw * 16 / 375);
}

设置最大窗口宽度

假设,我们设置最大窗口宽度为 768px,即当窗口宽度大于 768px 时,根字体大小将不再变化

@media screen and (min-width: 768px) {
  :root {
    /* calc(768px * 16 / 375) */
    font-size: 32.768px;
  }
}

设置内容水平居中显示

设置内容在所规定的最大宽度内水平居中显示

body {
  max-width: 768px;
  margin: 0 auto;
}

设置定位元素的基准

当我们的内容在 PC 宽屏下,水平居中显示,两边保留空白的情况下,如果有一个固定定位的弹窗,样式为

.modal {
  position: fixed;
  bottom: 0;
  left: 0;
  right: 0;
}

这样的话,就会导致弹窗的宽度是相对于整个窗口的宽度,而不是我们水平居中显示的内容宽度,这是不合适的。

根据 MDN 文档中固定定位 fixed 的描述:

当元素祖先的 transform、perspective、filter 或 backdrop-filter 属性非 none 时,容器由视口改为该祖先。

所以我么可以设置 body 的样式为:

body {
  perspective: 0;
}

使 body 内的所有元素,固定定位的基准为 body 的大小位置,而不是整个窗口。

总结

这种方案在竖屏 (宽度大于高度) 状态下,保持了显示效果以及布局的统一。

但是在横屏 (宽度小于高度) 状态下,例如 PC 端,就会导致内容在水平居中显示,两边留有大片空白。看起来不是那么美观。

这种主要适用于,只做移动 H5 端的页面,PC 端不做处理。

如果还有 PC 端的设计稿,可以用 CSS 的媒体查询,来做宽度自适应。

或者完全新开一个项目专门做 PC 端页面,然后访问的时候,监听浏览器 ua 或者窗口宽度,自动跳转到对应的移动端或 PC 端的项目页面。

作者:  wtto
发表时间: 2021年1月23日
最后更新时间:  2024年1月1日
版权说明:  CC BY-NC-ND 4.0 DEED