关于rem的使用

<script>
    //设置根字号 屏幕尺寸为750px时 1rem=100px
    (function (doc, win) {
        var docEl = doc.documentElement,
            resizeEvt = 'onorientationchange' in window ? 'onorientationchange' : 'resize',
            recalc = function () {
                var clientWidth = docEl.clientWidth;
                if (!clientWidth) return;
                if (clientWidth >= 750) {
                    docEl.style.fontSize = '100px';
                } else {
                    docEl.style.fontSize = 100 * (clientWidth / 750) + 'px';
                }
            };

        if (!doc.addEventListener) return;
        win.addEventListener(resizeEvt, recalc, false);
        doc.addEventListener('DOMContentLoaded', recalc, false);
    })(document, window);
</script>

如何使用?

这是rem布局的核心代码,这段代码的大意是:
页面中html的font-size的大小为: 100 * (当前页面宽度 / 750)

于是,问题来了,为什么要这样?别急,我先来一一回答

  1. 为什么是750px?
    对于手机屏幕来说,750px的页面宽度是一个安全的最大宽度,保证了移动端页面两边不会留白。注意这里的px是css逻辑像素,与设备的物理像素是有区别的。如iPhone 5使用的是Retina视网膜屏幕,使用2px x 2px的 device pixel 代表 1px x 1px 的 css pixel,所以设备像素数为750 x 1136px,而它的CSS逻辑像素数为375 x 568px。如果要切移动端页面,你可以先把效果图宽度等比例缩放到750px,很好用。

  2. 为什么要设置html的font-size?
    rem就是根元素(即:html)的字体大小。html中的所有标签样式凡是涉及到尺寸的(如: height,width,padding,margin,font-size。甚至,left,top等)你都可以放心大胆的用rem作单位。

如果你把html的font-size设为20px,前面说过,rem就是html的字体大小,那么1rem = 20px。
此时,此时宽60px,高40px的元素样式就这样设置如下 ↓

width: 3rem;
height: 2rem;

那要是宽55px,高37px呢?然后经过换算,,设置如下 ↓

width: 2.75rem;
height: 1.85rem;

是不是发现这换算起来有点麻烦啊,,,(当然,你要是心算帝请无视)
如果我们一开始把html的font-size设为100px呢?此时1rem = 100px,那么上面的宽,高就可以这么设置 ↓

width: 0.55rem;
height: 0.37rem;

是不是换算起来简单多了?!
(当然可能有同学问,为什么不一开始把html的font-size设为1px呢,这样换算起来也简单,答:浏览器一般都有最小字体限制,比如谷歌浏览器,最小中文字体就是12px,所以实际上没有办法让1rem=1px。)
根据上面的js代码,如果页面宽度低于750px,那么页面中html的font-size也会按照(当前页面宽度/750)的比例变化。这样,页面中凡是应用了rem的作尺寸单位的元素都会随着页面变化而等比例缩放了!

  1. 都哪些情况可以用rem布局?
    大部分情况下都可以用rem布局这个方法,当然具体还要看情况而定。拿我们公司项目举例,只有底部的导航不用rem,而是用的flex布局。因为导航点击最多,所以给它一个固定的大小(其实就是高度固定,宽度自适应的方案)。大家可以看看淘宝的这个手机页面 淘宝手机站,基本就是这种感觉,底部导航和顶部搜索框用的高固定,宽自适应的方案,其余的部分基本都是随着浏览器宽度变化在等比例缩放。

查看原文 

<think>好的,我现在需要帮助用户了解如何在Next.js中使用REM单位。首先,我得回忆一下REM的基本概念,它是相对于根元素(通常是html标签)的字体大小的相对单位。所以在Next.js项目中使用REM,主要是为了响应式设计和可访问性,让页面元素能够根据根字体大小进行缩放。 接下来,我得考虑如何在Next.js中设置根字体大小。通常,可以通过全局CSS样式来设置html的font-size。用户可能需要在styles目录下创建一个全局CSS文件,比如globals.css,然后在里面定义html的字体大小。比如设置为62.5%,这样1REM就等于10px(因为浏览器默认是16px,62.5%就是10px),这样计算起来更方便。 然后,用户可能需要在组件中使用REM单位。比如在CSS模块中,设置某个元素的宽度为20rem,相当于200px。这时候需要确保组件中正确引入CSS模块,并且样式应用正确。 另外,响应式设计也是一个需要考虑的点。用户可能希望根据不同的屏幕尺寸调整根字体大小,这时候可以使用媒体查询。比如在移动端设置更小的根字体大小,然后在桌面端调整。不过,使用媒体查询可能需要不同的策略,或者结合JavaScript来动态调整,比如在useEffect钩子中监听窗口大小变化,并修改根字体大小。不过这样做可能会影响性能,需要注意。 还有,用户可能会遇到第三方库或组件使用px单位的情况,这时候需要考虑如何统一处理。可能需要使用postcss插件,比如postcss-pxtorem,将px自动转换为REM。这需要在PostCSS配置文件中进行设置,并安装相应的插件。同时,在next.config.js中配置PostCSS,确保构建过程中自动转换。 还有可能需要注意图片和图标的大小,这些也可能需要使用REM单位来保持整体布局的一致性。如果使用SVG,可能需要设置其width和height为REM,或者通过CSS控制。 测试也是重要的一环,用户可能需要验证不同屏幕下REM是否按预期工作,检查元素的实际像素值是否符合计算后的结果。可以使用浏览器的开发者工具来检查计算样式,确认REM单位是否正确转换。 最后,可能需要提醒用户注意一些常见问题,比如在JavaScript中直接操作样式时,可能需要手动将REM转换为像素值进行计算,或者动态调整根字体大小时如何避免布局抖动。另外,使用REM时,嵌套元素的字体大小可能不会受到影响,因为它们相对于根元素,但其他单位如em可能会影响,需要注意区分。 总结下来,步骤大致是:设置根字体大小,配置PostCSS转换,应用REM单位到样式,处理响应式调整,测试验证,以及注意事项。这样用户应该能够在Next.js项目中顺利使用REM单位了。</think>在Next.js中使用REM单位进行开发,可以通过以下步骤实现响应式布局: 一、基础设置 1. 创建全局CSS文件(如`globals.css`): ```css /* 设置根字体大小(1rem = 10px) */ html { font-size: 62.5%; /* 基于浏览器默认16px的62.5% */ } /* 定义响应式断点 */ @media (max-width: 768px) { html { font-size: 50%; /* 移动端1rem=8px */ } } ``` 二、组件使用示例 ```css /* Button.module.css */ .container { padding: 2rem; /* 20px(桌面端)或16px(移动端) */ font-size: 1.6rem; /* 16px(桌面端)或12.8px(移动端) */ } ``` 三、自动转换方案(推荐) 1. 安装postcss插件: ```bash npm install postcss-pxtorem --save-dev ``` 2. 创建`postcss.config.js`: ```javascript module.exports = { plugins: { 'postcss-pxtorem': { rootValue: 10, // 对应html字体62.5%的设置 propList: ['*'], selectorBlackList: [/^html$/] // 排除html标签 } } } ``` 四、动态调整方案 ```javascript // 在_app.js中添加响应逻辑 import { useEffect } from 'react' function setRootFontSize() { const width = window.innerWidth const baseSize = width > 768 ? 10 : 8 document.documentElement.style.fontSize = `${baseSize}px` } function MyApp({ Component, pageProps }) { useEffect(() => { setRootFontSize() window.addEventListener('resize', setRootFontSize) return () => window.removeEventListener('resize', setRootFontSize) }, []) return <Component {...pageProps} /> } ``` 五、注意事项 1. 图片处理建议: ```css .img-responsive { width: 24rem; /* 240px */ height: auto; } ``` 2. 第三方组件适配: ```css /* 强制转换第三方组件 */ .third-party-component { font-size: 1.6rem !important; padding: 1rem !important; } ``` 3. 计算公式: $$ 1rem = \frac{rootFontSize}{16} \times 100\% $$ 验证方法: 1. 浏览器开发者工具检查元素 2. 控制台执行: ```javascript // 验证当前根字体大小 getComputedStyle(document.documentElement).fontSize ``` 最佳实践: - 优先使用`rem`进行布局尺寸定义 - 使用`em`进行文本相关定义 - 保留`px`用于边框等小尺寸 - 推荐搭配CSS变量使用: ```css :root { --spacing-unit: 2rem; --max-width: 120rem; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值