1.0.2 • Published 8 months ago

@rsbuild/plugin-rem v1.0.2

Weekly downloads
-
License
MIT
Repository
github
Last release
8 months ago

@rsbuild/plugin-rem

Rem 插件实现移动端页面的 rem 自适应布局,能够根据屏幕大小来动态调整字体大小,让网页在不同大小的屏幕上都能够自适应显示。

插件提供以下能力:

  • 集成 postcss-pxtorem,将 CSS 中的 px 单位转换为 rem
  • 在 HTML 模版中插入运行时代码,对根元素 fontSize 进行设置。

Usage

安装:

npm add @rsbuild/plugin-rem -D

rsbuild.config.ts 中注册:

// rsbuild.config.ts
import { pluginRem } from "@rsbuild/plugin-rem";

export default {
  plugins: [pluginRem()],
};

选项

默认选项

const defaultOptions = {
  enableRuntime: true,
  rootFontSize: 50,
  screenWidth: 375,
  rootFontSize: 50,
  maxRootFontSize: 64,
  widthQueryKey: "",
  excludeEntries: [],
  supportLandscape: false,
  useRootFontSizeBeyondMax: false,
  pxtorem: {
    rootValue: 50,
    unitPrecision: 5,
    propList: ["*"],
  },
};

介绍

名称类型默认值描述
enableRuntimebooleantrue是否自动生成 runtime 代码来动态计算根元素字体大小
inlineRuntimebooleantrue是否将 runtime 代码内联到 HTML 文件中。如果设置为 false,运行时代码会被抽取为一个独立的 convert-rem.[version].js 文件,并输出到产物目录下
rootFontSizenumber50根元素字体值
maxRootFontSizenumber64最大根元素字体值
widthQueryKeystring''根据 widthQueryKey 的值去 url query 中取 client width
screenWidthnumber375UI 设计图宽度
excludeEntriesstring[][]设置不注入 runtime 代码的页面入口,通常需要配合 pxtorem.exclude 使用
supportLandscapebooleanfalse横屏时使用 height 计算 rem
useRootFontSizeBeyondMaxbooleanfalse超过 maxRootFontSize 时,是否使用 rootFontSize
pxtoremobjectrootValue。默认与 rootFontSize 相同 unitPrecision: 5。精确位数 propList: '*'。支持转换的 CSS 属性postcss-pxtorem 插件属性

示例

pluginRem({
  rootFontSize: 30,
  excludeEntries: ["404", "page2"],
  pxtorem: {
    propList: ["font-size"],
  },
});

使用指南

CSS 属性值转换

由于默认的 rootFontSize 为 50。开启 rem 转换后,会按照 1rem = 50px 的比例,对 CSS 样式做如下转换:

/* input */
h1 {
  margin: 0 0 16px;
  font-size: 32px;
  line-height: 1.2;
  letter-spacing: 1px;
}

/* output */
h1 {
  margin: 0 0 0.32rem;
  font-size: 0.64rem;
  line-height: 1.2;
  letter-spacing: 0.02rem;
}

Rsbuild 默认会对所有 CSS 属性进行转换,如果希望仅对 font-size 属性进行转换,可通过设置 pxtorem.propList 实现。

pluginRem({
  pxtorem: {
    propList: ["font-size"],
  },
});

如何实现一些 CSS 属性不被转换为 REM?

pxtorem.propList 除了可以指定哪些属性需要被转换外,可以通过 ! 方式指定哪些元素不被转换:

pluginRem({
  pxtorem: {
    propList: ["*", "!border-width"], // 不转换 border-width 属性
  },
});

如果只希望一些个别 CSS 属性不被转换为 REM 时,也可参考如下写法:

/* `px` 转换为 `rem` */
.convert {
  font-size: 16px; // 转换为 1rem
}

/* `Px` 或 `PX` 会被 `postcss-pxtorem` 忽略,但是可以被浏览器正常识别 */
.ignore {
  border: 1px solid; // 忽略
  border-width: 2px; // 忽略
}

更多信息可参考 postcss-pxtorem

根元素字体大小计算

页面根元素的字体大小的计算公式为:

根元素字体大小 = 当前客户端屏幕宽度  * 根元素字体值 / UI 设计图宽度

(即:pageRootFontSize = clientWidth * rootFontSize / screenWidth)

以屏幕宽度为 390 的手机端浏览器为例,根元素字体值的默认值为 50, UI 设计图宽度为 375。

此时计算出的页面根元素的字体大小为 52 (390 * 50 / 375)。 此时 1 rem 为 52px,CSS 样式中的 32px(0.64 rem),实际页面效果为 33.28 px。

pluginRem({
  rootFontSize: 50,
  screenWidth: 375,
});

设置根元素字体最大值

在桌面浏览器端,根据计算公式得到的页面根元素字体值往往过大,当计算出的结果超出了默认的最大根元素字体值时,则采用当前设置的最大根元素字体值为当前根元素字体值。

以屏幕宽度为 1920 的桌面浏览器为例,此时计算出的根元素的字体大小为 349,超出了最大根元素字体值 64。则采用 64 为当前的根元素字体值。

pluginRem({
  maxRootFontSize: 64,
});

如何获取页面实际生效的 rootFontSize 值?

页面实际生效的 rootFontSize 会根据当前页面的情况动态计算。你可以通过打印 document.documentElement.style.fontSize 查看,也可通过 window.ROOT_FONT_SIZE 获取。

如何指定页面实际生效的 rootFontSize 值?

默认情况下,页面实际生效的 rootFontSize 会根据当前页面的情况动态计算,如果希望指定页面实际生效的 rootFontSize,可关闭 enableRuntime 配置,并在自定义 HTML 模版 中自行注入 document.documentElement.style.fontSize = '64px'

export default {
  html: {
    template: "./static/index.html",
  },
  plugins: [
    pluginRem({
      enableRuntime: false,
    }),
  ],
};

如何判断 REM 是否生效?

  1. CSS:查看生成的 .css 文件中对应属性的值是否从 px 转换成 rem。
  2. HTML:打开页面控制台查看 document.documentElement.style.fontSize 是否存在有效值。

License

MIT.

1.0.2

8 months ago

1.0.0-alpha.9

12 months ago

1.0.0-alpha.8

12 months ago

1.0.0-alpha.7

12 months ago

1.0.0-alpha.6

12 months ago

1.0.0-alpha.5

12 months ago

1.0.0-alpha.4

12 months ago

1.0.0-alpha.3

12 months ago

1.0.0-alpha.2

12 months ago

1.0.0-alpha.1

12 months ago

1.0.0-alpha.0

12 months ago

0.7.2

1 year ago

0.7.1

1 year ago

0.7.4

1 year ago

0.7.3

1 year ago

0.7.0

1 year ago

0.7.10

12 months ago

1.0.1

11 months ago

0.7.0-beta.8

1 year ago

0.7.0-beta.9

1 year ago

0.7.0-beta.7

1 year ago

0.7.9

1 year ago

0.7.6

1 year ago

0.7.5

1 year ago

0.7.8

1 year ago

0.7.7

1 year ago

1.0.1-beta.2

11 months ago

1.0.1-beta.1

12 months ago

1.0.1-beta.0

12 months ago

1.0.1-beta.6

11 months ago

1.0.1-beta.5

11 months ago

1.0.1-beta.4

11 months ago

1.0.1-beta.3

11 months ago

1.0.1-beta.9

11 months ago

1.0.1-beta.8

11 months ago

1.0.1-beta.7

11 months ago

1.0.1-beta.10

11 months ago

1.0.1-beta.11

11 months ago

0.7.0-beta.6

1 year ago

0.7.0-beta.5

1 year ago

0.7.0-beta.4

1 year ago

0.7.0-beta.1

1 year ago

0.7.0-beta.2

1 year ago

0.7.0-beta.3

1 year ago

0.7.0-beta.0

1 year ago

0.6.15

1 year ago

0.6.14

1 year ago

0.6.12

1 year ago

0.6.13

1 year ago

0.6.10

1 year ago

0.6.11

1 year ago

0.6.9

1 year ago

0.6.8

1 year ago

0.6.7

1 year ago

0.6.6

1 year ago

0.6.5

1 year ago

0.6.4

1 year ago

0.6.3

1 year ago

0.6.2

1 year ago

0.6.1

1 year ago

0.6.0

1 year ago

0.5.8

1 year ago

0.5.9

1 year ago

0.5.6

1 year ago

0.5.7

1 year ago

0.5.5

1 year ago

0.5.4

1 year ago

0.5.3

1 year ago

0.5.2

1 year ago

0.5.0

1 year ago

0.5.1

1 year ago

0.4.15

1 year ago

0.4.14

1 year ago

0.4.13

1 year ago

0.4.12

1 year ago

0.4.11

1 year ago

0.4.10

1 year ago

0.4.9

1 year ago

0.4.8

1 year ago

0.4.7

1 year ago

0.4.5

1 year ago

0.4.6

1 year ago

0.4.4

1 year ago

0.4.3

1 year ago

0.4.2

1 year ago

0.4.1

1 year ago

0.4.0

1 year ago

0.3.11

1 year ago

0.3.10

1 year ago

0.3.8

1 year ago

0.3.9

1 year ago

0.3.7

1 year ago

0.3.6

1 year ago

0.3.5

1 year ago

0.3.4

1 year ago

0.3.3

1 year ago

0.3.2

1 year ago

0.3.1

1 year ago

0.3.0

1 year ago

0.2.18

1 year ago

0.2.17

1 year ago

0.2.16

1 year ago

0.2.15

1 year ago

0.2.14

1 year ago

0.2.13

1 year ago

0.2.12

1 year ago

0.2.11

1 year ago

0.2.10

2 years ago

0.2.9

2 years ago

0.2.8

2 years ago

0.2.7

2 years ago

0.2.6

2 years ago

0.2.5

2 years ago

0.2.4

2 years ago

0.2.3

2 years ago

0.2.1

2 years ago

0.2.0

2 years ago

0.2.2

2 years ago

0.1.9

2 years ago

0.1.8

2 years ago

0.1.7

2 years ago

0.1.6

2 years ago

0.1.5

2 years ago

0.1.4

2 years ago

0.1.3

2 years ago

0.1.2

2 years ago

0.1.1

2 years ago

0.1.0

2 years ago

1.0.0

2 years ago

0.0.28

2 years ago

0.0.27

2 years ago

0.0.26

2 years ago

0.0.25

2 years ago

0.0.24

2 years ago

0.0.23

2 years ago

0.0.22

2 years ago