移动布局基础
约 5598 字大约 19 分钟
2026-04-04
移动开发基础
浏览器现状
| pc端 | 移动端 |
|---|---|
| 360 谷歌 火狐 百度 搜狗 IE | UC 欧朋 百度 360 谷歌 搜狗 猎豹 |
国内的UC,QQ,百度等都是根据Webkit修改过来的内核,暂无自主研发的内核
手机屏幕
碎片化严重
https://material.io/devices/
移动端调试方法
- Chrome DevTools(谷歌浏览器)的模拟手机调试
- 搭建本地Web服务器,手机和服务器一个局域网内,通过手机访问服务器
- 使用外网服务器,直接IP或域名访问
视口
视口(viewport)浏览器显示页面内容的屏幕区域。可分为布局视口、视觉视口、理想视口
布局视口 layout viewport
- 移动设备浏览器默认设置了一个布局视口,用于解决早期PC端页面在手机上显示的问题
- IOS,Android基本都将这个视口设置为980px,PC上的网页大多都能在手机上呈现,但是元素看起来小,默认通过手动缩放网页
视觉窗口 visual viewport
- 用户正在看到的网站的区域
- 可以通过缩放去操作视觉窗口,但不会影响布局视口,布局视口仍保持原来的宽度
理想视口 ideal viewport
- 为了使网站在移动端有最理想的浏览和阅读宽度而设定
- 对设备来说,是最理想的视口尺寸
- 需要手动添加meta视口标签通知浏览器操作
- meta视口标签的主要目的:布局视口的宽度应该与理想视口的宽度一致(设备多宽,布局视口就有多宽)
meta视口标签
<meta name="viewport" content="width=device-width, user-scalable=0, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">| 属性 | 解释说明 |
|---|---|
| width | 宽度设置的是viewport宽度,可以设置device-width特殊值 |
| initial-scale | 初始缩放比,大于0的数字 |
| maximum-scale | 最大缩放比,大于0的数字 |
| minimum-scale | 最小缩放比,大于0的数字 |
| user-scalable | 用户是否可以缩放,yes或no(1或0) |
二倍图
物理像素 & 物理像素比
- 物理像素点指的是屏幕显示的最小颗粒,是物理真实存在的。厂商出厂设置,苹果6/7/8是 750*1334
- 开发时1px不一定等于1个物理像素
- PC端页面,1px等于1个物理像素,移动端不同
- 一个px能显示的物理像素点的个数,称为物理像素比或屏幕像素比
- PC端和早前的手机屏幕/普通手机屏幕:1CSS像素=1物理像素
- Retina(视网膜屏幕)一种显示技术,可以将更多的物理像素点压缩至一块屏幕里,从而达到更高的分辨率,并提高屏幕显示的细腻程度
多倍图
对于一张50px * 50px 的图片,在手机Retina屏中打开,物理像素会放大倍数,造成图片模糊
在标准的viewport设置中,使用倍图来提高图片质量,解决在高清设备中的模糊问题
通常使用二倍图,还存在3、4倍图,要看实际需求
背景图片注意缩放问题
img {
/* 原始图片100px*100px */
width: 50px;
height: 50px;
}
.box {
/* 原始图片100px*100px */
background-size: 50px 50px;
}cutterman切出多倍图
二倍精灵图
(1)在firework把精灵图等比例缩放为原来的一半
(2)根据大小测量坐标
(3)background-size: 精灵图原来宽度的一半
背景缩放 background-size
规定背景图像的尺寸
background-size: 背景图片宽度 背景图片高度;单位:长度|百分比|cover|contain
cover把背景图像扩展至足够大,以使背景图像完全覆盖背景区域
contain把背景图像扩展至最大尺寸,以使其宽度和高度完全适应内容区域
移动开发选择
单独制作移动端页面
网址域名前面加m(mobile)可以打开移动端。通过判断设备,如果是移动端,则调到移动端界面
响应式页面兼容移动端
三星电子官网:www.samsung.com/cn/,通过判断屏幕宽度来改变样式,以适应不同终端
移动端技术解决方案
移动端浏览器基本以Webkit内核为主,可使h5标签和css3样式
浏览器私有前缀只考虑添加webkit
css初始化 normalize.css
移动端推荐使用
- 保护了有价值的默认值
- 修复了浏览器bug
- 模块化
- 拥有详细的文档
官网地址:http://necolas.github.io/normalize.css/ | https://github.com/necolas/normalize.css/
css盒子模型 box-sizing
传统模式宽度计算:width + border + padding
css3盒子模型:width里面包含border 和 padding
/* css3盒子模型 */
box-sizing: border-box;
/* 传统盒子模型 */
box-sizing: content-box;特殊样式
css3盒子模型
box-sizing: border-box;
-webkit-box-sizing: border-box;点击高亮需要清除 设置为transparent 透明
* {
-webkit-tap-highlight-color: transparent;
}在移动端浏览器默认的外观在ios上加上这个属性才能给按钮和输入框自定义样式
button,
input {
-webkit-appearance: none;
}禁用长按页面时的弹出菜单
img,
a {
-webkit-touch-callout: none;
}移动端技术选型
单独制作移动端页面
- 流式布局(百分比布局)
- flex弹性布局(推荐)
- less+rem+媒体查询布局
- 混合布局
响应式页面兼容移动端
- 媒体查询
- bootstarp
流式布局(百分比布局)
非固定像素布局-最常见布局
通过盒子的宽度设置成百分比来根据屏幕的宽度进行伸缩,不受固定像素的限制,内容向两侧填充
max-width 最大宽度(max-height 最大高度)
min-width 最小宽度(min-height 最小高度)
flex布局
操作方便,布局极其简单,移动端使用比较广泛
pc端浏览器支持情况比较差
IE11或更低版本不支持flex或仅支持部分
flex布局原理
flex 是 flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性,任何一个容器都可以指定为 flex 布局
当我们为父盒子设为 flex 布局以后,子元素的 float、clear 和 vertical-align 属性将失效
flex布局又叫伸缩布局 、弹性布局 、伸缩盒布局 、弹性盒布局
采用 Flex 布局的元素,称为 Flex 容器(flexcontainer),简称"容器"。它的所有子元素自动成为容器成员,称为 Flex 项目(flex item),简称"项目"
总结:就是通过给父盒子添加flex属性,来控制子盒子的位置和排列方式
父项常见属性
| flex-direction | 设置主轴的方向 |
|---|---|
| justify-content | 设置主轴上的子元素排列方式 |
| flex-wrap | 设置子元素是否换行 |
| align-content | 设置侧轴上的子元素的排列方式(多行) |
| align-items | 设置侧轴上的子元素排列方式(单行) |
| flex-flow | 复合属性,相当于同时设置了 flex-direction 和 flex-wrap |
flex-direction 设置主轴的方向
主轴与侧轴
在flex布局中,是分为主轴和侧轴两个方向,也称:行和列、x轴和y轴
- 默认主轴方向是x轴方向,水平向右
- 默认侧轴方向是y轴方向,水平向下

属性值
flex-direction属性决定主轴的方向(即项目的排列方向)
注意:主轴和侧轴是会变化的,就看flex-direction设置谁为主轴,剩下的就是侧轴。子元素是跟着主轴来排列的
| 属性值 | 说明 |
|---|---|
| row | 默认值从左到右 |
| row-reverse | 从右到左 |
| column | 从上到下 |
| column-reverse | 从下到上 |
justify-content 设置主轴上的子元素排列方式
此属性定义了项目在主轴上的对齐方式
注意:使用这个属性之前一定要确定好主轴是哪个
| 属性值 | 说明 |
|---|---|
| flex-start | 默认值 从头开始 如果主轴是x轴,则从左到右 |
| flex-end | 从尾部开始排列 |
| center | 在主轴居中对齐(如果主轴是x轴则 水平居中) |
| space-around | 平方剩余空间 |
| space-between | 先两边贴边 再平分剩余空间 |
flex-wrap 设置子元素是否换行
默认情况下,项目都排在一条线上(又称"轴线")上。flex-wrap属性定义,flex布局中默认是不换行的
| 属性值 | 说明 |
|---|---|
| nowrap | 默认值,不换行 |
| wrap | 换行 |
align-items 设置侧轴上的子元素排列方式(单行)
该属性是控制子项在侧轴(默认是y轴)上的排列方式 在子项为单项的时候使用
| 属性值 | 说明 |
|---|---|
| flex-start | 默认值 从上到下 |
| flex-end | 从下到上 |
| center | 挤在一起居中(垂直居中) |
| stretch | 拉伸 |
align-content 设置侧轴上的子元素的排列方式(多行)
设置子项在侧轴上的排列方式并且只能用于子项出现换行的情况(多行),在单行下没有效果
| 属性值 | 说明 |
|---|---|
| flex-start | 默认值在侧轴的头部开始排列 |
| flex-end | 在侧轴的尾部开始排列 |
| center | 在侧轴中间显示 |
| space-around | 子项在侧轴平分剩余空间 |
| space-between | 子项在侧轴先分布在两头,再平分剩余空间 |
| stretch | 设置子项元素高度平分父元素高度 |
flex-flow
该属性是 flex-direction 和 flex-wrap 属性的复合属性
Flex-flow: row wrap;子项常见属性
- flex子项目占的份数
- align-self控制子项自己在侧轴的排列方式
- order属性定义子项的排列顺序(前后顺序)
flex 属性
flex 属性定义子项目分配剩余空间,用flex来表示占多少份数
.item {
flex: <number>; /* 默认值 0 */
}align-self控制子项自己在侧轴上的排列方式
align-self 属性允许单个项目有与其他项目不一样的对齐方式,可覆盖 align-items 属性
默认值为 auto,表示继承父元素的 align-items 属性,如果没有父元素,则等同于 stretch
span:nth-child(2) {
/* 设置自己在侧轴上的排列方式 */
align-self: flex-end;
}order 属性定义项目的排列顺序
数值越小,排列越靠前,默认为0
注意:和 z-index 不一样
.item {
order: <number>;
}rem布局
rem基础
rem(root em)是一个相对单位,类似于em,em是父元素字体大小
不同的是rem的基准是相对于html元素的字体大小
根元素(html)设置font-size=12px;非根元素设置width:2rem;则换成px表示24px
/* 根html 为 12px */
html {
font-size: 12px;
}
/* 此时 div 的字体大小就是 24px */
div {
font-size: 2rem;
}rem的优势:父元素文字大小可能不一致, 但是整个页面只有一个html,可以很好来控制整个页面的元素大小
媒体查询 Media Query
使用 @media查询,可以针对不同的媒体类型定义不同的样式
@media可以针对不同的屏幕尺寸设置不同的样式
当重置浏览器大小时,页面也会根据浏览器的宽度和高度重新渲染页面
语法规范
@media mediatype and | not | only (media feature) {
css-code;
}- 用@media开头 注意 @符号
- mediatype 媒体类型
- 关键字 and not only
- media feature 媒体特性 必须有小括号包含
mediatype 查询类型
媒体类型:将不同的终端设置划分成不同的类型
| 值 | 解释说明 |
|---|---|
| all | 用于所有设备 |
| 用于打印机和打印预览 | |
| screen | 用于电脑屏幕,平板电脑,智能设备等 |
关键字
将媒体类型或多个媒体特性连接到一起作为媒体查询的条件
- and:可以将多个媒体特性连接到一起,"且"
- not:排除某个媒体特性,"非"
- only:指定某个特性的媒体类型,可省略
媒体特性
每种媒体类型都具有各自不同的特性,根据不同媒体特性设置不同的展示风格,要加小括号包含
| 值 | 解释说明 |
|---|---|
| width | 定义输出设备中页面可见区域的宽度 |
| min-width | 定义输出设备中页面最小可见区域宽度 |
| max-width | 定义输出设备中页面最大可见区域宽度 |
媒体查询书写规则
注意: 为了防止混乱,媒体查询我们要按照从小到大或者从大到小的顺序来写,但是我们最喜欢的还是从小到大来写,这样代码更简洁

rem实现元素动态大小变化
<style>
* {
margin: 0;
padding: 0;
}
.top {
height: 1rem;
font-size: 0.5rem;
background-color: #98C36E;
color: #fff;
font-weight: 700;
text-align: center;
line-height: 1rem;
}
@media screen and (min-width: 320px) {
html {
font-size: 50px;
}
}
@media screen and (min-width: 640px) {
html {
font-size: 100px;
}
.top {
background-color: sandybrown;
}
}
</style>
<body>
<div class="top">胡梓卓</div>
</body>

引入资源
当样式繁多的时候,可以针对不同的媒体使用不同的stylesheets(样式表)
语法规范
<link rel="stylesheet" href="index_1.css" media="mediatype and|not|only (media feature)">less基础
CSS 是一门非程序式语言,冗余度高,不利于扩展,复用,没有计算能力
less(leaner style sheets)一门css扩展语言(css预处理器)
在css基础上,引入变量,Mixin(混入),运算以及函数等功能,简化css编写,降低css维护成本
less中文网址:http://lesscss.cn
常见的css预处理器:sass、less、stylus
Less是一门css 预处理语言,扩展了css的动态特性
less安装
①安装nodejs,可选择版本(8.0),网址:http://nodejs.cn/download/
②检查是否安装成功,使用cmd命令(win10是window+r 打开运行输入cmd) ---输入“node –v”查看版本即可
③基于nodejs在线安装Less,使用cmd命令“npm install -g less”即可
④检查是否安装成功,使用cmd命令“ lessc -v ”查看版本即可

less使用
新建一个后缀名为less的文件,即可编写
把一个less样式文件导入到另一个less样式文件
@import "common";less变量
@变量名: 值;
@color: pink;
@font14: 14px;
body {
background-color: @color;
}
a {
font-size: @font14;
}变量命名规范
- 必须有@为前缀
- 不能包含特殊字符
- 不能以数字开头
- 大小写敏感
less编译
本质上,Less包含一套自定义的语法及一个解析器,用户根据这些语法定义自己的样式规则,这些规则会通过解析器,编译生成对应的css文件
需要把less文件,编译生成css文件,html页面才能使用
vscode Less 插件 -- easy less
ctrl+s保存自动把less文件自动编译为css文件
less嵌套
子元素的样式直接写到父元素里面
// 将css改为less
#header .logo {
width: 300px;
}
#header {
.logo {
width: 300px;
}
}如果遇见 (交集|伪类|伪元素选择器)
- 内层选择器的前面没有 & 符号,则它被解析为父选择器的后代
- 如果有 & 符号,它就被解析为父元素自身或父元素的伪类
a:hover{
color: red;
}
a{
&:hover{
color: red;
}
}less运算
任何数字、颜色或者变量都可以参与运算。就是Less提供了加(+)、减(-)、乘(*)、除(/)算术运算
注意:
- 运算符中间左右有个空格隔开 1px + 5
- 对于两个不同的单位的值之间的运算,运算结果的值取****第一个值的单位
- 如果两个值之间只有一个值有单位,则运算结果就取该单位
background-color: #666 - #222;
font-size: 12px - 2;
font-weight: 300 + @font-weight400;rem适配方案
技术方案

1.less+rem+媒体查询
总结:
①最后的公式:页面元素的rem值 = 页面元素值(px) / (屏幕宽度 / 划分的份数)
②屏幕宽度/划分的份数就是 htmlfont-size 的大小
③或者:页面元素的rem值 = 页面元素值(px) / html font-size 字体大小
2.lflexible.js+rem
github地址:https://github.com/amfe/lib-flexible
响应式布局
响应式开发原理
使用媒体查询针对不同宽度的设备进行布局和样式的设置,从而适配不同设备
设备划分
| 手机(超小) | < 768 |
|---|---|
| 平板(小屏) | >=768 < 992 |
| 桌面显示器(中屏) | >=992 <1000 |
| 大桌面显示器(宽屏) | >=1200 |
响应式布局容器
响应式需要一个父级做为布局容器,来配合子级元素来实现变化效果
原理就是在不同屏幕下,通过媒体查询来改变这个布局容器的大小,再改变里面子元素的排列方式和大小,从而实现不同屏幕下,看到不同的页面布局和样式变化
| 超小屏幕(手机,小于 768px) | 设置宽度为 100% |
|---|---|
| 小屏幕(平板,大于等于 768px) | 设置宽度为 750px |
| 中等屏幕(桌面显示器,大于等于 992px) | 宽度设置为 970px |
| 大屏幕(大桌面显示器,大于等于 1200px) | 宽度设置为 1170px |
快速开发-Bootstrap框架
Bootstrap 来自 Twitter(推特),是目前最受欢迎的前端框架。Bootstrap 是基于HTML、CSS 和 JAVASCRIPT 的,它简洁灵活,使得 Web 开发更加快捷
中文官网:http://www.bootcss.com/
官网:http://getbootstrap.com/
推荐使用:http://bootstrap.css88.com/
bootstrap使用
1.创建文件夹结构

2.创建html骨架结构
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<!--要求当前网页使用IE浏览器最高版本的内核来渲染-->
<meta name="viewport" content="width=device-width, initial-scale=1">
<!--视口设置:视口的宽度和设备一致,默认的缩放比例和PC端一致,用户不能自行缩放-->
<!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
<title>Bootstrap 101 Template</title>
<!-- Bootstrap -->
<link href="css/bootstrap.min.css" rel="stylesheet">
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="//cdn.bootcss.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<!--解决IE9以下浏览器对html5新增标签的不识别,并导致css不起作用的问题-->
<script src="//cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script>
<!--解决IE9以下浏览器对css3 Media Query的不识别-->
<![endif]-->
</head>
<body>
<h1>你好,世界!</h1>
<!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
<script src="//cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>
<!-- Include all compiled plugins (below), or include individual files as needed -->
<script src="js/bootstrap.min.js"></script>
</body>
</html>3.引入相关样式文件
<!-- Bootstrap 核心样式-->
<link rel="stylesheet" href="bootstrap/css/bootstrap.min.css">4.书写内容
直接拿Bootstrap 预先定义好的样式来使用
修改Bootstrap 原来的样式,注意权重问题
学好Bootstrap 的关键在于知道它定义了哪些样式,以及这些样式能实现什么样的效果
bootstrap布局容器
Bootstrap 需要为页面内容和栅格系统包裹一个 .container 或者.container-fluid 容器,它提供了两个作此用处的类
.container
- 响应式布局的容器 固定宽度
- 大屏 ( >=1200px) 宽度定为 1170px
- 中屏 ( >=992px) 宽度定为 970px
- 小屏 ( >=768px) 宽度定为 750px
- 超小屏 (100%)
.container-fluid
- 流式布局容器 百分百宽度
- 占据全部视口(viewport)的容器
bootstrap栅格系统
https://bootstrap.css88.com/css/
Bootstrap提供了一套响应式、移动设备优先的流式栅格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多12列
栅格选项参数
用于通过一系列的行(row)与列(column)的组合来创建页面布局,内容可放入创建好的布局中
| 超小屏幕(手机) <768px | 小屏设备(平板) >=768px | 中等屏幕(桌面显示器) >=992px | 宽屏设备(大桌面显示器) >=1200px | |
|---|---|---|---|---|
| .container 最大宽度 | 自动(100%) | 750px | 970px | 1170px |
| 类前缀 | .col-xs- | .col-sm- | .col=md- | .col=lg- |
| 列(column)数 | 12 | 12 | 12 | 12 |
- 行(row)必须放到container布局容器里面
- 实现列的平均划分 需要给列添加 类前缀
- xs-extra small:超小;sm-small:小;md-medium:中等;lg-large:大;
- 列(column)大于12,多余的“列(column)”所在的元素将作为一个整体另起一行排列
- 每一列默认有左右15像素的padding
- 可以同时为一列指定多个设备的类名,以便划分不同份数 例如class="col-md-4 col-sm-6"
栅格嵌套
栅格系统内置的栅格系统将内容再次嵌套
简单理解就是一个列内再分成若干份小列
可以通过添加一个新的 .row 元素和一系列 .col-sm-* 元素到已经存在的 .col-sm-*元素内
列嵌套最好加1个行row,可以取消父元素的padding值,高度也会自动和父级一样
<!-- 列嵌套 -->
<div class="col-sm-4">
<div class="row">
<div class="col-sm-6">小列</div>
<div class="col-sm-6">小列</div>
</div>
</div>列偏移
使用 .col-md-offset-* 类可以将列向右侧偏移
这些类实际是通过使用 * 选择器为当前元素增加了左侧的边距(margin)
<!-- 列偏移 -->
<div class="row">
<div class="col-lg-4">1</div>
<div class="col-lg-4 col-lg-offset-4">2</div>
</div>列排序
通过使用 .col-md-push-* 和 .col-md-pull-* 类就可以很容易的改变列(column)的顺序
<!-- 列排序 -->
<div class="row">
<div class="col-lg-4 col-lg-push-8">左侧</div>
<div class="col-lg-8 col-lg-pull-4">右侧</div>
</div>响应式工具
为了加快对移动设备友好的页面开发工作,利用媒体查询功能,并使用这些工具类可以方便的针对不同设备展示或隐藏页面内容
| 类名 | 超小屏 | 小屏 | 中屏 | 大屏 |
|---|---|---|---|---|
| .hidden-xs .visible-xs | 隐藏 可见 | 可见 隐藏 | 可见 隐藏 | 可见 隐藏 |
| .hidden-sm .visible-sm | 可见 隐藏 | 隐藏 可见 | 可见 隐藏 | 可见 隐藏 |
| .hidden-md .visible-md | 可见 隐藏 | 可见 隐藏 | 隐藏 可见 | 可见 隐藏 |
| .hidden-lg .visible-lg | 可见 隐藏 | 可见 隐藏 | 可见 隐藏 | 隐藏 可见 |
贡献者
更新日志
fb8bc-更新为vuepress于