1. CSS 常见单位
整体可以分成两类:
- 绝对长度单位(Absolute length units)
- 相对长度单位(Relative length units)
1.1 绝对单位
绝对单位:
- 与其他任何东西都没有关系,通常被认为总是相同的大小。
- 这些值中的大多数在用于打印时比用于屏幕输出时更有用,例如,我们通常不会在屏幕上使用cm。
- 惟一一个经常使用的值是px(像素)。
绝对单位 | 名称 | 等价换算 |
---|---|---|
cm | 厘米 | 1cm = 96px/2.54 |
mm | 毫米 | 1mm = 1/10th of 1cm |
Q | 四分之一毫米 | 1Q = 1/40th of 1cm |
in | 英寸 | 1in = 2.54cm = 96px |
pc | 十二点活字 | 1pc = 1/16th of 1in |
pt | 点 | 1pt = 1/72th of 1in |
px | 像素 | 1px = 1/96th of 1in |
1.2 相对单位
相对单位:
- 相对长度单位相对于其他一些东西
- 比如父元素的字体大小,或者视图端口的大小
- 使用相对单位的好处是,经过一些仔细的规划,您可以使文本或其他元素的大小与页面上的其他内容相对应
相对单位 | 相对于 |
---|---|
em | 在 font-size 中使用是相对于父元素的字体大小,在其他属性中使用是相对于自身的字体大小,如 width |
ex | 字符“x”的高度 |
ch | 数字“0”的宽度 |
rem | 根元素的字体大小 |
lh | 元素的line-height |
vw | 视窗宽度的1% |
vh | 视窗高度的1% |
1.3 px 详细介绍
px是pixel单词的缩写,翻译为像素。像素是影响显示的基本单位。
像素单位常见的有三种像素名称:设备像素(也称之为物理像素);设备独立像素(也称之为逻辑像素);CSS像素
- 设备像素,也叫物理像素。
- 设备像素指的是显示器上的真实像素,每个像素的大小是屏幕固有的属性,屏幕出厂以后就不会改变了
- 我们在购买显示器或者手机的时候,提到的设备分辨率就是设备像素的大小
- 比如iPhone X的分辨率 1125x2436,指的就是设备像素
- 设备独立像素,也叫逻辑像素。
- 如果面向开发者我们使用设备像素显示一个100px的宽度,那么在不同屏幕上显示效果会是不同的
- 开发者针对不同的屏幕很难进行较好的适配,编写程序必须了解用户的分辨率来进行开发
- 所以在设备像素之上,操作系统为开发者进行抽象,提供了逻辑像素的概念
- 比如你购买了一台显示器,在操作系统上是以1920x1080设置的显示分辨率,那么无论你购买的是2k、4k的显示器,对于开发者来说,都是 1920x1080的大小。
- CSS像素
- CSS中我们经常使用的单位也是pixel,它在默认情况下等同于设备独立像素(也就是逻辑像素),毕竟逻辑像素才是面向我们开发者的
- 我们可以通过JavaScript中的screen.width和screen.height获取到电脑的逻辑分辨率
2. 移动端适配
移动端开发目前主要包括三类:
- 原生App开发(iOS、Android、RN、uniapp、Flutter等)
- 小程序开发(原生小程序、uniapp、Taro等)
- Web页面(移动端的Web页面,可以使用浏览器或者webview浏览)
移动端适配包括两个概念:自适应、响应式
2.1 视口 viewport
在一个浏览器中,我们可以看到的区域就是视口(viewport)
视口划分为三种:布局视口、视觉视口、理想视口
- 在PC端的页面中,我们是不需要对视口进行区分,因为我们的布局视口和视觉视口是同一个
- 移动端的网页窗口往往比较小,布局视口是大于视觉视口的
布局视口:
- 一个在PC端的网页在移动端会按照宽度为980px来布局一个页面的盒子和内容
- 这个视口称为布局视口,默认宽度980px
视觉视口:
- 如果默认情况下,我们按照980px显示内容,那么右侧有一部分区域 就会无法显示,所以手机端浏览器会默认对页面进行缩放以显示到用户的可见区域中
- 那么显示在可见区域的这个视口,就是视觉视口
理想视口:
- 如果所有的网页都按照980px在移动端布局,那么最终页面都会被缩放显示。我们希望的是设置100px,那么显示的就是100px。
- 这时需要设置理想视口。
- 设置meta中的viewport
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
值 | 可能的附加值 | 描述 |
---|---|---|
width | 一个正整数,或者字符串 device-width | 定义 viewport 的宽度。 |
height | 一个正整数,或者字符串 device-height | 定义 viewport 的高度。未被任何浏览器使用。 |
initial-scale | 一个 0.0 和 10.0 之间的正数 | 定义设备宽度与 viewport 大小之间的缩放比例。 |
maximum-scale | 一个 0.0 和 10.0 之间的正数 | 定义缩放的最大值,必须大于等于 minimum-scale,否则表现将不可预测。 |
minimum-scale | 一个 0.0 和 10.0 之间的正数 | 定义缩放的最小值,必须小于等于 maximum-scale,否则表现将不可预测。 |
user-scalable | yes 或者 no | 默认为 yes,如果设置为 no,将无法缩放当前页面。浏览器可以忽略此规则 |
2.2 移动端适配方案
- 方案一:百分比设置
- 因为不同属性的百分比值,相对的可能是不同参照物,所以百分比往往很难统一
- 所以百分比在移动端适配中使用是非常少的
- 方案二:rem单位+动态html的font-size
- 方案三:vw单位
- 方案四:flex的弹性布局
2.2.1 rem 适配方案
rem单位是相对于html元素的font-size来设置的,那么如果我们需要在不同的屏幕下有不同的尺寸,可以动态的修改html的 font-size尺寸
在开发中,我们只需要考虑两个问题:
- 问题一:针对不同的屏幕,设置html不同的font-size
- 问题二:将原来要设置的尺寸,转化成rem单位
font-size 尺寸
屏幕尺寸 | html的font-size | 盒子的设置宽度 | 盒子的最终宽度 |
---|---|---|---|
375px | 37.5px | 1rem | 37.5px |
320px | 32px | 1rem | 32px |
414px | 41.4px | 1rem | 41.4px |
- 方案一:媒体查询
- 可以通过媒体查询来设置不同尺寸范围内的屏幕html的font-size尺寸
- 缺点:
- 1.我们需要针对不同的屏幕编写大量的媒体查询
- 2.如果动态改变尺寸,不会实时的进行更新
- 方案二:编写js代码
- 如果希望实时改变屏幕尺寸时,font-size也可以实时更改,可以通过js代码
- 方法:
- 1.根据html的宽度计算出font-size的大小,并且设置到html上
- 2.监听页面的实时改变,并且重新设置font-size的大小到html上
- 方案三:lib-flexible库
- 事实上,lib-flexible库做的事情是相同的,你也可以直接引入它
rem的单位换算
- 方案一:手动换算
- 比如有一个在375px屏幕上,100px宽度和高度的盒子
- 我们需要将100px转成对应的rem值
- 100/37.5=2.6667,其他也是相同的方法计算即可
- 方案二:less/scss函数
- 方案三:postcss-pxtorem
- 目前在前端的工程化开发中,我们可以借助于webpack的工具来完成自动的转化
npm install postcss-pxtorem
- 方案四:VSCode插件
- px to rem 的插件,在编写时自动转化
2.2.2 vw 适配方案
1vw等于屏幕的1%,vw我们只面临一个问题:将尺寸换算成vw的单位即可
vw相比于rem的优势:
- 优势一:不需要去计算html的font-size大小,也不需要给html设置这样一个font-size
- 优势二:不会因为设置html的font-size大小,而必须给body再设置一个font-size,防止继承
- 优势三:因为不依赖font-size的尺寸,所以不用担心某些原因html的font-size尺寸被篡改,页面尺寸混乱
- 优势四:vw相比于rem更加语义化,1vw刚才是1/100的viewport的大小
- 优势五:可以具备rem之前所有的优点
vw 的单位换算
- 方案一:手动换算
- 比如有一个在375px屏幕上,100px宽度和高度的盒子
- 我们需要将100px转成对应的vw值
- 100/3.75=26.667,其他也是相同的方法计算即可
- 方案二:less/scss函数
- 方案三:postcss-px-to-viewport-8-plugin
- 和rem一样,在前端的工程化开发中,我们可以借助于webpack的工具来完成自动的转化
npm install postcss-px-to-viewport-8-plugin
- 方案四:VSCode插件
- px to vw 的插件,在编写时自动转化