CSS 移动端适配配置 自适应 rem 布局

发布于 2024-11-09 04:47:04 字数 3773 浏览 5 评论 0

rem 是什么

remem 单位一样,都是一个相对单位,不同的是 em 是相对于元素的父元素的 font-size 进行计算, rem 是相对于根元素 htmlfont-size 进行计算,这样一来 rem 就绕开了复杂的层级关系,实现了类似于 em 单位的功能。默认情况下浏览器给的字体大小是 16px ,按照转化关系 16px = 1rem

手淘 在移动端的布局是基于 rem + viewport 处理的。

在流式布局中使用 % 百分比定义 宽度高度 大都是用 px 来固定住。如果使用 emrem 单位进行相对布局,相对 % 百分比更加灵活,同时可以支持浏览器的字体大小调整和缩放等的正常显示。

自适应处理

使用 rem 布局的时候,为了兼容不同的分辨率,我们应该要动态的修正 根字体 的大小,让所有的用 rem 单位的子元素跟着一起缩放,从而达到自适应的效果

一般情况在项目的最前面加载一段 js 来修改 htmlfont-size ,针对不同分辨率计算 font-size ,监听浏览器更改 htmlfont-size

<html>
  <head>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <title></title>
    <style type="text/css">
      section {
        width: 100%;
        height: 100%;
        background: red;
      }
      .page{
        width: 5rem;
        height: 10rem;
        background: yellow;
        font-size: 0.3rem;
      }
    </style>
  </head>
  <body>
    <section>
      <div class="page">rem 跟着 html:font-size 变化</div>
    </section>
  </body>
  <script type="text/javascript">
    var docEl = document.documentElement,
        //当设备的方向变化(设备横向持或纵向持)此事件被触发。绑定此事件时,
        //注意现在当浏览器不支持 orientationChange 事件的时候我们绑定了 resize 事件。
        //总来的来就是监听当然窗口的变化,一旦有变化就需要重新设置根字体的值
        resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
        recalc = function() {
          //设置根字体大小
          docEl.style.fontSize = 20 * (docEl.clientWidth / 320) + 'px';
        };
    //绑定浏览器缩放与加载时间
    window.addEventListener(resizeEvt, recalc, false);
    document.addEventListener('DOMContentLoaded', recalc, false);
  </script>
</html>

html 设置 fontSize 大小,其实就是在 DOMContentLoaded 或者 resize 变化后调整 fontSize 的大小,从而调整 rem 的比值关系。

docEl.style.fontSize = 20 * (docEl.clientWidth / 320) + 'px';

320 是按照移动端的 320 宽度为标准去做适配的,当然我们得根据实际情况通过 设计稿当前可视区的大小 做一个比例关系,通过这个比例进行缩放处理。

px 转化为 rem

首先把 meta 换为

 <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale= 1.0, minimum-scale=1.0">

然后实现方法:

  • npm i amfe-flexible --save
  • pxrem

方法一:在 common.scss 文件中,全局引入 scss 函数:

/**
  转化 px 为 rem。$base-font-size = 设计稿尺寸/10
*/
@function px2rem($px, $base-font-size: 37.5) {
  @return ($px/$base-font-size)*1rem
}

调用方式直接: width: px2rem(175);

方法二: npm i postcss-pxtorem --save-dev

package.json 内,在 postcss 内添加:

"postcss": {
   "plugins": {
     "autoprefixer": {},
     "postcss-pxtorem": {
       "rootValue": 1, // 设计稿宽度的 1/10,(JSON 文件中不加注释,此行注释及下行注释均删除)
       "propList":["*"] // 需要做转化处理的属性,如`hight`、`width`、`margin`等,`*`表示全部
    }
   }
 },

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

陌上芳菲

暂无简介

0 文章
0 评论
296 人气
更多

推荐作者

qq_7J1imQ

文章 0 评论 0

《一串符号》

文章 0 评论 0

hls.

文章 0 评论 0

雅心素梦

文章 0 评论 0

塔塔猫

文章 0 评论 0

微信用户

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文