由于移动端浏览器的发展比较晚,所以主流移动端浏览器的内核都是基于 Webkit 内核打造的。
我们在进行移动端的页面开发时,兼容性主要考虑 Webkit 内核。
目前无论是 安卓 还是 IOS,移动端设备的屏幕尺寸非常多,碎片化非常严重。
但是,前端页面开发者无需关注这些分辨率,因为我们常用的尺寸单位是 px。
目前移动端的屏幕尺寸非常多,并且随着发展还会越来越多。
但是,对于移动端的 Web 开发来说,我们不用考虑太多。
对于专门的 安卓 和 IOS 开发,才需要特别关注 dp、dpi、pt、ppi 等单位。
视口(viewport):浏览器显示页面内容的屏幕区域。
视口的分类:布局视口、视觉视口、理想视口。
发明者:史蒂夫·乔布斯
meta 视口标签通知浏览器操作meta 视口标签的主要目的:布局视口的宽度应该与理想视口的宽度一致,简单理解就是设备有多宽,我们布局的视口就有多宽。移动端 web 开发就是开发理想视口!
meta 视口标签 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no">
name=“视口”
content=“内容中包含若干个属性,用逗号隔开”
| 属性 | 解释说明 |
|---|---|
width | 宽度设置的是 viewport 宽度,我们设置为 device-width “设备宽度” 特殊值 |
initial-scale | 初始缩放比,大于 0 的数字,一般来说是设置为 1:1 即:1.0 |
maximum-scale | 最大缩放比,大于 0 的数字 |
minimum-scale | 最小缩放比,大于 0 的数字 |
user-scalable | 用户是否可以缩放,yes 或 no(1或0),一般来说是 no |
device-width1.0no1.01.0物理像素比 = 物理像素(分辨率) / 独立像素(CSS像素)
例如:iPhone X 的物理像素比为 3
| 屏幕尺寸 | 独立像素(CSS像素) | 物理像素(分辨率) | ppi/dpi(像素密度) | dpr(倍图) |
|---|---|---|---|---|
| 5.8英寸 | 812×375 | 2436×1125 | 458 | 3 |
物理像素比提出的原因:

常见 iPhone 设备屏幕参数:
| 设备 | 物理分辨率 | 开发分辨率 | 物理像素比(dpr) |
|---|---|---|---|
| iPhone13 Pro Max、12 Pro Max | 1284 * 2778 | 428 * 926 | 3 |
| iPhone 13\13 Pro、12\12 Pro | 1170 * 2532 | 390 * 844 | 3 |
| iPhone 13 mini、12 mini | 1080 * 2340 | 375 * 812 | 2.88(3) |
| iPhone 11 Pro Max、XS Max | 1242 * 2688 | 414 * 896 | 3 |
| iPhone X、XS、11 Pro | 1125 * 2436 | 375 * 812 | 3 |
| iPhone XR、11 | 828 * 1792 | 414 * 896 | 2 |
| iPhone 8 Plus | 1080 * 1920 | 414 * 736 | 2.6(3) |
| iPhone 8、SE | 750 * 1334 | 375 * 667 | 2 |
常见 iPad 设备屏幕参数:
| 设备 | 物理分辨率 | 开发分辨率 | 物理像素比(dpr) |
|---|---|---|---|
| iPad Pro 12.9 | 2048 * 2732 | 1024 * 1366 | 2 |
| iPad Pro 11 | 1668 * 2388 | 834 * 1194 | 2 |
| iPad mini 8.3 | 1488 * 2266 | 744 * 1133 | 2 |
随着移动智能设备屏幕素质的不断提高,目前手机一般都统一使用 3 倍图,平板电脑使用 2 倍图。
电脑-显示器多倍图说明
目前由于电脑显示器的素质也越来越高(尤其是笔记本电脑),2K屏、3K屏、4K屏、5K屏、6K屏 已经在不断普及,所以其实电脑端的也已经存在多倍图的应用了。
比如 Macbook Pro 16 M1 Pro/Max:物理分辨率(3456 * 2234)开发分辨率(1728 * 1117)2倍图
当然电脑端用户都能够方便的设置屏幕显示的缩放比,当缩放比为100%时就为1倍图,但目前的电脑端显示器大多已经默认为 125%、150%、175%、200% 缩放比。
故,在未来多倍图的运用将会越来越必要!
认识了缩放,就能合理的解释:为什么在电脑上设置了一个 100 * 100 的 div 盒子,而在浏览器上用测量工具测量像素长度时,却为 150 * 150,因为此时电脑显示器为 150% 的缩放比,只要我们将其改为 100%,就能得到我们想要的效果了。
50px * 50px 的图片,在手机 Retina 屏中打开,按照刚才的物理像素比会放大倍数,这样会造成图片模糊(比如:3倍图手机中,50 * 50 实际上是 150 * 150 个像素在显示) /* 在 iphone8 下面 */
img {
/* 原始图片100*100px */
width: 50px;
height: 50px;
}
.box {
/* 原始背景图片100*100px */
background-size: 50px 50px;
}
案例:
doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>03-二倍图做法title>
<style>
/* 我们需要一个50*50像素(css像素)的图片,直接放到我们的iphone8里面会放大2倍100*100就会模糊 */
/* 我们采取的是放一个100*100图片,然后手动的把这个图片缩小为50*50(css像素)*/
/* 我们准备的图片比我们实际需要的大小大2倍,这就方式就是2倍图 */
img:nth-child(2) {
width: 50px;
height: 50px;
}
style>
head>
<body>
<img src="images/apple50.jpg" alt="">
<img src="images/apple100.jpg" alt="">
body>
html>
手机模拟效果:
【附:二倍精灵图做法】
background-size 属性规定背景图像的尺寸
background-size: 背景图片宽度 背景图片高度;
注意:
【cover & contain 案例】

cover 案例:
background-size: cover;

contain 案例:
background-size: contain;

当图片是竖直放置时:

【背景缩放案例】
doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>05-背景图片2倍图title>
<style>
/* 1. 我们有一个50*50的盒子需要一个背景图片,但是根据分析这个图片还是要准备2倍,100*100 */
/* 2. 我们需要把这个图片缩放一半,也就是 50*50 background-size*/
div {
width: 50px;
height: 50px;
border: 1px solid red;
background: url(images/apple100.jpg) no-repeat;
background-size: 50px 50px;
}
style>
head>
<body>
<div>div>
body>
html>

一次性导出多种倍数的图片。
(1)单独制作移动端页面【主流】
(2)响应式页面兼容移动端【其次】
通常情况下,网址域名前面加 m(mobile) 可以打开移动端。通过判断设备,如果是移动设备打开,则跳到移动端页面。
通过判断浏览器窗口宽度来改变样式,以适应不同终端。
缺点:制作麻烦,需要花很大精力去调兼容性问题。
现在市场常见的移动端开发有单独制作移动端页面和相应式页面两种方案。
现在市场主流的选择还是单独制作移动端页面。
webkit 内核为主,因此我们就考虑 webkit 兼容性问题webkit 即可移动端 CSS 初始化推荐使用 normalize.css/
官网地址:http://necolas.github.io/normalize.css/
也就是说,我们的 CSS3 中的盒子模型,padding 和 border 不会撑大盒子了
/* CSS3盒子模型 */
box-sizing: border-box;
/* 传统盒子模型 */
box-sizing: content-box;
传统 or CSS3盒子模型?
案例:
doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>06-CSS3盒子模型title>
<style>
div:nth-child(1) {
/* 传统盒子模型= width + border + padding */
width: 200px;
height: 200px;
background-color: pink;
padding: 10px;
border: 10px solid red;
box-sizing: content-box;
}
div:nth-child(2) {
/* 有了这句话就让盒子变成CSS3盒子模型 */
/* padding 和 border 不会再撑大盒子了 */
box-sizing: border-box;
width: 200px;
height: 200px;
background-color: purple;
padding: 10px;
border: 10px solid blue;
}
style>
head>
<body>
<div>div>
<div>div>
body>
html>


/* CSS3盒子模型 */
box-sizing: border-box;
-webkit-box-sizing: border-box; /* 浏览器前缀兼容老版本浏览器 */
/* 移动端中某些地方点击会高亮,我们一般需要清除,设置 transparent 完成透明 */
/* 说明:比如 a链接 在移动端默认点击时会有一个背景颜色高亮 */
-webkit-tap-highlight-color: transparent;
/* 比如可以这样: */
* {
-webkit-tap-highlight-color: transparent;
}
/* 移动端浏览器默认的外观在 iOS 上加上这个属性才能给按钮和输入框自定义样式 */
-webkit-appearance: none;
/* 比如可以这样: */
input {
-webkit-appearance: none;
}
/* 禁用长按页面时的弹出菜单 */
-webkit-touch-callout: none;
/* 此处以 img 及 a 为例子 */
img, a { -webkit-touch-callout: none; }
【移动端技术选型】
移动端布局和以前我们学习的PC端有所区别:
(1)单独制作移动端页面【主流】
(2)响应式页面兼容移动端【其次】
max-width 最大宽度(max-height 最大高度)min-width 最小宽度(min-height 最小高度)案例:
doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>08-流式布局title>
<style>
* {
margin: 0;
padding: 0;
}
section {
width: 100%;
max-width: 980px;
min-width: 320px;
margin: 0 auto;
}
section div {
float: left;
width: 50%;
height: 400px;
}
section div:nth-child(1) {
background-color: pink;
}
section div:nth-child(2) {
background-color: rgb(0, 0, 0);
}
style>
head>
<body>
<section>
<div>div>
<div>div>
section>
body>
html>


可以看到,当页面宽度变化时,搜索框会同步变宽,但是左右两边的按钮是不会变化的,实现这个功能的原理是:

代码:
<div class="search-wrap">
<div class="search-btn">div>
<div class="search">
<div class="jd-icon">div>
<div class="sou">div>
div>
<div class="search-login">登陆div>
div>
.search-wrap {
position: fixed;
overflow: hidden;
width: 100%;
height: 44px;
min-width: 320px;
max-width: 640px;
}
.search-btn {
position: absolute;
top: 0;
left: 0;
width: 40px;
height: 44px;
}
.search-btn::before {
content: "";
display: block;
width: 20px;
height: 18px;
background: url(../images/s-btn.png) no-repeat;
background-size: 20px 18px;
margin: 14px 0 0 15px;
}
.search-login {
position: absolute;
right: 0;
top: 0;
width: 40px;
height: 44px;
color: #fff;
line-height: 44px;
}
.search {
position: relative;
height: 30px;
background-color: #fff;
margin: 0 50px;
border-radius: 15px;
margin-top: 7px;
}
.jd-icon {
width: 20px;
height: 15px;
position: absolute;
top: 8px;
left: 13px;
background: url(../images/jd.png) no-repeat;
background-size: 20px 15px;
}
.jd-icon::after {
content: "";
position: absolute;
right: -8px;
top: 0;
display: block;
width: 1px;
height: 15px;
background-color: #ccc;
}
.sou {
position: absolute;
top: 8px;
left: 50px;
width: 18px;
height: 15px;
background: url(../images/jd-sprites.png) no-repeat -81px 0;
background-size: 200px auto;
}
图片底部默认会带有一个空白,所以通常在开发中会设置:
img {
vertical-align: top; /* 去掉图片底部空白 */
}
firework 里面把精灵图等比例缩放为原来的一半情况一

这里 JD 与 搜索按钮之间有一个 |,之前我们使用盒子模型的右边框来实现,但是这里使用边框并不是一个好的选择,原因有二:
解决方法:利用伪元素法
.jd-icon::after {
content: "";
position: absolute;
right: -8px;
top: 0;
display: block;
width: 1px;
height: 15px;
background-color: #ccc;
}
情况二

这里的一排盒子用百分比布局,所以如果我们利用伪元素法加竖线的话,整体的大小加起来就大于 100% 了,所以最优的解法为直接给盒子加边框,但是加边框后盒子就变大了,所以正确的做法是先设置 CSS3 盒子模型,然后再设置边框就可以了。
附:CSS3 盒子模型 box-sizing: border-box;