适配:在不同尺寸的手机设备上,页面相对性的达到合理的展示(自适应)或者保持统一效果的等比缩放

适配的元素:

1.字体

2.宽高

3.间距

4.图像(图标、图片)

 

适配的方式:
1、百分比适配方式:

根据父级算百分比,需配合其他布局使用

 例:

四个div 设置高度后,四份div平分,各占25%

 

2、viewport缩放适配

把所有机型的css像素设置成一致的

这个方案是以375为标准,对大屏不友好,有弊端

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <meta name="viewport" content="width=device-width, initial-scale=1,user-scalable=no,
 6     minimum-scale=1,maximum-scale=1" id="view">
 7     <title>Document</title>
 8     <style>
 9         body {
10             margin: 0;
11 
12         }
13 
14         .box div {
15             width: 93.75px;
16             height: 100px;
17             float: left;
18         }
19 
20         .box div:nth-child(1) {
21             background: red
22         }
23 
24         .box div:nth-child(2) {
25             background: blue
26         }
27 
28         .box div:nth-child(3) {
29             background: yellowgreen
30         }
31 
32         .box div:nth-child(4) {
33             background: pink
34         }
35     </style>
36     <script>
37         (function(){
38             // 获取css像素值(也就是获取html的宽) (前提是viewport没缩放)三种方法:
39             var curWidth = document.documentElement.clientWidth;
40             var curWidth = window.innerWidth;
41             var curWidth = window.screen.width;
42 
43             // 声明一个目标值
44             var targetWidth = 375; //是iphon6的像素值
45 
46             //缩放比
47             var scale = curWidth/targetWidth;
48             
49             //选择meta标签中的内容 view.content 再改变缩放比
50             var view = document.getElementById('view');
51             
52             view.content = 'initial-scale='+scale+',user-scalable = no, minimum-scale='+scale+',maximum-scale='+scale+''
53             console.log(view.content)
54         })();
55     </script>
56 </head>
57 
58 <body>
59     <img src="./images/123.jpg" alt="">
60     <div class="box">
61         <div></div>
62         <div></div>
63         <div></div>
64         <div></div>
65     </div>
66 </body>
67 
68 </html>

3、DPR缩放适配

 把css像素缩放成与设备像素一样大的尺寸

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 
 4 <head>
 5     <meta charset="UTF-8">
 6     <!-- <meta name="viewport" content="width=device-width, initial-scale=1,user-scalable=no,
 7     minimum-scale=1,maximum-scale=1" id="view"> -->
 8     <title>Document</title>
 9     <style>
10         body {
11             margin: 0;
12 
13         }
14 
15         .box div {
16             width: 25%;
17             height: 100px;
18             float: left;
19         }
20 
21         .box div:nth-child(1) {
22             background: red
23         }
24 
25         .box div:nth-child(2) {
26             background: blue
27         }
28 
29         .box div:nth-child(3) {
30             background: yellowgreen
31         }
32 
33         .box div:nth-child(4) {
34             background: pink
35         }
36     </style>
37     <script>
38         (function () {
39             // 获取元素
40             var meta = document.querySelector('meta[name="viewport"]');
41             var scale = 1 / window.devicePixelRatio; //  1/dpr
42             if (!meta) {
43                 // 这个条件成立说明用户没写meta标签,需要创建一个
44                 meta = document.createElement('meta');
45                 meta.name = 'viewport';
46                 // 此时不需要去掉width=device-width,因为物理像素大于css像素,取宽度会取大的值,initial-scale大,
47                 //  所以width=device-width可以不去掉
48                 meta.content = 'width=device-width, initial-scale=' + scale + ',user-scalable=no,minimum-scale=' + scale + ',maximum-scale=' + scale + ''
49                 document.head.appendChild(meta);
50             } else {
51                 meta.setAttribute('content', 'width=device-width, initial-scale=' + scale + ',user-scalable=no,minimum-scale=' + scale + ',maximum-scale=' + scale + '')
52             }
53         })();
54     </script>
55 </head>
56 <body>
57     <div class="box">
58         <div></div>
59         <div></div>
60         <div></div>
61         <div></div>
62     </div>
63 </body>
64 </html>

4、rem 适配 (主流)

把所有的设备都分成相同的若干份,再计算元素宽度所占的份数

 

em:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 
 4 <head>
 5     <meta charset="UTF-8">
 6     <meta name="viewport" content="width=device-width, initial-scale=1,user-scalable=no,
 7     minimum-scale=1,maximum-scale=1" id="view">
 8     <title>Document</title>
 9     <style>
10         .em{
11            font-size:20px;
12         }
13         .em p{
14            font-size:2em;   /*  1em = 20px */
15         }
16     </style>    
17 </head>
18 <body>
19     <!--  em   作为font-size的单位时,其代表父元素的字体大小,作为其他属性单位时,代表自身字体大小 
20                    font-size:20px   1em:20px
21                    问题:
22                    1.Chrome 下有最小字体限制,必须为12px,所以这个值不能小于12
23                    2.如果两个一样的元素,但是里面字体不一样,那就不能统一设置了,或者元素字体变化了,
24                    就又要统一设置一遍
25          rem    css3新增的一个相对单位, 是相对于根元素字体大小;
26                 r  root 
27                 html(font-size:20px)    2rem=40px
28     -->
29      <div class="em">
30          <p>em-放到了房间</p>
31      </div>
32 </body>
33 </html>

rem:

em和rem最终都会转成px

rem适配原理:
把所有设备都分成相同的若干份,再计算元素宽度所占的份数

 给所有设备设置根节点字体大小(html),根节点字体大小是根据屏幕尺寸决定的,通过rem适配,根节点字体大小不能给定值,要根据设备的大小

如何设置html的font-size:

第二种方法:(比较靠谱)