Css 媒体查询 移动端适配

Css 媒体查询 移动端适配

八月 08, 2020

媒体查询

媒体查询可以根据设备显示器的特性(如视口宽度、屏幕比例、设备方向:横向或纵向)为其设定 CSS 样式。使用媒体查询,可以在不改变页面内容的情况下,为特定的一些输出设备定制显示效果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
语法:
媒体查询包含一个可选的媒体类型和零个或多个满足CSS3规范的表达式.

@media mediatype and|not|only  (media feature) {CSS-Code;}


媒体设备类型:

all:用于所有设备--默认值
print:用于打印机和打印预览
screen:用于电脑屏幕,平板电脑,智能手机等(前端写这个就好了)
speech:应用于屏幕阅读器等发声设备


媒体属性:
max-height:定义输出设备中的页面最大可见区域高度。
max-width:定义输出设备中的页面最大可见区域宽度。
min-height:定义输出设备中的页面最小可见区域高度。
min-width:定义输出设备中的页面最小可见区域宽度。
width:定义输出设备中的页面可见区域宽度。
height:定义输出设备中的页面可见区域高度。
orientation:定义输出设备中的页面是横屏还是竖屏。
landscape横屏 portrait竖屏
max-device-height:定义输出设备的屏幕可见的最大高度。
max-device-width:定义输出设备的屏幕最大可见宽度。
min-device-width:定义输出设备的屏幕最小可见宽度。
min-device-height:定义输出设备的屏幕的最小可见高度。
device-height:定义输出设备的屏幕可见高度。
device-width:定义输出设备的屏幕可见宽度。


操作符not、and、only和逗号(,)可以用来构建复杂的媒体查询

(1)and 关键字用来把多个媒体属性和媒体类型组合成一条媒体查询,只有当每个属性都为真时,结果才为真。
@media all and (min-width: 700px) and (orientation: landscape) { ... }
在可视区域宽度不小于700像素并在在横屏时有效

(2)逗号: 媒体查询中使用逗号分隔,效果等同于 or 逻辑操作符,使用逗号分隔的媒体查询,任何一个媒体查询返回真,样式就是有效的。逗号分隔的列表中每个查询都是独立的,一个查询中的操作符并不影响其它的媒体查询。
@media all and (min-width: 700px),handheld and (orientation: landscape) { ... }

(3)not 关键字用来对一条媒体查询的结果进行取反,在媒体查询为假时返回真,在逗号媒体查询列表中 not 仅会否定它应用到的媒体查询上而不影响其它的媒体查询
例如:
@media not screen and (color), print and (color)
等价于:
@media (not (screen and (color))), print and (color)

(4)only关键字用来排除不支持css3媒体查询的浏览器。
对于支持Media Queries的设备来说,存在only关键字,移动设备的 Web 浏览器会忽略only关键字并直接根据后面的表达式应用样式文件。对于不支持Media Queries的设备但能够读取Media Type类型的Web浏览器,遇到only关键字时会忽略这个样式文件
所以,在使用媒体查询时,only最好不要忽略

css2,css3的版本媒体查询的区别:
一般认为媒体查询是CSS3的新增内容,实际上CSS2已经存在了,CSS3新增了媒体属性和使用场景(IE8-浏览器不支持)
在CSS2中,媒体查询只使用于<style>和<link>标签中,以media属性存在media属性用于为不同的媒介类型规定不同的样式,媒体属性是CSS3新增的内容;
<link rel="stylesheet" href="css/wide.css" media="screen " />
<link rel="stylesheet" href="css/mobile.css" media="screen and (min-width:320px) and (max-width:640px)" />

常见适配范围

1
2
3
4
5
6
7
8
9
10
/* 手机等小屏幕手持设备 */
@media screen and (min-width: 320px) and (max-width: 480px) {}
/* 平板之类的宽度 1024 以下设备 */
@media only screen and (min-width: 321px) and (max-width: 1024px) {}
/* PC客户端或大屏幕设备: 1028px 至更大 */
@media only screen and (min-width: 1029px) {}
/* 竖屏 */
@media screen and (orientation:portrait) {对应样式}
/* 横屏 */
@media screen and (orientation:landscape){对应样式}

视口-viewport

1
2
3
4
5
6
7
8
9
10
11
12
13
14
许多智能手机都使用了一个比实际屏幕尺寸大很多的虚拟可视区域(980px),主要目的就是让pc页面在智能手机端阅读时不会因为实际可视区域变形。所以你看到的页面还是普通样式,即一个全局缩小后的页面。为了让智能手机能根据媒体查询匹配对应样式,让页面在智能手机中正常显示,特意添加了一个meta标签。这个标签的主要作用就是让智能手机浏览页面时能进行优化,并且可以自定义界面可视区域的尺寸和缩放级别。

语法:
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
属性值:
width:可视区域的宽度,值可为数字或关键词device-width;
height:可视区域的高度,值可为数字或关键词device-height;
initial-scale:页面首次被显示时的缩放级别(0-10.0),取值为1时页面按实际尺寸显示,无任何缩放
minimum-scale:设定最小缩小比例(0-10.0),取值为1时将禁止用户缩小至实际尺寸之下
maximum-scale:设定最大放大比例(0-10.0),取值为1时将禁止用户放大至实际尺寸之上
user-scalable:设定用户是否可以缩放(yes/no)

含义为:宽为手机移动设备默认宽度,初始缩放比例为1.0,最大缩放比例为原始像素大小,不允许用户放大或者缩小;

CSS3 单位

1
2
3
4
5
6
7
8
9
10
11
12
相对单位:
em:表示相对于应用在当前元素的字体尺寸;
ex: 表示英文字母小x的高度
ch: 数字0的宽度
rem: 根元素(html)的font-size
vw: viewpoint width,视窗宽度,1vw=视窗宽度的1%
vh: viewpoint height,视窗高度,1vh=视窗高度的1%
vmin: vw和vh中较小的那个。
vmax: vw和vh中较大的那个。
px: 编程中使用的开发单位;

绝对单位:cm mm in pt pc px

分辨率,PPi,DPI,DPR,物理像素,逻辑像素区别

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1、屏幕尺寸:指的是屏幕对角线的长度(1英寸 = 2.54 厘米)

2、分辨率:是指宽度上和高度上最多能显示的物理像素点个数

3、点距:像素与像素之间的距离,点距和屏幕尺寸决定了分辨率大小

4、PPI:屏幕像素密度,即每英寸(1英寸=2.54厘米)聚集的像素点个数,这里的一英寸还是对角线长度;
手机屏幕距离你的眼睛10-12英寸(约25-30厘米)时,它的分辨率只要达到300PPI这个神奇数字(每英寸300个像素点)以上,你的视网膜就无法分辨出像素点了,这样的屏幕被称为“视网膜屏幕”-Retina

5、DPI:每英寸像素点,印刷行业术语。对于电脑屏幕而言和PPI是一个意思

6、设备像素(又称为物理像素): 指设备能控制显示的最小物理单位,意指显示器上一个个的点。

7、设备独立像素(也叫密度无关像素或逻辑像素):可以认为是计算机坐标系统中得一个点,这个点代表一个可以由程序使用的虚拟像素(比如: css像素),这个点是没有固定大小的,然后由相关系统转换为物理像素。

8、DPR(设备像素比):设备像素比 = 设备像素 / 逻辑像素。(在Retina屏的iphone上,DPR为2,1个css像素相当于2个物理像素)
window.devicePixelRatio

其他设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
忽略Android平台中对邮箱地址的识别
<meta name="format-detection" content="email=no" />

iPhone会将看起来像电话号码的数字添加电话连接,应当关闭(可选yes no)
<meta name="format-detection" content="telephone=no" />

当网站添加到主屏幕快速启动方式,可隐藏地址栏,仅针对ios的safari
<meta name="apple-mobile-web-app-capable" content="yes" />

在web app应用下状态条(屏幕顶部条)的颜色;
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
默认值:default(白色)
black(黑色)
black-translucent(灰色半透明)。

网站开启对web app程序的支持
<meta name="apple-mobile-web-app-capable" content="yes" />

添加到主屏幕后,全屏显示
<meta name="apple-touch-fullscreen" content="yes">

就是删除默认的苹果工具栏和菜单栏
<meta name="apple-mobile-web-app-capable" content="yes" />
content有两个值”yes”和”no”,当需要显示工具栏和菜单栏时,这个行meta就不用加了,默认就是显示。

应用信息,保留系统历史记录,运动效果
<meta name=”App-Config” content=”fullscreen=yes,useHistoryState=yes,transition=yes”/>

xx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1. pt 即 point:有两个含义:

一是印刷行业常用单位,是一个标准长度单位,绝对大小,1pt = 1/72 英寸 = 0.35mm;

二是 iOS 开发用的基本单位;


2. dp (也称 dip)

dp 是安卓开发用的基准单位,在 dpi (屏幕像素密度,即每英寸包含的像素点) 为 160 的屏幕为上,1dp = 1px。为了简单起见,Android 把屏幕密度分为了 5 种:mdpi、hdpi、xhdpi、xxhdpi、xxxhdpi;


3. sp (可缩放独立像素)

在安卓系统里,sp 与 dp 类似,不同的是 sp 可以根据用户的字体大小首选项进行缩放,而 dp 则不会。 尽量使用 dp 作为空间大小单位,sp 作为文字相关大小单位。

媒体查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
@media screen and (min-width: 320px) {
html {
font-size: 42.66666666px;
}
}
@media screen and (min-width: 360px) {
html {
font-size: 48px;
}
}
@media screen and (min-width: 375px) {
html {
font-size: 50px;
}
}
@media screen and (min-width: 384px) {
html {
font-size: 51.2px;
}
}
@media screen and (min-width: 400px) {
html {
font-size: 53.33333334px;
}
}
@media screen and (min-width: 414px) {
html {
font-size: 55.2px;
}
}
@media screen and (min-width: 424px) {
html {
font-size: 56.53333334px;
}
}
@media screen and (min-width: 480px) {
html {
font-size: 64px;
}
}
@media screen and (min-width: 540px) {
html {
font-size: 76px;
}
}
@media screen and (min-width: 720px) {
html {
font-size: 96px;
}
}
@media screen and (min-width: 750px) {
html {
font-size: 100px;
}
}

js 动态改变 html 的 font-size

除了媒体查询,还可以用 js 来改变 html 根元素的 font-size,下面写了 rem.js 逻辑,需要全局引用

1
2
3
4
5
6
7
8
9
10
11
// rem.js
//todo 配置移动端自适应
function font() {
document.documentElement.style.fontSize =
document.documentElement.clientWidth / 3.75 + "px";
}

font();

//todo 当我们浏览器的窗口发生改变时,重新计算尺寸
window.onresize = font;

移动端常用 meta 标签

参考的博客链接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<meta
name="viewport"
content="width=device-width, initial-scale=1, user-scalable=no"
/>
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
<meta name="format-detection" content="telephone=no, email=no" />
<meta
name="viewport"
content="width=device-width, initial-scale=1, user-scalable=no"
/>
<meta
name="apple-mobile-web-app-capable"
content="yes"
/><!-- 删除苹果默认的工具栏和菜单栏 -->
<meta
name="apple-mobile-web-app-status-bar-style"
content="black"
/><!-- 设置苹果工具栏颜色 -->
<meta
name="format-detection"
content="telphone=no, email=no"
/><!-- 忽略页面中的数字识别为电话,忽略email识别 -->
<!-- 启用360浏览器的极速模式(webkit) -->
<meta name="renderer" content="webkit" />
<!-- 避免IE使用兼容模式 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<!-- 针对手持设备优化,主要是针对一些老的不识别viewport的浏览器,比如黑莓 -->
<meta name="HandheldFriendly" content="true" />
<!-- 微软的老式浏览器 -->
<meta name="MobileOptimized" content="320" />
<!-- uc强制竖屏 -->
<meta name="screen-orientation" content="portrait" />
<!-- QQ强制竖屏 -->
<meta name="x5-orientation" content="portrait" />
<!-- UC强制全屏 -->
<meta name="full-screen" content="yes" />
<!-- QQ强制全屏 -->
<meta name="x5-fullscreen" content="true" />
<!-- UC应用模式 -->
<meta name="browsermode" content="application" />
<!-- QQ应用模式 -->
<meta name="x5-page-mode" content="app" />
<!-- windows phone 点击无高光 -->
<meta name="msapplication-tap-highlight" content="no" />
<!-- 适应移动端end -->