JS基础DOM操作
document对象
- Document节点表示的整个载入的网页,它的实例是全局的document对象:
- 对DOM的所有操作都是从 document 对象开始的;
- 它是DOM的 入口点,可以从document开始去访问任何节点元素;
- 对于最顶层的html、head、body元素,我们可以直接在document对象中获取到:
- html元素: = document.documentElement
- body元素: = document.body
- head元素: = document.head
- 文档声明: = document.doctype
节点之间的导航
- **如果我们获取到一个节点后,可以根据这个节点去获取其他的节点,我们称之为节点之间的导航。 **
- 节点之间存在如下的关系:
- 父节点:parentNode
- 前兄弟节点:previousSibling
- 后兄弟节点:nextSibling
- 子节点:childNodes
- 第一个子节点:firstChild
- 第二个子节点:lastChild
1 |
|
表格元素的导航
- **
元素支持 (除了上面给出的,之外) 以下这些属性: **
- table.rows —
元素的集合; - table.caption/tHead/tFoot — 引用元素
, ,;- table.tBodies — 元素的集合;
- ,, 元素提供了 rows 属性:
- tbody.rows — 表格内部
元素的集合; : - tr.cells — 在给定
中的 和 单元格的集合; - tr.sectionRowIndex — 给定的
在封闭的 / / 中的位置(索引);- tr.rowIndex — 在整个表格中
的编号(包括表格的所有行) 和 : - td.cellIndex — 在封闭的
中单元格的编号。 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<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>
</head>
<body>
<!-- 高级元素: table/form -->
<table>
<thead>
<tr>
<th>姓名</th>
<th>年龄</th>
<th>身高</th>
</tr>
</thead>
<tbody>
<tr>
<td>why</td>
<td>18</td>
<td>1.88</td>
</tr>
<tr>
<td>kobe</td>
<td>30</td>
<td>1.98</td>
</tr>
</tbody>
</table>
<script>
var tableEl = document.body.firstElementChild
// 通过table元素获取内部的后代元素
console.log(tableEl.tHead, tableEl.tBodies, tableEl.tFoot)
console.log(tableEl.rows)
// 拿到一行元素
var rowEl = tableEl.rows[2]
console.log(rowEl.cells[0])
console.log(rowEl.sectionRowIndex)
console.log(rowEl.rowIndex)
</script>
</body>
</html>获取元素的方法
- 当元素彼此靠近或者相邻时,DOM 导航属性非常有用。
- 但是,在实际开发中,我们希望可以任意的获取到某一个元素应该如何操作呢?
- DOM为我们提供了获取元素的方法:
- 开发中如何选择呢?
- 目前最常用的是querySelector和querySelectAll;
- getElementById偶尔也会使用或者在适配一些低版本浏览器时;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<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>
</style>
</head>
<body>
<div class="box">
<h2>我是标题</h2>
<div class="container">
<p>
我是段落, <span class="keyword">coderwhy</span> 哈哈哈哈
</p>
<p>
我也是段落, <span class="keyword">kobe</span> 呵呵呵呵额
</p>
<div class="article">
<h3 id="title">我是小标题</h3>
<p>
我是文章的内容, 嘿嘿嘿嘿嘿
</p>
</div>
</div>
</div>
<script>
var keywordEl = document.querySelector(".keyword")
// keywordEls是对象, 可迭代的
// 可迭代对象: String/数组/节点的列表
var keywordEls = document.querySelectorAll(".keyword")
for (var el of keywordEls) {
el.style.color = "red"
}
console.log(keywordEls)
var titleEl = document.querySelector("#title")
titleEl.style.color = "orange"
</script>
</body>
</html>节点的属性 - nodeType
- nodeType属性:
- nodeType 属性提供了一种获取节点类型的方法;
- 它有一个数值型值;
- 常见的节点类型有如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<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>
</head>
<body>
<!-- 我是注释 -->
我是文本
<div class="box">
<h2>我是标题</h2>
<p>我是内容, 哈哈哈哈</p>
</div>
<script>
// 1.获取三个节点
var bodyChildNodes = document.body.childNodes
var commentNode = bodyChildNodes[1]
var textNode = bodyChildNodes[2]
var divNode = bodyChildNodes[3]
// 2.节点属性
// 2.1.nodeType 节点的类型
for (var node of bodyChildNodes) {
if (node.nodeType === 8) {
} else if (node.nodeType === 3) {
} else if (node.nodeType === 1) {
}
}
console.log(commentNode, commentNode.nodeType, "-------", textNode, textNode.nodeType, "-------", divNode.nodeType) // 8 3 1
console.log(Node.COMMENT_NODE)
</script>
</body>
</html>节点的属性 – nodeName、tagName
- nodeName:获取node节点的名字;
- tagName:获取元素的标签名词;
- tagName 和 nodeName 之间有什么不同呢?
- tagName 属性仅适用于 Element 节点;
- nodeName 是为任意 Node 定义的:
- 对于元素,它的意义与 tagName 相同,所以使用哪一个都是可以的;
- 对于其他节点类型(text,comment 等),它拥有一个对应节点类型的字符串;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<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>
</head>
<body>
<!-- 我是注释 -->
我是文本
<div class="box">
<h2>我是标题</h2>
<p>我是内容, 哈哈哈哈</p>
</div>
<script>
// 1.获取三个节点
var bodyChildNodes = document.body.childNodes
var commentNode = bodyChildNodes[1]
var textNode = bodyChildNodes[2]
var divNode = bodyChildNodes[3]
// 2.2.nodeName 节点的名称
// tagName: 针对元素(element)
console.log(commentNode.nodeName, textNode.nodeName, divNode.nodeName)
console.log(commentNode.tagName, divNode.tagName)
</script>
</body>
</html>节点的属性 - innerHTML、textContent
- innerHTML 属性
- 将元素中的 HTML 获取为字符串形式;
- 设置元素中的内容;
- outerHTML 属性
- 包含了元素的完整 HTML
- innerHTML 加上元素本身一样;
- textContent 属性
- 仅仅获取元素中的文本内容;
- innerHTML和textContent的区别:
- 使用 innerHTML,我们将其“作为 HTML”插入,带有所有 HTML 标签。
- 使用 textContent,我们将其“作为文本”插入,所有符号均按字面意义处理。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<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>
</head>
<body>
<!-- 我是注释 -->
我是文本
<div class="box">
<h2>我是标题</h2>
<p>我是内容, 哈哈哈哈</p>
</div>
<script>
// 1.获取三个节点
var bodyChildNodes = document.body.childNodes
var commentNode = bodyChildNodes[1]
var textNode = bodyChildNodes[2]
var divNode = bodyChildNodes[3]
// 2.3. data(nodeValue)/innerHTML/textContent
// data针对非元素的节点获取数据
// innerHTML: 对应的html元素也会获取
// textContent: 只会获取文本内容
console.log(commentNode.data, textNode.data, divNode.data)
console.log(divNode.innerHTML)
console.log(divNode.textContent)
// 设置文本, 作用是一样
// 设置文本中包含元素内容, 那么innerHTML浏览器会解析, textContent会当成文本的一部分
divNode.innerHTML = "<h2>呵呵呵呵</h2>"
// divNode.textContent = "<h2>嘿嘿嘿嘿</h2>"
// 2.4.outerHTML
console.log(divNode.outerHTML)
</script>
</body>
</html>节点的属性 - nodeValue
- nodeValue/dat
- 用于获取非元素节点的文本内容
节点的其他属性
- hidden属性:也是一个全局属性,可以用于设置元素隐藏。
- DOM 元素还有其他属性:
- value
- ,
- href
- id
- 所有元素的 “id” 特性的值。
- value
- class和style我们会在后续专门讲解的。
attribute的分类
- 属性attribute的分类:
- 标准的attribute:某些attribute属性是标准的,比如id、class、href、type、value等;
- 非标准的attribute:某些attribute属性是自定义的,比如abc、age、height等;
attribute的操作
- 对于所有的attribute访问都支持如下的方法:
- elem.hasAttribute(name) — 检查特性是否存在。
- elem.getAttribute(name) — 获取这个特性值。
- elem.setAttribute(name, value) — 设置这个特性值。
- elem.removeAttribute(name) — 移除这个特性。
- attributes:attr对象的集合,具有name、value属性;
- attribute具备以下特征:
- 它们的名字是大小写不敏感的(id 与 ID 相同)。
- 它们的值总是字符串类型的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<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>
</head>
<body>
<div id="abc" class="box" title="box"
age="18" height="1.88">
我是box
</div>
<input type="checkbox" checked="checked">
<script>
var boxEl = document.querySelector(".box")
// 1.所有的attribute都支持的操作
console.log(boxEl.hasAttribute("AGE"), boxEl.hasAttribute("abc"), boxEl.hasAttribute("id"))
console.log(boxEl.getAttribute("AGE"), boxEl.getAttribute("abc"), boxEl.getAttribute("id"))
boxEl.setAttribute("id", "cba")
boxEl.removeAttribute("id")
var boxAttributes = boxEl.attributes
for (var attr of boxAttributes) {
console.log(attr.name, attr.value)
}
// 2.通过getAttribute()一定是字符串类型
var inputEl = document.querySelector("input")
console.log(inputEl.getAttribute("checked"))
</script>
</body>
</html>元素的属性(property)
- 对于标准的attribute,会在DOM对象上创建与其对应的property属性:
- 在大多数情况下,它们是相互作用的
- 改变property,通过attribute获取的值,会随着改变;
- 通过attribute操作修改,property的值会随着改变;
- 但是input的value修改只能通过attribute的方法;
- 除非特别情况,大多数情况下,设置、获取attribute,推荐使用property的方式:
- 这是因为它默认情况下是有类型的;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<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>
</head>
<body>
<!-- 元素中的属性称之为attribute -->
<!-- 标准的attribute在对应的对象模型中都有对应的property -->
<div id="abc" class="box" title="标题"
age="18" height="1.88">
我是box
</div>
<input type="checkbox" checked>
账号: <input class="account" type="text">
<button class="btn">设置input的值</button>
<script>
// 对象中的属性称之为property
// var obj = {
// // property
// name: "why"
// }
// 1.通过property获取attribute的值
// 获取box元素
var boxEl = document.querySelector(".box")
console.log(boxEl.id, boxEl.title, boxEl.age, boxEl.height)
// input元素
var inputEl = document.querySelector("input")
// if (inputEl.getAttribute("checked")) {
// console.log("checkbox处于选中状态")
// }
if (inputEl.checked) {
console.log("checkbox处于选中状态")
}
console.log(typeof inputEl.checked)
// 2.attribute和property是相互影响的
boxEl.id = "aaaaa"
console.log(boxEl.getAttribute("id"))
boxEl.setAttribute("title", "哈哈哈")
console.log(boxEl.title)
// 3.比较特殊的情况, input设置值(了解)
var accountInputEl = document.querySelector(".account")
var btnEl = document.querySelector(".btn")
btnEl.onclick = function() {
accountInputEl.setAttribute("value", "kobe")
// 优先级更高
accountInputEl.value = "coderwhy"
}
</script>
</body>
</html>HTML5的data-*自定义属性
前面我们有学习HTML5的data-*自定义属性,那么它们也是可以在dataset属性中获取到的:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<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>
</head>
<body>
<div id="abc" class="box"
data-age="18" data-height="1.88"></div>
<script>
var boxEl = document.querySelector(".box")
// 小程序开发中使用
console.log(boxEl.dataset.age)
console.log(boxEl.dataset.height)
</script>
</body>
</html>JavaScript动态修改样式
- 有时候我们会通过JavaScript来动态修改样式,这个时候我们有两个选择:
- 选择一:在CSS中编写好对应的样式,动态的添加class;
- 选择二:动态的修改style属性;
- 开发中如何选择呢?
- 在大多数情况下,如果可以动态修改class完成某个功能,更推荐使用动态class;
- 如果对于某些情况,无法通过动态修改class(比如精准修改某个css属性的值),那么就可以修改style属性;
- 接下来,我们对于两种方式分别来进行学习。
元素的className和classList
- 元素的class attribute,对应的property并非叫class,而是className:
- 这是因为JavaScript早期是不允许使用class这种关键字来作为对象的属性,所以DOM规范使用了className;
- 虽然现在JavaScript已经没有这样的限制,但是并不推荐,并且依然在使用className这个名称;
- 我们可以对className进行赋值,它会替换整个类中的字符串
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<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>
.active {
color: red;
font-size: 24px;
background-color: green;
}
</style>
</head>
<body>
<div class="box">
我是box
</div>
<script>
// 1.获取boxEl
var boxEl = document.querySelector(".box")
// 2.监听点击
var counter = 1
boxEl.onclick = function() {
// 1.直接修改style
// boxEl.style.color = "red"
// boxEl.style.fontSize = "24px"
// boxEl.style.backgroundColor = "green"
// 2.动态的添加某一个class
boxEl.className = "active"
// 3.动态的修改boxEl的宽度
boxEl.style.width = 100 * counter + "px"
counter++
}
</script>
</body>
</html>- 如果我们需要添加或者移除单个的class,那么可以使用classList属性。
- elem.classList 是一个特殊的对象:
- elem.classList.add (class) :添加一个类
- elem.classList.remove(class):添加/移除类。
- elem.classList.toggle(class) :如果类不存在就添加类,存在就移除它。
- elem.classList.contains(class):检查给定类,返回 true/false。
- **classList是可迭代对象,可以通过for of进行遍历。 **
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<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>
.active {
color: #fff;
background-color: #f80;
font-size: 25px;
}
</style>
</head>
<body>
<div class="box">
我是box
</div>
<button class="btn">切换</button>
<script>
var boxEl = document.querySelector(".box")
// 1.方法一: className
// boxEl.className = "abc"
// var obj = {}
// obj.name = "abc"
// obj.class = "hahahaha"
// obj.var = 123
// console.log(obj)
// 2.方法二: classList操作class
boxEl.classList.add("abc")
boxEl.classList.add("active")
boxEl.classList.remove("abc")
// 需求: box在active之间切换
var btnEl = document.querySelector(".btn")
btnEl.onclick = function() {
// if (boxEl.classList.contains("active")) {
// boxEl.classList.remove("active")
// } else {
// boxEl.classList.add("active")
// }
boxEl.classList.toggle("active")
}
</script>
</body>
</html>元素的style属性
- 如果需要单独修改某一个CSS属性,那么可以通过style来操作:
- 对于多词(multi-word)属性,使用驼峰式 camelCase
- 如果我们将值设置为空字符串,那么会使用CSS的默认样式:
- 多个样式的写法,我们需要使用cssText属性:
- 不推荐这种用法,因为它会替换整个字符串;
元素style的读取 - getComputedStyle
- 如果我们需要读取样式:
- 对于内联样式,是可以通过style.*的方式读取到的;
- 对于style、css文件中的样式,是读取不到的;
- 这个时候,我们可以通过getComputedStyle的全局函数来实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<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>
.box {
font-size: 20px;
}
</style>
</head>
<body>
<div class="box" style="background-color: red;">
我是box
</div>
<script>
var boxEl = document.querySelector(".box")
console.log(boxEl.style.backgroundColor)
console.log(boxEl.style.fontSize)
console.log(getComputedStyle(boxEl).fontSize)
</script>
</body>
</html>创建元素
- 前面我们使用过 document.write 方法写入一个元素:
- 这种方式写起来非常便捷,但是对于复杂的内容、元素关系拼接并不方便;
- 它是在早期没有DOM的时候使用的方案,目前依然被保留了下来;
- 那么目前我们想要插入一个元素,通常会按照如下步骤:
- 步骤一:创建一个元素;
- 步骤二:插入元素到DOM的某一个位置;
- 创建元素: document.createElement(tag)
插入元素
- 插入元素的方式如下:
- node.append(…nodes or strings) —— 在 node 末尾 插入节点或字符串,
- node.prepend(…nodes or strings) —— 在 node 开头 插入节点或字符串,
- node.before(…nodes or strings) —— 在 node 前面 插入节点或字符串
- node.after(…nodes or strings) —— 在 node 后面 插入节点或字符串,
- node.replaceWith(…nodes or strings) —— 将 node 替换为给定的节点或字符串。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<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>
</head>
<body>
<span>111111</span>
<div class="box">
<span class="box-first">呵呵呵呵</span>
<p>哈哈哈哈哈</p>
</div>
<script>
var boxEl = document.querySelector(".box")
// 1.通过innerHTML(不推荐)
// boxEl.innerHTML = `
// <h2 class="title">我是标题</h2>
// `
// 2.真实创建一个DOM对象
var h2El = document.createElement("h2")
h2El.className = "title"
h2El.classList.add("active")
h2El.textContent = "我是标题"
// 将元素插入boxEl
// boxEl.append(h2El)
// boxEl.prepend(h2El)
// boxEl.after(h2El)
// boxEl.before(h2El)
// boxEl.replaceWith(h2El, "abc")
// 插入到span和p元素之间
// var spanEl = document.querySelector("span")
// var spanEl = boxEl.children[0]
var spanEl = boxEl.querySelector("span")
spanEl.after(h2El)
</script>
</body>
</html>移除和克隆元素
- 移除元素我们可以调用元素本身的remove方法:
- 如果我们想要复制一个现有的元素,可以通过cloneNode方法:
- 可以传入一个Boolean类型的值,来决定是否是深度克隆;
- 深度克隆会克隆对应元素的子元素,否则不会;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<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>
</head>
<body>
<button class="remove-btn">移除box</button>
<button class="clone-btn">复制box</button>
<div class="box">
<h2>我是标题</h2>
<p>我是文本, 哈哈哈哈哈</p>
</div>
<script>
// 1.获取元素
var boxEl = document.querySelector(".box")
var removeBtnEl = document.querySelector(".remove-btn")
var cloneBtnEl = document.querySelector(".clone-btn")
// 2.监听removeBtn的点击
removeBtnEl.onclick = function() {
boxEl.remove()
}
// 3.复制box
var counter = 0
cloneBtnEl.onclick = function() {
var newNode = boxEl.cloneNode(true)
newNode.children[0].textContent = "我是标题" + counter
// boxEl.after(newNode)
document.body.append(newNode)
counter++
}
</script>
</body>
</html>小案例练习
练习一:通过prompt接收用户的输入,根据输入创建一个列表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<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>
</head>
<body>
<h1>动态创建列表</h1>
<ul class="list"></ul>
<script>
var ulEl = document.querySelector(".list")
var isFlag = true
while (isFlag) {
var message = prompt("请输入信息:")
if (!message) { // 没有输入内容
isFlag = false
} else {
var liEl = document.createElement("li")
liEl.textContent = message
ulEl.append(liEl)
}
}
</script>
</body>
</html>练习二:动态显示时间
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<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>
</head>
<body>
<h1 class="time">2023-05-08 11:14:30</h1>
<script>
// 封装了工具函数
function padLeft (content, count, padStr) {
count = count || 2
padStr = padStr || "0"
content = String(content)
return content.padStart(count, padStr)
//string.padStart(count,val)补充count位,不足count位用val来补齐
}
// 1.获取时间的元素
var timeEl = document.querySelector(".time")
setInterval(function () {
// 2.获取具体的时间并且进行格式化
var date = new Date()
var year = date.getFullYear()
var month = padLeft(date.getMonth() + 1)
var day = padLeft(date.getDate())
var hour = padLeft(date.getHours())
var minute = padLeft(date.getMinutes())
var second = padLeft(date.getSeconds())
// 3.将时间放到timeEl中
timeEl.textContent = `${year}-${month}-${day} ${hour}:${minute}:${second}`
}, 1000);
// 补充String方法
// var str = "124"
// console.log(str.padStart(4, "0"))
</script>
</body>
</html>练习二:倒计时显示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
<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>
.countdown {
color: #f00;
font-size: 20px;
}
.countdown .time {
background-color: #f00;
color: #fff;
display: inline-block;
padding: 5px;
border-radius: 3px;
}
</style>
</head>
<body>
<div class="countdown">
<span class="time hour">03</span>
<span class="split">:</span>
<span class="time minute">25</span>
<span class="split">:</span>
<span class="time second">43</span>
</div>
<script>
function formatPadLeft (content, count, padStr) {
count = count || 2
padStr = padStr || "0"
content = String(content)
return content.padStart(count, padStr)
}
// 1.获取元素
var hourEl = document.querySelector(".hour")
var minuteEl = document.querySelector(".minute")
var secondEl = document.querySelector(".second")
var endDate = new Date()
endDate.setHours(24)
endDate.setMinutes(0)
endDate.setSeconds(0)
endDate.setMilliseconds(0)
setInterval(function () {
// 获取倒计时的小时-分钟-秒钟
// 11:53:22 => 24:00:00
var nowDate = new Date()
var intervalTime = Math.floor((endDate.getTime() - nowDate.getTime()) / 1000)
// console.log(intervalTime)
// 43324: x小时x分钟x秒钟
var hour = Math.floor(intervalTime / 3600)
var minute = Math.floor(intervalTime / 60) % 60
var second = intervalTime % 60
// 2.设置内容
hourEl.textContent = formatPadLeft(hour)
minuteEl.textContent = formatPadLeft(minute)
secondEl.textContent = formatPadLeft(second)
}, 1000)
// 125: x百x十x个
// var num = 125
// console.log(Math.floor(num / 10 * 10))
// console.log(Math.floor(num / 10) % 10)
// console.log(num % 10)
</script>
</body>
</html>元素的大小、滚动
- clientWidth:contentWith+padding(不包含滚动条)
- clientHeight:contentHeight+padding
- clientTop:border-top的宽度
- clientLeft:border-left的宽度
- offsetWidth:元素完整的宽度
- offsetHeight:元素完整的高度
- offsetLeft:距离父元素的x
- offsetHeight:距离父元素的y
- scrollHeight:整个可滚动的区域高度
- scrollTop:滚动部分的高度
window的大小、滚动
- window的width和height
- innerWidth、innerHeight:获取window窗口的宽度和高度(包含滚动条)
- outerWidth、outerHeight:获取window窗口的整个宽度和高度(包括调试工具、工具栏)
- documentElement.clientHeight、documentElement.clientWidth:获取html的宽度和高度(不包含滚动条)
- window的滚动位置:
- scrollX:X轴滚动的位置(别名pageXOffset)
- scrollY:Y轴滚动的位置(别名pageYOffset)
- 也有提供对应的滚动方法:
- 方法 scrollBy(x,y) :将页面滚动至 相对于当前位置的 (x, y) 位置;
- 方法 scrollTo(pageX,pageY) 将页面滚动至 绝对坐标;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
<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>
.box {
/* width: 2000px; */
height: 100px;
background-color: orange;
}
.scroll-btn {
position: fixed;
right: 20px;
bottom: 20px;
/* display: none; */
}
</style>
</head>
<body>
<div class="box"></div>
<button class="scroll-btn">回到顶部</button>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
<script>
// window大小
console.log(window.outerWidth)
console.log(window.outerHeight)
console.log(window.innerWidth)
console.log(window.innerHeight)
console.log(document.documentElement.offsetWidth)
console.log(document.documentElement.offsetHeight)
// 获取window的滚动区域
window.onclick = function() {
console.log(window.scrollX)
console.log(window.scrollY)
}
var scrollBtnEl = document.querySelector(".scroll-btn")
scrollBtnEl.hidden = true
window.onscroll = function() {
var scrollY = window.scrollY
if (scrollY > 600) {
// scrollBtnEl.style.display = "block"
scrollBtnEl.hidden = false
} else {
// scrollBtnEl.style.display = "none"
scrollBtnEl.hidden = true
}
}
// 点击按钮后滚动到某个位置
scrollBtnEl.onclick = function() {
// window.scrollBy(0, 100)
window.scrollTo(0, 0)
}
</script>
</body>
</html>本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 十一的博客!评论数据库加载中 - 当元素彼此靠近或者相邻时,DOM 导航属性非常有用。
- tr.sectionRowIndex — 给定的
- table.caption/tHead/tFoot — 引用元素
- table.rows —