npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@rsbuild/plugin-rem

v1.0.2

Published

<p> <a href="https://npmjs.com/package/@rsbuild/plugin-rem"> <img src="https://img.shields.io/npm/v/@rsbuild/plugin-rem?style=flat-square&colorA=564341&colorB=EDED91" alt="npm version" /> </a> <img src="https://img.shields.io/badge/License-MIT-bl

Downloads

19,362

Readme

@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: ["*"],
  },
};

介绍

| 名称 | 类型 | 默认值 | 描述 | | ------------------------ | ---------- | --------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | | enableRuntime | boolean | true | 是否自动生成 runtime 代码来动态计算根元素字体大小 | | inlineRuntime | boolean | true | 是否将 runtime 代码内联到 HTML 文件中。如果设置为 false,运行时代码会被抽取为一个独立的 convert-rem.[version].js 文件,并输出到产物目录下 | | rootFontSize | number | 50 | 根元素字体值 | | maxRootFontSize | number | 64 | 最大根元素字体值 | | widthQueryKey | string | '' | 根据 widthQueryKey 的值去 url query 中取 client width | | screenWidth | number | 375 | UI 设计图宽度 | | excludeEntries | string[] | [] | 设置不注入 runtime 代码的页面入口,通常需要配合 pxtorem.exclude 使用 | | supportLandscape | boolean | false | 横屏时使用 height 计算 rem | | useRootFontSizeBeyondMax | boolean | false | 超过 maxRootFontSize 时,是否使用 rootFontSize | | pxtorem | object | rootValue。默认与 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.