HTML
一般而言,一个初始的 HTML 文件拥有如下结构:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Hello, world!</title>
</head>
<body>
<h1>Hello World</h1>
</body>
</html>
其中:
<!DOCTYPE html>作为 文档声明 用于声明当前 HTML 文件的版本,这条语句表示当前使用的 HTML 版本为 5<html lang="en"></html>作为 HTML 的根标签,包括了除文档声明之外的所有文件中的 HTML 语句<head></head>作为 头部,也是当前页面的配置信息,用于外部引入文件<body></body>作为 内容,用于显示浏览器页面内的内容
注意:
- 主流采用 HTML 5 规范
- HTML 的文件拥有
.html和.htm两种扩展名 html标签不区分大小写,在html标签中,推荐等号左右不添加空格以增加可读性
HTML 的常用标签有:
- 标题:从
<h1></h1>到<h6></h6>,标题字号逐渐减小,标题之间有嵌套关系 - 段落:
<p></p> - 粗体:
<b></b>,同时还有易混淆的<strong></strong>用于强调,其中视障人士的屏幕阅读器会在<strong>标签时重读,由此<b></b>和<strong></strong>的区别在于一个是为了粗体而粗体,一个是为了强调而粗体 - 斜体:
<i></i>,同上有<em></em> - 删除线:
<s></s>,同上有<del></del> - 下划线:
<hr/> - 换行:
<br/> - 图片标签:
<img src="" width="" height="" alt="" title=""/> - 无序列表:
<ul type=""><li></li></ul>type="circle/square"表示无序列表前符号使用空心圆还是实心方块
- 有序列表:
<ol start="" type=""><li></li></ol>start=表示起始引索,默认为1type=表示有序列表前符号类型:1阿拉伯数字a小写英文字母A大写英文字母i小写罗马数字I大写罗马数字
- 超链接:
<a href="" target="">...</a>href表示地址,target表示打开方式,在...中写下希望让用户读到的内容
<a href="#"></a>为假链接,原因是#在HTML中表示当前页面的锚点,但如果没有指定具体的锚点 ID,点击后只会回到页面顶部
- 表格:
<table>:表格容器
<tr>:表格行(table row)<th>:表头单元格(table header),默认加粗居中<td>:标准单元格(table data)<thead>:表头部分<tbody>:表格主体<tfoot>:表格页脚
<table>
<thead>
<tr>
<th>表头 1</th>
<th>表头 2</th>
</tr>
</thead>
<tbody>
<tr>
<td>数据 1</td>
<td>数据 2</td>
</tr>
</tbody>
</table>
HTML 标签的一个难点在于对表单 <form> 的使用。<form> 声明了表单:创建一个表单容器,包含各种输入控件,收集用户输入并通过 HTTP 请求发送到服务器。
格式形如 <form action="" method="" target="">,其中主要属性有
action=用于指定表单提交的 URLmethod=表示提交的方式GET/POSTGET:在地址栏后面携带,只能携带字符串,携带的数据大小一般不允许超过 4 KB,缺点是数据暴露、长度限制和编码限制(只能选 URL 编码)POST:在 HTTP 协议的请求体中携带,可以携带任意类型数据,携带数据大小无限制,同时比GET更安全,但是POST请求不可缓存、不可书签化、多次提交可能重复操作而且性能会比GET稍差
target=在何处打开响应_self, _blank, _parent, _topenctype=表示编码类型autocomplete=表示是否启用自动填充novalidate表示禁用表单验证
常用的表单控件(表单项)有:输入类型 <input>,选择菜单 <select>,文本域 <textarea>:
<input>输入框:最常用的表单控件,通过type属性可以创建多种不同类型的输入字段<select>选择菜单:允许用户从预选项中选择<textarea>多行文本域:用于输入多行文本内容,适合长文本的输入
这三者的共同重要特性有:
name属性:所有控件都需要name属性,用于在提交时标识数据id和<label>:使用id与<label>关联,提升可访问性和用户体验required:HTML 5 验证属性,即标记的必填项/必选项placeholder:输入提示文字value:控件的默认值或选中状态 还有一些杂七杂八的比如音频、视频、图片标签,还有<a href="#top">Back to Top</a>这样的假链接和<summary></summary>、<details></details>之类的需要时查询即可。
CSS
关于 CSS,首先要引入 HTML 中 div 和 span 的概念:
div是 HTML 中的一个标签,无特定含义,通常作为自定义的容器配合 CSS 完成网页的基本布局span也是没有特定语义的标签,一般作为文本容器出现 两者的区别体现在:div是“块级元素”,会独占一行;span是行内元素,不会独占一行div可以再嵌套其他标签(因而容易滥用);span中只能嵌套文本/图片/超链接 CSS 的基本语法如下:
{
Property: Value Value;
Property: Value Value
}
要点在于:
- 属性和属性值用
:连接 - 如果一个属性有多个值直接用空格隔开
- 如果有多个属性,属性和属性之间用
;隔开,最后一个;可省略也可写 关于 CSS 引入方式的优先级要记住:行内样式优先级永远最高,而内部和外部样式谁写在后面谁优先。
内联(行内)样式通过标签的 style 属性来结合:
<p style="Property: Value; Property: Value Value"></p>
内部样式通过 style 标签来结合:
<head>
<style type="text/css">
Selector {
property: Value Value;
}
</style>
</head>
其中 style 标签必须写在 head 标签的开始和结束标签之间,同时 style 标签中的 type 属性默认即为 text/css 因而可省略不写。
外部样式则为通过 link 标签来结合。
<head>
<link rel="stylesheet" href="loc/custom.css" />
</head>
接下来来看一下 CSS 的基本选择器吧:
| 选择器 | 描述 | 语法 | Eg |
|---|---|---|---|
| 标签选择器 | 根据 HTML 标签名称选择标签 | Selector {} |
div { Property:Value; } |
| ID 选择器 | 根据 id 属性值选择标签 | #id {} |
#d1 { Property:Value; } |
| 类选择器 | 根据 class 属性值(类名)选择标签 | .class {} |
.c1 { Property:Value; } |
| 同源选择器 | 选取所有标签 | * {} |
* { Property:Value; } |
此处的优先级大小为:ID > 类 > 标签 > 通用 还有被称为 CSS 组合选择器的:
| 选择器 | 描述 | 语法 | Eg |
|---|---|---|---|
| 层级选择器 | 层级关系选择标签 | Parent Son |
div a{} |
| 属性选择器 | 根据指定属性的值筛选元素 | [Property='Value'] |
input[type='text'] {} |
| 并集选择器 | 多个选择器的结果进行合并 | Selector1, Selector2, ... |
.c1, span {} |
以下分别为三种 CSS 中常见的属性:背景属性、文本样式和字体属性。
| 功能 | 属性名 | 属性取值 |
|---|---|---|
| 背景色 | background-color |
1. 颜色常量 2. 使用十六进制 3. RGB |
| 背景图片 | background-image |
url() |
| 平铺方式 | background-repeat |
_ repeat:默认,背景图像将在垂直方向和水平方向重复_ repeate-x:背景图像将在水平方向重复_ repeate-y:背景图像将在垂直方向重复_ no-repeat:背景图像仅显示一次 |
| 背景位置 | background-position |
left, top |
| 功能 | 属性名 | 属性取值 |
|---|---|---|
| 颜色 | color |
颜色 |
| 设置行高 | line-height |
像素 |
| 文字修饰 | text-decoration |
_ underline:下划线_ overline:上划线_ ine-through:删除线_ none:无线条 |
| 文本缩进 | text-indent |
缩进文本,单位可用 em |
| 文本对齐 | text-align |
默认值由浏览器决定,有 left, right, center 三种取值 |
| 功能 | 属性名 | 作用 |
|---|---|---|
| 字体名 | font-family |
设置字体,需要本机拥有或者在线引入 |
| 设置大小 | font-size |
像素 |
| 设置样式 | font-style |
_ normal:默认,标准字体样式_ italic:斜体 |
| 设置粗细(字重) | font-weight |
加粗使用 bolder |
JavaScript
JavaScript 能干什么呢?
- 操作浏览器(BOM):网址跳转、历史记录切换、浏览器弹窗
- 操作网页(DOM):操作 HTML 标签、标签属性、样式、文本等
注意到 JS 在浏览器内存中进行运行时操作,不修改网页根本源码,刷新网页之后网页还原。
根据 JS 的作用,不难推断出 JS 的组成:
- ECMAScript:JS 的基本语法规范
- BOM (Browser Object Model):浏览器对象模型,与浏览器交互
- DOM (Document Object Model):文档对象模型,操作网页
类似于 CSS,JS 的引入也有在 <script></script> 中直接编写和 <script src="custom.js"></script> 引入两种手段。显然,一个 <script> 标签不能同时引入和编写。
JS 有如下控制台方法:
console.log():控制台输出正常语句console.warn():控制台警告框console.error():控制台错误提示
JS 作为一门 弱类型语言,其变量类型由其值决定,定义变量使用关键字 var 或者 let。在作用域、变量提升、重复声明等方面存在显著差异。推荐优先使用 let 和 const,避免使用 var 除非有特殊兼容性需求。常见 JS 变量类型如下:
- 数值类型
number,如1, 2, 3, 3.14 - 布尔类型
boolean,true,false - 字符串类型
string,如"string",'string' - 对象类型
object,如new Date(),null - 以及尚未确定的类型
undefined,如var a有一函数typeof()用于判断变量的类型 对于变量,有运算符==比较数值以及===比较变量数值和类型。所以会出现经典的:
var i = 2;
var j = "2";
alert(i == j); // true
alert(i === j); //false
JS 也有和 C++ 长得几乎相同的 for, if, switch:
// for
for (let i = 1; i <= n; i++) {
for (let j = 1; j <= i; j++)、
document.writeln(i + j)
}
// if
var e = 7;
if (e == 1) {
alert('1');
} else if (e == 2) {
alert('2');
} else {
alert('7');
}
// switch
var s = "js";
switch (s) {
case "java":
alert("java");
break;
case "javascript":
alert("javascript");
break;
case "js":
alert("js");
break;
}
JS 的函数内部有一个 arguments array 用于存放传入的参数,故 函数声明时的参数个数和函数调用时传入的参数个数可以不一致。JS 没有函数重载,同名函数后者覆盖前者。参数列表中直接写参数名而无需写 var。
// 普通函数
function func(args) {
//...
return val;
}
// 匿名函数
function (args) {
// ...
return val;
}
匿名函数的核心应用场景是快速嵌入配合其他函数作用,比如回调函数、事件监听,以及 ES6 中引入的箭头函数,但是注意其无法递归、复用性差。同时 Debug 时在报错栈中会显示为 anonymous 或 ? 难以定位来源。在 JS 中,单独声明一个匿名函数且不将其赋值、传递或立即执行,基本上等于写了一行“废代码”。因而单独的匿名函数声明是无法通过解析的。
JS 的 事件 指的是发生在 HTML 元素上的“事情”,即浏览器/用户做的某些事情。事件通常与函数配合使用,通过绑定的形式让发生的事件来驱动函数运行。有以下常见事件:
| 属性 | 对应“事件” |
|---|---|
onclick |
当用户点击某个对象时调用的事件句柄 |
ondblclick |
当用户双击某个对象时调用的事件句柄 |
onchange |
域的内容被改变 |
onblur |
元素失焦 |
onfocus |
元素获焦 |
onload |
页面或图像完成加载 |
onsubmit |
确认按钮被点击,表单被提交 |
onkeydown |
某个键盘按键被按下 |
onkeypress |
某个键盘按键被按住 |
onkeyup |
某个键盘按键被松开 |
onmousedown |
鼠标按钮被按下 |
onmouseup |
鼠标按键被松开 |
onmouseout |
鼠标从某元素移开 |
omouseover |
鼠标移到某元素之上 |
onmousemove |
鼠标被移动 |
如何将事件绑定呢?对于普通/匿名函数各有其方式:
// 普通函数
<标签 属性="js 文件, 调用函数"></标签>;
// 匿名函数
标签对象.事件属性 = function () {
// ...
};
JS 的数组构建方式如下:
var arr = new Array(size);
var arr = new Array(elem1, elem2, elem3, ...); // 注意此处上下两种命名方式的设计缺陷:当只有一个参数时语义歧义突变
var arr = [elem1, elem2, elem3, ...]; // 绝对推荐
由 JS 的变量特性我们不难得到:JS 数组中的每个元素都可以是任意类型,JS 数组长度可变,类似于 list。
对于数组 Array 常用的方法有:
concat():连接若干个数组并返回结果join():把数组中所有元素放入一个字符串中并通过指定的分隔符进行分隔reverse():颠倒数组中元素的顺序 对于二维数组:
var arrs = [
[1, 2, 3, 4, 5],
[1, 2, 3, 4, 5],
[1, 2, 3, 4, 5],
];
for (let i = 0; i < arrs.length(); i++) {
for (let j = 0; j < arrs[i].length(); j++) {
// ...
}
}
JS 另一个重要的内置对象是 Date 日期:
- 创建当前日期
var date = new Date() - 创建指定日期
var date = new Date(Y, M, D, H, M, S)注意月从 0 开始,0 表示 1 月。 日期也有不少自己的 方法。
JS 的 BOM 中封装了浏览器中各个对象,使得开发者可以方便的 操作浏览器中的各个对象。常见的有 windows(窗体对象)、navigator(浏览器导航对象)、screen(屏幕对象)、histroy(历史对象)、location(当前路径信息)。
| 方法 | 作用 |
|---|---|
alert() |
显示带有一段消息和一个确认按钮的警告框 |
confirm() |
显示带有一段消息以及确认按钮和取消按钮的对话框 |
prompt() |
弹出输入框 |
setInterval(func,time) |
按照指定的周期(以毫秒计)来调用函数或计算表达式,请注意是传入函数名 |
setTimeout(func,time) |
在指定的毫秒数后调用函数或计算表达式 |
clearInterval() |
取消由 setInterval() 设置的 Interval()。 |
clearTimeout() |
确认按钮被点击,表单被提交 |
onkeydown |
取消由 setTimeout() 方法设置的 timeout。 |
| 方法 | 作用 |
|---|---|
appName |
返回浏览器的名称 |
appVersion |
返回浏览器的平台和版本信息 |
| 方法 | 作用 |
|---|---|
width |
返回显示器屏幕的分辨率宽度 |
height |
返回显示屏幕的分辨率高度 |
| 方法 | 作用 |
|---|---|
back() |
加载 history 列表中的前一个 URL |
forword() |
加载 history 列表中的下一个 URL |
go() |
加载 history 列表中的某个具体页面 |
| 方法 | 作用 |
|---|---|
host |
设置或返回主机名和当前 URL 的端口号 |
href |
设置或返回完整的 URL |
port |
设置或返回当前 URL 的端口号 |
JS 的 DOM 用于 访问网页中的所有内容。当网页被加载时,浏览器会创建页面的 DOM 对象。DOM对象模型是一棵树:网页里所有的标签、属性和文本都会被转换成节点对象,按照层级结构组织成 树形结构。其中:
document:整个网页封装成的对象element:标签封装成的对象attribute:属性封装成的对象text:文本封装成的对象 对于标签,获取标签有如下方法:
| 方法 | 作用 | 返回值 |
|---|---|---|
document.getElementById(id) |
根据 id 获取标签 | Element对象 |
document.getElementsByName(name) |
根据元素的 name 属性获取一批标签 |
Element 类数组 |
document.getElementsByTagName(tagName) |
根据标签名获取一批标签 | Element 类数组 |
document.getElementsByClassName(className) |
按根据类名获取一批标签 | Element 类数组 |
接下来看怎么操作标签:
| 方法 | 作用 | 返回值 |
|---|---|---|
document.createElement(tagName) |
创建标签 | Element对象 |
parentElement.appendChild(sonElement) |
插入标签 | |
element.remove() |
删除标签 |
操作属性:
| 方法 | 作用 | 返回值 |
|---|---|---|
getAttribute(attrName) |
获取属性值 | 属性名称 |
setAttribute(attrName, attrValue) |
设置属性值 | 属性名称, 属性值 |
getElementsByTagName(tagName) |
根据标签名称获取一批标签 | Element 类数组 |
document.getElementsByClassName(className) |
根据类名获取一批标签 | Element 类数组 |
还有操作标签体本身:
| 方法 | 作用 |
|---|---|
content.innerHTML |
获取标签体内容 |
content.innerHTML = "..." |
设置标签体内容 |
完结撒花,接下来就是学 TypeScript 了 🎉🎉🎉