DOM基本概念

DOM的基本概念

DOM使JS操控HTML变得优雅

image.png

DOM是JS操控HTML和CSS的桥梁

image.png
image.png

DOM简介

image.png

DOM节点树

image.png
image.png

nodeType常用属性值

image.png
image.png

节点访问和位置的关系

访问元素节点

所谓“访问”元素节点,就是指“得到”、“获取”页面上的元素节点。
对节点进行操作,第一步就是要得到它。
访问元素节点主要依靠document对象。

认识document对象

image.png

访问元素节点的常用方法

image.png

getElementByld()

image.png
image.png
延迟运行
image.png
image.png

getElementsByTagName()

image.png
image.png

getElementsByClassName()

image.png
image.png

querySelector()

image.png
image.png

querySelectorAll()

image.png

节点的关系

image.png
image.png

注意

image.png

排除文本节点的干扰

image.png

书写常见的节点关系函数

image.png

  1. <div id="box">
  2. <p id="par">我是</p>
  3. <p>我是数组</p>
  4. <p id="para">
  5. <span>1</span>
  6. <span>2</span>
  7. <span>3</span>
  8. </p>
  9. <p>我是数组</p>
  10. <p>我是数组</p>
  11. <p>我是数组</p>
  12. </div>
  13. <script>
  14. //得到p标签的数组
  15. var box = document.getElementById('box');
  16. var para = document.getElementById('para');
  17. //封装一个函数,这个函数可以返回元素的所有子元素节点(兼容到IE6),类似children的功能
  18. function getChildren(node) {
  19. //结果数组
  20. var children = [];
  21. //遍历node这个节点的所有子节点,判断每一个子节点的nodeType属性是不是1
  22. //如果是1,就推入结果数组
  23. for (var i = 0; i < node.childNodes.length; i++) {
  24. if (node.childNodes[i].nodeType == 1) {
  25. children.push(node.childNodes[i]);
  26. }
  27. }
  28. return children;
  29. }
  30. console.log(getChildren(box));
  31. //封装一个函数,这个函数可以返回元素的前一个元素兄弟节点(兼容到IE6),类似previousElementSibling的功能
  32. function getElemenPrevtSibling(node) {
  33. var o = node;
  34. //使用while语句
  35. while (o.previousSibling != null) {
  36. if (o.previousSibling.nodeType == 1) {
  37. //结束循环,找到了
  38. return o.previousSibling;
  39. }
  40. //让o成为它的前一个节点
  41. o = o.previousSibling;
  42. }
  43. }
  44. console.log(getElemenPrevtSibling(para));
  45. //封装第三个函数,这个函数可以返回元素的所有兄弟节点
  46. function getAllElementSibling(node) {
  47. //前面的元素兄弟节点
  48. var prevs = [];
  49. //后面的元素兄弟节点
  50. var nexts = [];
  51. var o = node;
  52. //遍历node的前面的节点
  53. while(o.previousSibling != null){
  54. if (o.previousSibling.nodeType == 1) {
  55. prevs.unshift(o.previousSibling);
  56. }
  57. o=o.previousSibling;
  58. }
  59. o = node;
  60. //遍历node的后面的节点
  61. while(o.nextSibling != null){
  62. if (o.nextSibling.nodeType == 1) {
  63. prevs.unshift(o.nextSibling);
  64. }
  65. o=o.nextSibling;
  66. }
  67. //将两个数组进行合并,然后返回
  68. return prevs.concat(nexts);
  69. }
  70. console.log(getAllElementSibling(para));
  71. </script>

节点操作

节点操作

如何改变元素节点中的内容

image.png

  1. <div id="box"></div>
  2. <script>
  3. var obox = document.getElementById('box');
  4. obox.innerHTML='<ul><li>牛奶</li> <li>牛</li></ul>';
  5. obox.innerText='<ul><li>牛奶</li> <li>牛</li></ul>';
  6. </script>

如何改变元素节点的CSS样式

image.png

  1. <style>
  2. .box{
  3. width: 200px;
  4. height: 200px;
  5. border: 1px solid #000;
  6. }
  7. </style>
  8. <div class="box" id="box"></div>
  9. <script>
  10. var oBox=document.getElementById('box');
  11. oBox.style.backgroundColor='red';
  12. </script>

如何改变元素节点的HTML属性

image.png

  1. <img src="images/bj/0.jpg" id="pic">
  2. <a href="http://www.baidu.com" id="link">
  3. 去百度
  4. </a>
  5. <script>
  6. var opic = document.getElementById('pic');
  7. var opi = document.getElementById('link');
  8. opic.src = 'images/bj/2.jpg';
  9. opi.href = 'http://sbj.cnipa.gov.cn/sbcx/';
  10. opi.innerText = '去商标';
  11. </script>

image.png

  1. <div id="box"></div>
  2. <script>
  3. var box = document.getElementById('box');
  4. box.setAttribute('data-n', 10);
  5. var n=box.getAttribute('data-n');
  6. alert(n);
  7. </script>

节点的创建、移除和克隆

节点的创建、移除和克隆

节点的创建

image.png

孤儿节点

image.png

appendChild()

image.png

insertBefore()

image.png

  1. <div id="box">
  2. <p>我是段落1 </p>
  3. <p>我是段落2 </p>
  4. <p>我是段落3 </p>
  5. </div>
  6. <script>
  7. var Obox = document.getElementById('box');
  8. var ops=document.getElementsByTagName('p');
  9. //创建孤儿节点
  10. var oP=document.createElement('p');
  11. //设置内部文字
  12. oP.innerText='我是新来的';
  13. //上树
  14. //Obox.appendChild(oP);
  15. Obox.insertBefore(oP,ops[2]);
  16. </script>

小练习

image.png

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <style>
  9. td {
  10. width: 20px;
  11. height: 20px;
  12. border: 1px solid #000;
  13. }
  14. </style>
  15. </head>
  16. <body>
  17. <table id="mytable"></table>
  18. <script>
  19. //请动态创建出一个20行12列的表格
  20. var mytable = document.getElementById('mytable');
  21. for (var i = 0; i < 20; i++) {
  22. //创建了新的tr标签
  23. var tr = document.createElement('tr');
  24. for (var j = 0; j < 12; j++) {
  25. //创建了新的td标签
  26. var td = document.createElement('td');
  27. //让tr追加td标签
  28. tr.appendChild(td);
  29. }//让mytable追加td标签
  30. mytable.appendChild(tr);
  31. }
  32. </script>
  33. </body>
  34. </html>

image.png

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <style>
  9. td {
  10. width: 120px;
  11. height: 30px;
  12. border: 1px solid #000;
  13. }
  14. </style>
  15. </head>
  16. <body>
  17. <table id="mytable"></table>
  18. <script>
  19. //请创建九九乘法表
  20. var mytable = document.getElementById('mytable');
  21. for (var i = 1; i < 10; i++) {
  22. //创建了
  23. var tr = document.createElement('tr');
  24. for (var j = 1; j <= i; j++) {
  25. //创建了新的td标签
  26. var td = document.createElement('td');
  27. //设置td内部的文字
  28. td.innerText = i + '乘' + j + '等于' + (i * j);
  29. //让tr追加td标签
  30. tr.appendChild(td);
  31. }//让mytable追加td标签
  32. mytable.appendChild(tr);
  33. }
  34. </script>
  35. </body>
  36. </html>

移动节点

image.png

  1. <div id="box1">
  2. <p id="para">我是段落移动</p>
  3. </div>
  4. <div id="box2">
  5. <P>我是原有</P>
  6. <P>我是原有</P>
  7. <P>我是原有</P>
  8. <P>我是原有</P>
  9. </div>
  10. <script>
  11. var box1 = document.getElementById('box1');
  12. var box2 = document.getElementById('box2');
  13. var para = document.getElementById('para');
  14. var ps = document.getElementsByTagName('p');
  15. // box2.appendChild(para);
  16. box2.insertBefore(para, ps[2]);
  17. </script>

删除节点

image.png

克隆节点

image.png

  1. <div id="box1">
  2. <ul>
  3. <li>牛奶</li>
  4. <li>咖啡</li>
  5. <li>可乐</li>
  6. </ul>
  7. </div>
  8. <div id="box2"></div>
  9. <script>
  10. var box1 = document.getElementById('box1');
  11. var box2 = document.getElementById('box2');
  12. var theul = document.getElementsByTagName('ul')[0];
  13. var newul=theul.cloneNode(true);
  14. box2.appendChild(newul);
  15. </script>

DOM事件

事件监听

什么是“事件监听”

image.png

最简单的设置事件监听的方法

image.png

常见的鼠标事件监听

image.png

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <style>
  9. div {
  10. width: 200px;
  11. height: 200px;
  12. background-color: rgb(227, 19, 19);
  13. }
  14. </style>
  15. </head>
  16. <body>
  17. <div id="box"></div>
  18. <button>确认</button>
  19. <script>
  20. var obox = document.getElementById('box');
  21. //给box这个盒子添加点击事件监听
  22. obox.onclick = function () {
  23. console.log('你好,我是click');
  24. }
  25. obox.ondblclick = function () {
  26. console.log('你好,我是ondblclick');
  27. }
  28. obox.onmousedown = function () {
  29. console.log('你好,我是onmousedown');
  30. }
  31. obox.onmouseup = function () {
  32. console.log('你好,我是onmouseup');
  33. }
  34. obox.onmouseenter = function () {
  35. console.log('你好,我是onmouseenter');
  36. }
  37. obox.onmouseleave = function () {
  38. console.log('你好,我是onmouseleave');
  39. }
  40. obox.onmousemove = function () {
  41. console.log('你好,我是onmousemove');
  42. }
  43. </script>
  44. </body>
  45. </html>

常见的键盘事件监听

image.png

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. </head>
  9. <body>
  10. <input type="text" id="nameFiled">
  11. <script>
  12. var nameFiled=document.getElementById('nameFiled');
  13. nameFiled.onkeydown=function(){
  14. console.log('我是onkeydown')
  15. }
  16. nameFiled.onkeypress=function(){
  17. console.log('我是onkeypress')
  18. }
  19. nameFiled.onkeyup=function(){
  20. console.log('我是onkeyup')
  21. }
  22. </script>
  23. </body>
  24. </html>

常见的表单事件监听

image.png

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. </head>
  9. <body>
  10. <form id="myform">
  11. <p>
  12. 姓名:
  13. <input type="text" name="nameField">
  14. </p>
  15. <p>
  16. 年龄:
  17. <input type="text" name="ageField">
  18. </p>
  19. <p>
  20. 年龄:
  21. <input type="submit" name="ageField">
  22. </p>
  23. </form>
  24. <script>
  25. var myform = document.getElementById('myform');
  26. var nameField = myform.nameField;
  27. var ageField = myform.ageField;
  28. nameField.onchange = function () {
  29. console.log('你已经修改完姓名');
  30. }
  31. nameField.oninput = function () {
  32. console.log('你正在修改姓名');
  33. }
  34. nameField.onfocus = function () {
  35. console.log('姓名框已经得到了焦点');
  36. }
  37. nameField.onblur = function () {
  38. console.log('姓名框已经失去了焦点');
  39. }
  40. myform.onsubmit=function(){
  41. console.log('你正在尝试提交表单');
  42. }
  43. </script>
  44. </body>
  45. </html>

事件传播

事件的传播

image.png

Onxxx写法只能监听冒泡阶段

image.png

addEventListener()方法

image.png
image.png

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <style>
  9. #box1 {
  10. width: 202px;
  11. height: 202px;
  12. border: 1px solid #000;
  13. padding: 50px;
  14. }
  15. #box2 {
  16. width: 100px;
  17. height: 100px;
  18. border: 1px solid #000;
  19. padding: 50px;
  20. }
  21. #box3 {
  22. width: 100px;
  23. height: 100px;
  24. border: 1px solid #000;
  25. }
  26. </style>
  27. </head>
  28. <body>
  29. <div id="box1">
  30. <div id="box2">
  31. <div id="box3">
  32. </div>
  33. </div>
  34. </div>
  35. <script>
  36. var box1 = document.getElementById('box1');
  37. var box2 = document.getElementById('box2');
  38. var box3 = document.getElementById('box3');
  39. // box1.onclick = function () {
  40. // console.log('我是box1的onclick');s
  41. // }
  42. // box2.onclick = function () {
  43. // console.log('我是box2的onclick');
  44. // }
  45. // box3.onclick = function () {
  46. // console.log('我是box3的onclick');
  47. //}
  48. box1.addEventListener('click',function(){
  49. console.log('我是box1的捕获阶段')
  50. },true)
  51. box2.addEventListener('click',function(){
  52. console.log('我是box2的捕获阶段')
  53. },true)
  54. box3.addEventListener('click',function(){
  55. console.log('我是box3的捕获阶段')
  56. },true)
  57. box1.addEventListener('click',function(){
  58. console.log('我是box1的冒泡阶段')
  59. },false)
  60. box2.addEventListener('click',function(){
  61. console.log('我是box2的冒泡阶段')
  62. },false)
  63. box3.addEventListener('click',function(){
  64. console.log('我是box3的冒泡阶段')
  65. },false)
  66. </script>
  67. </body>
  68. </html>

事件对象

image.png

鼠标

image.png

鼠标位置

image.png
image.png
image.png

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <style>
  9. *{
  10. margin: 0;
  11. padding: 0;
  12. }
  13. #box {
  14. width: 200px;
  15. height: 200px;
  16. background-color: rgb(36, 30, 30);
  17. margin: 100px;
  18. padding: 50px;
  19. }
  20. body {
  21. height: 2000px;
  22. }
  23. #info {
  24. font-size: 30px;
  25. }
  26. </style>
  27. </head>
  28. <body>
  29. <div id="box"> </div>
  30. <div id="info"> </div>
  31. <script>
  32. var obox = document.getElementById('box');
  33. var oinfo = document.getElementById('info');
  34. obox.onmousemove = function (e) {
  35. oinfo.innerHTML = 'offsetX/Y:' + e.offsetX + ',' + e.offsetY+'<br>'
  36. + 'clientX/Y:' + e.clientX + ',' + e.clientY+'<br>'
  37. + 'pageX/Y:' + e.pageX + ',' + e.pageY;
  38. }
  39. </script>
  40. </body>
  41. </html>

e.charCode和e.keyCode属性

image.png

charCode字符码

image.png

keyCode属性

image.png

  1. <input type="text" id="field1">
  2. <h1 id="info1"></h1>
  3. <input type="text" id="field2">
  4. <h1 id="info2"></h1>
  5. <script>
  6. var ofield1 = document.getElementById('field1');
  7. var oinfo1 = document.getElementById('info1');
  8. var ofield2 = document.getElementById('field2');
  9. var oinfo2 = document.getElementById('info2');
  10. ofield1.onkeypress = function (e) {
  11. oinfo1.innerText = '你输入的字符的字符码是' + e.charCode;
  12. }
  13. ofield2.onkeydown = function (e) {
  14. oinfo2.innerText = '你按下的按键的键码是' + e.keyCode;
  15. }
  16. </script>

小案例

image.png

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <style>
  9. #box {
  10. position: absolute;
  11. top: 200px;
  12. left: 200px;
  13. width: 100px;
  14. height: 100px;
  15. background-color: rgb(214, 41, 41);
  16. }
  17. </style>
  18. </head>
  19. <body>
  20. <div id="box"></div>
  21. <script>
  22. var box = document.getElementById('box');
  23. //全局变量t、l,分别代表盒子的top属性和left属性值
  24. var t = 200;
  25. var l = 200;
  26. //监听document对象的键盘按下事件监听,表示当用户在整个网页上按下按键的时候
  27. document.onkeydown = function (e) {
  28. switch (e.keyCode) {
  29. case 37:
  30. l -= 5;
  31. break;
  32. case 38:
  33. t -= 5;
  34. break;
  35. case 39:
  36. l += 5;
  37. break;
  38. case 40:
  39. t += 5;
  40. break;
  41. }
  42. //更改样式
  43. box.style.left = l + 'px';
  44. box.style.top = t + 'px'
  45. }
  46. </script>
  47. </body>
  48. </html>

e.preventDefault()方法

image.png

小案例1

image.png

  1. <p>
  2. <input type="text" id="field">
  3. </p>
  4. <script>
  5. var field = document.getElementById('field');
  6. field.onkeypress = function (e) {
  7. console.log(e.charCode);
  8. //根据和用户输入的字符的字符码(e.charCode)
  9. //数字0~9,字符码48~57
  10. //小写字母a~z,字符码97~122
  11. if (!(e.charCode >= 48 && e.charCode <= 57 || e.charCode >= 97 && e.charCode <= 122) ){
  12. e.小案例2();
  13. }
  14. }
  15. </script>

小案例2

image.png

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <style>
  9. #box {
  10. width: 200px;
  11. height: 200px;
  12. background: #000;
  13. }
  14. body{
  15. height: 2000px;
  16. }
  17. </style>
  18. </head>
  19. <body>
  20. <div id="box"></div>
  21. <h1 id="info"></h1>
  22. <script>
  23. var box = document.getElementById('box');
  24. var info = document.getElementById('info');
  25. //全局变量就是info中显示的数字
  26. var a = 0;
  27. //给box盒子添加鼠标事件监听
  28. box.onmousewheel = function (e) {
  29. //阻止默认事件;就是说当用户在盒子里滚动鼠标滚轮的时候,不会引发页面的滚动
  30. e.preventDefault();
  31. if (e.deItaY > 0) {
  32. a++;
  33. } else {
  34. a--;
  35. }
  36. info.innerText = a;
  37. }
  38. </script>
  39. </body>
  40. </html>

e.stopPropagation()方法

image.png

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <style>
  9. #box {
  10. width: 200px;
  11. height: 200px;
  12. background: #000;
  13. }
  14. body{
  15. height: 2000px;
  16. }
  17. </style>
  18. </head>
  19. <body>
  20. <div id="box">
  21. <button id="bth">按我</button>
  22. </div>
  23. <h1 id="info"></h1>
  24. <script>
  25. var box = document.getElementById('box');
  26. var bth = document.getElementById('bth');
  27. // box.onclick=function(){
  28. // console.log('我是盒子');
  29. // };
  30. //bth.onclick=function(e){
  31. //阻止事件继续传播
  32. // e.stopPropagation();
  33. // console.log('我是按钮');
  34. // };
  35. box.addEventListener('click',function(){
  36. console.log('我是box的捕获阶段')
  37. },true)
  38. bth.addEventListener('click',function(e){
  39. //阻止事件继续传播
  40. e.stopPropagation();
  41. console.log('我是bth的捕获阶段')
  42. },false)
  43. </script>
  44. </body>
  45. </html>

小案例

image.png

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <style>
  9. .model{
  10. width: 200px;
  11. height: 200px;
  12. background-color: rgb(236, 40, 40);
  13. position: absolute;
  14. top: 50%;
  15. left: 50%;
  16. margin-top: -70px;
  17. margin-left: -200px;
  18. display: none;
  19. }
  20. </style>
  21. </head>
  22. <body>
  23. <button id="bth">
  24. 按我弹出弹出层
  25. </button>
  26. <div class="model" id="box"></div>
  27. <script>
  28. var bth=document.getElementById('bth');
  29. var box=document.getElementById('box');
  30. //点击按钮的时候,弹出层显示
  31. bth.onclick=function(e){
  32. //阻止事件继续传播到document身上
  33. e.stopPropagation();
  34. box.style.display='block';
  35. }
  36. //点击页面任何部分的时候,弹出层关闭
  37. document.onclick=function(){
  38. box.style.display='none';
  39. }
  40. //阻止事件继续传播
  41. box.onclick=function(e){
  42. //阻止事件继续传播到document身上
  43. e.stopPropagation();
  44. }
  45. </script>
  46. </body>
  47. </html>

事件监听

批量添加事件监听

image.png

  1. <ul id="list">
  2. <li>列表项</li>
  3. <li>列表项</li>
  4. <li>列表项</li>
  5. <li>列表项</li>
  6. <li>列表项</li>
  7. <li>列表项</li>
  8. <li>列表项</li>
  9. <li>列表项</li>
  10. <li>列表项</li>
  11. <li>列表项</li>
  12. <li>列表项</li>
  13. <li>列表项</li>
  14. <li>列表项</li>
  15. <li>列表项</li>
  16. <li>列表项</li>
  17. <li>列表项</li>
  18. <li>列表项</li>
  19. <li>列表项</li>
  20. <li>列表项</li>
  21. <li>列表项</li>
  22. </ul>
  23. <script>
  24. var list = document.getElementById('list');
  25. var lis = list.getElementsByTagName("li");
  26. console.log(lis.length);
  27. //书写循环语句,批量给元素添加监听
  28. for (var i = 0; i < lis.length; i++) {
  29. lis[i].onclick = function () {
  30. //在这个函数中,this代表点击的这个元素,this涉及函数上下文的相关知识
  31. this.style.color = 'red';
  32. }
  33. }
  34. </script>

批量添加事件监听的性能问题

image.png

新增元素动态绑定事件

image.png

  1. <button id="bth">按我添加新的列表项</button>
  2. <ul id="list">
  3. </ul>
  4. <script>
  5. var bth = document.getElementById('bth');
  6. var list = document.getElementById('list');
  7. //按钮的点击事件
  8. bth.onclick = function () {
  9. //创建一个新的li列表项,孤儿节点
  10. var lis = document.createElement("li");
  11. lis.innerHTML = '我是列表项';
  12. //上树
  13. list.appendChild(lis);
  14. //给新创建的这个li节点添加onclick事件监听
  15. lis.onclick=function(){
  16. this.style.color = 'red';
  17. }
  18. }
  19. </script>

动态绑定事件的问题

image.png

事件委托

image.png

e.target和e.currentTarget属性

image.png

  1. <button id="btn">按我创建一个新列表项</button>
  2. <ul id="list">
  3. <li>列表项</li>
  4. <li>列表项</li>
  5. <li>列表项</li>
  6. </ul>
  7. <script>
  8. var list = document.getElementById('list');
  9. var btn = document.getElementById('btn');
  10. list.onclick = function (e) {
  11. // e.target表示用户真正点击的那个元素
  12. e.target.style.color = 'red';
  13. }
  14. btn.onclick=function(){
  15. //创建新的li元素
  16. var lis = document.createElement("li");
  17. lis.innerHTML = '我是新来的';
  18. //上树
  19. list.appendChild(lis);
  20. }
  21. </script>

事件委托的使用场景

image.png

注意事项

image.png
image.png

实现动画

定时器和延时器

定时器

image.png

  1. var a=0;
  2. setInterval(function(){
  3. console.log(a);
  4. a=a+2;
  5. },1000)

函数的参数

image.png

具名函数也可以传入setInterval

image.png

清除定时器

image.png

  1. <h1 id="info">0</h1>
  2. <button id="btn1">开始</button>
  3. <button id="btn2">暂停</button>
  4. <script>
  5. var info = document.getElementById('info');
  6. var btn1 = document.getElementById('btn1');
  7. var btn2 = document.getElementById('btn2');
  8. var a = 0;
  9. //设置一个全局变量
  10. var timer = null;
  11. btn1.onclick = function () {
  12. //为了防止定时器叠加,我们应该在设置定时器之前先清除定时器
  13. clearInterval(timer);
  14. //更改全局变量timer的值为一个定时器实体
  15. timer = setInterval(function () {
  16. info.innerText = ++a;
  17. }, 1000);
  18. };
  19. btn2.onclick = function () {
  20. clearInterval(timer);
  21. }
  22. </script>

延时器

image.png

清除延时器

image.png

  1. <button id="btn1">2秒后弹出你好</button>
  2. <button id="btn2">取消弹出</button>
  3. <script>
  4. var btn1 = document.getElementById('btn1');
  5. var btn2 = document.getElementById('btn2');
  6. var timer;
  7. btn1.onclick = function () {
  8. timer = setTimeout(function () {
  9. console.log('你好');
  10. }, 2000);
  11. }
  12. btn2.onclick = function () {
  13. clearTimeout(timer);
  14. }
  15. </script>

初步认识异步语句

image.png
image.png

使用定时器实现动画

image.png

image.png
image.png

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <style>
  8. #box {
  9. position: absolute;
  10. top: 100px;
  11. left: 100px;
  12. width: 100px;
  13. height: 100px;
  14. background-color: orange;
  15. }
  16. </style>
  17. </head>
  18. <body>
  19. <button id="btn">运动</button>
  20. <div id="box"></div>
  21. <script>
  22. //得到元素
  23. var btn = document.getElementById('btn');
  24. var box = document.getElementById('box');
  25. //全局变量盒子的left值
  26. var left = 100;
  27. //按钮监听
  28. btn.onclick = function () {
  29. var timer = setInterval(function () {
  30. //改变全局变量
  31. left += 10;
  32. if (left >= 1000) {
  33. clearInterval(timer);
  34. }
  35. box.style.left = left + 'px';
  36. }, 20)
  37. }
  38. </script>
  39. </body>
  40. </html>

JS和CSS结合实现动画

image.png

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <style>
  8. #box {
  9. position: absolute;
  10. top: 100px;
  11. left: 100px;
  12. width: 100px;
  13. height: 100px;
  14. background-color: orange;
  15. }
  16. </style>
  17. </head>
  18. <body>
  19. <button id="btn">按我运动</button>
  20. <div id="box"></div>
  21. <script>
  22. //得到元素
  23. var btn = document.getElementById('btn');
  24. var box = document.getElementById('box');
  25. //标示量,指示当前盒子在左边还是右边
  26. var pos = 1; //1左边,2右边
  27. //事件监听
  28. btn.onclick = function () {
  29. //把过渡加上
  30. box.style.transition = 'all 2s linear 0s';
  31. if (pos == 1) {
  32. //瞬间移动,但是由于有过渡,所以是动画
  33. box.style.left = '1100px';
  34. pos = 2;
  35. } else if (pos == 2){
  36. box.style.left = '100px';
  37. pos = 1;
  38. }
  39. }
  40. </script>
  41. </body>
  42. </html>

函数节流

image.png
image.png

<!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">
    <style>
        #box {
            position: absolute;
            top: 100px;
            left: 100px;
            width: 100px;
            height: 100px;
            background-color: orange;
        }
    </style>
</head>

<body>
    <button id="btn">按我运动</button>
    <div id="box"></div>
    <script>
        //得到元素
        var btn = document.getElementById('btn');
        var box = document.getElementById('box');

        //标示量,指示当前盒子在左边还是右边
        var pos = 1;   //1左边,2右边
        //函数节流锁
        var lock = true;
        //事件监听
        btn.onclick = function () {
            //首先检查锁是否是关闭
            if (!lock) return;
            //把过渡加上
            box.style.transition = 'all 2s linear 0s';
            if (pos == 1) {
                //瞬间移动,但是由于有过渡,所以是动画
                box.style.left = '1100px';
                pos = 2;
            } else if (pos == 2) {
                box.style.left = '100px';
                pos = 1;
            }
            //关锁
            lock = false;

            setTimeout(function () {
                lock = true;
            }, 2000);
        }
    </script>
</body>

</html>

动画效果开发1·无缝连续滚动特效

原理
image.png

<!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">
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        .box {
            width: 1000px;
            height: 130px;
            border: 1px solid #000;
            margin: 50px auto;
            overflow: hidden;
        }

        .box ul {
            list-style: none;
            width: 5000px;
            position: relative;
        }

        .box ul li {
            float: left;
            margin-right: 10px;
        }
    </style>
</head>

<body>
    <div id="box" class="box">
        <ul id="list">
            <li><img src="/images/number/0.png" alt=""></li>
            <li><img src="/images/number/1.png" alt=""></li>
            <li><img src="/images/number/2.png" alt=""></li>
            <li><img src="/images/number/3.png" alt=""></li>
            <li><img src="/images/number/4.png" alt=""></li>
            <li><img src="/images/number/5.png" alt=""></li>
        </ul>
    </div>
    <script>
        var box = document.getElementById('box');
        var list = document.getElementById('list');

        //复制多一遍所有的li
        list.innerHTML += list.innerHTML;

        //全局变量,表示当前list的left值
        var left = 0;

        //定时器,全局变量
        var timer;
        move();
        //动画封装成函数
        function move() {
            //设表先关,防止动画积累
            clearInterval(timer);
            timer = setInterval(function () {
                left -= 4;
                //验收
                if (left <= -1260) {
                    left = 0;
                }
                list.style.left = left + 'px';
            }, 20);
        }
        //鼠标进入停止计时器
        box.onmouseenter = function () {
            clearInterval(timer);
        };
        //鼠标离开继续计时器
        box.onmouseleave = function () {
            move();
        } ;
    </script>
</body>

</html>

动画效果开发2·跑马灯轮播图特效

<!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">
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        .carousel {
            width: 650px;
            height: 360px;
            border: 1px solid #000;
            margin: 50px auto;
            position: relative;
            overflow: hidden;
        }

        .carousel ul {
            list-style: none;
            width: 6000px;
            position: relative;
            left: 0px;
            transition: left .5s ease 0s;
        }

        .carousel ul li {
            float: left;
        }

        .carousel .leftbtn {
            position: absolute;
            left: 20px;
            top: 50%;
            margin-top: -25px;
            width: 50px;
            height: 50px;
            background-color: orange;
            border-radius: 50%;
        }

        .carousel .rightbtn {
            position: absolute;
            right: 20px;
            top: 50%;
            margin-top: -25px;
            width: 50px;
            height: 50px;
            background-color: orange;
            border-radius: 50%;
        }
    </style>
</head>

<body>
    <div class="carousel">
        <ul id="list">
            <li><img src="images/bj/0.jpg" </li>
            <li><img src="images/bj/1.jpg" </li>
            <li><img src="images/bj/2.jpg" </li>
            <li><img src="images/bj/3.jpg" </li>
            <li><img src="images/bj/4.jpg" </li>
        </ul>
        <a href="javascript:;" class="leftbtn" id="leftbtn"></a>
        <a href="javascript:;" class="rightbtn" id="rightbtn"></a>
    </div>
    <script>
        //得到按钮和ul,ul整体进行运动
        var leftbtn = document.getElementById('leftbtn');
        var rightbtn = document.getElementById('rightbtn');
        var llist = document.getElementById('list');


        //克隆第一张照片
        var cloneli = list.firstElementChild.cloneNode(true);
        list.appendChild(cloneli);
        //当前ul显示到第几张了,从0开始数
        var idx = 0;
        //节流锁
        var lock = true;
        //右按钮监听
        rightbtn.onclick = function () {
            //判断锁的状态
            if (!lock) return;
            lock=false;
            //给list加过渡,
            list.style.transition = 'left .5s ease 0s';
            idx++;
            if (idx >4) {
                //设置一个延时器,延时器的作用就是将ul瞬间拉回0的位置,延时器的目的是让过渡动画结束拉回去
                setTimeout(function () {
                    //取消过渡,因为要的是瞬间移动
                    list.style.transition = 'none';
                    list.style.left = 0;
                    idx = 0;
                }, 500)
            }

            list.style.left = -idx * 650 + 'px';
            setTimeout(function () {
                lock = true;
            }, 500)
        }

        leftbtn.onclick = function () {
            if (!lock) return;
            lock=false;
            //判断是不是第0张,如果是,那就用假的替换真的
            if (idx == 0) {
                //取消过渡
                list.style.transition = 'none';
                list.style.left = -5 * 650 + 'px';
                //设置一个延时器,这个延时器的延时时间是0毫秒,虽然是0毫秒,但是可以让我们过渡先是瞬间取消,然后再加上
                setTimeout(function () {
                    list.style.transition = 'left .5s ease 0s';
                    idx = 4;
                    list.style.left = -idx * 650 + 'px';
                }, 0);
            } else {
                idx--;
                list.style.left = -idx * 650 + 'px';
            }
            setTimeout(function () {
                lock = true;
            }, 500)
        }
    </script>动画效果开发2 - 轮播图特效.htm
</body>

</html>

动画效果开发3·呼吸轮播图特效

<!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">
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        .carousel {
            width: 650px;
            height: 360px;
            border: 1px solid #000;
            margin: 50px auto;
            position: relative;
        }

        .carousel ul {
            list-style: none;
        }

        .carousel ul li {
            position: absolute;
            top: 0;
            left: 0;
            /*透明度都是0*/
            opacity: 0;
            transition: opacity 1s ease 0s;
        }

        /*只有第一张透明度是1*/
        .carousel ul li:first-child {
            opacity: 1;
        }

        .carousel .leftbtn {
            position: absolute;
            left: 20px;
            top: 50%;
            margin-top: -25px;
            width: 50px;
            height: 50px;
            background-color: orange;
            border-radius: 50%;
        }

        .carousel .rightbtn {
            position: absolute;
            right: 20px;
            top: 50%;
            margin-top: -25px;
            width: 50px;
            height: 50px;
            background-color: orange;
            border-radius: 50%;
        }
    </style>
</head>

<body>
    <div class="carousel">
        <ul id="list">
            <li><img src="images/bj/0.jpg" </li>
            <li><img src="images/bj/1.jpg" </li>
            <li><img src="images/bj/2.jpg" </li>
            <li><img src="images/bj/3.jpg" </li>
            <li><img src="images/bj/4.jpg" </li>
        </ul>
        <a href="javascript:;" class="leftbtn" id="leftbtn"></a>
        <a href="javascript:;" class="rightbtn" id="rightbtn"></a>
    </div>
    <script>
        //得到按钮和ul,ul整体进行运动
        var leftbtn = document.getElementById('leftbtn');
        var rightbtn = document.getElementById('rightbtn');
        var list = document.getElementById('list');
        var lis = list.getElementsByTagName('li');

        //当前是第几张图显示
        var idx = 0;
        //节流
        var lock = true;
        //右按钮
        rightbtn.onclick = function () {
            //判断节流
            if (!lock) return;
            lock = false;
            //还没有改idx,此时的idx就是老图,老图淡出
            lis[idx].style.opacity = 0;
            idx++;
            if (idx > 4) idx = 0;
            //改了idx,此时的idx这个图片就是新图,新图淡入
            lis[idx].style.opacity = 1;
            //动画结束之后,开锁
            setTimeout(function () {
                lock = true;
            }, 1000)
        }
        //左按钮
        leftbtn.onclick = function () {
            //判断节流
            if (!lock) return;
            lock = false;
            //还没有改idx,此时的idx就是老图,老图淡出
            lis[idx].style.opacity = 0;
            idx--;
            if (idx < 0) idx = 4;
            //改了idx,此时的idx这个图片就是新图,新图淡入
            lis[idx].style.opacity = 1;
            //动画结束之后,开锁
            setTimeout(function () {
                lock = true;
            }, 1000)
        }

    </script>
</body>

</html>