前端开发过程中,尺寸单位是我们必须用到的,下面我们对css中常见的几种尺寸单位px,em,rem,rpx进行逐一介绍 基本概念(以下概念读起来可能有些晦涩,如果看不懂也没关系) 像素它不是自然界的物理长度,指基本原色素及其灰度的基本编码。 css中的像素只是一个抽象的单位,在不同的设备或不同的环境中,css中的1px所代表的设备物理像素是不同的。 物理像素它是显示器(电脑、手机屏幕)最小的物理显示单位,物理像素指的是显示器上最小的点。物理像素的大小取决于屏幕。是一个无法改变的属性。 设备独立像素我上一张图,你就会理解什么是设备独立像素 就是我们开发过程中使用的css中的px 设备像素比(device pixel radio)设备像素比 = 物理像素 / 设备独立像素,单位是dpr!(device pixel radio) Retina屏幕
因为Retina屏幕的出现,在pc端默认情况下,css中的1px等于1物理像素,但在移动端1px不一定等于1物理像素,比如说iPhone的设备独立像素是375 *667,因为它使用了Retina屏幕,他的dpr是2,所以iPhone 6 的物理像素为 750 *1334 在不同的屏幕上(普通屏幕 vs retina屏幕),css中1px所呈现的大小(物理尺寸)是一致的,不同的是1px所对应的物理像素个数是不一致的。 在普通屏幕下,1px 对应 1个物理像素(1:1)。 在Retina屏幕下(dpr=2),1px对应 2x2个物理像素(1:4)。 你会发现,在移动端开发中使用了图片(img标签),2倍图要比1倍图清晰,就是这个缘故 px默认情况下像素px是相对于屏幕分辨率而言,比如说我们的屏幕分辨率是1440 X 900,说的就是像素1440px X 900px; 这里会遇到另一种情况 浏览器缩放缩放是缩放CSS像素(缩放比例为1时,一个CSS像素等于一个屏幕像素),就是在屏幕分辨率不变的情况下,用户对浏览进行了缩放 强调一点,用户的缩放行为是对浏览器进行的,缩放的是css像素,而非分辨率,分辨率是屏幕的分辨率,不论你怎么缩放当前页面,屏幕分辨率都不会改变 我们知道在移动端可以在一定程度上控制用户的缩放行为,也可以禁止用户缩放
content属性值 :
但是在pc端就麻烦了
mac:
由于浏览器菜单栏属于系统软件权限,没发控制,我们可以通过js控制ctrl/cammond + +/- 或 Windows下ctrl + 滚轮 缩放页面的情况 em本人在实际开发过程中并没有使用过em单位,但是后面要说的rem是基于em的,所以,对em进行简单介绍 em 是相对长度单位。相对于当前对象内文本的字体尺寸。如当前对行内文本的字体尺寸未被人为设置,则相对于浏览器的默认字体尺寸。
看个栗子吧
html代码中, 第一级,html的 font-size: 50px; 第二级,my-div 的 font-size: 40px; 第三级,parent-font 的 font-size:30px; 第四级,child-font 的 font-size: 0.5em; 我们通过浏览器查看,发现第四级的fong-size为15px; 我们取消第三级parent-font 的字体大小 我们通过浏览器查看,发现第四级的fong-size为20px; 当我们取消第三级font-size后,第三级的字体大小为40px; 所以我们说em的字体大小不是固定的,em的大小取决于父级的字体大小 当父级的字体大小为20px,子级的1em就是20px 当父级的字体大小为30px,子级的1em就是30px 那么说font-size存在着继承父级的特点 我们在第一级html中设置font-size,第二级继承第一级,第三级继承第二级,第四级继承第三级,以此类推 每一级都继承自它的父级,也就是说每一级的em所代表的px大小都不是固定的,因为他们的父级不是同一个,所以em的应用场景并不多。 那么如果是em的都继承自同一个地方,是不是可以解决很多问题呢? 这时候rem出现了 remrem 是CSS3的一个相对单位(root em,根em) 使用rem为元素设定字体大小时,仍然是相对大小,但相对的只是HTML根元素 只要html的font-size大小不变,1rem所代表的font-size大小就不会变,rem只取决于html的font-size rem解决了哪些问题移动设备的宽度是各种各样的,每个设备的dpr也不同,换句话说就是不同设备每一行的物理像素数不同,能显示的css的px数也不同, 如果我们写一个div,宽度是375px,375px在这个屏幕(iPhone6)上是刚刚满屏,因为这个屏幕宽度刚刚是375px( 设备独立像素), 当我们换另一个宽度是414px的设备(iPhone6Plus)时,这个宽度375px的div就无法铺满这个屏幕,同样的当换一个iPhone5(320px),又会出现滚动条,安卓机的宽度更是五花八门,使用media媒体查询不靠谱,因为它不能覆盖所有的机型宽度 我们之前说rem的大小是相对于html的font-size的,如果html的font-size根据不同设备的宽度做动态计算,问题就会得到解决 我们写页面都是根据UI设计稿来做的,我们假设UI设计稿的宽度是750px(750px是常规宽度,当然也可以是640px或是其他宽度,但是整个项目,宽度必须统一),唯一不变就是就屏幕宽度,我们的html的font-size(rem)只取决于设备宽度 于是
html的font-size:document.documentElement.style.fontSize 设备的宽度:document.documentElement.clientWidth 750:UI设计稿的宽度 为了方便计算我们将font-size x 100,方便计算(乘100不是必须的,我接触过一些项目就不是乘以100,但是UI设计稿中使用了sketch做了动态计算,但我还是建议乘100,不然遇到psd的设计图就很麻烦了) 对上面的js做些完善
对以上代码不做过多解释 也可以这样写
iPhone5(320px)下html的font-size:42.6667px,1rem=42.6667px iPhone6(375px)下html的font-size:50px,1rem=50px iPhone6Plus(414px)下html的font-size:55.2px,1rem=55.2px rem是继承自html的font-size,但是小程序中没有html,那怎么办呢? rpx我不基于html的font-size了,我基于一个别的值就行了,你也不需要计算这个值,我给你计算了,这就是rpx。 |
|