移动端基础
视口
二倍图
移动端开发选择
移动端技术解决方案
移动端web开发之流式布局
移动端web开发之flex布局
移动端web开发之rem布局
Less基础
苏宁移动首页制作
响应式开发
Bootstrap前端开发框架
栅格系统 grid systems
阿里百秀首页案例
浏览现状
国内的UC和QQ,百度等手机浏览器都是根据webkit修改过来的内核,国内尚无自主研发的内核。
兼容移动端主流浏览器,处理webkit内核浏览器即可。
手机屏幕现状
移动端设备屏幕尺寸非常多,碎片化严重。
作为开发者无需关注这些分辨率,因为我们常用的尺寸单位px
移动端调试方法
视口viewport是浏览器显示页面内容的屏幕区域。可分为布局视口、视觉视口、理想视口。
布局视口 layout viewport
视觉视口 visual viewport
理想视口 ideal viewport
标准的viewport设置
属性 | 解释说明 |
---|---|
width | 宽度设置的是viewport宽度 可设置device-width特殊值 |
initial-scale | 初始缩放比,大于0的数字 |
maximum-scale | 最大缩放比,大于0的数字 |
minimum-scale | 最小缩放比,大于0的数字 |
user-scalable | 用户是否可缩放 yes或no(1或0) |
物理像素&物理像素比
/* 1. 物理像素 就是我们说的分辨率 iPhone8的物理像素是 750 */
/* 2. 在 iPhone8里面 1px 开发像素 = 2个物理像素 开发尺寸375*/
多倍图
<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>Documenttitle>
<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:背景图片宽度 背景图片高度
背景图片2倍图
<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>Documenttitle>
<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.单独制作移动端页面(主流)
通常,网址域名前加m(mobile)可打开移动端页面。通过判断设备,若移动设备打开,则调到移动端页面。
2.响应式页面兼容移动端(其次)
通过判断屏幕宽度来改变样式,以适应不同终端。
缺点:制作麻烦,耗大精力去调兼容性问题。
移动端浏览器
移动端浏览器基本以webkit内核为主,我们就考虑webkit兼容性问题。
webkit对H5标签和css兼容性很好,放心使用。
我们浏览器私有前缀只要考虑添加webkit即可
CSS初始化 normalize.css
官网http://necolas.github.io/normalize.css
CSS盒子模型
box-sizing:border-box;盒子宽度=width width包含了border和padding
传统的盒子模型
box-sizing:content-box; 盒子宽度=border+padding+width
特殊样式
/*css3盒子模型*/
box-sizing:border-box;
-webkit-box-sizing:border-box;
/*点击高亮我们需要清除 设置为transparent透明*/
-webkit-tap-highlight-color:transparent;
/*在移动端浏览器默认的外观在ios上加这个属性才能给按钮和输入框自定义样式*/
-webkit-appearance:none;
/*禁用长按页面时的弹出菜单*/
img,a{ -webkit-touch-callout:none;}
流式布局(百分比布局)
二倍精灵图做法
传统布局
flex弹性布局
1.如果是PC端页面布局,用传统。
2. 如果移动端,或者不考虑兼容性问题的PC端页面布局,用flex弹性布局
flex是flexible Box的缩写,“弹性布局”。用来为盒状模型提高最大的灵活性,任何一个容器都可以指定为flex布局。不分行内元素,块元素,行内块。
布局原理:
通过给父盒子添加flex属性,来控制子盒子的位置和排列方式。
flex-direction:设置主轴方向
justify-content:设置主轴上的子元素排列方式
flex-wrap:设置子元素是否换行
align-content:设置侧轴上的子元素的排列方式(多行)
align-items:设置侧轴上的子元素的排列方式(单行)
flex-flow:复合属性,相当于同时设置了flex-direction和flex-wrap
flex-direction:设置主轴方向
1.主轴和侧轴 (行和列、x和y轴)
flex-direction设置谁为主轴,剩下的就是侧轴。我们的子元素是跟着主轴排列的
属性值 | 说明 |
---|---|
row | 默认值从左到右 |
row-reverse | 从右到左 |
column | 从上到下 |
column-reverse | 从下到上 |
justify-content:设置主轴上的子元素排列方式
注意:使用这个属性前,一定要确定好主轴是哪个
属性值 | 说明 |
---|---|
flex-start | 默认值 从头开始,如果x为主轴,则从左到右 |
flex-end | 贴着尾部排列 和row-reverse 有很大区别 |
center | 在主轴居中对齐 |
space-around | 平分剩余空间 |
space-between | 先两边贴边,再平分剩余空间(重要) |
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 | 设置子项元素高度平分父元素高度 |
align-content和align-items区别
flex-flow:复合属性,相当于同时设置了flex-direction和flex-wrap
flex-flow:row wrap;
flex属性定义子项目分配剩余空间,用flex来表示占多少份数
.item{
flex :;/*default 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:;
}
携程网首页案例制作
常用初始化样式
body {
max-width: 540px;
min-width: 320px;
margin: 0 auto;
font: normal 14px/1.5 Tahoma, "Lucida Grande", Verdana, "Microsoft Yahei", STXihei, hei;
color: #000;
background: #f2f2f2;
overflow-x: hidden;
-webkit-tap-highlight-color: transparent;
}
语法
background:linear-gradient(起始方向 ,颜色1,颜色2);
background:-webkit-linear-gradient(left ,red,blue);
background:-webkit-linear-gradient(left top ,red,blue);
背景渐变必须添加浏览器私有前缀
起始方向可以是:方位名词 或者度数 如果省略,默认是top
1.页面布局文字能够随着屏幕大小变化而变化?
2.流式布局和flex布局主要针对于宽度布局,高度如何控制?
3.怎么样让屏幕发生变化的时候元素的高度和宽度等比例缩放?
可通过rem布局解决
rem单位
媒体查询
媒体查询(Media Query)是CSS3新语法
比如:根据不同页面宽度改变背景颜色
语法
@media mediatype and|not|only(media feature){
CSS code;
}
mediatype查询类型
值 | 解释 |
---|---|
all | 所有设备 |
打印机和打印预览 | |
screen | 用于电脑屏幕,平板电脑,智能手机等 |
关键字将媒体类型或多个媒体特性连接到一起做为媒体查询的条件
媒体特性
值 | 解释 |
---|---|
width | 定义输出设备中页面可见区域的宽度 |
min-width | 定义输出设备中的最小可见区域 |
max-width | 定义输出设备中的最大可见区域 |
为了防止混乱,媒体查询推荐从小到大写
引入资源
当样式比较繁多的时候,我们可以根据不同的媒体使用不同的css文件
原理:直接在link中判断设备尺寸,然后引入不同css文件
Document
1
2
Less(Leaner Style Sheets缩写)是一门CSS扩展语言,也称为css预处理器
做为css的一种扩展形式,并没有减少css的功能,而是在现有css语法上,为css加入程序式语言的特性。
在css语法基础上,引入了变量,Mixin(混入),运算以及函数等功能,大大简化css代码,降低css维护成本,less让我们用更少的代码做更多的事情。
常见css预处理器:Sass、Less、Stylus
Less是一门css预处理语言,扩展了css的动态特性
Less安装
1.安装node.js
2.检查是否安装成功,使用cmd命令 输入node -v 查看版本号
3.基于nodejs在线安装Less ,使用cmd命令输入 npm install -g less
4.检查是否安装成功,使用cmd命令 lessc -v
Less使用
首先先建一个后缀名为.less的文件,在这个less文件中写less语句
Less变量
@变量名 :值;
变量命名规范:
1.必须有@前缀
2.不能包含特殊字符
3.不能数字开头
4.大小写敏感
@color:pink;
// 定义一个粉色的变量
@color: pink;
// 错误的变量名 @1color @color~@#
// 变量名区分大小写 @color 和 @Color 是两个不同的变量
// 定义了一个 字体为14像素的变量
@font14: 14px;
body {
background-color: @color;
}
div {
color: @color;
font-size: @font14;
}
a {
font-size: @font14;
}
Less编译
less包含一套自定义的语法及一个解析器。
用户根据这些语法定义自己的样式,这些样式规则通过解析器,编译成对应的css文件。
把less编译为css文件,这样html文件可使用
在VScode中安装 Easy Less插件即可,保存less文件时会自动编译为css文件
Less嵌套
如果遇到(交集|伪类|伪元素选择器)
没有&符号,解析为后代
有&符号,解析为父元素自身或父元素的伪类
// 1. less嵌套 子元素的样式直接写到父元素里面就好了
a {
color: red;
// 2. 如果有伪类、交集选择器、 伪元素选择器 我们内层选择器的前面需要加&
&:hover {
color: blue;
}
}
相当于css的
a:hover{ //注意a 和: 之间没有空格!!!
color;red;
}
.nav {
.logo {
color: green;
}
&::before {
content: "";
}
}
Less运算
1.让一些不能等比自适应的元素,达到当设备尺寸发生改变的时候,等比例适配当前设备
2.使用媒体查询根据不同设备按比例设置html的字体大小,然后页面元素使用rem做为尺寸单位,当html字体大小变化 元素尺寸也会发生变化,从而达到等比缩放的适配。
技术方案1
less
媒体查询
rem
技术方案2(推荐)
flexible.js
rem
技术方案1
1.动态设置html标签font-size大小
假设设计稿750px,把整个屏幕划分成15等份(划分标准不一,可20份也可10等份) 750/15=50px 50px作为html地font-size。
假设设计稿320px,font-size大小320/15=21.33px
2.元素大小取值方法
页面元素的rem值=元素页面值(px)/html的font-size大小
1.技术选型
方案:采取单独制作移动页面方案
技术:布局采取rem适配布局(less+rem+媒体查询)
设计图:采用750px设计尺寸
2.搭建相关文件夹结构
3.设置视口标签以及引入初始化样式
//此页面对应的css文件
4.设置公共common.less文件
1.新建common.less文件 利用媒体查询设置不同的html字体大小
2.我们关心的尺寸有 320px、360px、375px、384px、400px、414px、424px、480px、540px、720px、750px
3.划分的份数定位15等份
4.因为pc端也可打开此页面,默认html字体大小50px,这句话写到最上面
5.新建index.less文件
将刚才设置好的common.less文件引入到index.less文件中
@import "common"
// @import 导入的意思 可以把一个样式文件导入到另外一个样式文件里面
// link 是把一个 样式文件引入到 html页面里面
生成的index.css引入到index.html页面
6.body样式
body {
min-width: 320px;
width: 15rem;
margin: 0 auto;
line-height: 1.5;
font-family: Arial,Helvetica;
background: #F2F2F2;
}
技术方案2 flexible.js和rem
高效简洁的rem适配方案 flexible.js
手机淘宝团队出的简洁高效 移动端适配库
我们不需要写媒体查询了 ,flexible.js做了处理
原理:把当前设备划为10等份。可取flexible.js更改划分
flexible.js提供的文字大小是根据当前屏幕尺寸来进行计算的,实际工作我们常常会对一些屏幕尺寸做些限制
/* 如果我们的屏幕超过了 750px 那么我们就按照 750设计稿来走 不会让我们页面超过750px */
@media screen and (min-width: 750px) {
html {
font-size: 75px!important;
}
}
比如当前设计稿750px,我们只需要把html文字大小设置为75px(750/10)即可
里面元素的rem值=页面元素px/ 75
flexible.js下载地址 https://github.com/amfe/lib-flexible
VScode插件:把px转换为rem cssrem
cssrem 默认的html字体大小为16px 可更改
setting->搜索 ceerem root font ->改值->重启VScode
响应式开发原理:使用媒体查询针对不同宽度的设备进行布局和样式的设置,从而适配不同设备的目的。
设备划分 | 尺寸区间 | 设置宽度 |
---|---|---|
超小屏幕(手机) | <768px | 100% |
小屏设备(平板) | >=768px~<992px | 750px |
中等屏幕(桌面显示器) | >=992px ~<1200px | 970px |
宽屏设备(大桌面显示器) | >=1200px | 1170px |
响应式布局容器
响应式需要一个父级做为布局容器,来配合子级元素来实现变化效果。
原理就是在不同屏幕下,通过媒体查询来改变这个布局容器的大小,再改变里面子元素的排列方式和大小,从而实现不同屏幕下,看到不同的页面布局和样式变化。
每个媒体查询下写对应尺寸的样式
Document
bootstrap简介
中文官网:https://www.bootcss.com/
官网:https://getbootstrap.com/
Bootstrap是目前最受欢迎的前端框架。基于css,html和JavaScript。
框架:一套架构,有一套比较完整的网页功能解决方案,而且控制权在框架本身,有预制样式库、组件和插件。使用者要按照框架所规定的某种规范进行开发。
Bootstrap使用
1.创建文件夹结构
2.创建html骨架
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Bootstrap 101 Templatetitle>
<link rel="stylesheet" href="bootstrap/css/bootstrap.min.css">
head>
<body>
body>
html>
3.引入相关样式文件
4.书写内容
布局容器
bootstrap需要为页面内容和栅格系统包裹一个.container容器,它提供了两个作此作用处的类
1.container类
2. container-fluid类
栅格系统 grid systems
它指将页面布局划分为等宽的列,然后通过列数的定义来模块化页面布局。
bootstrap提供了一套响应式、移动设备优先的流式栅格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多12列。
栅格选项参数
超小屏(手机)<768px | 小屏设备(平板)>=768px | 中等屏(桌面显示器)>=992px | 宽屏设备(大桌面显示器)>=1200px | |
---|---|---|---|---|
.container最大宽度 | 自动(100%) | 750px | 970px | 1170px |
类前缀 | .col-xs- | .col-sm- | .col-md- | .col-lg- |
列嵌套
栅格系统内置的栅格系统将内容再次嵌套。
我们可以通过添加一个新的.row元素和一系列.col-sm-元素到已经存在的.col-sm-元素内。
列嵌套最好加一个.row元素,这样可以去掉父元素的padding值,并且和父级一样高。
列偏移
使用.col-md-offset-* 类可以将列向右侧偏移。
列排序
通过使用.col-md-push-*和,col-md-pull-*类改变列的顺序。
左侧push 、右侧pull
左侧
右侧
响应式工具
为加快对移动设备友好的界面开发工作,利用媒体查询功能,并使用这些工具类可以方便的针对不同设备展示或隐藏页面内容,
.hidden-xs 超小屏下隐藏,其他可见
.hidden-sm 小屏下隐藏,其他可见
.hidden-md 中屏下隐藏,其他可见
.hidden-lg 大屏下隐藏,其他可见
相反.visible再相应屏幕尺寸下显示
/* 修改container的最大宽度为 1280 根据设计稿来走的 */
@media screen and (min-width: 1280px) {
.container {
width: 1280px;
}
}
.logo img {
display: block;
/* width: 100%; */
/* logo图片不需要缩放 */
max-width: 100%;
margin: 0 auto;
}
img {
width:100%;
}
图片能够随着屏幕尺寸的变化自适应
屏幕划分分析
1.屏幕缩放发现 中屏幕和大屏幕布局 是一致的。因此我们列定义为col-md- 即可,md是大于等于970以上的
2.小屏幕布局发生变化 需要为小屏幕根据需求改变布局
3.超小屏幕布局发生变化 需要为超小屏幕根据需求改变布局
策略: 先布局md以上的pc端布局,最后根据实际需求在修改 小屏幕和超小屏幕的特殊布局样式。
移动端技术选型
推荐 flex弹性布局和rem适配布局
我们选取一种为主要技术选型,其他技术做为辅助,这种混合开发技术。
附注:
条件注释