admin管理员组

文章数量:1655704

移动端基础

1.1 浏览器现状

PC端常见浏览器

360浏览器、谷歌浏览器、火狐浏览器、QQ浏览器、百度浏览器、搜狗浏览器、IE浏览器

移动端常见浏览器

UC浏览器、QQ浏览器、欧朋浏览器、百度手机浏览器、360安全浏览器、谷歌浏览器、搜狗浏览器、猎豹浏览器、以及其他杂牌浏览器。

国内的UC和QQ,百度等手机浏览器都是根据Webkit修改过来的内核,国内尚无自主研发的内核,就像国内的手机操作系统都是基于Android修改开发的一样。

总结:兼容移动端主流浏览器,处理Webkit内核浏览器即可

1.2 手机屏幕现状

  • 移动端设备屏幕尺寸非常多,碎片化严重。
  • Android设备有多种分辨率:480*800, 480*854, 540*960, 720*1280, 1080*1920等,还有传说中的2k,4k屏。
  • 近年来iPhone的碎片化也加剧了,其设备的主要分辨率有:640*960, 640*1136, 750*1334, 1242*2208等。
  • 作为开发者无需关注这些分辨率,因为我们常用的尺寸单位是px。

1.3 常见移动端屏幕尺寸

设备尺寸(英寸)开发尺寸(px)物理像素比(dpr)
iPhone3G3.5320*4801.0
iPhone4/4s3.5320*4802.0
iPone5/5s/5c4.0320*5682.
HTC One M84.5360*6403.0
iPhone64.7375*6672.0
Nexus 44.7384*6402.0
Nexus 5x5.2411*7312.6
iPhone6 Plus5.5414*7363.0
Samsung Galaxy Note 45.7480*8533.0
Sony Xperia Z Ultra6.4540*9602.0
Nexus 7('12)7.0600*9601.3
iPad Mini7.9768*10241.0

注:以上数据局参考自 https://material.io/devices/ 。

注:作为前端开发,不建议大家去纠结dp,dpi,pt,ppi等单位。

1.4 移动端调试方法

  • Chrome DevTools(谷歌浏览器)的模拟手机调试
  • 搭建本地web服务器,手机和服务器一个局域网内,通过手机访问服务器
  • 使用外网服务器,直接IP或域名访问

1.5 总结

  • 移动端浏览器我们主要对webkit内核进行兼容
  • 我们现在开发的移动端主要针对手机端开发
  • 现在移动端碎片化比较严重,分辨率和屏幕尺寸大小不一
  • 学会用谷歌浏览器模拟手机界面以及调试

2.视口

**视口(viewport)**就是浏览器显示页面内容的屏幕区域。视口可以分为布局视口、视觉视口和理想视口。

2.1 布局视口 layout viewport

  • 一般移动设备的浏览器都默认设置了一个布局视口,用于解决早期的PC端页面在手机上显示的问题。
  • IOS,Android基本都将这个视口分辨率设置为980px,所以PC上的网页大多都能在手机上呈现,只不过元素看上去很小,一般默认可以通过手动缩放网页。

2.2视觉视口 visual viewport

  • 字面意思,它是用户正在看到的网站的区域。注意:是网站的区域。
  • 我们可以通过缩放去操作视觉视口,但不会影响布局视口,布局视口仍保持原来的宽度。

2.3 理想视口 ideal viewport

  • 为了使网站在移动端有最理想的浏览和阅读宽度而设定
  • 理想视口,对设备来讲,是最理想的视口尺寸
  • 需要手动添加meta视口标签通知浏览器操作
  • meta视口标签的主要目的:布局视口的宽度应该与理想视口的宽度一致,简单理解就是设备有多宽,我们布局的视口就多宽

2.4 总结

  • 视口就是浏览器显示页面内容的屏幕区域
  • 视口分为布局视口,视觉视口和理想视口
  • 想要理想视口,我们需要给我们的移动端页面添加meta视口标签

2.5 meta视口标签

<meta name="viewport" content="width=device-width, user-scalable=no, 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)

2.6 标准的viewport设置

  • 视口宽度和设备保持一致
  • 视口的默认缩放比例1.0
  • 不允许用户自行缩放
  • 最大允许的缩放比例1.0
  • 最小允许的缩放比例1.0

3. 二倍图

3.1 物理像素&物理像素比

  • 物理像素点指的是屏幕显示的最小颗粒,是物理真实存在的。这是厂商在出厂时就设置好了,比如苹果6\7\8 是 750*1334
  • 我们开发时候的1px不是一定等于1个物理像素的
  • PC端页面,1个px等于1个物理像素的,但是移动端就不尽相同
  • 一个px的能显示的物理像素点的个数,称为物理像素比或屏幕像素比
  • PC端和早先的手机屏幕/普通手机屏幕:1CSS像素 = 1物理像素的
  • Retina(视网膜屏幕)是一种显示技术,可以将更多的物理像素点压缩至一块屏幕里,从而达到更高的分辨率,并提高屏幕显示的细腻程度。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>物理像素比</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        div {
            width: 300px;
            height: 300px;
            background-color: pink;
        }
        /* 1. 物理像素 就是我们说的分辨率  iPhone8的物理像素是 750 */
        /* 2. 在 iPhone8里面 1px 开发像素 = 2个物理像素 */
    </style>
</head>
<body>
    <div></div>
</body>
</html>

3.2 多倍图

  • 对于一张50px * 50px的图片,在手机Retina屏中打开,按照刚才的物理像素比会放大倍速,这样会造成图片模糊
  • 在标准的viewport中,因为iPhone6\7\8的影响,但是现在还存在3倍图4倍图的情况,这个看实际开发公司需求
  • 背景图片 注意缩放问题
/* 在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 http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>二倍图做法</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(1).jpg" alt="">
    <!-- 采取2倍图 -->
    <img src="images/apple100.jpg" alt="">
</body>
</html>

3.3 背景缩放 background-size

background-size: 背景图片宽度 背景图片高度;
  • 单位:长度|百分比|cover|contain;
  • cover把背景图像扩展至足够大,以使其宽度和高度完全覆盖背景区域。
  • contain把背景图像扩展至最大尺寸,以使其宽度和高度完全适应内容区域。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>背景缩放</title>
    <style>
        div {
            width: 500px;
            height: 500px;
            border: 1px solid red;
            background: url(images/dog.jpg) no-repeat;
            /* transform: rotate(90deg); */
            /* background-size: 图片宽度 图片高度; */
            /* 1. 只写一个参数 肯定是宽度 高度省略了 会等比例缩放 */
            /* background-size: 500px; */
            /* 2. 里面的单位可以跟百分比 相对于父盒子来说的 */
            /* background-size: 50%; */
            /* 3. cover 要完全覆盖div盒子 可能有部分背景图片显示不全 */
            /* background-size: cover; */
            /* 4. contain 高度和宽度等比例拉伸 当宽度或者高度 铺满div盒子就不再进行拉伸了 可能有部分空白区域*/
            /* background-size: contain; */
        }
    </style>
</head>
<body>
    <div></div>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>背景图片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>

4.移动端开发选择

4.1 移动端主流方案

  1. 单独制作移动端页面(主流)
    1. 京东商城手机版
    2. 淘宝触屏版
    3. 苏宁易购手机版
  2. 响应式页面兼容移动端(其次)
    1. 三星手机官网

4.2 单独移动端页面(主流)

通常情况下,网址域名前面加m(mobile)可以打开移动端。通过判断设备,如果是移动设备打开,则跳转到移动端页面。

4.3 响应式兼容PC移动端

三星电子官网:www.samsung/cn/ ,通过判断屏幕宽度来改变样式,以适应不同终端。

缺点:制作麻烦,需要花很大精力去调兼容性问题

4.4 总结

现在市场常见的移动端开发有单独制作移动端页面和响应式页面两种方案

现在市场主流的选择还是单独制作移动端页面

5.移动端技术解决方案

5.1 移动端浏览器

移动端浏览器基本以webkit内核为主,因此我们就考虑webkit兼容性问题。

我们可以放心使用H5标签和CSS3样式。

同时我们浏览器的私有前缀我们只需要考虑添加webkit即可

5.2 CSS初始化 normalize.css

移动端CSS初始化推荐使用 normalize.css

  • Normalize.css:保护了有价值的默认值
  • Normalize.css:修复了浏览器的bug
  • Normalize.css:是模块化的
  • Normalize.css:拥有详细的文档

官网地址:http://necolas.github.io/normalize.css/

5.3 CSS3 盒子模型 box-sizing

  • 传统模式宽度计算:盒子的宽度 = CSS中设置的width + border + padding

  • CSS3盒子模型: 盒子的宽度 = CSS中设置的宽度width 里面包含了border和padding

    也就是说我们的CSS3中的盒子模型,padding和border不会撑大盒子了

/* CSS3盒子模型 */
box-sizing: border-box;
/* 传统盒子模型 */
box-sizing: content-box;

传统orCSS3盒子模型?

  • 移动端可以全部CSS3盒子模型
  • PC端如果完全需要兼容,我们就用传统模式,如果不考虑兼容性,我们就选择CSS3盒子模型
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>CSS3盒子模型</title>
    <style>
        div:nth-child(1) {
            /* 传统盒子模型 = width + padding + border */
            width: 200px;
            height: 200px;
            background: pink;
            padding: 10px;
            border: 10px solid red;
        }
        div:nth-child(2) {
            /* 有了这句话就变成了CSS3盒子模型 */
            /* padding 和 border 不会再撑大盒子了 */
            box-sizing: border-box;
            width: 200px;
            height: 200px;
            background: purple;
            padding: 10px;
            border: 10px solid ;
        }
    </style>
</head>
<body>
    <div></div>
    <div></div>
</body>
</html>

5.4 特殊样式

/* 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; }
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>特殊样式</title>
    <style>
        a {
            -webkit-tap-highlight-color: transparent;
        }

        input {
            -webkit-appearance: none;
        }
    </style>
</head>
<body>
    <a href="">黑马</a>
    <input type="button" value="按钮">
</body>
</html>

6.移动端常见布局

移动端技术选型

移动端布局和以前我们学习的PC端有所区别:

  1. 单独制作移动端页面(主流)
  • 流式布局(百分比布局)
  • flex弹性布局(强烈推荐)
  • less+rem+媒体查询布局
  • 混合布局
  1. 响应式页面兼容移动端(其次)
  • 媒体查询
  • bootstarp

6.1 流式布局(百分比布局)

  • 流式布局,就是百分比布局,也称非固定像素布局。
  • 通过盒子的宽度设置成百分比来根据屏幕的宽度来进行伸缩,不受固定像素的限制,内容向两侧填充
  • 流式布局方式是移动web开发使用的比较常见的布局方式。
  • max-width 最大宽度(max-height 最大高度)
  • min-width 最小宽度 (min-height 最小高度)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>流式布局</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        section {
            width: 100%;
            max-width: 980px;
            min-width: 320px;
            margin: 0 auto;
        }

        section div {
            width: 50%;
            height: 400px;
            float: left;
        }

        section div:nth-child(1) {
            background-color: pink;
        }

        section div:nth-child(2) {
            background-color: purple;
        }
    </style>
</head>
<body>
    <section>
        <div></div>
        <div></div>
    </section>
</body>
</html>

案例:京东移动端首页

1.技术选型

方案:我们采取单独制作移动页面方案

技术:布局采取流式布局

2.搭建相关文件夹结构

css文件夹
images文件夹
upload文件夹
index.html

3.设置视口标签以及引入初始化样式

	<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, maximum-scale=1.0, minimum-scale=1.0">
    <!-- 引入我们的css初始化文件 -->
    <link rel="stylesheet" href="css/normalize.css">
    <!-- 引入我们首页的css -->
    <link rel="stylesheet" href="css/index.css">

4.常用初始化样式

body {
    margin: 0 auto;
    min-width: 320px;
    max-width: 1080px;
    background: #fff;
    font-size: 14px;
    font-family: -apple-system, Helvetica, sans-serif;
    line-height: 1.5;
    color: #666;
}

5.二倍精灵图做法

  • 在firework里面把精灵图等比例缩放为原来的一半
  • 之后根据大小测量坐标
  • 注意代码里面background-size也要写:精灵图原来宽度的一半

6.图片格式

DPG图片压缩技术

京东自主研发推出DPG图片压缩技术,经测试该技术,可直接节省用户近50%的浏览流量,极大的提升了用户的网页打开速度。能够兼容jpeg,实现全平台、全部浏览器的兼容支持,经过内部和外部上万张图片的人眼浏览测试后发现,压缩后的图片和webp的清晰度对比没有差距。

webp图片格式

谷歌开发的一种皆在加快图片加载速度的图片格式。图片颜色体积大约只有JPEG的2/3,并能节省大量的服务器宽带资源和数据空间

1.flex布局

1.1 传统布局与flex布局

传统布局

  • 兼容性好
  • 布局繁琐
  • 局限性,不能再移动端很好的布局

flex弹性布局

  • 操作方便,布局极为简单,移动端应用很广泛
  • PC端浏览器支持情况较差
  • IE11或更低版本,不支持或仅部分支持

建议

  1. 如果是PC端页面布局,我们还是传统布局。
  2. 如果是移动端或者不考虑兼容性问题的PC端页面布局,我们还是使用flex弹性布局

1.2 初体验

1.搭建HTML结构

<div>
    <span>1</span>
    <span>2</span>
    <span>3</span>
</div>
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>flex布局体验</title>
    <style>
        div {
            display: flex;
            justify-content: space-around;
            width: 80%;
            height: 500px;
            background-color: pink;
        }

        div span {
            width: 150px;
            height: 100px;
            background-color: purple;
            margin-left: 5px;
        }
    </style>
</head>

<body>
    <div>
        <span></span>
        <span></span>
        <span></span>
    </div>
</body>

</html>

2.flex布局原理

2.1 布局原理

flex是flexible Box的缩写,意为“弹性布局”,用来为盒状模型提供最大的灵活性,任何一个容器都可以指定为flex布局。

  • 当我们为父盒子设为flex布局以后,子元素的float、clear和vertical-align属性将失效。
  • 伸缩布局=弹性布局=伸缩盒布局=弹性盒布局=flex布局

采用flex布局的元素,称为flex容器(flex container),简称“容器”。它的所有子元素自动成为容器成员,称为flex项目(flex item),简称“项目”。

  • 体验中div就是flex父容器。
  • 体验中span就是子容器flex项目
  • 子容器可以横向排列也可以纵向排列

总结flex布局原理:

就是通过给父盒子添加flex属性,来控制盒子的位置和排列方式

3.flex布局父项常见属性

3.1 常见父项属性

以下有6个属性是对父元素设置的

  • flex-direction:设置主轴的方向
  • justify-content:设置主轴上的子元素排列方式
  • flex-wrap:设置子元素是否换行
  • align-content:设置侧轴上的子元素的排列方式(多行)
  • align-items:设置侧轴上的子元素排列方式(单行)
  • flex-flow:复合属性,相当于同时设置了flex-direction和flex-wrap

3.2 flex-direction 设置主轴的方向

1.说明

在flex布局中,是分为主轴和侧轴两个方向,同样的叫法有:行和列、x轴和y轴

  • 默认主轴方向就是x轴方向,水平向右
  • 默认侧轴方向就是y轴方向,水平向下

2.属性值

flex-direction属性决定主轴的方向(即项目的排列方向)

注意:主轴和侧轴实惠变换的,就看flex-direction设置谁为主轴,剩下的就是侧轴。而我们的子元素是跟着主轴来排列的

属性值说明
row默认值从左到右
row-reverse从右到左
column从上到下
column-reverse从下到上
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>flex主轴方向</title>
    <style>
        div {
            /* 给父元素添加flex属性 */
            display: flex;
            /* 默认的主轴是x轴 行 row y轴就是侧轴 */
            /* 我们的元素是跟着主轴来排列的 */
            /* flex-direction: row; */
            /* 简单了解 翻转 */
            /* flex-direction: row-reverse; */
            /* 我们可以把主轴设置为y轴, 那么x轴就成了侧轴 */
            flex-direction: column;
            width: 80%;
            height: 500px;
            background-color: pink;
        }

        div span {
            width: 150px;
            height: 100px;
            background-color: purple;
        }
    </style>
</head>
<body>
    <div>
        <span>1</span>
        <span>2</span>
        <span>3</span>
    </div>
</body>
</html>

3.3 justify-content 设置主轴上的子元素排列方式

justify-content属性定义了项目在主轴上的对齐方式

注意:使用这个属性之前一定要确定好主轴是哪个

属性值说明
flex-start默认值 从头部开始 如果主轴是x轴,则从左到右
flex-end从尾部开始排列
center在主轴居中对齐(如果主轴是x轴则 水平居中)
space-around****平分剩余空间
space-between****先两边贴边 再平分剩余空间(重要)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>flex设置主轴上子元素排列方式1</title>
    <style>
        div {
            display: flex;
             /* 默认主轴是 x轴 row */
            /* justify-content 是设置主轴上子元素排列方式 */
            /* flex-direction: row; */
            /* justify-content: end; */
            /* 让我们子元素居中对齐 */
            /* justify-content: center; */
            /* 平分剩余空间 */
            /* justify-content: space-around; */
            /* 先两边贴边, 再平分剩余空间 */
            /* justify-content: space-between; */
            /* 主轴为 y轴 */
            flex-direction: column;
            /* justify-content: space-around; */
            justify-content: space-between;
            width: 800px;
            height: 600px;
            background-color: pink;
        }

        div span {
            width: 150px;
            height: 100px;
            background-color: purple;
        }
    </style>
</head>
<body>
    <div>
        <span>1</span>
        <span>2</span>
        <span>3</span>
        <span>4</span>
    </div>
</body>
</html>

3.4 flex-wrap 设置子元素是否换行

默认情况下,项目都排在一条线(又称“轴线)上。flex-wrap属性定义,flex布局中默认是不换行的。

属性值说明
nowrap默认值,不换行
wrap换行
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>子元素是否换行</title>
    <style>
        div {
            display: flex;
            width: 800px;
            height: 500px;
            background-color: pink;
            /* flex布局中, 默认的子元素是不换行的, 如果装不开, 会缩小子元素的宽度, 放到父元素里面  */
            flex-wrap: wrap;
        }

        div span {
            width: 150px;
            height: 100px;
            color: #fff;
            background-color: purple;
            margin: 10px;
        }
    </style>
</head>
<body>
    <div>
        <span>1</span>
        <span>2</span>
        <span>3</span>
        <span>4</span>
        <span>5</span>
    </div>
</body>
</html>

3.5 align-items 设置侧轴上的子元素排列方式(单行)

该属性是控制子项在侧轴(默认是y轴)上的排列方式在子项为单项的时候使用

属性值说明
flex-start从上到下
flex-end从下到上
center挤在一起居中(垂直居中)
stretch拉伸(默认值)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>flex设置侧轴上子元素排列方式</title>
    <style>
        div {
            display: flex;
            /* 默认主轴是 x轴 row */
            flex-direction: column;
            justify-content: center;
            /* 我们需要一个侧轴居中 */
            align-items: center;
            /* 拉伸 但是子盒子不要给高度 */
            /* align-items: stretch; */
            width: 800px;
            height: 600px;
            background-color: pink;
        }

        div span {
            width: 150px;
            height: 100px;
            background-color: purple;
            color: #fff;
            margin: 10px;
        }
    </style>
</head>
<body>
    <div>
        <span>1</span>
        <span>2</span>
        <span>3</span>
    </div>
</body>
</html>

3.6 align-content 设置侧轴上的子元素的排列方式(多行)

设置子项在侧轴上的排列方式并且只能用于子项出现换行的情况(多行),在单行下是没有效果的。

属性值说明
flex-start默认值在侧轴的头部开始排列
flex-end在侧轴的尾部开始排列
center在侧轴中间显示
space-around子项在侧轴平分剩余空间
space-between子项在侧轴先分布在两头,再平分剩余空间
stretch设置子项元素高度平分父元素高度

3.7 align-items和align-content区别

  • align-items适用于单行情况下,只有上对齐、下对齐、居中和拉伸
  • align-content适应于换行(多行)的情况下(单行情况下无效),可以设置上对齐,下对齐,居中,拉伸以及平均分配剩余空间等属性值。
  • 总结就是单行找align-items 多行找align-content

3.8 flex-flow

flex-flow属性就是flex-direction和flex-wrap属性的复合属性

flex-flow: row wrap;
  • flex-direction:设置主轴的方向
  • justify-content:设置主轴上的子元素排列方式
  • flex-wrap:设置子元素是否换行
  • align-content:设置侧轴上的子元素的排列方式(多行)
  • align-items:设置侧轴上的子元素排列方式(单行)
  • flex-flow:复合属性,相当于同时设置了flex-direction和flex-wrap

4.flex布局子项常见属性

  • flex子项目占的份数
  • align-self控制子项自己在侧轴的排列方式
  • order属性定义子项的排列顺序(前后顺序)

4.1 flex属性

flex属性定义子项目分配剩余空间,用flex来表示占多少份数

.item {
    flex: <nmmber>; /* default 0 */
}

4.2 align-self 控制子项自己在侧轴上的排列方式

align-self属性允许单个项目有与其他项目不一样对齐方式,可覆盖align-items属性。

默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。

span:nth-child(2) {
	/* 设置自己在侧轴上的排列方式 */
    align-self: flex-end;
}

4.3 order属性定义项目的排列顺序

数值越小,排列越靠前,默认为0。

注意:和z-index不一样。

span:nth-child(2) {
	/* 设置自己在侧轴上的排列顺序 */
    order: -1;
}

案例:携程网移动端首页

1.技术选型

方案:我们采取单独制作移动页面方案

技术:布局采取flex布局

2.搭建相关文件夹结构

css文件夹
images文件夹
upload文件夹
index.html

3.设置视口标签以及引入初始化样式

    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, maximum-scale=1.0, minimum-scale=1.0">
	<link rel="stylesheet" href="css/normalize.css">
	<link rel="stylesheet" href="css/index.css">

4.常用初始化样式

body {
	max-width: 540px;
    min-width: 320px;
    margin: 0 auto;
    font: normal 14px/1.5 Tahoma,"Lucida Grande",Verdana,"Microsoft Yahei";
    color: #000;
    background: #f2f2f2;
    overflow-x: hidden;
    -webkit-tap-highlight-color: transparent;
}

5.常见flex布局思路

  1. 默认主轴是x轴
  2. 把主轴设为y轴
  3. 把侧轴设为居中对齐

6.背景线性渐变

语法1:

background: linear-gradient(起始方向,颜色1,颜色2,...);
background: -webkit-linear-gradient(left,red,blue,...);
background: -webkit-linear-gradient(left top,red,blue,...);

背景渐变必须添加私有前缀

起始方向可以是:方位名词或者度数,如果省略默认就是top

rem适配布局

思考

  1. 页面布局文字能否随着屏幕大小变化而变化?
  2. 流式布局和flex布局主要针对宽度布局,那高度如何设置呢?
  3. 怎么样让屏幕发生变化的时候元素高度和宽度等比例缩放?

1.rem基础

rem单位

rem(root em)是一个相对单位,类似于em,em是父元素字体大小。

不同的是rem的基准是相对于html元素的字体大小。

比如,根元素(html)设置font-size=12px;非根元素设置width: 2rem; 则换成px就是24px。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>rem单位</title>
    <style>
        html {
            font-size: 14px;
        }

        div {
            font-size: 12px;
            width: 15rem;
            height: 15rem;
            background-color: purple;
        }

        p {
            /* em 相对于父元素的字体大小来说的  */
            /* width: 10em;
            height: 10em; */
            /* rem 相对于html元素的字体大小来说的 */ 
            width: 10rem;
            height: 10rem;
            background-color: pink;
            /* 3. rem的优点就是可以通过修改html里面的文字来改变页面中元素的大小 可以整体控制 */
        }
    </style>
</head>
<body>
    <div>
        <p></p>
    </div>
</body>
</html>

2.媒体查询

2.1 什么是媒体查询

媒体查询(Media Query)是css3新语法。

  • 使用@media查询,可以针对不同的媒体类型定义不同的样式
  • @media可以针对不同的屏幕尺寸设置不同的样式
  • 当你重置浏览器大小的过程中,页面也会根据浏览器的宽度和高度重新渲染页面
  • 目前针对很多苹果手机、Android手机,平板等设备都用得到多媒体查询
@media mediatype and |not|only| (media feature) {
    css-Code;
}
  • 用@media开头注意@符号
  • mediatype 媒体类型
  • 关键字 and not only
  • media feature 媒体特性 必须有小括号包含

2.2 语法规范

1.mediatype查询类型

将不同的终端设备划分成不同的类型,称为媒体类型

解释说明
all用于所有设备
print用于打印机和打印预览
scree用于电脑屏幕,平板电脑,智能手机等

2.关键字

关键字将媒体类型或者多个媒体特性连接到一起作为媒体查询的条件。

  • and:可以将多个媒体特性连接在一起,相当于“且”的意思。
  • not:排除某个媒体类型,相当于“非”的意思,可以省略。
  • only:指定某个特定的媒体类型,可以省略。

3.媒体特性

每种媒体类型都具有各自不同的特性,根据不同媒体类型的媒体特性设置不同的展示风格。我们暂且了解三个。注意他们要加小括号包含

解释说明
width定义输出设备中页面可见区域的宽度
min-width定义输出设备中页面最小可见区域宽度
max-width定义输出设备中页面最大可见区域宽度
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>媒体查询</title>
    <style>
        /* 这句话的意思就是: 在我们屏幕上并且最大的宽度是800像素 设置我们想要的样式 */
        /* max-width 小于等于 800像素 */
        /* 媒体查询可以根据不同的尺寸来改变不同的样式 */
        @media screen and (max-width: 800px) {
            body {
                background-color: pink;
            }
        }

        @media screen and (max-width: 500px) {
            body {
                background-color: purple;
            }
        }
    </style>
</head>
<body>
    <div></div>
</body>
</html>

案例:根据页面宽度改变背景颜色

案例:实现思路
  1. 按照从大到小的或者从小到大的思路
  2. 注意我们有最大值max-width和最小值min-width都是包含等于的
  3. 当屏幕小于540像素,背景颜色变为蓝色(x<=539)
  4. 当屏幕大于等于540像素并且小于等于969像素的时候背景颜色为绿色(540<=x<969)
  5. 当屏幕大于等于970像素的时候,背景颜色为红色(x>=970)

注意:为了防止混乱,媒体查询我们需要按照从小到大或者从大到小的顺序来写,但是我们最喜欢的还是从小到大来写,这样代码更简洁

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>媒体查询案例修改背景颜色</title>
    <style>
        /* 1. 媒体查询一般按照从大到小的或者从小到大来 */
        /* 2. 小于540px 页面的背景颜色变为蓝色 */
        @media screen and (max-width: 539px) {
            body {
                background-color: blue;
            }
        }

        /* 3. 540 ~ 970 我们的页面颜色变为绿色 */
        @media screen and (min-width: 540px) and (max-width: 969px) {
            body {
                background-color: green;
            }
        }

        /* 4. 大于等于970 我们的页面颜色改为红色 */
        @media screen and (min-width: 970px) {
            body {
                background-color: red;
            }
        }

        /* 5. screen 和 and 必须带上不能省略 */
        /* 6. 我们的数字后面必须跟单位 970px 这个px不能省略 */
    </style>
</head>

<body>

</body>

</html>

2.3 媒体查询+rem实现元素动态大小变化

rem单位是跟着html来走的,有了rem页面元素可以设置不同大小尺寸

媒体查询可以根据不同设备宽度来修改样式

媒体查询+rem就可以实现不同设备宽度,实现页面元素大小的动态改变

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        /* 从大到小的顺序 */
        @media screen and (min-width: 320px) {
            html {
                font-size: 50px;
            }
        }

        @media screen and (min-width: 640px) {
            html {
                font-size: 100px;
            }
        }
        .top {
            height: 1rem;
            line-height: 1rem;
            text-align: center;
            font-size: .5px;
            background-color: green;
            color: #fff;
        }
    </style>
</head>
<body>
    <div class="top">购物车</div>
</body>
</html>

2.4 引入资源(理解)

当样式比较繁多的时候,我们可以针对不同的媒体使用不同styleheets(样式表)

原理,就是直接在link中判断设备的尺寸,然后引用不同的css文件。

1.语法规范

<link rel="stylesheet" media="mediatype and|not|only (media feature)" href="mystylesheet.css">
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>引入资源</title>
    <style>
        /* 当我们屏幕大于等于640px以上的,我们让div一行显示2个 */
        /* 当我们屏幕小于640px我们让div一行显示一个 */
        /* 一个建议:我们媒体查询最好的方法是从小到大 */
        /* 引入资源就是 针对不同的屏幕尺寸 调用不同的css文件 */
    </style>
    <link rel="stylesheet" href="style320.css" media="screen and (min-width: 602px)">
    <link rel="stylesheet" href="style640.css" media="screen and (min-width: 960px)">
</head>
<body>
    <div>1</div>
    <div>2</div>
</body>
</html>

3. less基础

css是一门非程序式语言,没有变量、函数、scope(作用域)等概念。

  • css需要书写大量看似没有逻辑的代码,css冗余度是比较高的。
  • 不方便维护及扩展,不利于复用。
  • css没有很好的计算能力。
  • 非前端开发工程师来讲,往往会因为缺少css编写经验而很难写出组织且易于维护的css代码项目。

3.2 less介绍

less(leaner style sheets 的缩写)是一门css扩展语言,也成为css预处理器。

作为css的一种形式的扩展,它并没有减少css的功能,而是在现有的css语法上,为css加入程序式语言的特性。

他再css的语法基础之上,引入了变量,Mixin(混入),运算以及函数等功能,大大简化了css的编写,并且降低了css的维护成本,就像他的名称所说的那样,less可以让我们用更少的代码做更多的事情。

less中文网址:http://lesscss/

常见的css预处理器:Sass、Less、Stylus

一句话:Less是一门css预处理语言,它扩展了css的动态特性。

less使用

我们首先新建一个后缀名为less我文件,在这个less文件里面书写less语句。

  • less变量
  • less编译
  • less嵌套
  • less运算

3.4 less变量

变量是指没有固定的值,可以改变的。因为我们css中的一些颜色和数值等经常使用。

	@变量名:值;

1.变量命名规范

  • 必须有@为前缀
  • 不能包含特殊字符
  • 不能以数字开头
  • 大小写敏感

3.5 less编译

本质上,less包含一套自定义的语法及一个解析器,用户根据这些语法定义自己的样式规则,这些规则最终会通过解析器,编译生成对应的css文件。

所以,我们需要把我们的less文件,编译生成为css文件,这样我们的html页面才能使用。

vscode less插件

Easy LES插件用来把less文件编译为css文件

安装完毕插件,重新加载下vscode。只要保存一下less文件,会自动生成css文件。

3.6 less嵌套

我们经常用到选择器的嵌套

#header .logo {
	width: 300px;
}

less嵌套写法

#header {
    .logo {
		width: 300px;
    }
}

如果遇见(交集|伪类|伪元素选择器)

  • 内层选择器的前面没有&符号,则它被解析为父选择器的后代;
  • 如果有&符号,它就被解析为父元素自身或父元素的伪类。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>less嵌套</title>
    <style>
        /* .header {}
        .header a {} */
    </style>
</head>
<body>
    <div class="header"><a href="#">文字</a></div>
    <div class="nav">
        <div class="logo">传智播客</div>
    </div>
</body>
</html>
.header {
    width: 200px;
    height: 200px;
    background-color: pink;

    a {
        color: red;

        // 2. 如果有伪类、交集选择器、伪元素选择器 我们内层选择器的前面需要加&
        &:hover {
            color: blue;
        }
    }
}

.nav {
    .logo {
        color: blue;
    }

    &::before {
        content: '';
    }
}
.header {
  width: 200px;
  height: 200px;
  background-color: pink;
}
.header a {
  color: red;
}
.header a:hover {
  color: blue;
}
.nav .logo {
  color: blue;
}
.nav::before {
  content: '';
}

任何数字、颜色或者变量都可以参与运算。就是less提供了加(+)、减(-)、乘(*)、除(/)算术运算。

  • 乘号(*****)和除号(/)的写法
  • 运算符中间左右有个空格隔开1px + 5
  • 对于两个不同的单位的值之间的运算,运算结果的值取第一个值的单位
  • 如果两个值之间只有一个值有单位,则运算结果就取该单位
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>less运算</title>
    <link rel="stylesheet" href="count.css">
</head>
<body>
    <div></div>
</body>
</html>
@border: 5px - 4;
@baseFont: 50px;
html {
    font-size: @baseFont;
}
div {
    width: 200px - 50;
    height: 200px;
    border: @border solid red;
    background-color: #666 - #222;
}

img {
    width: 82px / 50rem;
    height: 82px / 50rem;
}
// 1. 我们运算符的左右两侧必须敲一个空格隔开
// 2. 两个数参与运算 如果只有一个单位,则最后的结果就以这个单位为准
// 3. 两个数参与运算,如果2个数都有单位,而且是不一样的单位,最后的结果一第一个单位为准
html {
  font-size: 50px;
}
div {
  width: 150px;
  height: 200px;
  border: 1px solid red;
  background-color: #444444;
}
img {
  width: 82px / 50rem;
  height: 82px / 50rem;
}

4.rem适配方案

提问

  1. 我们适配的目标是什么?
  2. 怎么去达到这个目标的?
  3. 在实际的开发当中如何使用?

答案

  1. 让一些不能等比自适应的元素,达到当设备尺寸发生改变的时候,等比例适配当前设备。
  2. 使用媒体查询根据不同设备按比例设置html的字体大小,然后页面元素使用rem做尺寸单位,当html字体大小变化元素尺寸也会发生变化,从而达到等比例缩放的适配。

4.1 rem实际开发适配方案

  1. 按照设计稿与设备宽度的比例,动态计算并设置html根标签的font-size大小;(媒体查询)
  2. css中,设计稿元素的宽、高、相对位置等取值,按照同等比例换算为rem为单位的值;

4.2 rem适配方案技术使用(市场主流)

技术方案1

  • less
  • 媒体查询
  • rem

技术方案2

  • flexible.js
  • rem

总结:

  1. 两种方案现在都存在
  2. 方案2更简单,现阶段大家无需了解里面的js代码。

4.3 rem实际开发适配方案1

rem + 媒体查询 +less技术

1.设计稿常见尺寸宽度

设备常见宽度
iphone 4.5640px
iPhone 678750px
Android常见320px、360px、375px、384px、400px、414px、500px、720px大部分4.7~5寸的安卓设备为720px

一般情况下,我们以一套或两套效果图适应大部分的屏幕,放弃极端或对其优雅降级,牺牲一些效果;现在基本以750为准。

2.动态设置html标签font-size大小

  1. 假设设计稿是750px
  2. 假设我们把整个屏幕划分为15等份(划分标准不一可以是20份也可以是10等份)
  3. 每一份作为html字体大小,这里就是50px
  4. 那么在320px设备的时候,字体大小为320/15就是21.33px
  5. 用我们页面元素的大小除以不同的html字体大小会发现他们比例还是相同的
  6. 比如我们以750为标准设计稿
  7. 一个100*100像素的页面元素在750屏幕下,就是100/50转换为rem是2rem*2rem比例是1:1
  8. 320屏幕下,html字体大小为21.33 则2rem=42.66px 此时宽和高都是42.66但是宽和高的比例还是1比1
  9. 但是已经能实现不同屏幕下页面元素盒子等比例缩放的效果

3.元素大小取值方法

  1. 最后的公式:页面元素的rem值 = 页面元素值(px)/ (屏幕宽度 / 划分的份数)
  2. 屏幕宽度/划分的份数就是html font-size的大小
  3. 或者:页面元素的rem值 = 页面元素值(px)/ html font-size 字体大小

案例:苏宁网移动端首页

访问地址:m.suning

1.技术选型

方案:我们采取单独制作移动页面方案

技术:布局采取rem适配布局(less + rem + 媒体查询)

设计图:本设计图采用750px设计尺寸

2.搭建相关文件夹结构

css文件夹
images文件夹
upload文件夹
index.html

3.设置视口标签以及引入初始化样式

    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-ablscale=no, maximum-scale=1.0, minimum-scale=1.0">
	<link rel="stylesheet" href="css/normalize.css">

4.设置公共common.less文件

  1. 新建common.less 设置好最常见的屏幕尺寸,利用媒体查询设置不同的html字体大小,因为除了首页其他页面也需要
  2. 我们关心的尺寸有320px、360px、375px、400px、414px、424px、480px、540px、720px、750px
  3. 换分的份数我们定位15等份
  4. 因为我们pc端也可以打开我们苏宁移动端首页,我们默认html字体大小为50px,注意这句话写到最上面
// 设置常见的屏幕尺寸 修改里面的html字体大小
// 我们关心的尺寸有320px、360px、375px、400px、414px、424px、480px、540px、720px、750px
// 我们此次定义的划分的份数为 15
// 一定要写到最上面
html {
    font-size: 50px;
}

a {
    text-decoration: none;
}

input,
button {
    border: 0;
}

@no: 15;

@media screen and (min-width: 320px) {
    html {
        font-size: (320px / @no);
    }
}

@media screen and (min-width: 360px) {
    html {
        font-size: (360px / @no);
    }
}

@media screen and (min-width: 375px) {
    html {
        font-size: (375px / @no);
    }
}

@media screen and (min-width: 400px) {
    html {
        font-size: (400px / @no);
    }
}

@media screen and (min-width: 414px) {
    html {
        font-size: (414px / @no);
    }
}

@media screen and (min-width: 424px) {
    html {
        font-size: (424px / @no);
    }
}

@media screen and (min-width: 480px) {
    html {
        font-size: (480px / @no);
    }
}

@media screen and (min-width: 540px) {
    html {
        font-size: (540px / @no);
    }
}

@media screen and (min-width: 720px) {
    html {
        font-size: (720px / @no);
    }
}

@media screen and (min-width: 750px) {
    html {
        font-size: (750px / @no);
    }
}

5.新建index.less文件

  1. 新建index.less 这里面写首页的样式
  2. 将刚才设置好的common.less 引入到index.less里面 语法如下:
	// 在index.less 中导入 common.less 文件
	@import "common"
  1. 生成index.css 引入到index.html里面

6.body样式

body {
    min-width: 320px;
    width: 15rem;
    margin: 0 auto;
    line-height: 1.5;
    font-family: Arial,Helvetica;
    
}

解决VSCode中emmet对行内标签如 a span不换行的问题。VSCode设置中搜索Syntax Profiles,在settings.json中编辑,加入如下代码:
emmet.syntaxProfiles: {
html: {
inline_break: 2
}
}

5 rem适配方案2

5.1 简洁高效的rem适配方案flexible.js

技术方案1

  • less
  • 媒体查询
  • rem

技术方案2

  • flexible.js
  • rem

手机淘宝团队出的简洁高效移动端适配库

我们再也不需要在写不同屏幕的媒体查询,因为里面js做了处理

它的原理是把当前设备划分为10等份,但是不同设备下,比例还是一致的。

我们要做的,就是确定好我们当前设备的html文字大小就可以了

比如当前设计稿是750px,那么我们只需要把html文字大小设置为75px(750px / 10)就可以

里面页面元素rem值:页面元素的px值 / 75

剩余的,让flexible.js来去算

github地址:https://github/amfe/lib-flexible

5.2 使用适配方案2制作苏宁移动端首页

1.技术选型

方案:我们采取单独制作移动页面方案

技术:布局采取rem适配布局2(flexible.js + rem)

设计图:本设计图采用750px设计尺寸

2.搭建相关文件夹结构

css文件夹
images文件夹
js文件夹
upload文件夹
index.html

3.设置视口标签以及引入初始化样式还有js文件

 <meta name="viewport"
        content="width=device-width, initial-scale=1.0, user-ablscale=no, maximum-scale=1.0, minimum-scale=1.0">
 <link rel="stylesheet" href="css/normalize.css">
 <link rel="stylesheet" href="css/index.css">

我们页面需要引入这个js文件

// 在index.js 中引入flexible.js这个文件
<script src="js/flexible.js"><script>

4.body样式

body {
    min-width: 320px;
    width: 15rem;
    margin: 0 auto;
    line-height: 1.5;
    font-family: Arial,Helvetica;
    
}

5.3 vscode px转换rem 插件 cssrem

这是一个神奇的插件

设置html字体大小基准值

  1. 打开设置(快捷键是ctrl+逗号)
  2. 搜索cssroot

黑马面面布局开发

一、目的

  1. 了解移动端页面开发流畅
  2. 掌握移动端常见布局思路

1.1 技术方案

	1. 弹性盒子 rem + LESS
	2. 最小适配设备为iPhone5 320px 最大适配设备为iPhone8Plus(iPad能正常查看内容即可)

1.2 代码规范

1. 类名语义化,尽量精短,明确,必须以字母开头命名,且全部字母为小写,单词之间统一使用下划线“_”连接
2. 类名嵌套层次尽量不超过三层
3. 尽量避免直接使用元素选择器
4. 属性书写顺序
   布局定位属性:display/position/float/clear/visibility/overflow
   尺寸属性:widht/height/margin/padding/border/background
   文本属性:color/font/text-decoration/text-align/vertical-ailgn
   其他属性(css3):content/cursor/border-radius/box-shadow/text-shadow
5. 避免使用id选择器
6. 避免使用通配符*和!important

1.3 目录规范

	项目文件夹:heimamm
		样式文件夹:css
		业务类图片文件夹:images
		样式类图片文件夹:icons
		字体类文件夹:fonts

二、流程开发

2.1 蓝湖/摹客协作平台

  • UI设计师 psd效果图完成后,会上传到蓝湖/摹客里面,同时会拉前端工程师进入开发
  • 大部分情况下,UI会把图片按照前端设计要求给切好
  • UI设计师上传到蓝湖或者摹客(了解)
	1. 摹客官网地址:https://www.mockplus/  注册一个账号
	2. ps 安装慕客/蓝湖插件
	3. 打开ps慕客/蓝湖插件
	4. 上传(需要切图,需要先标注切图)
	5. 查看项目
	6. 邀请成员进入(分享按钮,链接地址)
  • 前端设计师可以直接慕客/蓝湖测量取值

2.2 适配方案

  • flex布局
  • 百分比布局
  • rem布局
  • vw/vh布局
  • 响应式布局
  • 本次案例 flex + rem + flexible.js + less

2.3 初始化文件

  • 引入 normalize.css

  • less中 初始化body样式

  • 约束范围

  • 	@media screen and (min-width: 750px) {
    	html {
    		font-size: 37.5px!important;
    	}
    }
    

2.4 swiper插件使用

官网地址:https://www.swiper/

  • 下载需要的css和js文件 html页面中引入相关文件
  • 官网找到类似案例复制HTML结构,css样式,js语法
  • 根据需求定制修改模块

2.5 图标字体上传下载

上传步骤:

  1. 让UI美工准备好 图标字体(必须是svg格式)
  2. 点上传按钮(保存颜色并提交)
  3. 生成之后加入购物车即可
  4. 点击下载—下载代码

小技巧:如何批量下载全部字体图标呢?

2.5 上传码云并发布部署静态网站

准备工作:需要下载git软件 需要码云注册账号

git可以把我们的本地网站提交上传到远程仓库(码云gitee)里面 类似以前的 ftp

码云 就是远程仓库 类似服务器

  1. 码云创建新的仓库 heimamm

  2. 利用git提交把本地网站提交到码云新建的仓库里面

    • 在网站根目录右键-Git Bash Here
    • 如果是第一次利用git提交,请配置好全局选项
    	git config --global user.name "用户名"
    	git config --global user.email "你的邮箱地址"
    
    • 初始化仓库
    	git init
    
    • 把本地文件放到暂存区
    	git add .
    
    • 把本地文件放到本地仓库里面
    	git commit -m '提交黑马面面网站'
    
    • 链接远程仓库
    git remote add origin 你新建的仓库地址
    
    • 把本地仓库的文件推送到远程仓库 push
    	git push -u origin master
    
  3. 码云部署发布静态网站

    • 在当前仓库中,点击“服务”菜单
    • 选择 Gitee Pages

移动web开发之响应式布局

目标

  • 能够说出响应式原理
  • 能够使用媒体查询完成响应式导航
  • 能够使用bootstrap的栅格系统
  • 能够使用bootstrap的响应式工具
  • 能够独立完成阿里百秀首页案例

1.响应式开发

1.1 响应式开发原理

就是使用媒体查询针对不同宽度的设备进行布局和样式的设置,从而适配不同设备的目的。

设备划分尺寸区间
超小屏幕(手机)<768px
小屏设备(平板)>=768px~<992px
中等屏幕(桌面显示器)>=992px~<1200px
宽度设备(大桌面显示器)>=1200px

1.2 响应式布局容器

响应式需要一个父级作为布局容器,来配合子级元素来实现变化效果。

原理就是在不同屏幕下,通过媒体查询来改变这个布局容器的大小,再改变里面子元素的排列方式和大小,从而实现不同屏幕下,看到不同的页面布局和样式变化。

平时我们的响应式尺寸划分
  • 超小屏幕(手机,小于768px):设置宽度为100%
  • 小屏幕(平板,大于等于768px):设置宽度为750px
  • 中等屏幕(桌面显示器,大于等于992px):宽度设置为970px
  • 大屏幕(大桌面显示器,大于等于1200px):宽度设置为1170px

案例:响应式导航

  1. 当我们屏幕大于等于768像素,我们给布局容器container宽度为750px。
  2. container里面包含8个小li盒子,每个盒子的宽度定为93.75px(750/8),高度为30px,浮动一行显示。
  3. 当我们屏幕缩放,宽度小于768像素的时候,container盒子宽度修改为100%宽度。
  4. 此时里面的8个小li,宽度修改为33.33%,这样一行就只能显示3个小li,剩余下行显示。

2.Bootstrap前端开发框架

2.1 Bootstrap 简介

Bootstrap来自Twitter(推特),是目前最受欢迎的前端框架。Bootstrap是基于HTML、CSS和JAVASCRIPT的,它简洁灵活,使得Web开发更加快捷

  • 中文官网:http://www.bootcss/
  • 官网:http://getbootstrap/
  • 推荐使用:https://v3.bootcss/

框架:顾名思义就是一套架构,它有一套比较完整的网页功能解决方案,而且控制权在框架本身,有预制样式库、组件和插件。使用者要按照框架所规定的某种规范进行开发。

1.优点
  • 标准化的html+css编码规范
  • 提供了一套简洁、直观、强悍的组件
  • 有自己的生态圈,不断的更新迭代
  • 让开发更简单,提高了开发的效率
2.版本
  • 2.x.x:停止维护。兼容性好,代码不够简洁,功能不够完善。
  • 3.x.x:目前使用最多,稳定,但是放弃了IE6-IE7。对IE8支持但是界面效果不好,偏向于开发响应式布局、移动设备优先的web项目。
  • 4.x.x:最新版,目前还不是很流行

2.2 Bootstrap 使用

在现阶段我们还没有接触js相关课程,所以我们只考虑使用它的样式库。

控制权在框架本身,使用者要按照框架所规定的某种规范进行开发

Bootstrap使用四步曲:

  1. 创建文件夹结构
  2. 创建html骨架结构
  3. 引入相关样式文件
  4. 书写内容
1. 创建文件夹结构
2. 创建HTML骨架结构
<!doctype 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">
    <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
    <title>Bootstrap 101 Template</title>

    <!-- Bootstrap -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">

    <!-- HTML5 shim 和 Respond.js 是为了让 IE8 支持 HTML5 元素和媒体查询(media queries)功能 -->
    <!-- 警告:通过 file:// 协议(就是直接将 html 页面拖拽到浏览器中)访问页面时 Respond.js 不起作用 -->
    <!--[if lt IE 9]>
      <script src="https://fastly.jsdelivr/npm/html5shiv@3.7.3/dist/html5shiv.min.js"></script>
      <script src="https://fastly.jsdelivr/npm/respond.js@1.4.2/dest/respond.min.js"></script>
    <![endif]-->
  </head>
  <body>
    <h1>你好,世界!</h1>

    <!-- jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边) -->
    <script src="https://fastly.jsdelivr/npm/jquery@1.12.4/dist/jquery.min.js" integrity="sha384-nvAa0+6Qg9clwYCGGPpDQLVpLNn0fRaROjHqs13t4Ggj3Ez50XnGQqc/r8MhnRDZ" crossorigin="anonymous"></script>
    <!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
    <script src="https://stackpath.bootstrapcdn/bootstrap/3.4.1/js/bootstrap.min.js" integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd" crossorigin="anonymous"></script>
  </body>
</html>
3. 引入相关样式文件
4. 书写内容
  • 直接拿bootstrap预先定义好的样式来使用
  • 修改bootstrap原来的样式,注意权重问题
  • 学好bootstrap的关键在于知道它定义了哪些样式,以及这些样式能实现什么样效果

2.3 布局容器

bootstrap需要为页面内容和栅格系统包裹一个.container容器,bootstrap预先定义好了这个类,叫.container它提供了两个作此用处的类。

1. container类
  • 响应式布局的容器 固定宽度
  • 大屏(>=1200px)宽度定为1170px
  • 中屏(>=992px)宽度定为970px
  • 小屏(>=768px)宽度定为750px
  • 超小屏(100%)
2. container-fluid类
  • 流式布局容器 百分百宽度
  • 占据全部视口(viewport)的容器。
  • 适合于单独做移动端开发

3. bootstrap栅格系统

3.1 栅格系统简介

栅格系统英文为“grid systems”,也有人翻译为“网格系统”,它是指将页面布局划分为等宽的列,然后通过列数的定义来模块化页面布局。

bootstrap 提供了一套响应式、移动设备优先的流式栅格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多12列。

bootstrap里面container宽度是固定的,但是不同屏幕下,container的宽度不同,我们再把container划分为12等份

3.2 栅格选项参数

栅格系统用于通过一系列的行(row)与列(column)的组合来创建页面布局,你的内容就可以放入这些创建好的布局中。

超小屏幕(手机)<768px小屏设备(平板)>=768px中等屏幕(桌面显示器)>=992px宽屏设备(大桌面显示器)>=1200px
.container最大宽度自动(100%)750px970px1170px
类前缀.col-xs-.col-sm-.col-md-.col-lg-
列(column)数12121212
  • 行(row)必须放到container布局容器里面
  • 我们实现列的平均划分 需要给列添加 类前缀
  • xs-extra small:超小;sm-small:小;md-medium:中等;lg-large:大;
  • 列(column)大于12,多余的“列(column)”所在的元素将被作为一个整体另起一行排列
  • 每一列默认有左右15像素的padding
  • 可以同时为一列指定多个设备的类名,以便画风不同份数 例如 class=“col-md-4 col-sm-6”

3.3 列嵌套

栅格系统内置的栅格系统将内容再次嵌套。简单理解就是一个列内再分成若干份小列。我们可以通过添加一个新的.row元素和一系列.col-sm-*元素到已经存在的.col-sm-*元素内。

我们列嵌套最好加一个行 row 这样可以去掉父元素的padding值,而且高度自动和父级一样高

	<!-- 列嵌套 -->
	<div class="col-sm-4">
        <div class="row">
            <div class="col-sm-6">小列</div>
            <div class="col-sm-6">小列</div>
        </div>
</div>
3.4 列偏移

使用.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>

3.5 列排序

通过使用.col-md-push-*和-md-pull-*类就可以很容易的改变列(column)的顺序。

3.6 响应式工具

为了加快对移动设备友好的页面开发工作,利用媒体查询,并使用这些工具类可以方便的针对不同设备展示火隐藏页面内容。

类名超小屏小屏中屏大屏
.hidden-xs隐藏可见可见可见
.hidden-sm可见隐藏可见可见
.hidden-md可见可见隐藏可见
.hidden-lg可见可见可见隐藏

与之相反的,是visible-xs visible-sm visible-md visible-lg 是显示某个页面内容

4. 阿里百秀首页案例

技术选型

方案:我们采取响应式页面开发方案

技术:bootstrap框架

设计图:本设计图采用1280px设计尺寸

屏幕划分分析
  1. 屏幕缩放发现中屏幕和大屏幕布局是一致的。因此我们列定义为col-md-就可以了,md是大于等于970以上的
  2. 屏幕缩放发现小屏幕布局发生变化,因此我们需要为小屏幕根据需求改变布局
  3. 屏幕缩放发现超小屏幕布局又发生变化,因此我们需要为超小屏幕根据需求改变布局
  4. 策略:我们先布局md以上的pc端布局,最后根据实际需要在修改小屏幕和超小屏幕的特殊布局样式
container宽度修改

因为本效果图1280的宽度,而bootstrap里面container宽度最大为1170px,因此我们需要手动改下container宽度

5.移动端布局总结

5.1 移动端主流方案

1. 单独制作移动端页面(主流)

京东商城手机版

淘宝触屏版

苏宁易购手机版

2. 响应式页面兼容移动端(其次)

三星手机官网

5.2 移动端技术选型

  • 流式布局
  • flex弹性布局(推荐)
  • rem适配布局(推荐)
  • 响应式布局

建议:我们选区一种主要技术选型,其他技术作为辅助,这种混合技术开发

vw和vh

1. 移动端布局

  • 移动端布局—flex布局
  • 为了实现可以适配移动端,页面元素可以宽度和高度等比例缩放
  • 需要移动端适配有如下方案:

rem

市场比较常见:

  1. 需要不断修改html文字大小
  2. 需要媒体查询media
  3. 需要flexible.js

vw/vh

将来(马上)趋势

  1. 省去各种判断和修改

​ 代表:

​ b站…

2. vw/vh是什么

  • vw/vh是一个相对单位(类似em和rem相对单位)
    • vw是:viewport width 视口宽度单位
    • vh是:viewport height 视口高度单位
  • 相对视口的尺寸计算结果
    • 1vw = 1/100视口宽度
    • 1vh = 1/100视口高度

例如:

当前屏幕视口是375像素,则1vw就是3.75像素,如果当前屏幕视口为414则1vw就是4.14像素

注意事项:和百分比有区别的,百分比是相对于父元素来说的,而vw和vh总是针对当前视口来说的。

3. vw/vh怎么用

  • 超级简单,元素单位直接使用新单位vw/vh即可。
  • 因为vw/vh是相对单位,所以不同视口(屏幕)下,宽高一起变化完成适配。
<style>
	* {
    	margin: 0;
    	padding: 0
	}
	div {
    	width: 10vw;
    	height: 10vh;
    	background-color: pink;
	}
</style>
如何还原设计稿
  • 前提:我们设计稿按照iPhone678来设计,有个盒子是50像素*50像素的,如何使用vw呢?

分析:

  1. 设计稿参照iPhone678,所以视口宽度是375像素(像素大厨切换到2x模式)

  2. 那么1vw是多少像素?

    ​ 375px / 100 = 3.75px

  3. 我们元素的目标是多少像素?

    ​ 50px * 50px

  4. 那么50*50是多少个vw?

    ​ 50 / 3.75 = 13.3333vw

总结

  1. 开发中使用vw,需要像素大厨有哪些改动?
    • 把模式改为2x模式
  2. 开发中使用vw,如何还原设计稿?
    • 确定设计稿视口宽度。比如375
    • 直接使用测量数值 / (视口宽度 / 100)
    • 比如:50 / (375 / 100)

4. vw注意事项

  • 因为设计到大量除法,还是适应less搭配更好点。
  • 我们本质是根据视口宽度来等比例缩放页面元素高度和宽度的,所以开发中使用vw就基本够用了,vh很少使用。
  • 兼容性:网站:https://caniuse/

案例实战-哔哩哔哩官网首页

bilibili官网移动端首页布局

需求:实现在不容宽度设备中等比例缩放的网页效果

分析:

  1. 准备好项目目录以及文件

  2. 准备好字体文件(下载别人网站字体)

​ 检查元素->iconfont样式表->复制字体URL到浏览器地址栏->回车

  1. 准备好less文件

    ​ 生成的css文件自动放到css文件下面

"lesspile": {
    "out": "../css/"   // 设置到处css路径
}
  1. 准备开始项目内容

本文标签: 笔记web