当前位置: 首页 > Web前端 > CSS

CSS单位:px,em,rem

时间:2023-03-31 10:51:05 CSS

px在平时的工作中,我发现大部分时间都是使用px作为CSS字体单位。不仅如此,其实公司所有的前端项目都使用px作为CSS字体单位。我们知道px(像素)作为CSS的相对长度单位,是相对于显示器的分辨率而言的。它的特点是稳定、准确、浏览器兼容性好,但相应的,在网页中使用px作为字体单位也存在问题。例如,当用户试图调整浏览器的默认字体大小时,因为px是固定大小的,所以无论你怎么调整对应页面的字体大小,它都不会改变。em为了解决上面提到的以px为字体单位的类似问题,引入了一个新的CSS字体单位em。作为字体单位,em也是相对长度单位。它与当前对象中文本的字体大小有关。如果当前对象中文本的字体大小没有设置,将使用浏览器的默认字体大小。任何浏览器的默认字体大小都是16px,所以当浏览器字体大小保持默认时:1em=16px,则1px=1/16=0.0625em,10px=0.625em,同理12px=0.0625x12=0.75em,14px=0.0625x14=0.875em。但是如果每次都要计算px到em的值,会大大降低开发效率。为了简化px到em的值转换,可以在CSS中声明body的字体大小为62.5%,即body{font-size:62.5%},这样1em=16px*62.5%=10px,那么对应的12px=1.2em,14px=1.4em,这样转换就简单多了。但是还有一个像上面这样的问题,就是em作为字体单位会继承父元素的字体大小。上面的计算假设所有元素的字号都是以body的字号为继承基准,但实际情况往往不是这样的。举个例子,下面的DOM结构:-size:1.2em">导航菜单1我是测试文字默认情况下,我们期望标签下的字体大小应该是1.2em或者12px,标签下的字体大小应该是1em或者10px,但实际上我们最终得到的结果是下的字体标签大小为1.2x1.2=1.44em=14.4px,标签下字体大小为1.2x1=1.2em=12px。这是因为em作为字体单位会继承父元素的字体大小。在这个例子中,由于父元素

  • 的字体大小设置为1.2em,所以浏览器在计算标签和标签的字体大小时,就是上面实际得到的结果。这样,em真正的计算公式是:1?当前父元素的font-sizexx待转换的像素值=em值,而不是简单的每次去掉16px,显然开发这种继承方式会导致极大的不便。为了解决上面提到的em字号继承问题,rem创建了一个新的CSS字号单位:rem,即“rootem”,在字号和px的转换时,其转换规则与em相同。但唯一不同的是,rem只会以根元素的字体大小作为转换基准,而不是每次都从其当前父元素继承。在网页中,根元素是,它的字体大小是浏览器当前设置的字体大小,默认为16px。这样,根据上面提到的转换规则,或者上面的例子,将赋值给,即,把所有的单位都改成rem,就可以得到我们预期的结果:标签下的字号应该是1.2rem,也就是12px,标签下的字号应该是1rem,即10px(这里只讲原理,假设忽略浏览器的最小字号限制)。rem解决了em的字体大小从父元素继承带来的不便。BrowserCompatibilityRem是CSS3中引入的一个单元,支持的浏览器有:MozillaFirefox3.6+、AppleSafari5.0+、GoogleChrome、IE9+和Opera11+。在现代浏览器或者移动端,我们可以放心地使用rem作为字体大小单位,但是如果想使用rem作为单位,又想兼容低版本的IE浏览器,可以考虑同时使用px和rem当时,使用px来兼容低版本IE的效果,使用rem来实现现代浏览器的效果。