日学习任务

  • 1.获取元素一切样式
  • [ ] 2.缓速动画封装

  • [ ] 缓速动画封装

  • [ ] a.代码冗余-函数

  • b.移动距离不限:函数参数
  • c.移动元素不限
  • d.移动方向不限
  • e.移动属性不限
  • [x] 3.缓速动画应用

  • [ ] 轮播图

01-getComputedStyle()获取元素一切样式属性

元素属性操作 特点 应用场景
点语法 可以修改任意样式,无法获取行外样式 修改元素样式
attribute 操作自定义样式 操作自定义样式
getComputedStyle() 不可以修改样式,可以获取任意样式(行内+行外) 获取元素样式
element.currentStyle 与getComputedStyle一致(仅限IE8及以前使用) 获取元素样式
  • 语法: window.getComputedStyle(元素,伪元素)

    • 返回值:对象类型(存储元素一切样式属性)
  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. background-color: pink;
  10. border: 10px solid green;
  11. padding: 10px;
  12. margin: 0 auto;
  13. position: relative;
  14. left: 0px;
  15. top: 50px;
  16. }
  17. .one::after {
  18. content: "哈哈哈";
  19. background-color: blue;
  20. }
  21. </style>
  22. </head>
  23. <body>
  24. <div class="one" id="box" style="height: 100px"></div>
  25. <script>
  26. let box = document.getElementById('box');
  27. /*1.点语法特点
  28. a.只能获取行内,无法获取行外
  29. b.获取的是string,带单位
  30. c.既可以获取,也可以修改
  31. */
  32. console.log(box.style.height);//100px
  33. console.log(box.style.width);//空字符串
  34. box.style.width = '500px';
  35. /*2. getComputedStyle() 获取元素一切样式属性
  36. a.既可以获取行内,也可以获取行外
  37. b.获取的是string,带单位
  38. c.只能获取不能修改
  39. */
  40. /*2.getComputedStyle() 获取元素一切样式属性
  41. 第一个参数:元素
  42. 第二个参数:伪元素 一般不传或者传null
  43. 返回值: CSSStyleDeclaration 对象:存储元素一切样式属性
  44. */
  45. let style = window.getComputedStyle(box,null);
  46. console.log(style);
  47. console.log(style.backgroundColor);
  48. console.log(style.padding);
  49. console.log(style.border);
  50. console.log(style.width);
  51. style.width = '1000px';//程序报错 只能获取不能修改
  52. /*3.三种语法操作元素属性总结
  53. a.点语法: 修改元素属性
  54. b. getComputedStyle():获取元素属性
  55. c.attribute: 操作自定义属性
  56. */
  57. </script>
  58. </body>
  59. </html>

02-缓速动画封装

day05 - 图1

1.1-缓动动画介绍

效果预览

  • 缓动动画核心计算公式: 本次需要移动距离 = (目标距离 - 当前距离)/10
  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style>
  7. #box {
  8. width: 100px;
  9. height: 100px;
  10. background-color: red;
  11. position: absolute;
  12. left: 50px;
  13. top: 50px;
  14. }
  15. </style>
  16. </head>
  17. <body>
  18. <input type="button" value="匀速移到400" id="move400"/>
  19. <input type="button" value="缓动移到400" id="move800"/>
  20. <div id="box"></div>
  21. </body>
  22. <script>
  23. /*1.介绍现实世界物体运动两种方式
  24. * 匀速运动:我们今天上午封装的动画,每一步移动的距离一样,相当于物体匀速运动
  25. * 加速运动:移动越来越快/原来越慢,每一步移动的距离不一样,相当于物体的加速度运动
  26. 2.缓动动画:指的是元素的移动速度越来越慢的动画(用户体验优于匀速动画)
  27. * 匀速动画在到达终点时会突然停止,不符合现实世界物体的运动规律
  28. 3.缓动动画核心原理公式: 本次移动距离 = (目前距离 - 当前距离)/10
  29. 移动次数 目标位置 缓动基数 当前位置 本次移动距离
  30. 1 400 10 0 (400-0)/10 = 40
  31. 2 400 10 40 (400-40)/10 = 36
  32. 3 400 10 76 (400-76)/10 = 32.4(向上取整得到33)
  33. 4 400 10 109 (400-109)/10 = 29.1(向上取整得到30)
  34. ...............
  35. n 400 10 397 (400-397)/10 = 0.3(向上取整得到1)
  36. n+1 400 10 398 (400-398)/10 = 0.2(向上取整得到1)
  37. n+2 400 10 399 (400-399)/10 = 0.1(向上取整得到1)
  38. 4.缓动动画特点
  39. * (1)每次移动距离不同,如果为小数,一般需要取整(因为一般开发中像素单位都给整数)
  40. * (2)不需要边界检测,因为到了最后面移动距离都是1个像素,但是需要判断是否达到终点来清除定时器
  41. */
  42. let box = document.getElementById('box');
  43. let timeID;
  44. /*缓动动画*/
  45. document.getElementById('move800').onclick = function ( ) {
  46. //先清除以前的定时器
  47. clearInterval(timeID);
  48. //开始缓动
  49. timeID = setInterval(function ( ) {
  50. //(1)获取用户当前位置
  51. let currentLeft = box.offsetLeft;
  52. //(2) 计算本次需要运动的距离
  53. let step = (400 - currentLeft)/10;
  54. //由于除法可能会得到小数,而一般像素的最小单位是1px,所以我们做一个向上取整
  55. step = Math.ceil(step);
  56. //(3)移动
  57. currentLeft += step;
  58. box.style.left = currentLeft + 'px';
  59. //缓动动画无需边界检测,因为到了最后面移动的距离都是1px,直到到达重点
  60. //(4)到达终点清除定时器
  61. if(currentLeft == 400){
  62. clearInterval(timeID);
  63. }
  64. },50)
  65. }
  66. //1.复习匀速动画的特点
  67. document.getElementById('move400').onclick = function ( ) {
  68. //先清除以前的定时器
  69. clearInterval(timeID);
  70. //开始动画
  71. timeID = setInterval(function ( ) {
  72. //(1)获取用户当前的位置
  73. let currentLeft = box.offsetLeft;
  74. //(2)定义一个匀速移动的距离
  75. let speed = 10;
  76. //(3)每一次运动的距固定
  77. currentLeft += speed;
  78. box.style.left = currentLeft + 'px';
  79. //(4)边界检测
  80. // 为什么要有边界检测:因为每一次移动的距离是固定的,无论当前位置距离目标位置有多远(1px),本次运动距离固定(10px)
  81. if(currentLeft >= 400){
  82. box.style.left = '400px';
  83. //到达终点,清除定时器
  84. clearInterval(timeID);
  85. }
  86. },50);
  87. }
  88. </script>
  89. </html>

1.2-移动距离不限01

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style>
  7. #box {
  8. width: 100px;
  9. height: 100px;
  10. background-color: red;
  11. position: absolute;
  12. left: 50px;
  13. top: 50px;
  14. }
  15. </style>
  16. </head>
  17. <body>
  18. <input type="button" value="缓动移到400" id="move400"/>
  19. <input type="button" value="缓动移到800" id="move800"/>
  20. <div id="box"></div>
  21. </body>
  22. <script>
  23. /*本小节封装实现需求:(1)移动距离不限
  24. */
  25. let box = document.getElementById('box');
  26. document.getElementById('move400').onclick = function ( ) {
  27. animationSlow(400);
  28. }
  29. document.getElementById('move800').onclick = function ( ) {
  30. animationSlow(800);
  31. }
  32. let timeID;
  33. function animationSlow ( target ) {
  34. //1.清除之前的定时器
  35. clearInterval(timeID);
  36. //2.开始移动
  37. timeID = setInterval(function ( ) {
  38. //2.1 获取元素当前位置
  39. let currentLeft = box.offsetLeft;
  40. //2.2 计算本次需要运动距离
  41. let step = (target - currentLeft)/10;
  42. //2.3 移动
  43. currentLeft += step;
  44. box.style.left = currentLeft + 'px';
  45. //2.4 终点检测:到达终点清除定时器
  46. if(currentLeft == target){
  47. clearInterval(timeID);
  48. }
  49. },50);
  50. }
  51. </script>
  52. </html>

1.3-移动元素不限02

day05 - 图2

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style>
  7. #box {
  8. width: 100px;
  9. height: 100px;
  10. background-color: red;
  11. position: absolute;
  12. left: 0px;
  13. top: 50px;
  14. }
  15. #box1 {
  16. width: 100px;
  17. height: 100px;
  18. background-color: green;
  19. position: absolute;
  20. left: 0px;
  21. top: 200px;
  22. }
  23. </style>
  24. </head>
  25. <body>
  26. <input type="button" value="缓动移到400" id="move400"/>
  27. <input type="button" value="缓动移到800" id="move800"/>
  28. <div id="box"></div>
  29. <div id="box1"></div>
  30. <script>
  31. /*本小节解决问题:移动元素不限 --函数参数
  32. */
  33. let box = document.getElementById('box');
  34. let box1 = document.getElementById('box1');
  35. //缓动移到400
  36. document.getElementById('move400').onclick = function(){
  37. animationSlow(box, 400);
  38. };
  39. //缓动移到800
  40. document.getElementById('move800').onclick = function ( ) {
  41. animationSlow(box1,800);
  42. };
  43. /**
  44. * 缓动动画
  45. * @param ele 要移动的元素
  46. * @param target 要移动的目标距离
  47. */
  48. function animationSlow (ele,target ) {
  49. //1.先清除之前的定时器,以本次移动为准
  50. clearInterval(ele.timeID);
  51. //2.开始本次移动
  52. ele.timeID = setInterval(function ( ) {
  53. //2.1 先获取当前位置
  54. let currentLeft = ele.offsetLeft;
  55. //2.2 计算本次移动距离 = (目标位置 - 当前位置)/10
  56. let step = (target - currentLeft)/10;
  57. //取整:
  58. step = Math.ceil(step);
  59. //2.3 开始移动
  60. currentLeft += step;
  61. ele.style.left = currentLeft + 'px';
  62. //2.4 终点检测
  63. if (currentLeft == target){
  64. clearInterval(ele.timeID);
  65. }
  66. },50);
  67. };
  68. </script>
  69. </body>
  70. </html>

1.4-移动方向不限03

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style>
  7. #box {
  8. width: 100px;
  9. height: 100px;
  10. background-color: red;
  11. position: absolute;
  12. left: 0px;
  13. top: 50px;
  14. }
  15. </style>
  16. </head>
  17. <body>
  18. <input type="button" value="缓动移到400" id="move400"/>
  19. <input type="button" value="缓动移到800" id="move800"/>
  20. <div id="box"></div>
  21. <script>
  22. /*本小节解决问题:移动方向不限
  23. 思考题(发现问题): 1.为什么缓动动画可以自动的实现从左往右与从右往左
  24. 2.为什么从左往右没有误差,而从右往左有误差
  25. 分析问题:
  26. 从左往右: 目标位置 > 当前位置 (1)step = (目标位置 - 当前位置)/10 是正数 (2)Math.ceil(0.3) = 1
  27. 从右往左: 目标位置 < 当前位置 (1)step = (目标位置 - 当前位置)/10 是负数 (2)Math.ceil(-0.9) = 0 Math.floor(-0.9) = -1
  28. 解决问题 : 如果step是正数:则向上取整
  29. 如果step是负数:则向下取整
  30. */
  31. let box = document.getElementById('box');
  32. //缓动移到400
  33. document.getElementById('move400').onclick = function(){
  34. animationSlow(box, 400);
  35. };
  36. //缓动移到800
  37. document.getElementById('move800').onclick = function ( ) {
  38. animationSlow(box,800);
  39. };
  40. /**
  41. * 缓动动画
  42. * @param ele 要移动的元素
  43. * @param target 要移动的目标距离
  44. */
  45. function animationSlow (ele,target ) {
  46. //1.先清除之前的定时器,以本次移动为准
  47. clearInterval(ele.timeID);
  48. //2.开始本次移动
  49. ele.timeID = setInterval(function ( ) {
  50. //2.1 先获取当前位置
  51. let currentLeft = ele.offsetLeft;
  52. //2.2 计算本次移动距离 = (目标位置 - 当前位置)/10
  53. let step = (target - currentLeft)/10;
  54. //取整:
  55. step = step>0?Math.ceil(step):Math.floor(step)
  56. // if (step>0){
  57. // step = Math.ceil(step);
  58. // }else{
  59. // step = Math.floor(step);
  60. // }
  61. //2.3 开始移动
  62. currentLeft += step;
  63. ele.style.left = currentLeft + 'px';
  64. //2.4 终点检测
  65. if (currentLeft == target){
  66. clearInterval(ele.timeID);
  67. }
  68. },50);
  69. };
  70. </script>
  71. </body>
  72. </html>

1.5-移动属性不限04

day05 - 图3

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style>
  7. #box {
  8. width: 100px;
  9. height: 100px;
  10. background-color: red;
  11. position: absolute;
  12. left: 0px;
  13. top: 50px;
  14. }
  15. </style>
  16. </head>
  17. <body>
  18. <input type="button" value="左右移动到800" id="move400" />
  19. <input type="button" value="上下移动到400" id="move800" />
  20. <div id="box"></div>
  21. <script>
  22. /*本小节解决问题:移动属性不限
  23. */
  24. let box = document.getElementById('box');
  25. //水平移动到400
  26. document.getElementById('move400').onclick = function () {
  27. animationSlow(box, 400, 'left');
  28. };
  29. //上下移动到400
  30. document.getElementById('move800').onclick = function () {
  31. animationSlow(box, 400, 'top');
  32. };
  33. /**缓动动画封装
  34. * @parma: ele:移动元素
  35. * @parma: target:目标位置
  36. * @parma: attr: 属性名字符串
  37. */
  38. function animationSlow(ele, target, attr) {
  39. //1.先清除以前的定时器,以本次为准
  40. clearInterval(ele.timeID);
  41. //2.开始本次移动
  42. ele.timeID = setInterval(function () {
  43. //2.1.获取元素当前位置
  44. //注意点: getComputerStyle获取的是字符串,需要使用parseInt转成number类型
  45. let current = parseInt(getComputedStyle(ele)[attr]);
  46. //2.2.计算本次移动距离 = (目标位置 - 当前位置)/10
  47. let step = (target - current) / 10;
  48. //取整: step正数:向上取整 从左往右 step是负数:从下取整 从右往左
  49. step = step > 0 ? Math.ceil(step) : Math.floor(step);
  50. //2.3.开始移动
  51. current += step;
  52. ele.style[attr] = current + 'px';
  53. //2.4.终点检测
  54. if (current == target) {
  55. clearInterval(ele.timeID);
  56. }
  57. }, 20);
  58. };
  59. </script>
  60. </body>
  61. </html>

03-轮播图

效果预览

day05 - 图4

1.1-完整思路介绍

  • 第一步:完成轮播图事件的添加 :用一个全局遍历index记录当前需要展示的图片的索引

    • (1)鼠标移入移出事件:当鼠标移入轮播图时显示左右两边上一页下一页按钮,移出时隐藏
    • (2)上一页下一页按钮点击事件

      • 点击下一页:index++
      • 点击上一页:index—
    • (3)页码点击事件
  • 第二步:完成上一页和下一页

    • (1)点击移动之前给ul添加边界检测:否则点击下一页会无限往右滚动
    • (2)修改当前索引(自增/自减),索引表示的是当前ul应该展示第几张图片
    • (3)移动ul(目标距离 = -index * screen的宽度)
    • (4)页码保持同步(当前显示的是第几张图片,下方页码对应索引高亮)
  • 第三步:完成无限轮播 核心思想:n+1

    • (1)常规思路:图片滚动时,当滚动到最后一张时,我们偷偷的快速改变ul的位置到第一张(不要动画,瞬间改变)

      • ul.style.left = ‘0px’;//ul回到初始位置
      • index = 0;//index恢复到0
    • (2)问题发现:这种方式可以实现无限轮播,但是在下一轮无限的时候第一张会被跳过去

      • 原因:我们手动改变了index为0,而动画又需要index+1,所以会错过index为0的那一张
    • (3)解决方案:我们在最后一张图片的后面加上第一张图片(第6张)可以让用户看到滚动效果,然后滚动到第六张时,再改变ul回到初始位置。

      • 好处:(1)用户可以看到滚动效果,不影响体验 (2)刚好第6张与第一张是同一张图片,快速改变位置不会造成动画的闪现
    • (4)当图片index为最后一张的的时候,页码应该显示第一个

      • 因为最后一张图片第一张是同一张图片
  • 第四步:自动无限轮播

    • 功能原理介绍:相当于每隔一段时间自动点击下一页按钮,代码逻辑完全不变
    • 思路分析:

      • (1)将轮播代码封装成一个函数
      • (2)开启定时器,每隔一段时间执行这个函数
      • (3)鼠标移入时清除定时器,移出时开启定时器

1.2-第一步:获取页面元素、注册事件

第一步:完成轮播图事件的添加 :用一个全局变量index记录当前需要展示的图片的索引

  • (1)鼠标移入移出事件:当鼠标移入轮播图时显示左右两边上一页下一页按钮,移出时隐藏
  • (2)上一页下一页按钮点击事件

    • 点击下一页:index++
    • 点击上一页:index—
  • (3)页码点击事件
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style type="text/css">
  7. * {
  8. padding: 0;
  9. margin: 0;
  10. list-style: none;
  11. border: 0;
  12. }
  13. .all {
  14. width: 500px;
  15. height: 200px;
  16. padding: 7px;
  17. border: 1px solid #ccc;
  18. margin: 100px auto;
  19. position: relative;
  20. }
  21. .screen {
  22. width: 500px;
  23. height: 200px;
  24. /*overflow: hidden;*/
  25. position: relative;
  26. }
  27. .screen li {
  28. width: 500px;
  29. height: 200px;
  30. overflow: hidden;
  31. float: left;
  32. }
  33. .screen ul {
  34. position: absolute;
  35. left: 0;
  36. top: 0px;
  37. width: 3000px;
  38. }
  39. #arr {
  40. display: none;
  41. }
  42. #arr span {
  43. width: 40px;
  44. height: 40px;
  45. position: absolute;
  46. left: 5px;
  47. top: 50%;
  48. margin-top: -20px;
  49. background: #000;
  50. cursor: pointer;
  51. line-height: 40px;
  52. text-align: center;
  53. font-weight: bold;
  54. font-family: '黑体';
  55. font-size: 30px;
  56. color: #fff;
  57. opacity: 0.3;
  58. border: 1px solid #fff;
  59. }
  60. #arr #right {
  61. right: 5px;
  62. left: auto;
  63. }
  64. </style>
  65. </head>
  66. <body>
  67. <div class="all" id='box'>
  68. <div class="screen">
  69. <ul>
  70. <li><img src="images/01.jpg" width="500" height="200"/></li>
  71. <li><img src="images/02.jpg" width="500" height="200"/></li>
  72. <li><img src="images/03.jpg" width="500" height="200"/></li>
  73. <li><img src="images/04.jpg" width="500" height="200"/></li>
  74. <li><img src="images/05.jpg" width="500" height="200"/></li>
  75. </ul>
  76. <ol>
  77. <li class="current">1</li>
  78. <li>2</li>
  79. <li>3</li>
  80. <li>4</li>
  81. <li>5</li>
  82. </ol>
  83. </div>
  84. <div id="arr"><span id="left">&lt;</span><span id="right">&gt;</span></div>
  85. </div>
  86. <script src="animation.js"></script>
  87. <script>
  88. /*
  89. 第二步:完成上一页下一页
  90. */
  91. //1.获取页面元素
  92. let box = document.getElementById ( "box" )//最外面大盒子 (有边框)
  93. let screen = document.getElementsByClassName ( "screen" )[ 0 ]//轮播图可视区域盒子
  94. let ul = screen.children[0];//轮播图列表ul
  95. console.log ( screen.children );
  96. let arr = document.getElementById('arr');//上一页下一页盒子
  97. let left = document.getElementById('left');//上一页
  98. let right = document.getElementById('right');//下一页
  99. //2.注册事件
  100. //2.1 鼠标移入box
  101. box.onmouseover = function ( ) {
  102. //3.事件处理 : 显示上一页下一页
  103. arr.style.display = 'block';
  104. };
  105. //2.2 鼠标移出box
  106. box.onmouseout = function ( ) {
  107. //3.事件处理:隐藏上一页下一页
  108. arr.style.display = 'none';
  109. };
  110. let index = 0;//声明变量记录当前显示图片的下标
  111. //2.3 下一页
  112. right.onclick = function ( ) {
  113. //3.事件处理 :
  114. index++;//下一页
  115. console.log ( index );
  116. };
  117. //2.4 上一页
  118. left.onclick = function ( ) {
  119. //3.事件处理 :
  120. index--;//上一页
  121. console.log ( index );
  122. };
  123. //2.5 页码点击事件
  124. for(let i = 0;i<ol.children.length;i++){
  125. ol.children[i].onclick = function ( ) {
  126. //3.事件处理
  127. alert(1111);
  128. }
  129. }
  130. </script>
  131. </body>
  132. </html>

1.3-第二步:完成上一页下一页点击事件

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style type="text/css">
  7. * {
  8. padding: 0;
  9. margin: 0;
  10. list-style: none;
  11. border: 0;
  12. }
  13. .all {
  14. width: 500px;
  15. height: 200px;
  16. padding: 7px;
  17. border: 1px solid #ccc;
  18. margin: 100px auto;
  19. position: relative;
  20. }
  21. .screen {
  22. width: 500px;
  23. height: 200px;
  24. /*overflow: hidden;*/
  25. position: relative;
  26. }
  27. .screen li {
  28. width: 500px;
  29. height: 200px;
  30. overflow: hidden;
  31. float: left;
  32. }
  33. .screen ul {
  34. position: absolute;
  35. left: 0;
  36. top: 0px;
  37. width: 3000px;
  38. }
  39. #arr {
  40. display: none;
  41. }
  42. #arr span {
  43. width: 40px;
  44. height: 40px;
  45. position: absolute;
  46. left: 5px;
  47. top: 50%;
  48. margin-top: -20px;
  49. background: #000;
  50. cursor: pointer;
  51. line-height: 40px;
  52. text-align: center;
  53. font-weight: bold;
  54. font-family: '黑体';
  55. font-size: 30px;
  56. color: #fff;
  57. opacity: 0.3;
  58. border: 1px solid #fff;
  59. }
  60. #arr #right {
  61. right: 5px;
  62. left: auto;
  63. }
  64. </style>
  65. </head>
  66. <body>
  67. <div class="all" id='box'>
  68. <div class="screen">
  69. <ul>
  70. <li><img src="images/01.jpg" width="500" height="200"/></li>
  71. <li><img src="images/02.jpg" width="500" height="200"/></li>
  72. <li><img src="images/03.jpg" width="500" height="200"/></li>
  73. <li><img src="images/04.jpg" width="500" height="200"/></li>
  74. <li><img src="images/05.jpg" width="500" height="200"/></li>
  75. </ul>
  76. <ol>
  77. <li class="current">1</li>
  78. <li>2</li>
  79. <li>3</li>
  80. <li>4</li>
  81. <li>5</li>
  82. </ol>
  83. </div>
  84. <div id="arr"><span id="left">&lt;</span><span id="right">&gt;</span></div>
  85. </div>
  86. </body>
  87. <script src="animation.js"></script>
  88. <script>
  89. /*
  90. 第一步:获取页面元素,注册事件
  91. */
  92. //1.获取页面元素
  93. let box = document.getElementById ( "box" )//最外面大盒子 (有边框)
  94. let screen = document.getElementsByClassName ( "screen" )[ 0 ]//轮播图可视区域盒子
  95. let ul = screen.children[0];//轮播图列表ul
  96. console.log ( screen.children );
  97. let arr = document.getElementById('arr');//上一页下一页盒子
  98. let left = document.getElementById('left');//上一页
  99. let right = document.getElementById('right');//下一页
  100. //2.注册事件
  101. //2.1 鼠标移入box
  102. box.onmouseover = function ( ) {
  103. //3.事件处理 : 显示上一页下一页
  104. arr.style.display = 'block';
  105. };
  106. //2.2 鼠标移出box
  107. box.onmouseout = function ( ) {
  108. //3.事件处理:隐藏上一页下一页
  109. arr.style.display = 'none';
  110. };
  111. let index = 0;//声明变量记录当前显示图片的下标
  112. //2.3 下一页
  113. right.onclick = function ( ) {
  114. //3.事件处理 :
  115. //3.1 如果是最后一页,则不滚动
  116. if (index == ul.children.length -1){
  117. return;
  118. };
  119. //3.2 下一页
  120. index++;//下一页
  121. //3.3 开始滚动
  122. animationMove(ul, - index*screen.offsetWidth);
  123. console.log ( index );
  124. };
  125. //2.4 上一页
  126. left.onclick = function ( ) {
  127. //3.事件处理 :
  128. //3.1 如果是第一页,则不滚动
  129. if (index == 0){
  130. return;
  131. };
  132. //3.2 上一页
  133. index--;//上一页
  134. //3.3 开始滚动
  135. animationMove(ul, -index*screen.offsetWidth );
  136. console.log ( index );
  137. };
  138. //2.5 页码点击事件
  139. for(let i = 0;i<ol.children.length;i++){
  140. ol.children[i].onclick = function ( ) {
  141. //3.事件处理
  142. alert(1111);
  143. }
  144. }
  145. </script>
  146. </html>

1.4-第三步:完成无限轮播

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style type="text/css">
  7. * {
  8. padding: 0;
  9. margin: 0;
  10. list-style: none;
  11. border: 0;
  12. }
  13. .all {
  14. width: 500px;
  15. height: 200px;
  16. padding: 7px;
  17. border: 1px solid #ccc;
  18. margin: 100px auto;
  19. position: relative;
  20. }
  21. .screen {
  22. width: 500px;
  23. height: 200px;
  24. overflow: hidden;
  25. position: relative;
  26. }
  27. .screen li {
  28. width: 500px;
  29. height: 200px;
  30. overflow: hidden;
  31. float: left;
  32. }
  33. .screen ul {
  34. position: absolute;
  35. left: 0;
  36. top: 0px;
  37. width: 3000px;
  38. }
  39. #arr {
  40. display: none;
  41. }
  42. #arr span {
  43. width: 40px;
  44. height: 40px;
  45. position: absolute;
  46. left: 5px;
  47. top: 50%;
  48. margin-top: -20px;
  49. background: #000;
  50. cursor: pointer;
  51. line-height: 40px;
  52. text-align: center;
  53. font-weight: bold;
  54. font-family: '黑体';
  55. font-size: 30px;
  56. color: #fff;
  57. opacity: 0.3;
  58. border: 1px solid #fff;
  59. }
  60. #arr #right {
  61. right: 5px;
  62. left: auto;
  63. }
  64. </style>
  65. </head>
  66. <body>
  67. <div class="all" id='box'>
  68. <div class="screen">
  69. <ul>
  70. <li><img src="images/01.jpg" width="500" height="200"/></li>
  71. <li><img src="images/02.jpg" width="500" height="200"/></li>
  72. <li><img src="images/03.jpg" width="500" height="200"/></li>
  73. <li><img src="images/04.jpg" width="500" height="200"/></li>
  74. <li><img src="images/05.jpg" width="500" height="200"/></li>
  75. <li><img src="images/01.jpg" width="500" height="200"/></li>
  76. </ul>
  77. <ol>
  78. <li class="current">1</li>
  79. <li>2</li>
  80. <li>3</li>
  81. <li>4</li>
  82. <li>5</li>
  83. </ol>
  84. </div>
  85. <div id="arr"><span id="left">&lt;</span><span id="right">&gt;</span></div>
  86. </div>
  87. </body>
  88. <script src="animation.js"></script>
  89. <script>
  90. /*
  91. 第三步:完成无限轮播
  92. 1.提出假设: 当图片是最后一页的时候: (1)瞬间将ul的位置修改为第一张 (2)index变成0
  93. 发现问题: 没有第五张滚动到第一张的动画,并且会从第一张滚动到第二张
  94. 分析问题: 直接修改ul位置从第五张到第六张,是一个瞬间的过程,没有动画
  95. 解决问题: 将第一张图片li放到ul的最后一张去。
  96. (1)当从第五张滚动到第六张的时候,由于此时index并不是最后一张。所以有动画
  97. (2)当从第六张(最后一张)直接修改ul为第一张的时候,两张是同一张,实现无缝对接
  98. */
  99. //1.获取页面元素
  100. let box = document.getElementById ( "box" )//最外面大盒子 (有边框)
  101. let screen = document.getElementsByClassName ( "screen" )[ 0 ]//轮播图可视区域盒子
  102. let ul = screen.children[0];//轮播图列表ul
  103. console.log ( screen.children );
  104. let arr = document.getElementById('arr');//上一页下一页盒子
  105. let left = document.getElementById('left');//上一页
  106. let right = document.getElementById('right');//下一页
  107. //2.注册事件
  108. //2.1 鼠标移入box
  109. box.onmouseover = function ( ) {
  110. //3.事件处理 : 显示上一页下一页
  111. arr.style.display = 'block';
  112. };
  113. //2.2 鼠标移出box
  114. box.onmouseout = function ( ) {
  115. //3.事件处理:隐藏上一页下一页
  116. arr.style.display = 'none';
  117. };
  118. let index = 0;//声明变量记录当前显示图片的下标
  119. //2.3 下一页
  120. right.onclick = function ( ) {
  121. //3.事件处理 :
  122. //3.1 如果是最后一页,(1)修改ul位置为第一张 (2)index = 0
  123. if (index == ul.children.length -1){
  124. ul.style.left = '0px';
  125. index = 0;//修改index从0开始无限滚动
  126. };
  127. //3.2 下一页
  128. index++;//下一页
  129. //3.3 开始滚动
  130. animationMove(ul, - index*screen.offsetWidth);
  131. console.log ( index );
  132. };
  133. //2.4 上一页
  134. left.onclick = function ( ) {
  135. //3.事件处理 :
  136. //3.1 如果是第一页,(1)修改ul位置为最后一张 (2)index = 最后一张下标
  137. if (index == 0){
  138. ul.style.left = -(ul.children.length-1)*screen.offsetWidth + 'px';
  139. index = ul.children.length-1;
  140. };
  141. //3.2 上一页
  142. index--;//上一页
  143. //3.3 开始滚动
  144. animationMove(ul, -index*screen.offsetWidth );
  145. console.log ( index );
  146. };
  147. </script>
  148. </html>

1.5-第四步:完成自动轮播

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style type="text/css">
  7. * {
  8. padding: 0;
  9. margin: 0;
  10. list-style: none;
  11. border: 0;
  12. }
  13. .all {
  14. width: 500px;
  15. height: 200px;
  16. padding: 7px;
  17. border: 1px solid #ccc;
  18. margin: 100px auto;
  19. position: relative;
  20. }
  21. .screen {
  22. width: 500px;
  23. height: 200px;
  24. overflow: hidden;
  25. position: relative;
  26. }
  27. .screen li {
  28. width: 500px;
  29. height: 200px;
  30. overflow: hidden;
  31. float: left;
  32. }
  33. .screen ul {
  34. position: absolute;
  35. left: 0;
  36. top: 0px;
  37. width: 3000px;
  38. }
  39. #arr {
  40. display: none;
  41. }
  42. #arr span {
  43. width: 40px;
  44. height: 40px;
  45. position: absolute;
  46. left: 5px;
  47. top: 50%;
  48. margin-top: -20px;
  49. background: #000;
  50. cursor: pointer;
  51. line-height: 40px;
  52. text-align: center;
  53. font-weight: bold;
  54. font-family: '黑体';
  55. font-size: 30px;
  56. color: #fff;
  57. opacity: 0.3;
  58. border: 1px solid #fff;
  59. }
  60. #arr #right {
  61. right: 5px;
  62. left: auto;
  63. }
  64. </style>
  65. </head>
  66. <body>
  67. <div class="all" id='box'>
  68. <div class="screen">
  69. <ul>
  70. <li><img src="images/01.jpg" width="500" height="200"/></li>
  71. <li><img src="images/02.jpg" width="500" height="200"/></li>
  72. <li><img src="images/03.jpg" width="500" height="200"/></li>
  73. <li><img src="images/04.jpg" width="500" height="200"/></li>
  74. <li><img src="images/05.jpg" width="500" height="200"/></li>
  75. <li><img src="images/01.jpg" width="500" height="200"/></li>
  76. </ul>
  77. <ol>
  78. <li class="current">1</li>
  79. <li>2</li>
  80. <li>3</li>
  81. <li>4</li>
  82. <li>5</li>
  83. </ol>
  84. </div>
  85. <div id="arr"><span id="left">&lt;</span><span id="right">&gt;</span></div>
  86. </div>
  87. </body>
  88. <script src="animation.js"></script>
  89. <script>
  90. /*
  91. 本小节:自动轮播
  92. 1.页面一加载:开启自动模式 (定时器每隔3s,自动执行下一页代码)
  93. */
  94. //1.获取页面元素
  95. let box = document.getElementById ( "box" )//最外面大盒子 (有边框)
  96. let screen = document.getElementsByClassName ( "screen" )[ 0 ]//轮播图可视区域盒子
  97. let ul = screen.children[0];//轮播图列表ul
  98. console.log ( screen.children );
  99. let arr = document.getElementById('arr');//上一页下一页盒子
  100. let left = document.getElementById('left');//上一页
  101. let right = document.getElementById('right');//下一页
  102. //一:自动轮播:开启自动模式 (定时器每隔3s,自动执行下一页代码)
  103. let timeID = setInterval(function ( ) {
  104. nextPage();
  105. },3000);
  106. //2.注册事件
  107. //2.1 鼠标移入box
  108. box.onmouseover = function ( ) {
  109. //3.事件处理 : 显示上一页下一页
  110. arr.style.display = 'block';
  111. //二:自动轮播:鼠标移入box,切换手动模式
  112. clearInterval(timeID);
  113. };
  114. //2.2 鼠标移出box
  115. box.onmouseout = function ( ) {
  116. //3.事件处理:隐藏上一页下一页
  117. arr.style.display = 'none';
  118. //三:自动轮播: 鼠标移出box,切换自动模式
  119. timeID = setInterval(function ( ) {
  120. nextPage();
  121. },3000);
  122. };
  123. let index = 0;//声明变量记录当前显示图片的下标
  124. //2.3 下一页
  125. right.onclick = function ( ) {
  126. //3.事件处理 :
  127. nextPage();
  128. };
  129. function nextPage ( ) {
  130. //3.1 如果是最后一页,(1)修改ul位置为第一张 (2)index = 0
  131. if (index == ul.children.length -1){
  132. ul.style.left = '0px';
  133. index = 0;//修改index从0开始无限滚动
  134. };
  135. //3.2 下一页
  136. index++;//下一页
  137. //3.3 开始滚动
  138. animationMove(ul, - index*screen.offsetWidth);
  139. console.log ( index );
  140. }
  141. //2.4 上一页
  142. left.onclick = function ( ) {
  143. //3.事件处理 :
  144. //3.1 如果是第一页,(1)修改ul位置为最后一张 (2)index = 最后一张下标
  145. if (index == 0){
  146. ul.style.left = -(ul.children.length-1)*screen.offsetWidth + 'px';
  147. index = ul.children.length-1;
  148. };
  149. //3.2 上一页
  150. index--;//上一页
  151. //3.3 开始滚动
  152. animationMove(ul, -index*screen.offsetWidth );
  153. };
  154. </script>
  155. </html>

04-课后练习

1.1-协议按钮

day05 - 图5

1.2-图片轮换

day05 - 图6