html5
在H5中,所有以data- 开头自定义属性,都会被包装到一个dataset对象中,dataset也是元素一个属性
<div id="box" data-id="3" data-age="18" data-my-name="ls"><div>
console.log(div.dataset) =====打印的是一个对象{id:3,age:18,myName:"ls"}
autofocus 自动聚焦
autocomplete 自动完成,默认值为:on ,,为off 关闭自动提示功能
# HTML5 基础
## HTML5 的发展(了解)
1-HTML 的历史:
1993 年 HTML 首次以因特网草案的形式发布,然后经历了 2.0、3.2 和 4.0,直到 1999 年的 HTML 4.01 版本稳定下来。 后来逐渐被更加严格的 XHTML 取代。
2-XHTML 的兴衰史:
自从 HTML 4.01 版本之后,掌握着 HTML 规范的万维网联网(W3C)组织没有再发布新的标准,而是围绕着 XHTML 1.0 以及之后的 XHTML 2.0 展开工作。XHTML 是基于 XML 、致力于实现更加严格并且统一的编码规范的 HTML 版本,解决之前的 HTML 4.01 版本时,由于编码不规范导致浏览器的各种古怪行为。对于开发者来说,XHTML 极大的好处,就是强迫开发者养成良好的编码习惯,放弃 HTML 的凌乱写法,最终降低了浏览器解析页面的难度,方便移植到更多平台。
但是XHTML 带来的确实毁灭性的灾难,XHTML 2.0 规范了更严格的错误处理规则,强制要求浏览器拒绝无效的 XHTML 2 页面,强制 Web 开发者写出绝对正确规范的代码,同时不得向下兼容,这将意味着,之前已经写好的数亿的页面将无法兼容,并且Web开发者的难度又被加大,最终被抛弃了哦!
3-HTML 5 的到来:
2008 年 W3C 发布了 HTML 5 的工作草案,2009 年停止了 XHTML 2 计划。随着时间推移,HTML 5 规范进一步解决了诸多非常实际的问题,各大浏览器厂商开始对旗下的产品进行升级,以便支持 HTML 5 。HTML 5 规范得到了持续的进步和完善,从而迅速融入到 Web 平台的实质性改进中。
和 XHTML 2.0 不同,制定 HTML 5 规范的并不想挑出以往 HTML 的各种毛病为其改正,而是尽可能的补全 Web 开发者急需的各种功能。这些功能包括更强大的 CSS3、表单验证、音频视频、本地存储、地理定位、绘画(Canvas)、Web 通信等等。
## HTML5 的概念
**狭义概念**: 是 html4 的升级版,新增了标签,对标签进行了优化。
**广义概念**:HTML5 代表浏览器端技术的一个发展阶段。在这个阶段,浏览器呈现技术得到了一个飞跃发展和广泛支持,它包括:HTML5,CSS3,Javascript,API 在内的一套技术组合。
## **语法规范**
HTML5 在语法规范上也做了比较大的调整,去除了许多冗余的内容,书写规则更加简洁、清晰。
1、更简洁
2、更宽松
单标签不用写关闭符号
双标签省略结束标签
html、head、body、tbody 可以完全省略
实际开发中应规范书写,不建议太随意 !
## 新增语义标签及兼容
```html
<header>
表示页眉
<footer>
表示页脚
<section>
表示区块
<article>
表示文章 如文章、评论、帖子、博客
<aside>
表示侧边栏 如文章的侧栏 本质上新语义标签与
<div>、<span>没有区别,只是其具有表意性</span></div>
</aside>
</article>
</section>
</footer>
</header>
```
H5 的相关知识在 IE9 以下浏览器普遍存在兼容问题:
对于 html5 的语义标签的兼容问题,可以通过引入 htmlshiv.min.js 来解决;
```html
<!-- 为了解决ie9以下的浏览器不支持语义标签-->
<!-- 条件注释 :满足条件则引入问题 如果不满足就是一个普通的注释 只有ie能够识别 -->
<!--
less 小于
equal 等于
great 大于
than 比较
-->
<!--[if lt IE 9]>
<script src="html5shiv.min.js"></script>
<![endif]-->
```
## 表单
![](.\img\form.png)
表单类型
| 类型 | 使用示例 | 含义 |
| ------------ | ----------------------- | -------------------- |
| **email** | <input type="email"> | 输入邮箱格式 |
| **tel** | <input type="tel"> | 输入手机号码格式 |
| **url** | <input type="url"> | 输入 url 格式 |
| **number** | <input type="number"> | 输入数字格式 |
| **search** | <input type="search"> | 搜索框(体现语义化) |
| **range** | <input type="range"> | 自由拖动滑块 |
| **color** | <input type="color"> | 拾色器 |
| **time** | <input type="time"> | 时间 |
| **date** | <input type="date"> | 日期 |
| **datetime** | <input type="datetime"> | 日期时间 |
| **month** | <input type="month"> | 月份 |
| **week** | <input type="week"> | 周 |
> 部分类型是针对移动设备生效的,且具有一定的兼容性,在实际应用当中可选择性的使用。
表单属性:
| **属性** | **用法** | **含义** |
| ---------------- | ---------------------------------------------- | ------------ |
| **placeholder** | <input type="text" placeholder="请输入用户名"> | 占位符 |
| **autofocus** | <input type="text" autofocus> | 自动获得焦点 |
| **multiple** | <input type="file" multiple> | 多文件上传 |
| **autocomplete** | <input type="text" autocomplete="off"> | 自动完成 |
| **required** | <input type="text" required> | 必填项 |
## DOM 扩展
### 获取元素的新方法
```javascript
//通过css选择器获取元素,返回符合要求的第一个元素,注意返回结果是对象
document.querySelector(“css选择器”)
//通过css选择器获取元素,返回伪数组
document.querySelectorAll(“css选择器”)
```
### 类名操作
```javascript
//添加类
node.classList.add(“classname”);
//移除类
node.classList.remove(“classname”);
//切换类
node.classList.toggle(“classname”);
//判断是否包含指定的类
node.classList.contains(“classname”);
```
注意:H5 新增的 API,IE8 以下的浏览器有兼容问题。
###自定义属性
在 HTML5 中我们可以自定义属性,其格式如下 data-\*="",例如 data-info="自定义属性",
通过 Node.dataset['info'] 我们便可以获取到自定义的属性值。
Node.dataset 是以对象形式存在的
```html
<div data-name="zs"></div>
<script>
//获取data-name属性的值
var divName = document.querySelector('div').dataset['name'];
</script>
```
# CSS3
如同人类的的进化一样,CSS3 是 CSS2 的“进化”版本,在 CSS2 基础上,增强或新增了许多特性, 弥补了 CSS2 的众多不足之处,使得 Web 开发变得更为高效和便捷。
### CSS3 的现状
1、浏览器支持程度比较好,需要添加私有前缀
2、移动端支持优于 PC 端
### **如何对待**
1、遵循 渐进增强 原则
渐进增强: 让低版本浏览器 可以使用最基本的功能,高版本的浏览器具有更好的用户体验
2、考虑用户群体
3、遵照产品的方案
4、听 Boss 的
# 选择器
### 关系选择器
![](img/s1.png)
### 属性选择器
![](img/s2.png)
```
^ 开始 $ 结束 * 包含
属性选择器 属性 []
div[title] 选中页面中带有title属性的div
div[title="aa"] 选中页面中带有title属性的div,并且title属性取值为aa
div[title^="aa"] 选中页面中带有title属性的div,并且title属性取值以aa开始
div[title$="aa"] 选中页面中带有title属性的div,并且title属性取值以aa结尾
div[title*="aa"] 选中页面中带有title属性的div,并且title属性取值包含aa
```
### 伪类选择器
![](img/s3.png)
```
/*结构 伪类选择器 符号:一个冒号
:hover :active 可以一种状态
结构伪类 通过结构进行筛选的一种伪类
li:first-child:选中li的父盒子下面的第一个子盒子
li:last-child:选中li的父盒子下面的最后一个子盒子
li:nth-child(n):选中li的父盒子下面的第n个子盒子
li:nth-last-child(n): 从后向前选中第n个子元素
n 是从0开始正整数 0,1,2,3,4,5.... n小于1是无效的
偶数: 2n even 奇数:2n+1 2n-1 odd
-n+5 选中前5个
*/
```
### 其他选择器
```
:focus 查找获取到焦点的文本框
:checked 获得选中的checkbox
:disabled 获得不可用的框
:enabled 获得可用的框
:not(selector)选择不匹配selector的那些元素
:target 获取当前活跃的锚点链接
```
### 伪元素选择器
```
E::before E::after
注意事项:
//1. 必须指定content属性,可以在content属性中写入文本内容,但是通常为空字符串。
//2. 默认是行内元素,无法设置宽高,需要指定display:block或者position:absolute
E::before :在元素子节点的最前面添加一个内容。
E::after :在元素子节点的最后面添加一个内容。
E::first-line 选中第一行
E::first-letter 选中第一个字
E::selection 被选中的区域
```
# 盒子模型(box-sizing)
> CSS3 中可以通过 box-sizing 来指定盒子模型,即可指定为 content-box、border-box,这样我们计算盒子大小的方式就发生了改变。
可以分成两种情况:
1、box-sizing: border-box 盒子大小为 width
2、box-sizing: content-box 盒子大小为 width + padding + border
![](img/box.png)
# 背景
> 在 css2 中已经有 background 属性了,用于设置盒子的背景相关的一些样式,在 CSS3 中新增加了几个背景相关的几个属性。
## background-size
> 用户设置背景图片的尺寸大小
```javascript
//注意:这两种设置方式会导致图片失真。
/*background-size:设置背景图片的大小*/
background-size: 600px 400px;
/* 百分比是相对于盒子自身的宽度和高度 */
background-size: 100% 100%;
```
不失真的设置方式(等比例缩放)
```javascript
/*containe保证等比例缩放,但是会出现留白*/
background-size: contain;
/*cover保证等比例缩放,并且不会留白,但是出现有一部分图片不显示*/
background-size: cover;
```
## background-clip(了解)
> 设置背景区域的大小
```javascript
/*盒子的背景区域是整个盒子,包括边框和padding*/
/*默认值,设置背景区域包括了边框*/
background-clip: border-box;
/*背景区域只包含padding和content*/
background-clip: padding-box;
/*背景区域只包含content*/
background-clip: content-box;
```
## background-origin(了解)
> 设置背景图片的原点的位置,默认是 padding 的地方开始
```javascript
background-image: url(images/bg.jpg);
/*设置原点从border开始*/
background-origin: border-box;
/*设置原点从padding开始,默认值*/
background-origin: padding-box;
/*设置原点从content开始*/
background-origin: content-box;
```
## 多重背景
> background 设置背景的时候,可以设置多个背景图片,使用逗号隔开。注意颜色只能设置一次,并且通常来说,颜色都是在最后面进行设置。
>
> background 是一个合写的属性,如果在 background 之前设置了 background 相关的样式,会被覆盖掉。
```css
background: url(images/mn1.jpg) no-repeat top left, url('images/mn2.jpg') no-repeat right bottom, pink;
```
# 渐变
## 线性渐变
> linear-gradient 指沿着某条直线朝一个方向产生的渐变效果。
![](img/line.png)
```javascript
//注意:渐变实际上相当与一张图片,因为需要加给background-image才会生效
//渐变的两个要求:有区间,有颜色变化。
//最简单的渐变
background-image: linear-gradient(red, green);
//设定渐变的方向
background-image: linear-gradient(to right, red, green);
//也可以设定渐变的角度
background-image: linear-gradient(45deg, red, green);
//设定渐变的范围
background-image: linear-gradient(to right, red 20%, green 80%)
//每一个区间表示渐变颜色的范围
background-image: linear-gradient(to right, red 20%, green 20%)
```
渐变方向:
![](img/fx.png)
## 径向渐变
> radial-gradient 指从一个中心点开始沿着四周产生渐变效果
![](img/radius.png)
```javasript
/*1. 最简单的渐变*/
background-image: radial-gradient(red, green);
/*2. 指定圆的半径和圆心*/
background-image: radial-gradient(200px at center, red, green);
/*3. 指定椭圆*/
background-image: radial-gradient(200px 80px at center, red, green);
/*4. 指定范围*/
background-image: radial-gradient(200px at center, green 50%, red 50%);
```
## 圆角
border-radius 每个角可以设置两个值 ,x 值,y 值
圆角处理时,脑中要形成圆、圆心、横轴、纵轴的概念,正圆是椭圆的一种特殊情况。如下图
可分别设置长、短半径,以“/”进行分隔,遵循“1,2,3,4”规则,“/”前面的 1~4 个用来设置横轴半径(分别对应横轴 1、2、3、4 位置 ),“/”后面 1~4 个参数用来设置纵轴半径(分别对应纵轴 1、2、3、4 位置 )
![img](img/bd.jpg)
# 阴影
###盒子阴影:
box-shadow :阴影的水平位移 垂直位移 模糊程度 阴影大小 阴影颜色 inset(内阴影)
默认是外阴影
### 文字阴影:
text-shadow :阴影的水平位移 垂直位移 模糊程度 阴影颜色
# 颜色
新增了 RGBA、HSLA 模式,其中的 A 表示透明度通道,即可以设置颜色值的透明度,相较 opacity,它们不具有继承性,即不会影响子元素的透明度。
RGBA: Red、Green、Blue、Alpha
HLSA: Hue、Saturation、Lightness、Alpha
H 色调 取值范围 0~360,0/360 表示红色、120 表示绿色、240 表示蓝色
S 饱和度 取值范围 0%~100%
L 亮度 取值范围 0%~100%
A 透明度 取值范围 0~1
![](img/sepan.jpg)
# 过渡
> transition:过渡是 CSS3 中具有颠覆性的特征之一,可以实现元素不同状态间的平滑过渡(补间动画),经常用来制作动画效果。
关于补间动画与帧动画
- 帧动画:通过一帧一帧的画面按照固定顺序和速度播放。比如电影胶片
- 补间动画:补间动画只需要起始状态和终止状态,浏览器会自动完成中间的过渡。[http://mux.alimama.com/posts/1009](http://mu x.alimama.com/posts/1009)
## 过渡的属性
```javascript
//transition-property:设置过渡属性
//也可以是width,height
transition-property:all;
//transition-duration:设置过渡时间
transition-duration:1s;/*过渡的时间*/
//transition-delay:设置过渡延时
transition-delay:2s;/*2秒之后才进行动画*/
//transition-timing-function:设置过渡的速度
//linear,ease,ease-in,ease-out,ease-in-out, steps(10)
transition-timing-function:linear;
```
【演示】
## 属性合写
```javascript
/*属性 时间 延时 速度*/
transition: width 1s 3s linear, height 3s 1s ease;
```
过渡的注意点:
- 过渡必须要有两个状态的变化。
- 过渡可以写在 A 状态,也可以写在 B 状态,但是如果写在 B 状态,那么回来的时候,就没有过渡效果了。
# 2D 转换
> transform: 转换,是 CSS3 最具颠覆性的几个特性之一,既可以用于 2D 转换,也可以用于 3D 转换。
>
> transform:2D 转换,元素在平面上实现移动、旋转、缩放、斜切等操作
## scale 缩放
```javascript
transform: scaleX(0.5); //让宽度变化
transform: scaleY(0.5); //让高度变化,注意不能写多个transform,不然会覆盖。
transform: scale(0.5); //让宽度和高度同时变化
```
注意:
- scale 接收的值是倍数,因此没有单位
- scale 可以是一个值,如果是一个值,不是说仅仅缩放宽度,高度也会等比例的缩放。
- 可以通过 transform-origin 设定旋转原点
## translate 平移
```javascript
transform: translateX(100px);
transform: translateY(100px);
transform: translate(100px, 100px);
transform: translate(50%, 50%);
```
注意:
- translate 的值可以是 px,也可以是百分比,如果是百分比,那么参照的是自身的宽高。
- translate 移动的元素并不会影响其他盒子,类似于相对定位。
## rotate 旋转
```javascript
transform: rotate(360deg);//旋转360度
transform: rotate(-360deg);//逆时针旋转360度
```
注意:
- 单位是 deg,角度,不是 px
- 正值顺时针转,负值逆时针转
- 可以通过 transform-origin 设定旋转原点
- 转换原点写在 A 状态,不能写在 B 状态
![](img/rotate.png)
## skew 斜切
> skew 在实际开发中,是用的最少的一个属性。一般来说,x 和 y 只会倾斜其中的一个
```javascript
/*在水平方向倾斜30deg*/
transform: skewX(30deg);
/*在垂直方向倾斜30deg*/
transform: skewY(30deg);
```
![](img/skew.png)
## transform-origin 转换原点
> 通过 transform-origin 可以设置转换的中心原点。
```javascript
transform-origin: center center;
transform-origin: 40px 40px;
```
【案例:03-transform-origin 设置转换原点.html】
## 转换合写问题
```javascript
transform:translateX(800px) scale(1.5) rotate(360deg) ;
//1. transform属性只能写一个,如果写了多个会覆盖
//2. transform属性可以连写,但是顺序对效果影响的,因为它会在第一个效果的基础上执行第二个效果,然后执行第三个效果(通常会把rotate放后面)
//3. 如果对transform进行过度效果的时候,初始状态和结束状态一一对应
```
# 3D 转换
> transform:不仅可以 2D 转换,还可以进行 3D 转换。
思考:2D 与 3D 的区别?
## 坐标轴
> 用 X、Y、Z 分别表示空间的 3 个维度,三条轴互相垂直。**_注意+Y 是向下的。_**
![](img/xyz.png)
## rotate 旋转
```javascript
transform: rotate(45deg);// 让元素在平面2D中旋转
transform: rotateX(45deg);// 让元素沿着X轴转45度
transform: rotateY(45deg);// 让元素沿着Y轴转45度
transform: rotateZ(45deg);// 让元素沿着Z轴转45度
```
问题:看不出来怎么转的,为什么现实生活中能够看出来?
## translate 平移
```javascript
/*沿着X轴的正方向移动45px*/
transform: translateX(45px);
/*沿着Y轴的正方向移动45px*/
transform: translateY(45px);
/*沿着Y轴的正方向移动45px*/
transform: translateZ(45px);
```
## perspective 透视
> 电脑显示屏是一个 2D 的平面,因为我们看不出来旋转的方向,通过 perspective 属性,可以定义 3D 元素距视图的距离,单位是 px。
>
> 说白了,设置了 perspective 属性后,就有了进大远小的效果了,在视觉上,让我们能看出来 3d 的效果。
![](img/toushi.jpg)
> 注意:当为元素定义 perspective 属性时,其子元素会获得透视效果,而不是元素本身。
```javascript
perspective:500px;
```
关于近大远小
![](img/per.png)2
透视本质上设置的是用户的眼睛和屏幕的距离;
对于我们眼睛来说,离我们越近的房子,我们会感觉到这个房子越大,离我们越远的房子,就会感觉越小,其实房子的大小都是一样的,只是在视觉上的一种不同。
## ransform-style
> transform-style 属性规定如何在 3D 空间中呈现被嵌套的元素。注意这个属性只能给父元素添加。
```javascript
flat:默认值,2d显示
preserve-3d: 3d显示
```
transform-style 与 perspective 的区别
```javascript
/*透视:透视只是相当于设置了一个距离,辅助我们查看3D效果的工具,*/
/*preserve-3d:给父盒子添加,让子元素保留3D的位置,说白了,只有设置了preserve-3d,这个元素才能被称之为3d元素。 */
//一个3d元素可以没有perspective,但是不能没有transform-style
```
![](img/preserve.png)
立方体:
![](img/three.png)
**注意:** 3D 变换中旋转 ,对着正方向去看,正值都是顺时针 负值是逆时针
## backface-visibility
```javascript
//指定元素背面面向用户时是否可见。
//visible: 指定元素背面可见,允许显示正面的镜像。
//hidden: 指定元素背面不可见
//注意:只有在3d的情况下,backface-visibility才会生效
```
# 动画
> 动画也是 CSS3 中具有颠覆性的特征之一,可以通过设置多个节点来精确控制一个或者一组动画,常用来实现复杂的动画效果。
动画与过渡的区别:
1. 过渡必须触发,需要两个状态的改变。
2. 动画可以一直运行下去,不需要触发。实现效果与过渡差不多
【01-动画初体验.html】
使用一个动画的基本步骤:
```javascript
//1.通过@keyframes指定动画序列
//2.通过百分比或者from/to将动画分割成多个节点
//3.在各个节点中分别定义动画属性
//4.通过animation将动画应用于相应的元素
```
【02-keyframes 详解.html】
## animation 详解
> animation 是一个复合属性,一共有 8 个参数
```javascript
animation-name:动画名称,由@keyframes定义的
animation-duration:动画的持续时间
animation-timing-function:动画的过渡类型
animation-delay:动画的延迟时间
animation-iteration-count:动画的循环次数
animation-direction:设置动画在循环中是否反向运动
animation-fill-mode:设置动画时间之外的状态
animattion-play-state:设置动画的状态。
```
## 动画库的使用
[https://isux.tencent.com/css3/index.html](https://isux.tencent.com/css3/index.html)
[https://daneden.github.io/animate.css/](https://daneden.github.io/animate.css/)
# web 字体
开发人员可以为自已的网页指定特殊的字体,无需考虑用户电脑上是否安装了此特殊字体,从此把特殊字体处理成图片的时代便成为了过去。
支持程度比较好,甚至 IE 低版本浏览器也能支持。
## web 字体(了解)
阿里妈妈:http://iconfont.cn/webfont/#!/webfont/index
有字库:http://www.youziku.com/
1. 第一步:使用 font-face 声明字体 2.第二步:定义使用 webfont 的样式 3.第三步:为文字加上对应的样式 4.在 CSS3 中,可以通过@font-face 定义新的字体。
## 字体图标(重点)
我们经常把网页常用的一些小的图标,做成精灵图,然后通过 background-position 去调整位置,但是这个需要引入图片,并且图片大小改变之后如果失真。在 CSS3 中可以使用字体图片,即使用图标跟使用文字一样。
优点:
1、将所有图标打包成字体库,减少请求;
2、具有矢量性,可保证清晰度;
3、使用灵活,便于维护;
Font Awesome 使用
http://fontawesome.dashgame.com/
阿里巴巴矢量图标:(可以自己定制)
http://www.iconfont.cn/plus/collections/index?type=1
# 切割轮播图
```javascript
//transitionend:过渡完成事件
```
# 弹性布局(伸缩布局)
> 布局:其实就是调整元素在水平和垂直方向上的布局方式。
CSS3 在布局方面做了非常大的改进,使得我们对块级元素的布局排列变得十分灵活,适应性非常强,其强大的伸缩性,在响应式开中可以发挥极大的作用。
【演示:01-伸缩布局初体验.html】
当给一个盒子设置了 display:flex 之后,这个盒子就有了**_主轴_** 和**_侧轴_** 的概念。
主轴:Flex 容器的主轴主要用来配置 Flex 项目,默认是水平方向
侧轴:与主轴垂直的轴称作侧轴,默认是垂直方向的
方向:默认**_主轴从左向右_** ,默认**_侧轴从上到下_**
> 主轴和侧轴并不是固定不变的,通过 flex-direction 可以互换。
![](img/flex.png)
## flex-direction
> flex-diretion 主要是用来调整主轴的方向的,默认是水平方向
>
> 了解即可,一般来说,很少调整主轴的方向。
可选值
```javascript
row:主轴方向为水平向右
column:主轴方向为竖直向下
row-reverse:主轴方向为水平向左
column-reverse:主轴方向是竖直向上。
```
## justify-content(重点)
> justify-content 主要用来设置**_主轴方向的对齐方式_** ,可选的值有:
可选值:
```javascript
flex-start: 弹性盒子元素将向起始位置对齐
flex-end: 弹性盒子元素将向结束位置对齐。
center: 弹性盒子元素将向行中间位置对齐
space-around: 弹性盒子元素会平均地分布在行里
space-between:第一个贴左边,最后一个贴右边,其他盒子均分,保证每个盒子之间的空隙是相等的。
```
## align-items(重点)
> align-items 用于调整**_侧轴的对其方式_** ,可选的值有:
```javascript
flex-start: 元素在侧轴的起始位置对其。
flex-end: 元素在侧轴的结束位置对其。
center: 元素在侧轴上居中对其。
stretch: 元素的高度会被拉伸到最大(不能给死高度)。
```
## flex-wrap
> flex-wrap 属性控制 flex 容器是单行或者多行,默认不换行
```javascript
nowrap: 不换行(默认),会压缩子盒子的宽度。
wrap: 当宽度不够的时候,会换行。
```
## align-content
> align-content 用来设置多行的 flex 容器的排列方式。
```javascript
flex-start: 各行向侧轴的起始位置堆叠。
flex-end: 各行向弹性盒容器的结束位置堆叠。
center: 各行向弹性盒容器的中间位置堆叠。
space-between: 各行在侧轴中平均分布。
space-around: 第一行贴上边,最后一个行贴下边,其他行在弹性盒容器中平均分布。
stretch:拉伸,不设置高度的情况下。
```
align-items 与 align-content 的区别
```javascript
align-items调整的是侧轴的对其方式,不换行一般用align-items
align-content:必须是多行才生效,如果单行,没有效果。换行了就用align-content。
```
## flex 属性
> **_上述讲的属性都是给父盒子设置的,接下来的几个属性是给子盒子设置的。_**
>
> flex 属性用来设置子盒子如何分配空间
```javascript
flex: 1;
```
## order 属性
> order 属性定义项目的排列顺序。数值越小,排列越靠前,默认为 0。
```javascript
order: 1;
```
阮一峰的博客[http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html](http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html)
# 携程旅行网
> flex 布局的应用。
# 360 浏览器
## fullpage 的使用
> fullPage.js 是一个基于 jQuery 的插件,它能够很方便、很轻松的制作出全屏网站。
参考文档 [http://www.dowebok.com/77.html](http://www.dowebok.com/77.html)
下载地址 [https://github.com/alvarotrigo/fullPage.js](http://www.dowebok.com/77.html)
### 基本使用
1. 引入 jQuery 文件,因为 fullpage 是 jquery 插件
2. 引入 fullpage 的 js 文件,**_不要引入 fullpage 的 css 文件,不然容易样式冲突。_**
3. 页面结构
4. 编写 js 代码
```html
<!-- 页面结构 -->
<div id="box">
<!--每一个class为section的div都是一屏,section这个类是固定的-->
<div class="section">我是内容1</div>
<div class="section">我是内容2</div>
<div class="section">我是内容3</div>
<div class="section">我是内容4</div>
</div>
```
```javascript
//编写js代码
$(function() {
$('#box').fullpage();
});
//背景颜色
//['#0da5d6', '#2AB561', '#DE8910', '#16BA9D', '#0DA5D6']
```
### 鼠标滚动事件(了解)
```javascript
<script>
window.onload = function(){
var count = 0;
document.onmousewheel = function(e){
/*鼠标滚动的量 下滚是负 上滚是正*/
if(e.wheelDelta < 0){
count ++;
}else{
count --;
}
console.log(count);
}
}
</script>
```
### 常用参数
| 属性名称 | 描述 |
| ------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **_sectionsColor_** | 设置每一个 section 的背景颜色 |
| controlArrows | 定义是否使用箭头来控制幻灯片,默认 true |
| verticalCentered | 设定每一个 section 的内容是否垂直居中,默认 true, |
| resize | 设定字体是否随着窗口缩放而缩放,默认 false,一般不修改 |
| **_scrollingSpeed_** | 设置滚动的速度,默认 700 毫秒 |
| easing | 设置动画的方式,默认是 easeInOutCubic,如果想要修改此页,需要引入 jquery.easing.js |
| css3 | 是否使用 css3 transform 来实现滚动效果,默认 true,不用修改,CSS3 的动画效率比较 js 高。 |
| loopTop | 滚动到顶部后是否连续滚动到底部,默认 false |
| loopBottom | 滚动到底部后是否连续滚动到顶部,默认 false |
| loopHorizontal | 设置幻灯片是否循环滚动,默认 true |
| **_continuousVertical_** | 是否循环滚动,默认为 false,如果设置为 true,则页面会循环滚动,不会出现 loopTop 与 loopBottom 那样的跳动。 |
| autoScrolling | 是否使用插件的滚动方式,默认 true,如果选择 false,会出现浏览器子代的滚动条,将不会按页滚动,按照滚动进行滚动。 |
| scrollBar | 是否包含滚动条,默认 false,如果设置为 true,那么浏览器自定的滚动条会出现,这个时候,页面滚动还是按页滚动,但是浏览器也能滚动。不建议开启,不然会不同步。 |
| paddingTop/paddingBottom | 给每一个 section 设置一个 paddingTop 或者 paddingBottom,默认值为 0,如果需要给页面设置一个固定定位的头部菜单或者底部菜单的时候,可以使用这两个选项。 |
| keyboardScrolling | 是否可以使用键盘方向键导航,默认 true |
| **_navigation_** | 是否显示导航,默认为 false,设置为 true,会显示小圆点,作为导航 |
| navigationPositon | 导航小圆点的位置,设置 left 或者 right,默认是 right |
| navigationTooltips | 小圆点的提示信息,鼠标一上去能看到提示信息 |
| showActiveTooltip | 是否显示当前页面的导航的 tooltip 信息,默认是 false |
| slidesNavigation | 是否显示横向幻灯片的导航,默认为 false |
| slidesNavPosition | 设置横向幻灯片的位置,top 或者 bottom,默认 bottom |
| sectionSelector | section 的选择器,默认是.section |
| slideSelector | slide 的选择器,默认是.slide |
### 常用回调函数
| 方法名 | 描述 |
| ----------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| afterLoad(anchorLink, index) | 滚动到某一个 section,当滚动结束后,会触发一次这个回调函数,anchorLink 是锚链接的名称,index 从 1 开始计算 |
| onLeave(index,nextIndex,diretion) | 当我们离开一个 section 时,会触发这个函数,index 是离开的页面的序号,从 1 开始计算。 nextIndex 是滚动到的页面的序号,direction 是往上还是往下滚动,值是 up 或者 down. return false 可以取消滚动 |
| afterResize() | 窗口大小发生改变后会触发的回调函数 |
| afterSlideLoad(anchor,index, slideAnchor,slideIndex) | 页面滚动到某一个幻灯片的时候会触发这个回调函数 |
| afterSlideLeave(anchor,index,slideIndex, diretion,nextSlideIndex) | 当离开某一个幻灯片的时候会触发一次这个回调函数。 |
#HTML5-API
# 网络状态
> 在移动端,我们经常需要检测设置是在线还是离线,HTML5 为此定义了一个 navigator.onLine 属性,这个属性用于检测设备是否联网。**_navigator.onLine_** 在不同浏览器中有细微的差别。
## 网络状态
【01.网络状态.html】
```javascript
navigator.onLine返回用户当前的网络状况,是一个布尔值
1. 如果浏览器连不上网(包括局域网),就是离线状态,也就是脱机状态,会返回false
2. 否则就是在线状态,返回true
```
**_注意:返回 true 不一定就是说一定能访问互联网,因为有可能连接的是局域网。但是返回 false 则表示一定连不上网。_**
## 监听网络变化
【02-判断网络状态.html】
> 为了更好的确定网络是否连接,HTML5 还定义了两个事件,用于监听网络状态的变化。
```javascript
//网络连接时会被调用
window.addEventListener('online', function() {
alert('online');
});
//网络断开时会被调用
window.addEventListener('offline', function() {
alert('offline');
});
```
# 地理位置
> 在 HTML 规范中,增加了获取用户地理信息的 API,这样使得我们可以基于用户位置开发互联网应用,即基于位置服务 LBS(Location Base Service)
## 隐私
HTML5 规范提供了一套保护用户隐私的机制。必须先得到用户明确许可,才能获取用户的位置信息。**_在获取地理位置之前,会询问用户,只有在获得许可之后,才能获取到用户的位置信息。_**
## 相关的方法
【03-获取地理位置.html】
```javascript
//successCallback:获取成功后会调用,并返回一个position对象,里面包含了地理位置信息
//获取失败了会调用,并返回error对象,里面包含了错误信息。
//获取当前的地理位置信息
navigator.geolocation.getCurrentPosition(successCallback, errorCallback);
//重复的获取当前的地理位置信息
navigator.geolocation.watchPosition(successCallback, errorCallback);
```
实例:
```javascript
navigator.geolocation.getCurrentPosition(
function(position) {
// 定位成功会调用该方法
// position.coords.latitude 纬度
// position.coords.longitude 经度
// position.coords.accuracy 精度
// position.coords.altitude 海拔高度
},
function(error) {
// 定位失败会调用该方法
// error 是错误信息
}
);
```
**_在 iOS 10 中,苹果对 webkit 定位权限进行了修改,所有定位请求的页面必须是 https 协议的。_**
## 百度地图
> 仅仅获取到经纬度对于用户来说意义并不大,因为用户也不知道经度和纬度表示的是地球上的哪一个地方,因为我们可以结合百度地图,准确的将用户的位置显示出来。
百度地图官网:[http://lbsyun.baidu.com/](http://lbsyun.baidu.com/)
```javascript
1. 在开发中,找到javascript API
2. 直接查看示例demo
3. 复制相应的代码,替换掉秘钥就行,秘钥只需创建一个新的应用就可以了。
```
# web 存储
> 在代码执行的时候,数据都是存储在内存中的,当页面关闭或者浏览器关闭的时候,内存就被释放掉了。数据只有存储在硬盘上,才不会被释放。
【01-web 存储初体验.html】
```javascript
//存储在内存中,会被释放
var str = 'hello world';
console.log(str);
//存储在硬盘上,不会被释放
localStorage.setItem('name', '张三');
console.log(localStorage.getItem('name'));
```
## cookie(了解)
> 传统方式,我们以 document.cookie 进行存储,但是存储起来特别麻烦,并且,存储大小只有 4k,常用来做自动登录,即存储用户的账号和密码信息。每次请求都会带上 cookie
【02-cookie 存储.html】
cookie 是以字符串形式存在的,这个字符串有固定的格式:key=value;key1=value1;
在获取 cookie 内容时,一般需要通过正则或者字符串的方法进行处理,转换成对象,最终得到数据。
```javascript
document.cookie = 'name=zhangsan';
document.cookie = 'age=18';
document.cookie = 'sex=23';
//读取cookie
var result = document.cookie;
console.log(result);
```
使用原生 js 操作 cookie 太过麻烦,尤其是 cookie 的获取和删除操作,使用 jquery.cookie 插件,能够简化我们的操作。
【03-cookie 存储(jquery 插件).html】
```javascript
//设置cookie
$.cookie('name', 'zs');
//获取cookie
console.log($.cookie('name'));
//删除cookie
$.removeCookie('name');
```
**使用 cookie:操作太麻烦,最多只能存储 4k ,每次请求都会带上 cookie,所以用户名和密码、还有 sessionID 会存储在 cookie 中**
## sessionStorage 与 localStorage
> HTML5 规范提出了解决方案,使用 sessionStorage 和 localStorage 存储数据。设置、读取、删除操作很方便
window.sessionStorage 的特点
```javascript
1. 声明周期为关闭浏览器窗口
2. 不能在多个窗口下共享数据。
3. 大小为5M
```
window.localStorage 的特点
```javascript
1. 永久生效,除非手动删除
2. 可以多个窗口共享
3. 大小为20M
```
window.sessionStorage 与 window.localStorage 的方法
```javascript
setItem(key, value); //设置存储内容
getItem(key); //读取存储内容
removeItem(key); //删除键值为key的存储内容
clear(); //清空所有存储内容
key(n); //以索引值来获取存储内容
```
【04-sessionStorage 与 localStorage 的用法.html】
【05-案例-换肤效果.html】
**面试题:请描述一下 cookies,sessionStorage 和 localStorage 的区别?**
# 自定义播放器
全屏切换 API:
```javascript
video.requestFullScreen();
```
方法:load()、play()、pause()
属性:
```javascript
currentTime:当前时间
duration:总长时间
timeupdate:播放进度更改时触发
volume:控制音量
```
参考文档
http://www.w3school.com.cn/tags/html_ref_audio_video_dom.asp
**_主要目的是练习一下 video 的属性和方法,还有之前我们学过的 js_**
推荐网站:[https://www.awesomes.cn/](https://www.awesomes.cn/)
# 文件读取
> 通过 FileReader 对象我们可以读取本地存储的文件,可以使用 File 对象来指定所要读取的文件或数据。其中 File 对象可以是来自用户在一个`<input>`元素上选择文件后返回的 FileList 对象,也可以来自由拖放操作生成的 DataTransfer
## files
对于 file 类型的 input 框,在这个 DOM 对象中,存在一个 files 属性,这个属性是 FileList 对象,是一个伪数组,里面存储着上传的所有文件,当 input 框指定了 multiple 属性之后,就可以上传多个文件了。
也就是说,通过 files 这个属性,我们就可以获取到所有上传的文件。
## file 对象
File 对象中包含了文件的最后修改时间、文件名、文件类型等信息。
## FileReader 对象
FileReader 是一个 HTML5 新增的对象,用于读取文件。
```javascript
//创建一个fileReader对象
var fr = new FileReader();
//读取文件的两个方法
//readAsText() 以文本的方式读取文件 ,文本文件
//readAsDataURL() 以DataURL形式读取文件,图片,视频
//文件读取完成事件:
fr.onload = function() {};
//当文件读取完成,可以通过result属性获取结果
fr.result;
```
参考资料:
https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader#toc
案例:
```javascript
var file = document.getElementById('file');
var box = document.getElementById('box');
file.addEventListener('change', function() {
console.dir(file);
//files:里面存储了所有上传的文件
//这个data就是我们上传的那个文件
var data = file.files[0];
//1. 创建一个文件读取器
var fr = new FileReader();
//2. 让文件读取器读取整个文件
fr.readAsDataURL(data);
//3. 等待文件读取完
//onload:文件读取完成后,就会触发
fr.onload = function() {
var img = document.createElement('img');
img.src = fr.result;
box.innerHTML = '';
box.appendChild(img);
};
});
```
# 拖拽
在 HTML5 的规范中,我们可以通过为元素增加 draggable="true"来设置此元素是否可以进行拖拽操作,其中图片、链接默认是开启的。
## 拖拽元素
页面中设置了 draggable="true"属性的元素,其中`<img>`、`<a>`标签默认是可以被拖拽的
## 目标元素
页面中任何一个元素都可以成为目标元素
## 事件监听
根据元素类型不同,需要设置不同的事件监听
```javascript
//1、拖拽元素
ondrag 应用于拖拽元素,整个拖拽过程都会调用
ondragstart 应用于拖拽元素,当拖拽开始时调用
ondragend 应用于拖拽元素,当拖拽结束时调用
//2、目标元素
ondragover 应用于目标元素,当停留在目标元素上时调用
ondrop 应用于目标元素,当在目标元素上松开鼠标时调用(浏览器默认不让拖拽,需要阻止的默认行为。)
```