CSS常用单位(px、rpx、em、rem)

本文深入探讨了不同布局单位在前端开发中的应用,包括px、rpx、em与rem的特性与换算方式,以及它们在响应式设计中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.px(pixel)

不用多说,最常用的单位,也是比较死板的一个单位,在手机端的开发中不受欢迎。

2.rpx(responsive pixel)

小程序中会用到的单位,根据屏幕宽度进行自适应。

规定屏幕宽为750rpx。

如在 iPhone6 上,屏幕宽度为375px,共有750个物理像素,则750rpx = 375px = 750物理像素,1rpx = 0.5px = 1物理像素。

设备rpx换算px(屏幕宽度/750)px换算rpx(750/屏幕宽度)
iphone51px = 0.42rpx1rpx = 2.34rpx
iphone61px = 0.5rpx1rpx = 2px
iphone6 Plus1px = 0.552rpx1rpx = 1.81px

所以:开发微信小程序时建议设计师可以用 iPhone6 作为视觉稿的标准,这样开发时换算单位比较明了!

3.em

表示相对尺寸,相对于当前对象内文本的font-size。

如果当前对象内文本的font-size计量单位也是em,则当前对象内文本font-size的参考对象为父元素文本font-size。

使用em可以较好的相应设备屏幕尺寸的变化,但是在进行元素设置时都需要知道父元素文本的font-size及当前对象内文本的font-size,这对开发造成了一定的麻烦,所以em在开发中使用相较于rem来说还是比较少的;

4.rem

rem是相对于根元素html的font-size的属性来计算的。

当有嵌套关系的时候,嵌套关系的元素的字体大小始终按照根节点的字体大小进行缩放,

所以我们只需要在html根元素确定一个参考值(font-size),这个参考值设置为多少,完全可以根据您自己的需求来定。

相较于em来说,rem对于开发者来说更友好一点。

为了方便计算,当我们把参考值font-size设置为10px时
pxrem
1212/10 = 1.2 rem
1414/10 = 1.4 rem
1616/10 = 1.6 rem
1818/10 = 1.8 rem
2020/10 = 2 rem
2222/10 = 2.2 rem
2424/10 = 2.4 rem
2626/10 = 2.6 rem
2828/10 = 2.8 rem
因此 1rem 就等于html根元素设定的font-size的px值。

例:

我们设置html { font-size:12px; } , 之后的div宽高都以这个12为基数来换算,

设定一个div{width:3rem;height:2.5rem;}

换算成px : div{ width:36px;height:30px;}

这时  1rem = 12px

Q: 那各种型号的手机、ipad屏幕都不一样大,那html的font-size到底应该设为多少好呢?

两种办法:

    1. 利用@media媒体查询屏幕大小来控制html的font-size,以此来达到根据屏幕大小来展示页面的效果

    2. 使用js来控制

//designWidth:设计稿的实际宽度值,需要根据实际设置
//maxWidth:制作稿的最大宽度值,需要根据实际设置
//这段js的最后面有两个参数记得要设置,一个为设计稿实际宽度,一个为制作稿最大宽度,例如设计稿为750,最大宽度为750,则为(750,750)
(function(designWidth, maxWidth) {
  var doc = document,
    win = window,
    docEl = doc.documentElement,
    remStyle = document.createElement("style"),
    tid;

  function refreshRem() {
    var width = docEl.getBoundingClientRect().width;
    maxWidth = maxWidth || 540;
    width > maxWidth && (width = maxWidth);
    var rem = width * 100 / designWidth;
    remStyle.innerHTML = 'html{font-size:' + rem + 'px;}';
  }
  if (docEl.firstElementChild) {
    docEl.firstElementChild.appendChild(remStyle);
  } else {
    var wrap = doc.createElement("div");
    wrap.appendChild(remStyle);
    doc.write(wrap.innerHTML);
    wrap = null;
  } //要等 wiewport 设置好后才能执行 refreshRem,不然 refreshRem 会执行2次;
  refreshRem();
  win.addEventListener("resize", function() {
    clearTimeout(tid); //防止执行两次
    tid = setTimeout(refreshRem, 300);
  }, false);
  win.addEventListener("pageshow", function(e) {
    if (e.persisted) { // 浏览器后退的时候重新计算
      clearTimeout(tid);
      tid = setTimeout(refreshRem, 300);
    }
  }, false);
  if (doc.readyState === "complete") {
    doc.body.style.fontSize = "16px";
  } else {
    doc.addEventListener("DOMContentLoaded", function(e) {
      doc.body.style.fontSize = "16px";
    }, false);
  }
})(750, 750); //需要根据你的设计稿的大小来调整脚本最后的两个参数。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值