css中的单位换算_CSS单位px、em、rem及它们之间的换算关系

作者:WangMin

格言:努力做好自己喜欢的每一件事

国内的设计师大都喜欢用px,而国外的网站大都喜欢用em和rem,那么三者的区别与优势是什么?接下来我们就来学习一下吧!

85c865df238f0331e505091818ddefc6.png

单位px、em、rem分别表示什么?

1、 px(Pixel) 相对于显示器分辨率而言,表示“绝对尺寸”(并非真正的绝对),实际上就是css中定义的像素(这里的像素与设备的物理像素有一定的区别),利用px设置字体大小及元素宽高等比较稳定和精确。px的特点如下:

IE无法调整那些使用px作为单位的字体大小;

国外的大部分网站能够调整的原因在于其使用了em或rem作为字体单位;

Firefox能够调整px和em,rem,但是96%以上的中国网民使用IE浏览器(或内核)。

px不能适应浏览器缩放时产生的变化,因此一般不用于是响应式网站。

2、em 表示相对尺寸,其相对于当前对象内 (父级元素) 文本的字体尺寸 font-size(如当前对行内文本的字体尺寸未被设置,则相对于浏览器的默认字体尺寸。 任意浏览器的默认字体高都是16px。所有未经调整的浏览器都符合:1em = 16px。)。使用em可以较好的相应设备屏幕尺寸的变化,但是在进行元素设置时都需要知道父元素文本的font-size及当前对象内文本的font-size,如有遗漏可能会导致错误。em的特点如下:

em的值并不是固定的;

em会继承父级元素的字体大小。

3、rem 为css3新增的一个相对单位,使用rem为元素设定字体大小时,仍然是相对大小,但是rem只相对于HTML根元素的font-size,因此只需要确定这一个font-size。使用rem的好处是只修改根元素就可以成比例的调整所有字体的大小,又可以避免字体大小逐层复合的连锁反应。

目前,除了IE8及更早版本外,所有浏览器均已支持rem。以下是我在 caniuse对rem属性的兼容表:

d38f74be3cf6c0f4f20dadbb96f21fa3.png

对于不支持它的浏览器,应对方法也很简单,就是多写一个绝对单位的声明。这些浏览器会忽略用rem设定的字体大小。如下:

元素{

font-size:14px;

font-size:2rem;

}

rem、em与px间的换算关系

1、 px与em之间的换算关系

任意浏览器的默认字体大小16px。所有未经调整的浏览器都符合: 1em=16px。那么12px=0.75em,10px=0.625em,这样换算起来有点麻烦,而且容易换算出错。所以,为了简化font-size的换算,我们可以制定一个单位换算基准:需要在css中的body选择器中声明font-size=62.5%,代码如下:

body{

font-size:62.5% ;

}

这就使em值变为 16px*62.5%=10px, 这样12px=1.2em, 10px=1em, 也就是说只需要将你的原来的px数值除以10,然后换上em作为单位就行了。基准对照表如下图:

4692799479c3f007921d3f058b103741.png

总结:我们在写CSS的时候,需要注意以下两点:

1)body选择器中声明font-size=62.5%;

2)将你的需要转换的px数值除以10,然后换上em作为单位;

3)重新计算那些被放大的字体的em数值。避免字体大小的重复声明。

我们来举一个例子来说明一下:

你猜我字体是多大?em

body{

font-size:62.5%;

}

div{

font-size:1.2em; //font-size=10 *1.2 =12px

}

p{

font-size:1.2em; //font-size= 12*1.2=14.4px

}

我们可以的到p的字体大小为14.4px,如下:

02a6213fac9caa118f0200dd9968bf81.png

p的字体大小是怎么计算的呢?因为em相对于当前对象内 (父级元素) 文本的字体尺寸,p是div的子元素,div是body的子元素,要想的到p的字体大小就要先的到div的字体大小,因为body选择器中声明了font-size=62.5%,所以div的字体大小为1.2*10=12px,相当于div声明了font-size=75%(1em=12px),因为p:1.2em,所以p的字体大小转换为px:12*1.2=14.4px。这里就应证了em单位的缺点。

2、 px与rem之间的换算关系

从上面可以得到rem是一个相对大小的值,它相对于根元素,浏览器的默认字体尺寸也是16px。这时 px与rem之间的换算是1rem=16rem。下面是默认16px与rem之间的转换关系:

px

rem

12

12/16 = .75

14

14/16 = .875

16

16/16 = 1

18

18/16 = 1.125

20

20/16 = 1.25

24

24/16 = 1.5

30

30/16 = 1.875

36

36/16 = 2.25

42

42/16 = 2.625

48

48/16 = 3

比如假设,我们设置html的字体大小的值为html{font-size: 87.5%;}(也就是1rem=14px)。然后其他的字体大小就是将你要的值除以14得到的值加上 rem 单位。上面的14是个变量,相对于你对根元素html字体大小的设定,如果你设定的是62.5%,那除数就变成10了。如果你根元素的字体大小选62.5%,那px和rem之间的换算就是px直接除以10就得到rem了。为了简化font-size的换算,我们在html中也可以写入以下代码:

html{

font-size: 62.5%; /* 公式16px*62.5%=10px */

}

此时,上面示例中所示的值将会改变:

px

rem

12

12/10 = 1.2

14

14/10 = 1.4

16

16/10 = 1.6

18

18/10 = 1.8

20

20/10 = 2.0

24

24/10 = 2.4

30

30/10 = 3.0

36

36/10 = 3.6

42

42/10 = 4.2

48

48/10 = 4.8

我们来举一个例子来说明一下:

你猜我字体是多大?rem

html{

font-size: 62.5%; /* 公式16px*62.5%=10px */

}

div{

font-size:2rem;

}

p{

font-size:2rem;

}

我们可以得到p的字体大小转换为px为:20px

4c5cc62fb71cba11af3213db685367fb.png

p的字体大小是怎么计算的呢?因为rem只相对于HTML根元素的font-size,所以rem 以html{ font-size: 62.5%; }为转换基准 公式16px*62.5%=10px相当于1rem=10px,然后就可以得到p的字体大小:10*2rem=20px。

注意:

若没有在根元素(html字体)指定参照值,那浏览器默认1rem 就是16px,若指定值,则1rem就是指定值 。

html设置为62.5%或者10px 时会失效,是因为小于12px或者75%的字体大小不支持换算。这可能与有些浏览器不支持12px 以下的大小有关。所以,使用rem单位,html的字体默认字体大小必须设置为12px或以上。若小于12px则浏览器换算时自动默认字体为12px。

总的来说,为了简化font-size的换算,我们通常将rem与em的换算基准设置为 font-size : 62.5%; ,则此时1rem=1em = 16px * 62.5% = 10px, 这样10px = 1em=1rem,方便于我们使用。

以上仅是个人见解,若有不足之处欢迎在下方评论指出,那就先分享到这里!! 😄 后续继续更新!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/283229.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MAC】Ncnn 编译so文件方案

【MAC】Ncnn 编译so文件方案 1、下载ncnn github地址是:https://github.com/Tencent/ncnn 指定目录:在终端或者git管理工具 输入:git clone https://github.com/Tencent/ncnn.git 2、编译Ncnn 2.1 Mac平台 安装cmake、wget(根据实…

SSM学习注意杂记

2019独角兽企业重金招聘Python工程师标准>>> 1.spring导包时一定要版本对应,最好不要导不同版本的包,还有mybatis的包,springmvc的包,三个框架的包都需配套,要不然会出现一些想象不到的错误。 2.mybatis写映…

《ASP.NET Core 6框架揭秘》实例演示[15]:针对控制台的日志输出

针对控制台的ILogger实现类型为ConsoleLogger,对应的ILoggerProvider实现类型为ConsoleLoggerProvider,这两个类型都定义在 NuGet包“Microsoft.Extensions.Logging.Console”中。ConsoleLogger要将一条日志输出到控制台上,首选要解决的是格式…

《HeadFirst Python》第一章学习笔记

对于Python初学者来说,舍得强烈推荐从《HeadFirst Python》开始读起,这本书当真做到了深入浅出,HeadFirst系列,本身亦是品质的保证。这本书舍得已在《Python起步:写给零编程基础的童鞋》一文中提供了下载。为了方便大家…

Oracle-13:Oracle中的表分区

------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客记录了表分区 表分区的含义: 典型的拿空间换时间的案例! 表分区对一张表进行分区,分区之后表中的数据存在相对应的分区内(可以是不…

js控制图像等比例缩放

<!DOCTYPE html> <html> <head><title>图片内部放大效果</title> <meta charset"utf-8"> <style type"text/css">#imgborder{ width: 200px;height: 160px;border: 3px solid #000; overflow: hidden;position:…

mysql一张表最多多少索引_MySQL一个索引最多有多少个列?真实的测试例子

MySQL一个索引最多有多少个列&#xff1f;真实的测试例子更新时间&#xff1a;2009年07月01日 22:22:21 作者&#xff1a;MySQL一个索引最多有多少个列&#xff1f;下面是具体的实现代码。最多16列。create table test (f1 int,f2 int,f3 int,f4 int,f5 int,f6 int,f7 int,f8…

.NET Core 使用 LibreOffice 实现 Office 预览(Docker 部署)

前些年做云盘产品的时候&#xff0c;一个很核心的功能就是 Office 文件预览&#xff0c;当时还没有使用 .NET Core ,程序部署在 Windows Server 服务器上&#xff0c;文件预览的方案采用了微软的 OWA 。目前在做的零代码产品中的表单附件控件&#xff0c;同样面临着 Office 文件…

[开源精品] C#.NET im 聊天通讯架构设计 -- FreeIM 支持集群、职责分明、高性能

&#x1f4bb; FreeIM 是什么&#xff1f;FreeIM 使用 websocket 协议实现简易、高性能&#xff08;单机支持5万连接&#xff09;、集群即时通讯组件&#xff0c;支持点对点通讯、群聊通讯、上线下线事件消息等众多实用性功能。 ImCore 已正式改名为 FreeIM。使用场景&#xff…

用websploit获取管理员后台地址

1, use web/dir_scanner 2, set TARGET http://www.****.com 3, run SOURCE: https://sourceforge.net/projects/websploit/ WebSploit Advanced MITM Framework[]Autopwn – Used From Metasploit For Scan and Exploit Target Service[]wmap – Scan,Crawler Target Used Fro…

《ASP.NET Core 6框架揭秘》实例演示[16]:内存缓存与分布式缓存的使用

.NET提供了两个独立的缓存框架&#xff0c;一个是针对本地内存的缓存&#xff0c;另一个是针对分布式存储的缓存。前者可以在不经过序列化的情况下直接将对象存储在应用程序进程的内存中&#xff0c;后者则需要将对象序列化成字节数组并存储到一个独立的“中心数据库”。对于分…

人工智能教程007:创建一个卷积神经网络(2)

2019独角兽企业重金招聘Python工程师标准>>> 我们如何对图像应用卷积 当我们在图像上应用卷积时&#xff0c;我们在两个维度上执行卷积——水平和竖直方向。我们混合两桶信息&#xff1a;第一桶是输入的图像&#xff0c;由三个矩阵构成——RGB三通道&#xff0c;其中…

【系统知识点】linux入门基础命令

大概总结了一下一些基础命令&#xff0c;仅仅是帮助基础使用linux文件系统&#xff0c;如果还有相关基础命令&#xff0c;希望大家留言一起补充汇总一下&#xff01;命令的基本格式&#xff1a;格式&#xff1a;command [-options] parameter1 parameter2 …ps&#xff1a;第一…

Blazor University (48)依赖注入 —— Scoped 依赖

原文链接&#xff1a;https://blazor-university.com/dependency-injection/dependency-lifetimes-and-scopes/scoped-dependencies/Scoped 依赖Scoped 依赖项类似于 Singleton 依赖项&#xff0c;因为 Blazor 会将相同的实例注入到依赖它的每个对象中&#xff0c;但不同之处在…

c 连接mysql怎么增删改_C++ API方式连接mysql数据库实现增删改查

这里复制的http://www.bitscn.com/pdb/mysql/201407/226252.html一、环境配置1&#xff0c;装好mysql&#xff0c;新建一个C控制台工程(从最简单的弄起&#xff0c;这个会了&#xff0c;可以往任何c工程移植)&#xff0c;在vs2010中设置&#xff0c;工程--属性--VC目录--包含目…

阿里云如何实现海量短视频的极速分发?答案在这里!

摘要&#xff1a;短视频行业目前比较火热&#xff0c;但是如何快速的实现海量短视频的极速分发&#xff0c;对于短视频业务提供方来讲是一个比较棘手的问题。阿里云技术专家将带领大家从视频的上传、采集、存储和CDN分发等方面为我们介绍阿里云的整体方案&#xff0c;并且重点讲…

GitHub项目管理维护实用教程

GitHub项目维护教程 1&#xff09;注册GitHub账户并登陆&#xff1b; 2&#xff09;在Windows cmd&#xff08;或Ubuntu中的terminal&#xff09;中cd到自己的工作目录&#xff0c;将仓库clone下来&#xff1a; 命令&#xff1a; 1 git clone https://github.com/... #项目地址…

图文详解cacti的安装和使用

简介&#xff1a; 1.cacti介绍2.安装服务端3.安装客户端4.添加监控的设备cacti的介绍Cacti是一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形分析工具Cacti是通过 snmpget来获取数据&#xff0c;使用 RRDtool绘画图形&#xff0c;而且你完全可以不需要了解RRDtool复杂…

记一次 .NET 某金融企业 WPF 程序卡死分析

一&#xff1a;背景 1. 讲故事前段时间遇到了一个难度比较高的 dump&#xff0c;经过几个小时的探索&#xff0c;终于给找出来了&#xff0c;在这里做一下整理&#xff0c;希望对大家有所帮助&#xff0c;对自己也是一个总结&#xff0c;好了&#xff0c;老规矩&#xff0c;上 …

如何将图片放到mysql_怎么将图片添加到mysql中

将图片添加到mysql中的方法&#xff1a;首先将数据库存储图片的字段类型设置为blob二进制大对象类型&#xff1b;然后将图片流转化为二进制&#xff1b;最后将图片插入数据库即可。正常的图片储存要么放进本地磁盘&#xff0c;要么就存进数据库。存入本地很简单&#xff0c;现在…