今日学习任务

  • [x] 1.localStorage与sessionStorage

  • [ ] localstorge与sessioStorge的区别

  • sessionStorage案例:页面间传值
  • [x] 2.offset家族

  • [ ] offsetWidth和offsetHeight获取元素宽高

  • offsetParent获取定位父级
  • offsetLeft和offsetTop获取定位距离
  • [x] 3.定时器

  • [x] 定时器作用及语法

  • [ ] setInterval():重复定时器

  • setTimeout():一次定时器
  • [ ] 4.定时器的应用场景案例

  • [ ] 秒杀

  • 动画

01-localstorage与sessionstorage

1.1-localstorage

1.localStorage:本地存储

  1. 将数据存储到浏览器

2.语法

  1. 存: localStorage.setItem('属性名','属性值')
  2. 取: localStorage.getItem('属性名')
  3. 删: localStorage.removeItem('属性名')
  4. 清空: localStorage.clear()

3.注意点

  1. a.存储的数据只能是字符串类型。如果是其他数据类型则会自动调用toString()方法转成字符串
  2. b.永久存储。除非自己删,否则一直存在于浏览器

day04 - 图1

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>Document</title>
  8. </head>
  9. <body>
  10. <button id="btn1">存储据</button>
  11. <button id="btn2">取储据</button>
  12. <button id="btn3">删储据</button>
  13. <button id="btn4">清空储据</button>
  14. <script>
  15. /*
  16. 1.localStorage:本地存储
  17. 将数据存储到浏览器
  18. 2.语法
  19. 存: localStorage.setItem('属性名','属性值')
  20. 取: localStorage.getItem('属性名')
  21. 删: localStorage.removeItem('属性名')
  22. 清空: localStorage.clear()
  23. 3.注意点
  24. a.存储的数据只能是字符串类型。如果是其他数据类型则会自动调用toString()方法转成字符串
  25. b.永久存储。除非自己删,否则一直存在于浏览器
  26. */
  27. //存
  28. document.getElementById('btn1').onclick = function(){
  29. localStorage.setItem('name','班长');
  30. localStorage.setItem('age',18);
  31. localStorage.setItem('girlFriend',['苍老师','波多老师','吉泽老师']);
  32. }
  33. //取
  34. document.getElementById('btn2').onclick = function(){
  35. let age = localStorage.getItem('age');
  36. console.log(age);
  37. }
  38. //删
  39. document.getElementById('btn3').onclick = function(){
  40. localStorage.removeItem('girlFriend');
  41. }
  42. //清空:一次性删除所有数据
  43. document.getElementById('btn4').onclick = function(){
  44. localStorage.clear();
  45. }
  46. </script>
  47. </body>
  48. </html>

1.2-sessionStorage

1.sessionStorage相当于短命版的localStorage,其他用法完全一致

2.两者区别:HP值不同

  1. localStorage:永久存储(存在硬盘,HP值无限)
  2. sessionStorage:临时存储(存在内存,HP值一条命,只要浏览器关闭就没有了)
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>Document</title>
  8. </head>
  9. <body>
  10. <button id="btn1">存储据</button>
  11. <button id="btn2">取储据</button>
  12. <button id="btn3">删储据</button>
  13. <button id="btn4">清空储据</button>
  14. <script>
  15. /*
  16. 1.sessionStorage相当于短命版的localStorage,其他用法完全一致
  17. 2.两者区别:HP值不同
  18. localStorage:永久存储(存在硬盘,HP值无限)
  19. sessionStorage:临时存储(存在内存,HP值一条命,只要浏览器关闭就没有了)
  20. */
  21. //存
  22. document.getElementById('btn1').onclick = function(){
  23. sessionStorage.setItem('name','班长');
  24. sessionStorage.setItem('age',18);
  25. sessionStorage.setItem('girlFriend',['苍老师','波多老师','吉泽老师']);
  26. }
  27. //取
  28. document.getElementById('btn2').onclick = function(){
  29. let age = sessionStorage.getItem('age');
  30. console.log(age);
  31. }
  32. //删
  33. document.getElementById('btn3').onclick = function(){
  34. sessionStorage.removeItem('girlFriend');
  35. }
  36. //清空:一次性删除所有数据
  37. document.getElementById('btn4').onclick = function(){
  38. sessionStorage.clear();
  39. }
  40. </script>
  41. </body>
  42. </html>

1.3-案例:页面间传值

day04 - 图2

  • 页面a
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>Document</title>
  8. </head>
  9. <body>
  10. <input type="text" placeholder="请输入账号" id="user">
  11. <input type="password" placeholder="请输入密码" id="pwd">
  12. <a href="09-页面间传值2.html" id="next">下一步</a>
  13. <script>
  14. let user = document.getElementById('user');
  15. let pwd = document.getElementById('pwd');
  16. document.getElementById('next').onclick = function(){
  17. //希望跳转之前保存一下数据
  18. sessionStorage.setItem('user',user.value);
  19. sessionStorage.setItem('pwd',pwd.value);
  20. }
  21. </script>
  22. </body>
  23. </html>
  • 页面b
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>Document</title>
  8. </head>
  9. <body>
  10. <input type="text" placeholder="请输入职业" id="job">
  11. <input type="text" placeholder="请输入邮箱" id="email">
  12. <input type="text" placeholder="请输入地址" id="addr">
  13. <input type="button" value="注册" id="register">
  14. <script>
  15. let job = document.getElementById('job');
  16. let email = document.getElementById('email');
  17. let addr = document.getElementById('addr');
  18. document.getElementById('register').onclick = function () {
  19. //拿到上一个页面的内容
  20. let user = sessionStorage.getItem('user');
  21. let pwd = sessionStorage.getItem('pwd');
  22. //拿到当前页面的内容
  23. //一起发给服务器
  24. console.log(user, pwd, job.value, email.value, addr.value);
  25. }
  26. </script>
  27. </body>
  28. </html>

02-offset家族

  • 1.offset属性家族:获取元素真实的宽高和位置

    • offsetWidth、offsetHeight、offsetParent、offsetLeft、offsetTop
  • 2.之前学习的通过style属性获取宽高的特点

    • 1.只能获取行内的宽高
    • 2.获取到的值是一个string类型,并且带px
    • 3.获取到的只有宽高,不包含padding、border(总结就是行内写的是什么,获取的就是什么)
    • 4.既可以读取,也可以设置
  • 3.offsetWidth与offsetHeight:获取的是元素的实际宽高 = width + border + padding

    • 1.可以获取行内及内嵌的宽高
    • 2.获取到的值是一个number类型,不带单位
    • 3.获取的宽高包含border和padding
    • 4.只能读取不能设置

day04 - 图3

1.1-offsetWidth与offsetHeight

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <style>
  7. .one{
  8. width: 100px;
  9. padding: 10px;
  10. border: 10px solid red;
  11. }
  12. </style>
  13. </head>
  14. <body>
  15. <div id="box" class="one" style="height: 150px; background: pink; "></div>
  16. </body>
  17. <script>
  18. /*offset属性家族:获取元素真实的宽高和位置
  19. * offsetWidth、offsetHeight、offsetParent、offsetLeft、offsetTop
  20. */
  21. let box = document.getElementById('box');
  22. /*之前学习的通过style属性获取宽高的特点
  23. * 1.只能获取行内的宽高
  24. * 2.获取到的值是一个string类型,并且带px
  25. * 3.获取到的只有宽高,不包含padding、border(总结就是行内写的是什么,获取的就是什么)
  26. * 4.既可以读取,也可以设置
  27. */
  28. console.log ( box.style.width );
  29. console.log ( box.style.height );
  30. box.style.height = '100px';
  31. /*offsetEWidth与offsetHeight:获取的是元素的实际宽高 = width + border + padding
  32. 1.可以获取行内及内嵌的宽高
  33. 2.获取到的值是一个number类型,不带单位
  34. 3.获取的宽高包含border和padding
  35. 4.只能读取,不能设置
  36. */
  37. console.log ( box.offsetWidth ); //width + border + padding
  38. console.log ( box.offsetHeight ); //height + border + padding
  39. box.offsetWidth = 300; //手动设置无效:只能读取,不能设置。
  40. </script>
  41. </html>

1.2-offsetParent

  1. offsetParent:获取最近的定位父元素 (自己定位参照的父元素)
  2. 注意点:
  3. 1.如果元素自身是固定定位(fixed),则定位父级是null
  4. 2.如果元素自身是非固定定位,并且所有的父元素都没有定位,那么他的定位父级是body
  5. 3.body的定位父级是null
  6. <!DOCTYPE html>
  7. <html lang="en">
  8. <head>
  9. <meta charset="UTF-8">
  10. <title>Title</title>
  11. <style>
  12. .one{
  13. top: 50px;
  14. left: 0px;
  15. width: 100px;
  16. height: 100px;
  17. background: greenyellow;
  18. position: absolute;
  19. }
  20. .two{
  21. top: 100px;
  22. left: 0;
  23. width: 200px;
  24. height: 200px;
  25. background: cyan;
  26. position: relative;
  27. }
  28. .three{
  29. top: 0;
  30. left: 0;
  31. width: 300px;
  32. height: 300px;
  33. background: green;
  34. position: relative;
  35. }
  36. </style>
  37. </head>
  38. <body>
  39. <div class="three">
  40. <div class="two">
  41. <div class="one" id="box">1</div>
  42. </div>
  43. </div>
  44. </body>
  45. <script>
  46. /*offsetParent:获取最近的定位父元素 (自己定位参照的父元素)
  47. //注意点:
  48. 1.如果元素自身是固定定位,则定位父级是null
  49. 2.如果元素自身是非固定定位,并且所有的父元素都没有定位,那么他的定位父级是body
  50. 3.body的定位父级是null
  51. */
  52. let box = document.getElementById('box');
  53. console.log ( box.offsetParent );
  54. //如果是固定定位fixed,则父元素是null
  55. //原因:固定定位参照的是浏览器窗口,这不属于任何一个元素,所以是null
  56. // console.log ( box.offsetParent );//null
  57. //body自身的定位父元素是null
  58. console.log ( document.body.offsetParent );
  59. </script>
  60. </html>

1.3-offsetLeft和offsetTop

  • offsetLeft:获取自己左外边框与offsetParent的左内边框的距离
  • offsetTop:获取自己上外边框与offsetParent的上内边框的距离
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <style>
  7. .one{
  8. top:50px;
  9. left: 50px;
  10. width: 100px;
  11. height: 100px;
  12. background: greenyellow;
  13. border: 10px solid red;
  14. margin: 20px;
  15. position: absolute;
  16. }
  17. .two{
  18. top: 200px;
  19. left: 200px;
  20. width: 200px;
  21. height: 200px;
  22. background: cyan;
  23. border: 20px solid purple;
  24. padding: 10px;
  25. position: absolute;
  26. }
  27. </style>
  28. </head>
  29. <body>
  30. <div class="two">
  31. <div class="one" id="box">1</div>
  32. </div>
  33. </body>
  34. <script>
  35. /*
  36. offsetLeft:获取自己左外边框与offsetParent的左内边框的距离
  37. offsetTop:获取自己上外边框与offsetParent的上内边框的距离
  38. */
  39. let box = document.getElementById('box');
  40. console.log ( box.offsetLeft ); //70
  41. console.log ( box.offsetTop ); //70
  42. </script>
  43. </html>

03-定时器作用及语法

1.1-setInterval

定时器:某一件事(一段代码)并不是马上执行,而是隔一段时间执行

  • setInterval:创建定时器

    • 特点:一旦创建立即计时,必须要手动停止,否则会无限的每隔一段时间执行代码
  • clearInterval(定时器id):清除定时器

    • 一个页面可以创建很多个定时器,通过制定定时器id可以清除特定的定时器
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>Document</title>
  8. </head>
  9. <body>
  10. <button id="start">开启</button>
  11. <button id="end">结束</button>
  12. <p id="p1">0</p>
  13. <script>
  14. /*1.定时器: 让一段代码每隔一定时间自动执行
  15. 2.语法
  16. 开启定时器: setInterval() 一旦开启永久重复,只能手动调用语法停止
  17. 清除定时器 clearInterval()
  18. */
  19. let p1 = document.querySelector('#p1');
  20. let timeID = null;//声明变量存储定时器
  21. //注册事件
  22. document.getElementById('start').onclick = function () {
  23. /**开启定时器
  24. 第一个参数:一段代码 回调函数
  25. 第二个参数:时间间隔 单位:ms
  26. 返回值: 定时器ID timeID
  27. 定时器ID:一个页面可以开启很多个不同的定时器,浏览器为了区分这些定时器,每开启一个定时器
  28. 就会给它们一个编号,这个编号叫做定时器ID
  29. */
  30. timeID = setInterval(function () {
  31. console.log('哈哈哈');
  32. p1.innerText++;
  33. // let text = p1.innerText;
  34. // text++;//只是变量text的值+1
  35. // console.log(text);
  36. // p1.innerText = text;
  37. }, 1000);
  38. };
  39. document.getElementById('end').onclick = function () {
  40. //清除定时器
  41. //参数:定时器ID
  42. clearInterval(timeID);
  43. };
  44. </script>
  45. </body>
  46. </html>

1.2-setTimeout

  • 定时器setTimeout与setInterval唯一的区别是,setTimeout定时器只会执行一次
  • 总结:

    • 1.如果你想让这个代码一段时间后只执行一次,使用setTimeout
    • 2.如果你想让这个代码每隔一段时间执行一次(执行多次),使用setInterval
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>Document</title>
  8. </head>
  9. <body>
  10. <script>
  11. /* 1. setInterval() :永久定时器 一旦开启会永久重复, 只能手动清除
  12. clearInterval() :清除
  13. 2. setTimeout() : 一次定时器 一旦开启只会执行一次,执行完毕之后自动清除
  14. */
  15. let timeID = setTimeout(function(){
  16. console.log('boom');
  17. },5000);
  18. //一次定时器也可以清除,但是不常用
  19. // clearInterval(timeID);
  20. // clearTimeout(timeID);
  21. </script>
  22. </body>
  23. </html>

04-定时器的场景案例

1.1-倒计时秒杀

效果预览

  • 思路分析

    开启定时器,1s

    1. 1.先获取页面元素的文本 h m s<br />
    2. 2.每过1ss--<br />
    3. 3.如果s < 0, s = 59, m--<br />
    4. 4.如果m < 0, m = 59, h--<br />
    5. 5.如果 h m s < 10,则在前面加上0<br />
    6. 6.将计算的h m s 结果,显示到页面元素中<br />
    7. 7.如果h == 0 && m == 0 && s == 0
  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title>Document</title>
  6. <style>
  7. .box {
  8. width: 200px;
  9. height: 100px;
  10. margin: 100px auto;
  11. }
  12. span {
  13. display: inline-block;
  14. width: 30px;
  15. height: 40px;
  16. line-height: 40px;
  17. background-color: #222;
  18. color: #fff;
  19. text-align: center;
  20. font-weight: 700;
  21. }
  22. </style>
  23. </head>
  24. <body>
  25. <div class="box">
  26. <span id="spanHour">03</span>
  27. <span>:</span>
  28. <span id="spanMin">06</span>
  29. <span>:</span>
  30. <span id="spanSec">15</span>
  31. </div>
  32. <script>
  33. /*思路分析
  34. 开启一个永久定时器。时间间隔1s。
  35. (1).获取页面元素的文本。 h m s
  36. (2).每过1s, s--
  37. (3). 如果s < 0, s = 59,m--
  38. (4) 如果 m < 0, m = 59,h--
  39. (5)如果hms < 10,则在前面加上0
  40. (5)将计算好的时分秒hms赋值给页面元素文本
  41. (6)如果 s == 0 && m == 0 && h == 0,清除定时器
  42. */
  43. let timeID = setInterval(function () {
  44. //(1).获取页面元素的文本。 h m s
  45. let hDiv = document.querySelector('#spanHour');
  46. let mDiv = document.querySelector('#spanMin');
  47. let sDiv = document.querySelector('#spanSec');
  48. let h = hDiv.innerText;
  49. let m = mDiv.innerText;
  50. let s = sDiv.innerText;
  51. //(2).每过1s, s--
  52. s--;
  53. //(3). 如果s < 0, s = 59,m--
  54. if (s < 0) {
  55. s = 59;
  56. m--;
  57. };
  58. //(4) 如果 m < 0, m = 59,h--
  59. if (m < 0) {
  60. m = 59;
  61. h--;
  62. };
  63. //(5)如果h m s < 10,则在前面加上0
  64. /*注意点: 不要直接用字符串和数字计算,应该先转成number类型 */
  65. s = parseInt(s);
  66. m = parseInt(m);
  67. h = parseInt(h);
  68. s = s < 10 ? '0' + s : s;
  69. m = m < 10 ? '0' + m : m;
  70. h = h < 10 ? '0' + h : h;
  71. //(6)将计算好的时分秒hms赋值给页面元素文本
  72. hDiv.innerText = h;
  73. mDiv.innerText = m;
  74. sDiv.innerText = s;
  75. //(7)如果 s == 0 && m == 0 && h == 0,清除定时器
  76. if (s == 0 && m == 0 && h == 0) {
  77. clearInterval(timeID);
  78. }
  79. }, 1000)
  80. </script>
  81. </body>
  82. </html>

1.2-动画介绍(匀速动画)

效果预览

  • 需求:点击开始按钮,让div向右移动800px ,动画效果
  • 动画可以理解为物理中的运动,运动三要素:v = s/t (速度 = 距离/时间)

    • 如果没有时间因素,则会造成瞬移效果
  • 1.如果直接修改div的left值就会瞬间移动,没有动画效果
  • 2.动画效果:让div的left值每隔一段时间向右移动一点,直到移动800为止
  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title>标题</title>
  6. <style>
  7. .one {
  8. width: 100px;
  9. height: 100px;
  10. background-color: pink;
  11. position: absolute;
  12. top: 50px;
  13. left: 0px;
  14. }
  15. </style>
  16. </head>
  17. <body>
  18. <input type="button" value="开始" id="start"/>
  19. <div class="one" id="box"></div>
  20. </body>
  21. <script>
  22. /*需求:点击开始按钮,让div向右移动800px ,动画效果
  23. 动画可以理解为物理中的运动,运动三要素:v = s/t (速度 = 距离/时间)
  24. * 如果没有时间因素,则会造成瞬移效果
  25. *
  26. 1.如果直接修改div的left值就会瞬间移动,没有动画效果
  27. 2.动画效果:让div的left值每隔一段时间向右移动一点,直到移动800为止
  28. * */
  29. //1.获取div
  30. let div = document.querySelector('#box');
  31. // //直接修改div的left值就会瞬间移动,没有动画
  32. // document.getElementById('start').onclick = function ( ) {
  33. // div.style.left = '800px';
  34. // }
  35. //2.利用定时器实现动画(setInterval)
  36. let timeID = null;//声明一个变量,用来记录定时器的id
  37. let currentLeft = 0 ;//声明一个变量,用来记录运动中当前的left值
  38. document.getElementById('start').onclick = function ( ) {
  39. timeID = setInterval(function ( ) {
  40. //定义一个距离因子来表示速度,每隔一段时间,当前距离会叠加这个因子
  41. //因子越小,动画越平缓
  42. let step = 9;
  43. currentLeft += step;
  44. div.style.left = currentLeft + 'px';
  45. //判断div是否达到目的地,否则会无限向右移动
  46. if(currentLeft >= 800){
  47. div.style.left = 800 + 'px'; //到达终点
  48. clearInterval(timeID); //清除定时器,停止运动
  49. }
  50. },100);//间隔时间越小动画越平缓
  51. }
  52. </script>
  53. </html>