[web前端] 1. 大纲

1. 第一阶段(后端、服务器端)

1.4 NodeJS(服务器)

1.4.1 语法规范

1. 区分大小写

2. 语句末尾的分号可写可不写

3. 单行注释://,多行注释:/*   */

1.4.2 变量常量

1. 声明变量

var x = 1;

练习:

声明多个变量,分别保存员工编号、姓名、性别、生日、工资、部门编号。

var empNo = 123
var empName = 'zhangsan'
var empSex = 'male'
var empBirthDay = '2012-12-24'
var empSalary = 9876.53
var empDepNo = 12
console.log(empNo, empName, empSex, empBirthDay, empSalary, empDepNo)
//123 zhangsan male 2012-12-24 9876.53 12

2. 关键字

 3.预留关键字

class, int,float...

4. 重新赋值

以下不会报错

var a = 1
var a = 2
a = 4
a = 'a'

var b=5, c=7, d;

undefined:

这是作者不经意出现的一个错误,但作者不承认(按理来说应该是null),后来就一直沿用到现在

var a;
console.log(a) //undefined

5. 常量

const PI = 3.14

1.4.3 数据类型

1. 原始类型(没有日期类型)

(1)数值:

整型(4byte),浮点型(8byte)

(2)字符串

不区分单引号和双引号

查询字符的unicode码:

var a ="中";
console.log(a.charCodeAt()) //20013

(3)布尔

true, false

(4)未定义(undefined)

只有一个值undefined

(5)空(null)

只有一个值null

var a = null;
console.log(a, typeof a) //null object

2. 引用类型(函数,对象)

3. 检测数据类型

var a = 3;
console.log(typeof a) //number

4. 数据类型转换

(1)隐式转换

加法运算遵循以下两个规则:

从左到右

字符串 > 数值 > 布尔

1)数字 + 字符串

var a = 1;
var b = 1 + '2'
console.log(b, typeof b) //12 string

2)数字 + 布尔

var a = 1;
var b = true
var c = a + b
console.log(c, typeof c) //2 number

3)布尔 + 字符串

var a = 'a';
var b = true
var c = a + b
console.log(c, typeof c) //atrue string

- * / 算法遵循以下规则:

两边尽力转成数值然后进行计算

var a = '2';
var b = 1
var c = a - b
console.log(c, typeof c) //1 number

如果无法转成数值,则结果为NaN

var a = 'e';
var b = 1
var c = a - b
console.log(c, typeof c) //NaN number

(2)强制转换

1)强制转换为数值型

var a = '12';
var b = Number(a)

console.log(b, typeof b) //12 number

Number(undefined)  //NaN

Number(null)  //0

2)强制转换为整型

会将前导数值转成整型

undefined,null,bool返回NaN

var a = '32e';
var b = parseInt(a)
console.log(b, typeof b) //32 number

3)强制转换为浮点型

parseFloat

4)数值,布尔转换成字符串

var a = true;
var b = a.toString()

console.log(b, typeof b) //true string

1.5 运算符

1.三等于(===)

类型相同,数值相同才为true

var a = true;
var b = 1;

console.log(a == b);   //true
console.log(a === b);  //false
console.log(a = b);    //1

2. 浏览器端函数(NodeJS没有)

1)警示框

alert('msg')

2)提示框

var a = prompt()
console.log(a)

var b = prompt('pls input your password')
console.log(b)

1.6 函数

1.6.1 分类

系统函数:isNaN/parseInt/parseFloat/Number/prompt/alert

自定义函数

1.6.2 格式

function 函数名称(参数列表){
    函数体
}

示例

function sum (a, b){
	return a + b
}

console.log(sum(1,2)) //3

函数定义的形参和调用函数时传递的实参个数可以不一致,如果实参个数少,则剩余的形参默认设置为undefined;如果实参的个数多,则多余的实参不会在形参中获取,但可以通过其他方式获取传递的全部实参。

1.6.3 作用域

变量或者函数(函数内定义的函数是局部作用域函数)的可访问范围,分为两种:

1. 全局作用域:
在函数外部定义的变量

在函数内部未使用var定义的变量(不建议使用)

2. 局部作用域

在函数内部使用var定义的变量

变量提升:

js程序执行前,会将使用var声明的变量提升到所在作用域的最前边,但赋值还是在原来的位置。

函数提升:

js程序执行前,会将使用function声明的函数提升到所在作用域的最前边,在调用时才会真正执行函数内的代码。

1.6.4 匿名函数

没有名称的函数:function(){}

创建函数:

(1)函数声明

function fn1(){}

(2)函数表达式

var fn2 = function(){}

函数声明创建函数存在提升,可以在任意位置创建;函数表达式使用变量创建,只存在变量提升 ,不存在函数提升,只能先创建后调用,

全局污染问题:

不管是变量还是函数,它的名称都是全局的,会造成全局污染

1. 对于变量,可以将变量定义在局部环境中

2. 对于函数,可以使用匿名函数,并采用自调用方式进行匿名函数的调用

(function(){
	console.log(1) //1
})();

1.6.5 函数回调

将函数以实参的形式进行传递

function allMax(fmax, a, b){
	return fmax(a, b)
}

var a = allMax(function(a, b) {
	return a > b ? a : b
}, 1, 3)
console.log(a)

1.6.6 全局函数

全局对象下定义的函数

parseInt/parseFloat/isNaN/encodeURI/decodeURI/isFinite/eval

function max(a, b){
	return a > b ? a : b
}

console.log(eval('max(2, 8)')) //8

1.7 对象

1.7.1 分类

1. 内置对象

js提供的

2. 宿主对象:根据不同的执行环境进行划分的

DOM对象,http对象

3. 自定义对象

1.7.2 创建自定义对象

1. 对象字面量

var person = {
	ename:'xiaolan', 
	age:23,
	'user name' : 'a'
}
console.log(person)
console.log(person.ename)
console.log(person['user name'])

2. 内置构造函数

var car = new Object()
car.size = 100
console.log(car)

遍历属性:

var car = new Object()
car.size = 100
car.name = 'benz'
car.color = 'red'
for(var key in car){
	console.log(key, car[key])
}

判断某个属性是否存在:

console.log(car.brand === undefined)
console.log(car.hasOwnProperty('brand'))
console.log('size' in car)

对象的成员方法

var car = new Object()
car.size = 100
car.name = 'benz'
car.color = 'red'
car.run = function(city){
	console.log('car run in ' + city)
}

car.run('shanghai')

3. 自定义构造函数

1.8 数组

1.8.1 创建数组

1. 数组字面量

var emps = ['a', 'b', 'c']
emps[10] = 'd'

console.log(emps) //[ 'a', 'b', 'c', <7 empty items>, 'd' ]

2. 内置构造函数

var emps = new Array('a', 'b')
console.log(emps)

指定初始化大小

var emps = new Array(1)
emps[3] = 'c'
console.log(emps)

1.8.2 关联数组

以字符串作为下标,而不是以数字作为下标(索引)

var emps = []
emps['age'] = 12
console.log(emps) //[ age: 12 ]

还可以将关联数组和下标数组混用:

var arr = [1,2]
arr['name'] = 's'

console.log(arr) //[ 1, 2, name: 's' ]

1.8.3 for in遍历数组

var emps = []
emps['age'] = 12
emps['name'] = 'zhangsan'

for(var key in emps){
	console.log(key, emps[key])
}

//age 12
//name zhangsan
var emps = [1, 2, 3]

for(var key in emps){
	console.log(key, emps[key])
}

//0 1
//1 2
//2 3

1.8.4 数组API

1. 数组转字符串

toString

join(seperator)

2. 拼接(原数组不变,返回拼接后的新数组)

var arr3 = arr1.concat(arr2)

var arr3 = arr1.concat(arr2)
for(var key in arr3){
	console.log(key, arr3[key])
}

3. 截取(原数组不变,返回截取到的数组)

slice(start, end)

4. 删除(原数组被删除指定元素,返回被删除的元素数组)

splice(start, count[, addV1, addV2...])

5. reverse反转(原数组被反转)

6. sort排序(原数组被排序)

7. 末尾加元素(原数组中增加元素,返回增加元素后的数组长度)

push

8. 末尾删除元素(原数组中删除元素)

pop

9. 数组头部增加元素(原数组中增加元素)

unshift

10. 数组头部删除元素(原数组中删除元素)

shift

1.8.5 二维数组

var cities = []
cities['shanghai'] = ['pudong', 'minhang', 'huangpu']
cities['sz'] = ['futian', 'baoshui', 'xiangshan']

for(var key in cities){
	console.log(cities[key])
}

//[ 'pudong', 'minhang', 'huangpu' ]
//[ 'futian', 'baoshui', 'xiangshan' ]

1.9 字符串

字符串是原始类型,但是它有包装类型(对象)。js有三种包装对象:字符串包装对象(String),布尔包装(Boolean)对象和数值包装对象(Number)。

var str1 = new String(1) //String对象
var str2 = String(1)  //string类型
var str3 = '2'  //string类型

1. 字符串API

(1)字符长度

length

(2)获取字符

charAt(index)

[index]

(3)获取下标

indexOf

lastIndexOf

(4)大小写转换

toUpperCase

toLowerCase

(5)截取字符串

slice

substr

substring

(6)分割成数组

split

(7)匹配模式

1)search(/xxx/i)  //正则表达式方式

2)match  //只能使用正则

3)replace

1.10 Math对象

不需要创建,可以直接使用

1.11 Date对象

1. 对象创建

   new Date('2022/3/15 10:36:56')  

   new Date(2022, 5, 19, 10, 36, 56)  //月份 0 - 11

   new Date()  //当前系统时间

   new Date(毫秒数)

2. API

  d.getFullYear

  d.getMonth  //0 - 11

  d.getDate

  d.getHours

  d.getMinutes

  d.getSeconds

  d.getMilliseconds

  d.getDay   //0 - 6

  d.getTime  //距离计算机元年的毫秒数

  d.toLocaleString

  d.toLocaleDateString

  d.toLocaleTimeString

1.12 Number对象

Number()   //转成数值

new Number()   //转成数值对象

1. API

toFixed()   //取小数点后的n位

1.13 Bolean对象

!!值   //转成boolean

1.14 异常

1. 错误类型

(1)语法错误(SyntaxError):错误的使用了中文符号,缺少括号等,这种错误会导致所有代码不执行;

(2)引用错误(ReferenceError):使用了未声明的变量,错误之前的代码会执行;

(3)类型错误(TypeError),属性当作方法使用,错误之前的代码会执行;

(4)范围错误(RangeError),数组的长度使用负数,错误之前的代码会执行;

2. 自定义错误

console.log(1)
var a = 'aa'
if(isNaN(a)){
	throw 'pls enter a num'
}

console.log(2)

3. 异常捕获

console.log(1)
try{
	var a = new Array(-1)
	
}catch(err){
	console.log('error: ' + err)
}

console.log(2)

==============NodeJS================

1.15 ES6

《ECMAScript6入门》

1.15.1 块级作用域

1. 先声明后使用

console.log(a)  //没有变量提升,ReferenceError
let a = 'a'

2. 大括号之内的位块作用域

1.15.2 参数默认值

function sum(a, b, c = 1){
	return a + b + c
}

console.log(sum(1, 3))

1.15.3 箭头函数

简化函数回调

let arr = [23,9,45,78,6]
console.log(arr.sort((a, b) => a - b)) //[ 6, 9, 23, 45, 78 ]

1.15.4 模板字符串

var year = 2022
var month = 5
var date = 7
var hour = 13
var dayOfWeek = '六'
console.log(`今天是${year}年${month}月${date}日${hour > 12 ? '上午' : '下午'}
   星期${dayOfWeek}
`)
//今天是2022年5月7日上午
//   星期六

1.16 NodeJS

ES对象 = 内置对象

 

 

1.16.1 nodejs特点

 

 

 1.16.2 全局对象 

1. global

(1)nodejs

全局对象:global

在交互模式下,定义的变量和函数,默认是全局的,可以使用global.xxx来调用;

但在脚本模式下,定义的变量和函数不是全局的,不能使用global.xxx调用

(2)js(浏览器)

全局对象:window

定义的变量和函数,默认是全局的,可以使用window.xxx来调用

查看API
1. nodejs.org/docs
2. nodejs.cn/docs

2. process:进程

process.arch //操作系统架构,如x64
process.platform  //操作系统,如win32
process.env  //环境变量
process.version //nodejs版本
process.pid  //当前进程编号
process.kill(4956)  //杀死进程4956

3. console

console.log()
console.info()
console.warn()
console.error()

//console耗时统计
console.time('for')
for(let i = 0; i < 10000; i++){
	i += 2
}

console.timeEnd('for')  //for: 0.164ms

4. buffer

var buf = Buffer.alloc(5, 'abcde')  //开辟长度位5的缓冲区,存储abcde
console.log(buf)  //<Buffer 61 62 63 64 65>
console.log(String(buf))  //abcde
console.log(buf.toString())  //abcde

5. 模块

一个独立的功能体

在NodeJS下,模块分成3大类:核心模块,自定义模块,第三方模块。

在NodeJS下,每个文件就是一个模块,NodeJS自动为每个文件添加构造函数,所有代码被该构造函数所包含:

//(function (exports, require, module, __filename, __dirname) {

  var a = 123;
  function fn(){}


//});

参数介绍:

1)exports:它是一个对象,他与module对象中的exports对象指向了同一个内存地址,也就是说,我们在导出模块中的变量和方法时,可以直接使用exports,也可以使用module.exports;

exports === module.exports

2)require:用于引入其他模块,它是一个方法;

3)module:它是一个对象,代表当前模块,它里面有一个重要的对象,即exports对象;

4)__filename:当前模块的全限定名(__dirname + 模块名称)

5)__dirname:当前模块的绝对目录路径

(1)编写07_1.js,内部引入07_2.js模块

  引入模块时,首先会执行被因为模块里的所有代码,但默认情况下,被引入模块里定义的变量和函数都是局部的,因此无法在引入模块中直接使用。

  可以使用module(代表当前模块对象)的exports对象来公开变量和函数,exports时module中的一个对象。

require中引入的模块如果是js模块,那么可以省略".js"

07_2.js
var name = 'Jerry';
function max(a, b){
	return a > b ? a : b;
}

module.exports.ename = name;  //等同于exports.ename = name;
module.exports.max = max;     //等同于exports.max= max;
  
========================================
07_1.js
var a = require('./07_2.js')  //等同于var a = require('./07_2')
console.log(a)           //{ ename: 'Jerry', max: [Function: max] }
console.log(a.ename)     //Jerry
console.log(a.max(1, 2)) //2

练习:

创建两个模块:main.js和cirecle.js, 在cirecle.js下创建两个函数,传递圆半径,计算圆的周长和面积,然后导出这两个函数。在main.js模块下引入cirecle.js模块,然后调用者两个函数。

function length(r) {return Math.PI * 2 * r}
function area(r) {return Math.PI * r * r}

module.exports.length = length;
module.exports.area = area;

//直接导出对象,这种情况下exports和module.exports不再相同
module.exports = {
	ename : 'john'
};

//直接导出匿名函数
module.exports.length = function(r){return Math.PI * 2 * r};

(2)引入目录形式模块

1)引入模块中需要使用require('./xxx'),然后会在该目录下寻找package.json

2)如果没有json文件,则查找该目录下是否有index.js,有则引入

3)如果有json文件,则按照json文件的描述进行引入

{
  "main" : "web.js"  //属性名称必需使用双引号,属性值如果是字符串,必需使用双引号
}
以路径开头不以路径开头
文件模块

require('./circle.js')

常用于引入自定义模块,后缀.js可以省略

require('querystring')

常用于引入核心模块

目录模块

require('./02_2')

会到02_2目录下查找package.json文件中的main属性对应的文件,如果找不到则引入index.js,如果没有index.js则报错

require('02_2')

会到当前目录下的node_modules文件夹中查找02_2目录,如果找不到,则往上一级目录查找,直到顶级目录,最好没找到则报错。常用于引入第三方模块

6. 包和npm

    包(package)就是一个目录模块,通常是第三方模块。

    npm是管理包的工具(下载第三方包),在安装nodejs时,npm也一起被安装了  npm -v

    全球最大的第三方包下载地址:www.npmjs.com 

第三方包下载安装过程:

npm init -y        //生成package.json文件,记录安装的包
npm install mysql  //安装好之后,会在package.json中记录dependencies信息
npm install        //在package.json所在的目录下执行该语句,会自动下载所有依赖包

7. 核心模块

(1)querystring

浏览器向服务器发送请求时传递数据的一种方式

const querystring = require('querystring')

var querystr = 'keyword=手机&enc=utf-8';
var obj = querystring.parse(querystr);
console.log(obj);
console.log(querystring.stringify(obj));

(2)url模块

parse(str)  //解析url

format(obj)  //将obj格式化成url

protocol
hostname
port
pathname
query

(3)全局函数

1)一次性定时器(js & nodejs)

var alert = global.setTimeout(() => console.log('aaa'), 3000);  //3000ms后执行function函数
clearTimeout(alert);  //清楚定时任务

2)周期性定时器(js & nodejs)

var timer = setInterval(回调函数,间隔毫秒数)
clearInterval(timer)

3)立即执行(nodejs)

var timer = setImmediate(回调函数)   //事件队列中执行回调函数
clearImmediate(timer)

nodejs是单线程语言,所有的代码必需顺序执行,但当遇到定时器的回调函数时,会将回调函数放入事件队列中,直到主程序的所有程序执行完毕,才会接着执行事件队列中的回调函数(回调函数中一般时比较耗时的逻辑)。

4. processTick(NodeJS)

process.nextTick(() => console.log(a)) //回调函数不会放入事件队列,而是放在主程序的最后

(4)fs模块

1)fs.stat(path, (err, stats) => {callback...}), var stats = fs.statSync(path)

2)fs.mkdir(path, err => {}), fs.mkdirSync()

同步方法如果报错会影响在它之后的代码执行,但异步方法因为是放在事件队列中,如果报错也只会影响异步函数自身。

3)fs.rmdir(path, err => {}), fs.rmdirSync()

4)fs.readdir(path, (err, result) => {}), var result = fs.readdir(path)

5)文件不存在,创建文件然后写入;如果文件存在,则清空文件,然后写入:

    fs.writeFile(path, data, (err) => {})

6)追加写入:

    fs.appendFile(path, data, (err) => {})

7)文件读取:

   fs.readFile(path, (err, data) => {})

8)文件删除:

  fs.unlink(path. err => {})

9)文件是否存在:

  var exists = fs.existsSync(path)

10)文件流

1. 可读流

  var stream = fs.createReadStream(path)

const fs = require('fs');

var stream = fs.createReadStream('a.txt');
stream.setEncoding('utf8');
stream.on('data', chunk => console.log(chunk)); //监听是否有数据事件
stream.on('end', () =>{})  //监听结束事件

2. 可写流

fs.createWriteStream(path)  //往path写

readStream.pipe(writeStream)  //将读流通过管道接入写流

(5)http协议

1)http.get(url, res => {})

const http = require('http');
http.get('http://www.baidu.com', res => {
	console.log(res.statusCode);
	res.on('data', chunk => console.log(chunk.toString()));
});

2)http服务端

const http = require('http');
var app = http.createServer();

app.listen(8080);//监听端口8080
app.on('request', (req, res) => {
	console.log(req.url, req.method, req.headers);
	//res.write('this is home page');
    res.writeHead(302, {Location:'http://www.baidu.com'});  //跳转

	res.end();  //结束并发送内容到客户端
});  //监听request事件

3)压缩

require("zlib");
var gzip = zlib.createGzip();'
fs.createReadStream(path).pipe(gzip).pipe(res);
res.writeHead(200, {
    "Content-Encoding" : "gzip",
    "Content-Type" : "text/html"
});

4)express

const express = require('express');
var app = express();
app.listen(8080);

app.get('/login', (req, res) => {
    console.log(req.method, req.url, req.headers);  //获取req的请求方法,url和请求头信息
    console.log(req.query);  //获取req的请求信息
    console.log(req.query);  //获取req的请求信息
    res.send(content);  //返回string内容
});

app.get('/login', (req, res) => {
    res.sendFile(path);  //返回文件
});

app.get('/index', (req, res) => {
    res.redirect(url);  //重定向
});

app.get('/detail/:price', (req, res) => { //路径参数
    console.log(req.params);
});

app.post('/login', (req, res) => {  //post请求
    req.on('data', mydata => console.log(querystring.parse(mydata.toString())));
    
    res.send('登录成功');
})

5)路由器

定义路由器:user.js

const express = require('express');

var router = express.Router();
router.get("/list", (req.res) => res.send('这是用户列表'));
router.get("/update", (req.res) => res.send('这是用户更新'));
...

module.exports=router;

web服务器引入router模块:web.js

const express = require('express');
const userRouter = require('./user');


var app = express();
app.listen(8080);

//挂载,在url前边加'/user'
app.use('/user', userRouter)

6)中间件

express的五个中间件:应用级中间件,路由级中间件,内置中间件,第三方中间件,错误处理中间件。

(1)应用级中间件:就是自定义写的中间件,使用时统一使用app.use()来使用中间件

const express = require('express');


var app = express();
app.listen(8080);

//第一个参数:拦截的url,也就是这个中间件给谁使用
//第二个参数:回调函数
app.use('/reg', (req, res, next) => {
    if(!req.params.username){
        res.send('用户名不能为空'); //验证不通过,直接返回
    } else {
        next(); //执行下一个中间件
    }
})

(2)内置中间件

//把所有的静态资源托管到public目录下,当浏览器请求静态资源会自动到public目录下寻找,不需要再创建单独的路由相应文件,如果没有这个中间件,需要使用res.sendFile(path)
//路径:1.绝对路径;2.相对于启动nodejs的路径
app.use( express.static('public') )

(3)第三方中间件

const bodyParser = require('body-parser');

app.use(bodyParser.urlencoded({
    extended : false //不适用第三方的qs模块,而是使用核心模块querystring类解析查询字符串为对象
    
}));

app.post('/login', (req, res) => {
    console.log(req.body);  //获取body信息,且自动转成了对象
    res.send('登录成功');
});

获取请求参数总结:

 7)数据库

const mysql = require('mysql');
var connection = mysql.createConnection({
    host : 'localhost',
    post : 3306,
    user : 'root',
    password : 'root',
    database : 'tedu'    
});

connection.connect();

connection.query('DELETE FROM emp WHERE eid = 3', (err, result) => {})
connection.query('INSERT INTO emp VALUES (?, ?, ?, ?)', [null, 'a', 1, 8000], (err, result) => {})

//直接将对象插入数据库
var emp = {
    ename : 'john',
    age : 12,
    dept : 'fast',
    salary : 1000000
};
connection.query('INSERT INTO emp SET ?', [emp], (err, result) => {});
connection.end();

(1)连接池

const mysql = require('mysql');
var pool = mysql.createPool({
    host : 'localhost',
    post : 3306,
    user : 'root',
    password : 'root',
    database : 'tedu',
    connectionLimit : 20 //设置连接池大小,设置了这个值就不需要再连接了    
});
pool.query(sql, callback);

2. 第二阶段(前端核心技术):

2.1 HTML5基础

html5被称为大前端技术,可以开发网页,app,桌面程序,数据可视化,VR...

2.1.1 标记

1. 双标记
<关键字>内容区域
内容区域中的内容是显示在页面上的数据

2. 单标记/空标记
<关键字/>或者<关键字>

2.1.2 嵌套

在一对标签中(内容区域)出现其他标记,从而性能功能叠加

<!--加粗并有超链接功能-->
<a href="">
    <b>aaa</b>
</a>

嵌套标签需要使用缩进展示,在前端中,一个缩进为2个空格。

2.1.3 属性和值

属性和值是对标签的修饰
1. 必需声明在开始标签中

<关键字 属性="值"></关键字>
<关键字 属性="值"/>

2. 一个标签可以有多个属性,属性间使用空格隔开

3. 属性值允许使用双引号,单引号或者不加引号,但推荐使用双引号

<html>
<header></header>
<body>
  <p align=center title="你很长寿" id='desc'>长得丑,活得久</p>

</body>
</html>

4. 属性是有分类的,并不是在任何标签下都能生效

(1)通用属性,标准属性

所有元素都能使用的属性,一共以下4中

title:鼠标悬停时显示的文本

id:定义元素在页面中的唯一标识

class:css中的类选择器

style:css中定义行内样式

2.1.4 注释

<!--注释-->

2.1.5 html学习

学习标签关键字及其功能
学习属性和值及其功能
学习嵌套关系

2.1.6 HTML文档结构

1. html文档构成

(1)文档类型声明

<!DOCTYPE html>  <!--标识这个要使用html5规则解析该文档-->

(2)网页结构

<html>
<head>
  <title>我的页面</title><!--定义网页标题-->
  <meta charset="utf-8"/>  <!--定义网页全局信息-->
  <!--乱码:1.html文档使用utf-8;2. meta设定utf-8-->
  <meta name="description" content=""/>  <!--方便百度搜索-->
  <meta name="Keywords" content=""/>
  <script></script>  <!--定义或引用js文件-->
  <style></style>  <!--定义网页内部样式-->
  <link>  <!--引用外部样式--> 
</head>
<body></body>
</html>

(3)body

1)专有属性:
bgcolor:背景颜色

text:文字颜色

(4)文本标记(***)

1)标题元素

    <h1>标题1</h1>
    <h2>标题2</h2>
    <h3>标题3</h3>
    <h4>标题4</h4>
    <h5>标题5</h5>
    <h6>标题6</h6>

特点:字体加粗,独占一行,上下有垂直间距

属性:

align:设置标记内部内容水平对齐方式,left(default)/center/right.单独成行的标签都可以使用该属性

2)段落元素 paragraph

<p></p>

特点:独占一行,上下有垂直间距

    p标签不允许嵌套块级元素(单独成行的标签)

属性:

align:设置标记内部内容水平对齐方式,left(default)/center/right

3)换行标记,水平标记

<br/>
<hr/>

hr属性:

size:设置水平线粗细,取值:5px

width:设置水平线宽度,取值:1000px,或者百分比,如50%,指占父元素宽度的百分比

align:水平线对齐方式

color:水平线颜色

4)预格式化标签

<pre></pre>

保留html代码中的换行和空格

5)特殊字符

空格:&nbsp;

小于号:&lt;

大于号:&gt;

版权标记:&copy;

注册商标:&reg;

<!--©<科技有限>版权所有-->

<p>&copy;&lt;科技有限&gt;版权所有</p>

6)文本样式

<b></b>  <strong></strong>  加粗

<i></i>  <em></em>  斜体

<s></s>   <del></del>  删除

<u></u> 下划线

<sup></sup> 上标(比如2的2次方)

<sub></sub>  小标

H5推荐使用有语义的标签

7)分区元素

块分区:div

用于做页面布局,数据逻辑分区,样式上并不能看出来。

独立成行。

行分区:span

    <a href="#">
        <span style="color:red">陶晶莹道歉</span>事件_百度百科
    </a>

8)元素显示方式

块级元素:独占一行,div, p, pre, h1-h6

行内元素:能够在一行内显示的元素,span,strong,b,em,...

行内块:

table:

flex:

2.1.7 图片和链接

1. 图片

<img src="图片路径/URL"/>

1)url:

绝对路径:

   网络资源必需使用绝对路径

   本机资源可以使用绝对路径,但在项目中不允许使用绝对路径,因为代码写在服务器,但运行在浏览器上,如果写成绝对路径,就需要浏览器存放图片的地址与服务器存放图片的地址相同。

相对路径:

    参照系:访问资源的html文件。

    兄弟关系,直接写文件名

    子级目录,先进入兄弟文件夹,再引入文件

    父级目录,先通过../进入父级文件夹,再引入文件

2)属性

src:source

title:鼠标悬停显示的内容

alt:图片资源出现错误时显示的内容

width:设置图片的宽度

height:设置图片的高度

2.链接

<a href="" target="_self"></a>

href:
  跳转的url, www.baidu.com
  要下载的文件, ../xxx.zip
  发邮件, mailto:xxx@163.com
  返回页面顶部,#
  执行js,javascript:alter(1)
  锚点,#xxx
target:
  _self:当前页面直接跳转,默认值
  —blank:在新页面跳转

(1)锚点

1)定义锚点(H4):

<a name="xxx"></a>

在h5中可以不定义锚点,而是使用标签的id号直接作为调转锚点

2)链接到锚点:

<a href="#xxx"></a>

如果是连接到其他页面的锚点,需要写上对应的url

<a href="xxx.html#id"></a>

2.1.8 表格

<table>
    <tr>  <!--第1行-->
        <td></td>
        <td></td>
    </tr>
    <tr>  <!--第2行-->
        <td></td>
        <td></td>
    </tr>
</table>

1. table属性:  

border: 边框
bordercolor: 边框颜色
width:表格宽度
height:表格高度
align:表格本身的对齐方式
bgcolor:表格背景色
cellpadding:单元格内边距,内边框到内容的距离
cellspacing:单元格外边距,边框到边框的距离

<table width="400px" height="400px"
           bgcolor="yellow" border="1px" align="center"
           cellpadding="5px" cellspacing="10px">
        <tr>
            <td>1</td>
            <td>2</td>
            <td>3</td>
            <td>4</td>
        </tr>
        <tr>
            <td>5</td>
            <td>6</td>
            <td>7</td>
            <td>8</td>
        </tr>
        <tr>
            <td>9</td>
            <td>10</td>
            <td>11</td>
            <td>12</td>
        </tr>
        <tr>
            <td>13</td>
            <td>14</td>
            <td>15</td>
            <td>16</td>
        </tr>
    </table>

2. tr属性

align:设置整行单元格内容的水平对齐方式,如果单元格设置了值,该值会被覆盖
valign:设置整行单元格内容的垂直对齐方式,top,middle,bottom,如果单元格设置了值,该值会被覆盖
bgcolor:设置整行单元格的背景色,,如果单元格设置了值,该值会被覆盖

3. td属性

width:宽度,会影响整列,整列的数据都要保持一致
height:高度,会影响整行,整行的高度都要保持一致
由于这种特性,表格的渲染方式和其他标签的渲染方式不同,表格的渲染需要全加载全部数据到内存中,然后再一次性进行渲染
align:单元格的水平对齐方式
valign:单元格的垂直对齐方式
bgcolor:单元格背景色
colspan:跨列
rowspan:跨行

4. 不规则表格(跨行,跨列)

(1)跨列:colspan

从指定单元格开始,横向向右合并N个单元格,被合并的单元格需要被删除

(2)跨行:rowspan

从指定单元格开始,纵向向下合并N个单元格,被合并的单元格需要被删除

<table width="400px" height="400px"
           bgcolor="yellow" border="1px" align="center"
           cellpadding="5px" cellspacing="10px">
        
        <tr align="right" valign="top">
            <td colspan="2">1</td>
            <td rowspan="2">2</td>
        </tr>
        <tr>
            <td  rowspan="2">5</td>
            <td>6</td>
        </tr>
        <tr>
            <td colspan="2">9</td>
        </tr>
    </table>

 5. table的可选标签

1. 表格标题,紧跟在table标签之后
  caption
2. 行列标题:
  th:字体加粗,居中

6. 表格的复杂应用

(1)行分组

<table>
    <thead></thead>
    <tbody></tbody>
    <tfoot></tfoot>
</table>

2.1.9 列表

1. 有序列表

<ol>
    <li></li>
    <li></li>
</ol>

ol属性:

type:标识类型,可选值:1, a, A, i, I

start:标识起始值

2.无序列表(页面布局)

<ul>
    <li></li>
    <li></li>
</ul>

属性:

type: disc, circle, square, none

3. 列表嵌套

1)列表中嵌套其他元素

2)列表中嵌套列表

4. 定义列表(对一个名词的解释使用的列表)

<dl>
    <dt>要解释的名词</dt>
    <dd>对名词的说明内容</dd>
</dl>

2.1.10 结构标记

用于网页布局。由于div可读性太差,h5新出了一堆结构标记,用于替代div布局,这些结构标记与div作用一摸一样,但是增加了可读性。

1. header:定义网页或者区域头部

2. footer:定义网页或者区域底部

3. nav:定义导航栏

4. section:定义网页主题

5. aside:定义侧边栏

6. article:定义文字相关内容,如论坛,回帖,用户评论

 2.1.11 表单

1. 作用

提供可视化输入控件

收集用户输入信息,并提交请求给服务器(form表单会自动收集信息,然后发送给服务器;但是ajax需要手动收集数据。因此表单和ajax这两种方式是二选一,也就是使用了ajax就不要使用表单,使用了表单就不要使用ajax。)

2. form的组成

前端:提供表单控件,与用户交互的可视化控件

后端:后台的接口对提交的数据进行处理

3. form表单的使用

<form action="接口url" method="提交请求方法"></form>

(1)form属性

1. action
  定义表单提交时发送的动作(向哪个url发送请求)
  如果action不写,或者action没有值,默认把请求发给本页面
2. method
  定义表单的提交方式
  get(默认值),提交内容显示在地址栏,提交的数据大小有限制,最大2kb
  post:没有大小限制,提交的内容不会显示在地址栏
3. enctype
  指定表单的编码方式
  允许将什么样的数据提交给服务器
  (1)text_plain: 允许提交普通字符给服务器
  (2)multipart/form-data: 允许提交文件给服务器
  (3)application/x-www-form-urlencoded: 允许提交任意字符(&*=...)给服务器(文件不允许)

4. 表单控件

(1)分类

1. input标签
  基础9种,h5新标签10种
2. textarea标签
3. select,option标签,下拉选择框
4. 其他元素

(2)input标签

<input type=""/>

属性:

  1)type:指定input元素的类型

  2)name:为控件定义名称,且为传参的变量名,服务器端取值时会使用到,如果没有name属性,对应的值不会被传递

  3)value:控件的值,就是传给服务器的值,它和name组成了键值对;在type为button时,value是按钮上显示的文本;

  4)disabled:禁用,文本只读,不可修改,不可提交;它是无值属性,也就是可以不需要赋值,也可以赋值为"disabled".

(3)input详解

  1)文本框(type="text", 默认类型)和密码框(type="password")

     特有属性:

      maxlength:设置输入的最大长度

      readonly:只读,不能改,属于无值属性;可提交(disabled不能提交)

      placeholder:占位符,用作提示,用户输入时会自动清空

  2)按钮相关:submit,reset,button

    submit:将表单种的数据收集整理,并发送给服务器。H5使用button标签替代了submit标签

    reset:重置,将当前表单恢复到初始状态

    button:按钮,没有功能,一般配合事件触发js脚本

  3)单选框(type="radio")和复选框(type="checkbox")

    name属性还具有分组功能,相同name属性的单选框只能择一选中,且必需设置value属性才能正确传值。

    checked:无值属性,就是默认选中

  4)隐藏域(type="hidden")

    需要提交给服务器,但是不想给用户展示。

 5)文件选择框(type="file")

    form的method必需使用post,enctype必需使用multipart/form-data

    特有属性:

    multiple:无值属性,可以一次性上传多个文件

(4)多行文本域

   textarea

   特有属性:

  rows, cols, 不精确,根据计算机硬件不同会有不同展示

(5)下拉框 

<select name="city">
    <option>上海</option>
    <option>北京</option>
</select>

1. select属性
(1)name
(2)size:选择框内显示几条可选项
(3)multiple:可多选


提交时,使用的是select的name属性作为key;
如果option没有value属性,那么提交的值为option的内容;
如果option有value属性,那么提交的值为option标签的value属性值

(6)其他元素

1)label:替代form中的span标签,文本和表单控件的关联(点击文本也可以选中),

2)fieldset:会使用边框框起来,还可以使用legend标签为fieldset创建标题

3)iframe(浮动框架):在一个html中引入其他html文本

<iframe src="header.html" frameborder="0" width="100%" height="100%" scrolling="no"></iframe>

(7)H5 input元素

email, search, url, tel, number(属性max, min, step), range(属性max, min, step), color, date, month, week

    (2)AJAX

    (3)CSS3

    (4)bootStrap(简化css3开发)

3. 第三阶段(前端进阶技术):

    (1)JS高级(难)

    (2)DOM&BOM

    (3)JQuery

    (4)VueJS

4. 第四阶段(H5移动开发):

    (1)HTML5

    (2)微信开发

    (3)HybridAPP

5. 第五阶段(框架技术):

    (1)AngularJS

    (2)ReactJS

    (3)Python

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值