欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

CSS3的REM设置字体大小 有大用 有大大用

CSS3的REM设置字体大小

小编推荐:掘金是一个高质量的技术社区,从 ECMAScript 6 到 Vue.js,性能优化到开源类库,让你不错过前端开发的每一个技术干货。各大应用市场搜索「掘金」即可下载APP,技术干货尽在掌握中。

在Web中使用什么单位来定义页面的字体大小,至今天为止都还在激烈的争论着,有人说PX做为单位好,有人说EM优点多,还有人在说百分比方便,以至于出现了CSS Font-Size: em vs. px vs. pt vs. percent这样的PK大局。不幸的是,仍然有不同的利弊,使各种技术都不太理想,但又无法不去用。真是进也难,退也难呀。

最近在学习em的相关知识的时候,无意之间让我拾得一宝,就是使用rem来设置Web页面的字体大小。让我一下子就来劲了,一口气看完并测试了一回,还真是爽歪歪的呀。师傅说好东西不能吃独食,于我就在这里给大家吹吹这个从没见过的REM

在详细介绍rem之前,我们先一起来回顾一下我们常用的两种记量单位,也是备受争论的两个:

  1.  PX为单位

  2.  EM为单位

PX为单位

在Web页面初期制作中,我们都是使用“px”来设置我们的文本,因为他比较稳定和精确。但是这种方法存在一个问题,当用户在浏览器中浏览我们制作的Web页面时,他改变了浏览器的字体大小,这时会使我们的Web页面布局被打破。这样对于那些关心自己网站可用性的用户来说,就是一个大问题了。因此,这时就提出了使用“em”来定义Web页面的字体。

em为单位

前面也说了,使用是“px”为单位是比较方便,而又一致,但在浏览器中放大或缩放浏览页面时会存在一个问题,要解决这个问题,我们可以使用“em”单位。Richard Rutter'在《How to size text using ems》一文中有做过详细的介绍,追至早一点,Richard Rutter也在《How to Size Text in CSS》中进行过深入的剖析。

这种技术需要一个参考点,一般都是以<body>的“font-size”为基准。比如说我们使用“1em”等于“10px”来改变默认值“1em=16px”,这样一来,我们设置字体大小相当于“14px”时,只需要将其值设置为“1.4em”。

body {
				font-size: 62.5%;/*10 ÷ 16 × 100% = 62.5%*/
			}
			h1 {
				font-size: 2.4em; /*2.4em × 10 = 24px */
			}
			p{
				font-size: 1.4em; /*1.4em × 10 = 14px */
			}
			li {
				font-size: 1.4em; /*1.4 × ? = 14px ? */
			}
		

为什么“li”的“1.4em”是不是“14px”将是一个问号呢?如果你了解过“em”后,你会觉得这个问题是多问的。前面也简单的介绍过一回,在使用“em”作单位时,一定需要知道其父元素的设置,因为“em”就是一个相对值,而且是一个相对于父元素的值,其真正的计算公式是 (子元素相对于父元素就相当于1个em? 假设父元素 是 2em 那么, 子元素的 1 em 就是父元素的 2em了 ;;;因为em 是相对于父元素的值):

1 ÷ 父元素的font-size × 需要转换的像素值 = em值  这个没看懂?

这样的情况下“1.4em”可以是“14px”,也可以是“20px”,或者说是“24px”,总之是一个不确定值,那么解决这样的问题,要么你知道其父元素的值,要么呢在任何子元素中都使用“1em”。这样一来可能又不是我们所需要的方法。

这里我只是简单的介绍了一个这两个单位的使用,具体一点的大家可以参阅:

  1.  Best Practices的站长Kyle的《CSS Font-Size: em vs. px vs. pt vs. percent

  2.  Converting px into percentage and em for relative CSS font sizes

  3.  Em Vs Percent Widths

  4.  CSS: Units of Measurement

  5.  Jennifer KyrninUsing Points, Pixels, Ems, or Percentages for CSS Fonts

Rem为单位

CSS3的出现,他同时引进了一些新的单位,包括我们今天所说的rem。在W3C官网上是这样描述rem的——“font size of the root element” 。下面我们就一起来详细的了解rem

前面说了“em”是相对于其父元素来设置字体大小的,这样就会存在一个问题,进行任何元素设置,都有可能需要知道他父元素的大小,在我们多次使用时,就会带来无法预知的错误风险。而rem是相对于根元素<html>,这样就意味着,我们只需要在根元素确定一个参考值,,在根元素中设置多大的字体,这完全可以根据您自己的需要,大家也可以参考下图:

我们来看一个简单的代码实例:

html {font-size: 62.5%;/*10 ÷ 16 × 100% = 62.5%*/}
body {font-size: 1.4rem;/*1.4 × 10px = 14px */}
h1 { font-size: 2.4rem;/*2.4 × 10px = 24px*/}
		

我在根元素<html>中定义了一个基本字体大小为62.5%(也就是10px。设置这个值主要方便计算,如果没有设置,将是以“16px”为基准 )。从上面的计算结果,我们使用“rem”就像使用“px”一样的方便,而且同时解决了“px”和“em”两者不同之处。

浏览器的兼容性

remCSS3新引进来的一个度量单位,大家心里肯定会觉得心灰意冷呀,担心浏览器的支持情况。其实大家不用害怕,你可能会惊讶,支持的浏览器还是蛮多的,比如:Mozilla Firefox 3.6+Apple Safari 5+Google ChromeIE9+Opera11+。只是可怜的IE6-8无法,你们就把他们当透明了吧,我向来都是如此。

不过使用rem单位设置字体,可不能完全不考虑IE了,如果你想使用这个REM,但也想兼容IE下的效果,你可考虑“px”和“rem”一起使用,用"px"来实现IE6-8下的效果,然后使用“Rem”来实现代浏览器的效果。就让IE6-8不能随文字的改变而改变吧,谁让这个Ie6-8这么老呢?哈。。。。大家不仿试试,还蛮有意思,说不定这个就是主流的度量单位了。

如需转载烦请注明出处:W3CPLUS

被顶起来的评论
  • 此昵称已被占

    回复 Paxster: 这点只能说并不是IE的问题,要求十年前的产品IE6来支持现在的技术,显然不科学,你能指望十年前的黑白电视显示现在的彩色高清?

  • 任俊采

    回复 沈玉杰: fuck,最烦偷换概念的人了,ie6出来的时间长和它垃圾有什么关系吗,而且后来的7和8问题仍然是一堆问题,还人类的精华,真是笑死个人了。给你们讲个笑话,ie6是人类知识的精华!

  • 沈玉杰

    对于黑IE的人,我只想说,你爸爸老了的时候,你也去说他蠢吧,也不想想IE6出来的时候有chrome和firefox吗?用了智能机就开始说以前诺基亚怎么怎么的,真的好吗?都是人类知识的精华何必去黑他们

  • _ruohan

    rem

  • 夏以沫

    在用着呢,哈哈

  • 唐明明

    学着使用中。 [威武]

  • ciznx
    ciznx

    别说 IE 6~8 二了好吧,你可以说“谁让他们这么老呢”,但别说它们二。

    • w3cplus

      已做修改,谢谢!

    • D.清幽草
      D.清幽草

      人家说的是ie6-8

    • ciznx
      123

      明明ie9到10都是黄色的,说明支持不好,反而chrome 4和firefox 4都已经很早就支持了,IE就是拿来黑的

    • 此昵称已被占

      这点只能说并不是IE的问题,要求十年前的产品IE6来支持现在的技术,显然不科学,你能指望十年前的黑白电视显示现在的彩色高清?

    • ciznx
      aaaaaaaaaaaaaaaa

      FUCK

    • ciznx
      jevivien

      现在的问题是即使不支持,也让你在ie上面实现一样的效果,所以才很无奈哦

    • Paxster

      你遇到了一个IE粉。。

    • ciznx
      嘿嘿嘿

      话说的是没错,现在IE12也非常的不错,可是...........老板就是要兼容IE8甚至以下的版本, 无力的开发人员黑IE也属无奈吧

    • abc

      那么你认真看过他们到底不支持在哪么?不支持在line-height中使用rem,不支持在伪类中使用。都是很容易能规避掉的情况。
      IE9和IE10同时代的其他浏览器相应的版本是多少,他们在那些版本上支持么?支持不支持不是看历史几个版本好么,IE往前数5个版本(11到6)就能跨越历史整整15年,你把其他浏览器往前数5个版本看看是多少时间以前的?
      如果你用其他浏览器一样的步调升级,你现在应当是用着IE11,甚至edge。
      所以整天说IE10如何IE9如何甚至IE6如何有什么意思呢? 
      IE6是什么时代的浏览器?他是2001年6月发布的。一直到2004年底,firefox才发布了1.0,并且问题相当多(我那时候做开发被firefox搞的快死了)。chrome呢?要再过4年,到2008年才初次发布。

    • ciznx
      ciznx

      还有,请看浏览器支持情况 http://caniuse.com/#feat=rem 这个特性的支持,各个浏览器做支持的比较迟。相反,很早就发布的 IE9 已经支持了,反而是比较早的一个。
      别没事就黑一下 IE 好吗?

  • 熊猫很瞌睡

    学习 手机上能安全用吧

  • 大鱼吃小鱼

    不管用,用的这个rem 更改字体照样改变

  • 小四-同学

    没看懂想要表达什么意思?

  • 昏昏欲睡的小猫

    设置font-size:62.5%;然后布局一个div的高度(原来是70px),设置为7.0rem,但是实际高度与用70px高度不一样。

    • 母婴天下
      母婴天下

      font-size:62.5% 要声明给html root

  • 小胖子

    还不错的分享

  • Helkyle

    讲解得很直白,哈哈哈,懂了~

  • Tonit

    意思是用em 和 rem 以后 用户即使改变了字体大小也不会有变化了?

  • Only_1968

    rem很赞的。

  • ciznx
    my

    我在html设置了font-size:62.5% 在body里面设置一个块,长宽10rem 浏览器调试显示长宽为120px 120px

    • ciznx
      my

      谢谢你的回复 开始学rem我把设置为块的长宽了,后来看清了

    • 端庄的2B小青年

      在chrome下不兼容的情况要怎么解决呢?firefox和IE下都可以设置成62.5%,在chrome下设置最小显示12px,要怎么才能在3者上面统一?

    • ciznx
      my

      哦哦 现在才明白你的意思了 谢谢啦

    • ciznx
      Amy

      360极速 opera也有这个问题 firefox没有这种问题

    • 周永利

      哈哈、、好办法

    • 就是这种范
    • ciznx
      Jiahao

      那就設成625%啊 1rem=100px

    • 蒲剑波

      62.5%指的是根目录,在chrome下设置最小显示12px,这是浏览器问题,何况现在很少用到10px的字体(sub,sup)

    • w3cplus

      Chrome的字体小于10px的时候会按12px计算,所以你设置font-size为62.5%时,相当于10px,这个时候就会造成你所说的现象

  • 默默者_念

    受教了,谢谢!!

  • ciznx
    歪妖内涵网

    好久没来了,过来转转

  • 王碎豆

    找了一晚上,这个说的太清晰了!必须赞

  • 朱阳星

    我在根元素中定义了一个基本字体大小为62.5%(也就是10px。设置这个值主要方便计算,如果没有设置,将是以“16px”为基准 )。从上面的计算结果,我们使用“rem”就像使用“px”一样的方便,而且同时解决了“px”和“em”两者不同之处。

    这里好像有问题 经chrome46测试 在html根元素小于12px时,1rem=12px,当根元素大于12px时,1rem才是设定的值

    • 唯独love72

      那如果设置成625%的话,多不好算啊

    • w3cplus

      有关于这个现象,可以看看前面的评论。补充一点,在Chrome浏览器下,当font-size小于12px时,浏览器会按12px计算,这样一来,就会看到1rem不是等于10px,而是等于12px。为了避免这个现象,又好计算的话,你可以把 html的font-size设置为625%,也就相当于100px。后面的计算就依此类推了

  • 无节操图片

    网站不错很漂亮,欢迎互访!

  • 2B的狮子

    em和rem永远不会成为主流

  • ciznx
    rem好变态

    好像QQ浏览器不支持rem吧,我用了之后,其他的都是好好的,但是QQ浏览器却是各种错乱

  • 丙亮

    学习了

  • 张绍波

    字体大小怎么随着屏幕改变而变化呢,不可能320和640公用一样大小的字体啊,太不雅观了

  • HoH
    HoH

    不错的文章,特地跑去看了下淘宝的h5页面,html{ font-size:100px;},能解决chrome下字体小于12px的问题,chrome浏览器 设置 网络内容 能修改最小字体设置,chrome默认设置都是12px

  • 鬼妈妈

    网易现在就这样用的

  • 茶花烙

    这个rem字体会自适应屏幕么? 随着窗口的缩小字体也缩小?

  • 沈玉杰

    对于黑IE的人,我只想说,你爸爸老了的时候,你也去说他蠢吧,也不想想IE6出来的时候有chrome和firefox吗?用了智能机就开始说以前诺基亚怎么怎么的,真的好吗?都是人类知识的精华何必去黑他们

    • w3cplus

      哪里有问题可以指出,没有必要去开骂。

    • ciznx
      唯独黑白

      你就是个傻逼

    • ciznx
      唯独黑白

      你就是个傻逼,知道吗?

    • ciznx
      dk

      老而不死是為賊

    • 任俊采

      fuck,最烦偷换概念的人了,ie6出来的时间长和它垃圾有什么关系吗,而且后来的7和8问题仍然是一堆问题,还人类的精华,真是笑死个人了。给你们讲个笑话,ie6是人类知识的精华!

    • ciznx
      专门骂这傻吊的

      你丫的是傻逼么?码农还有这种智障。。这能一样?那你写的垃圾代码就别重构了

    • 丁沛源

      这叫黑么?无中生有那叫黑,IE给现在带来多少不方便如果做WEB不是不知道,现在人动不动就带上家眷举例子,这习惯真的好么?即时是爸爸,依然能给社会带来很大的成果那当然不说他。如果已经落后时代了,还让留在第一线倚老卖老,拖住时代和年轻人步伐?喜欢10年文革么?

    • ciznx
      =, =

      这脑残吧?你穿过的鞋子都放家里收藏着?恐怕你都不知道扔了多少你的爸爸们了吧?你的亲爸你的野爸都很伤心呢!草泥马的脑残

  • 清风龙玲

    有人这么说,你们怎么样看.QQX5内核浏览器不支持rem单位,在大部分android 机上的微信页面不起作用

  • 霸王猫

    有个疑问呢......直接写 body{font-size:10px},干嘛计算一个62.5%,感觉问题复杂化了...... 求解?

  • Reeoo

    这个单位不错,只是还在用px布局,以后可以试试这个,兼容性也不错,移动端使用完全没有问题~

  • 彭新荏

    浏览器哪个好用用哪个咯,对IE感到反感是因为做开发的时候有些项目需要兼容IE6之类的浏览器,感到很烦宣泄一下吧。



    来自    http://www.w3cplus.com/css3/define-font-size-with-css3-rem



CSS样式中字体大小,建议font-size使用em  还是使用rem吧

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010874036/article/details/51582241

在如今这个提倡可用性设计以及用户体验设计的网络时代,CSS也是要一同参与其中的。大部分人在CSS代码编写中总是先对整体定义字体尺寸,中文情况下一般为12px,而其实这样以来在通过IE顶部菜单中的“察看-文字大小”设置已无任何作用。对字体感觉太小的浏览者而言无疑是种很不好的用户体验过程。其实这一切都可以避免,那就是使用em单位作为字体显示单位。

 

浏览器的默认字体高都是16px,所以未经调整的浏览器在显示1em=16px。换算过来的话也就是说1px=0.0625em,也就是12px=0.75em, 10px=0.625em,通过1px=0.0625em大家可以在CSS编写时通过px转换成em。不过还有一种更方便的方法,继续往下看!

 

这种方法要用到%单位(仅1次),其实%和em简单的话可以理解成前者只是比后者多2个0。为了简化font-size的换算,大家可以在css中的body中先全局声明font-size=62.5%,这里的%的算法和em一样,100%=16px,1px=6.25%,10px=62.5%,也就是定义了默认字体大小为10px。很多初学者可能会在此定义0.625em或者直接定义12px,这是没有效果的,一定要定义font-size=62.5%!由于em具有会继承父级出血元素的字体大小的特点,这是的1em=10px,所以12px=1.2em。px与em的转换通过除以10就可以得来,很方便了吧!

 

此外有一点必须要注意,可能是IE处理汉字时,对于浮点的取值精确度有限,在body下62.5%出来的12px字体比直接定义的要大一点点,只要将62.5%换成63%就可以了。通过以上对CSS代码的调整,你会发现自己的网站又向用户体验设计更靠近了一步,在如今这个提倡可用性设计以及用户体验设计的网络时代这是很重要的。

 

Html代码 复制代码
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  

  2.   

  3. <html xmlns="http://www.w3.org/1999/xhtml">  

  4.   

  5. <head>  

  6.   

  7. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  

  8.   

  9. <title>脚本之家测试</title>  

  10.   

  11. <style type="text/css" >  

  12.   

  13. body{   

  14.   

  15. font-size:63%;   

  16.   

  17. }   

  18.   

  19. </style>  

  20.   

  21. </head>  

  22.   

  23. <body>  

  24.   

  25. <p style="font-size:1.2em;">font-size:1.2em 脚本之家 (可以调整)</p>  

  26.   

  27. <p style="font-size:12px;">font-size:12px 脚本之家 (不能调整)</p>  

  28.   

  29. <p style="font-size:1.2em; color:#F90;">你可以通过IE顶部菜单中的“查看-文字大小“来调整字体显示尺寸</p>  

  30.   

  31. </body>  

  32.   

  33. </html>                      

 

 

CSS中定义的长度单位有两种,相对长度和绝对长度。相对长度单位主要有: 
* em (em,元素的字体的高度) 
* ex (x-height,字母 "x" 的高度) 
* px (像素,相对于屏幕的分辨率) 
绝对长度单位主要有: 
* in (英寸,1英寸=2.54厘米) 
* cm (厘米,1厘米=10毫米) 
* mm (米) 
* pt (点,1点=1/72英寸) 
* pc (帕,1帕=12点) 

使用px和em主要优缺点如下: 
1. IE无法调整那些使用px作为单位的字体大小,而firefox能够调整使用px和em作为单位的字体; 
2. 任意浏览器的默认字体高都是16px。所有未经调整的浏览器都符合: 1em=16px。那么12px=0.75em,10px=0.625em。为了简化font-size的换算,需要在css中的body选择器中声明 Font-size=62.5%,这就使em值变为 16px*62.5%=10px, 这样12px=1.2em, 10px=1em, 也就是说只需要将你的原来的px数值除以10,然后换上em作为单位就行了。 

em有如下特点: 

1. em的值并不是固定的; 
2. em会继续父级元素的字体大小。 

所以我们在写CSS的时候,需要注重两点: 
1. body选择器中声明Font-size=62.5%; 
2. 将你的原来的px数值除以10,然后换上em作为单位; 
3. 重新计算那些被放大的字体的em数值。避免字体大小的重复声明。 

也就是避免1.2 * 1.2= 1.44的现象。比如说你在id为#content的div中声明了字体大小为1.2em,那么在声明div中的p标签的字体大小时就只能是1em,而不是1.2em, 因为此em非彼em,它因继续#content的字体高而变为了1em=12px。那么我们假设要设置p的字体为22px,这个时候就需要22除以12来得到em的值了,这就是em会继续父级元素的字体大小的特性.

但是12px汉字例外,就是由以上方法得到的12px(1.2em)大小的汉字在IE中并不等于直接用 12px定义的字体大小,而是稍大一点。这个问题已经解决,只需在body选择器中把62.5%换成63%就能正常显示了。原因可能是IE处理汉字时,对于浮点的取值精确度有限。不知道有没有 其他的解释。


来自 https://blog.csdn.net/u010874036/article/details/51582241

普通分类: