博客列表 >第七章 JavaScript动画

第七章 JavaScript动画

刘静的博客
刘静的博客原创
2020年08月25日 11:39:13647浏览

第七章 JavaScript动画

简单运动

如何让物体运动起来

css代码如下:

  1. <style type="text/css">
  2. *{
  3. padding: 0;
  4. margin: 0;
  5. }
  6. button{
  7. width: 80px;
  8. height: 40px;
  9. }
  10. #box{
  11. width: 200px;
  12. height: 200px;
  13. background-color: pink;
  14. position: absolute;
  15. top: 50px;
  16. }
  17. </style>

html代码:

  1. <button id="btn">动画</button>
  2. <div id="box"></div>

javascript代码:

  1. <script type="text/javascript">
  2. // 简单的动画存在的问题: 1.处理边界 2.定时器的管理
  3. // 1.获取事件源
  4. var btn = document.getElementById('btn');
  5. var box = document.getElementById('box');
  6. var timer = null;
  7. // 2.给按钮绑定事件
  8. btn.onclick = function (){
  9. // 先关闭定时器 再开启定时器 防止定时器累加 导致物体加快
  10. clearInterval(timer);
  11. // 3.让物体运动起来(定时器) 如果没有边界,速度会越来越快
  12. timer = setInterval(function (){
  13. if(box.offsetLeft === 500){
  14. clearInterval(timer);
  15. }else{
  16. box.style.left = box.offsetLeft + 10 + 'px';
  17. }
  18. },30);
  19. }
  20. </script>

侧边栏动画效果

css代码如下:

  1. <style type="text/css">
  2. *{margin:0px;padding:0px;}
  3. #box{width:200px;height:200px;background-color:red;position:relative;margin-top:20px;left:-200px;}
  4. span{width: 40px;height: 60px;background-color: pink;color:#fff;position:absolute;right:-40px;top:50%;margin-top:-30px;text-align:center;line- height:60px;border-top-right-radius:10px;border-bottom-right-radius:10px;}
  5. </style>

html代码:

  1. <div id="box">
  2. <span>拉开</span>
  3. </div>

javascript代码:

  1. <script type="text/javascript">
  2. window.onload = function(){
  3. var box = document.getElementById('box');
  4. var sp = document.getElementsByTagName('span');
  5. box.onmouseover = function(){
  6. this.style.left = 0 + 'px';
  7. }
  8. box.onmouseout = function (){
  9. this.style.left = -box.offsetWidth + 'px';
  10. // this.style.left = -200 + 'px';
  11. }
  12. }
  13. </script>

[^注意:如果offsetWidth的对象有padding或者border值那么获取的obj.offsetWidth与定义的width不一致]:

侧边栏动画效果(匀速运动)

css代码如下:

  1. <style type="text/css">
  2. *{
  3. padding: 0;
  4. margin: 0;
  5. }
  6. #box{
  7. width: 200px;
  8. height: 200px;
  9. background-color: red;
  10. position: relative;
  11. left: -200px;
  12. }
  13. #box span{
  14. position: absolute;
  15. width: 40px;
  16. height: 60px;
  17. color: #fff;
  18. background-color: #000000;
  19. right: -40px;
  20. top: 50%;
  21. margin-top: -30px;
  22. line-height: 60px;
  23. text-align: center;
  24. }
  25. </style>

html代码如下:

  1. <div id="box">
  2. <span>拉开</span>
  3. </div>

javascript代码如下:

  1. <script type="text/javascript">
  2. window.onload = function (){
  3. var box = document.getElementById('box');
  4. var timer = null;
  5. box.onmouseover = function(){
  6. //先关闭定时器
  7. clearInterval(timer);
  8. timer = setInterval(function(){
  9. if(box.offsetLeft === 0){
  10. clearInterval(timer);
  11. return;
  12. }else{
  13. box.style.left = box.offsetLeft + 5 +'px';
  14. }
  15. },100)
  16. }
  17. box.onmouseout = function(){
  18. clearInterval(timer);
  19. timer = setInterval(function(){
  20. if(box.offsetLeft === -200){
  21. clearInterval(timer);
  22. return;
  23. }else{
  24. box.style.left = box.offsetLeft -5 +'px';
  25. }
  26. })
  27. }
  28. }
  29. </script>

侧边栏封装

javascript代码:

  1. <script type="text/javascript">
  2. window.onload = function (){
  3. var box = document.getElementById('box');
  4. var timer = null,speed = 0;
  5. box.onmouseover = function(){
  6. //先关闭定时器
  7. startAnimation(this,0);
  8. }
  9. box.onmouseout = function(){
  10. startAnimation(this,-200);
  11. }
  12. function startAnimation(obj,end){
  13. clearInterval(timer);
  14. speed = end > obj.offsetLeft ? 5 : -5;
  15. timer = setInterval(function(){
  16. if(obj.offsetLeft === end){
  17. clearInterval(timer);
  18. return;
  19. }else{
  20. obj.style.left = obj.offsetLeft + speed +'px';
  21. }
  22. })
  23. }
  24. }
  25. </script>

缓动运动

javascript代码:

  1. <script type="text/javascript">
  2. //0 —— 200
  3. //缓慢运动公式:加速度 = (结束值 - 起始值)/时间(缓动系数) 加速度是由快到慢
  4. window.onload = function (){
  5. var box = document.getElementById('box');
  6. var timer = null;end = 0;end2 = -200;
  7. box.onmouseover = function(){
  8. clearInterval(timer);
  9. timer = setInterval(function(){
  10. speed = Math.ceil((end - box.offsetLeft)/20);//0.45 数学Math.ceil()向上取整
  11. //处理边界问题
  12. if(box.offsetLeft === end){
  13. clearInterval(timer);
  14. return;
  15. }else{
  16. // console.log(box.offsetLeft,speed);//-9 0.45
  17. box.style.left = box.offsetLeft + speed +'px';//left: -8.55px;
  18. }
  19. },30);
  20. }
  21. box.onmouseout = function(){
  22. clearInterval(timer);
  23. timer = setInterval(function(){
  24. speed = Math.floor((end2 - box.offsetLeft)/20);//0.45 数学Math.ceil()向上取整
  25. //处理边界问题
  26. if(box.offsetLeft === end2){
  27. clearInterval(timer);
  28. return;
  29. }else{
  30. console.log(box.offsetLeft,speed);//-199 -1
  31. box.style.left = box.offsetLeft + speed +'px';//left: -8.55px;
  32. }
  33. },30);
  34. }
  35. }
  36. </script>

缓动运动封装

javascript代码:

  1. <script type="text/javascript">
  2. //缓慢运动公式:加速度 = (结束值 - 起始值)/时间(缓动系数) 加速度是由快到慢
  3. window.onload = function (){
  4. var box = document.getElementById('box');
  5. var timer = null;
  6. box.onmouseover = function(){
  7. slowAnimation(this,0);
  8. }
  9. box.onmouseout = function(){
  10. slowAnimation(this,-200);
  11. }
  12. function slowAnimation(obj,end){
  13. clearInterval(timer);
  14. timer = setInterval(function(){
  15. speed = (end - obj.offsetLeft) / 20;
  16. //如果速度大于0,证明物体往右走,速度小于0,证明物体往左走
  17. speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
  18. //处理边界问题
  19. if(obj.offsetLeft === end){
  20. clearInterval();
  21. return;
  22. }else{
  23. //console.log(obj.offsetLeft,speed)
  24. obj.style.left = obj.offsetLeft + speed + 'px';
  25. }
  26. },30)
  27. }
  28. }
  29. </script>

透明度动画

css代码:

  1. <style type="text/css">
  2. #box{
  3. width:200px;
  4. height:200px;
  5. background-color:pink;
  6. opacity:0.3;//全浏览器支持
  7. filter:alpha(opacity:30);
  8. //支持ie8以下浏览器 filter:alpha(opacity:30)
  9. }
  10. </style>

javascript代码:

  1. <script type="text/javascript">
  2. window.onload = function(){
  3. //1.获取事件源
  4. var box = document.getElementById('box');
  5. //2.监听事件
  6. box.onmouseover = function(){
  7. opacityAnimation(this,100);
  8. }
  9. box.onmouseout = function(){
  10. opacityAnimation(this,30);
  11. }
  12. var timer = null;alpha = 30;speed = 0;
  13. function opacityAnimation(obj,endAlpha){
  14. clearInterval(timer);
  15. timer = setInterval(function(){
  16. //求透明度变化的速度
  17. speed = endAlpha > alpha ? 1 :-1;
  18. //边界处理
  19. if(alpha === endAlpha){
  20. clearInterval(timer);
  21. return;
  22. }
  23. alpha += speed;
  24. obj.style.opacity = alpha/100;
  25. obj.style.filter = `alpha(opacity:${alpha})`;
  26. },30)
  27. }
  28. }
  29. </script>

多物体缓动运动

css代码:

  1. <style type="text/css">
  2. *{
  3. padding:0px;
  4. margin:0px;
  5. }
  6. div{
  7. width:300px;
  8. height:150px;
  9. background-color:#3081BF;
  10. margin:20px 0px;
  11. }
  12. </style>

html代码:

  1. <div></div>
  2. <div></div>
  3. <div></div>

javascript代码

  1. <script type="text/javascript">
  2. window.onload = function(){
  3. var allBoxs = document.getElementsByTagName('div');
  4. for(var i = 0;i<allBoxs.length;i++){
  5. allBoxs[i].onmouseover = function(){
  6. startAnimation(this,600);
  7. }
  8. allBoxs[i].onmouseout = function(){
  9. startAnimation(this,300);
  10. }
  11. }
  12. var timer = null,speed = 0;
  13. function startAnimation(obj,endTarget){
  14. //针对于多物体运动,定时器的返回值要绑定在当前的对象上
  15. clearInterval(obj.timer);
  16. obj.timer = setInterval(function(){
  17. //1.求速度
  18. speed = (endTarget - obj.offsetWidth) / 10;
  19. speed = endTarget > obj.offsetWidth ? Math.ceil(speed) : Math.floor(speed);
  20. //2.设置临界值
  21. if(endTarget === obj.offsetWidth){
  22. clearInterval(obj.timer);
  23. return;
  24. }
  25. //3.运动
  26. obj.style.width = obj.offsetWidth + speed +'px';
  27. },30)
  28. }
  29. }
  30. </script>

[^针对于多物体运动,定时器的返回值要绑定在当前的对象上]:

正确获取元素样式属性

css代码

  1. <style type="text/css">
  2. #box{
  3. width:200px;
  4. height:200px;
  5. background-color:red;
  6. border:1px solid #000;
  7. }
  8. </style>

javascript代码

  1. <script type="text/javascript">
  2. window.onload = function(){
  3. var box = document.getElementById('box');
  4. move(box);
  5. function move(obj){
  6. setInterval(function(){
  7. // alert(obj.offsetWidth); obj.style.width为获取行内宽度
  8. obj.style.width = parseInt(getStyle(obj,'width')) - 1 + 'px';
  9. // console.log(getStyle(obj,'width'));//string类型
  10. },30);
  11. }
  12. //获取元素属性的函数
  13. // @param {object} obj当前元素对象
  14. // @param {object} attr 当前元素对象的属性
  15. function getStyle(obj,attr){
  16. if(obj.currentStyle){
  17. //判断是否在ie浏览器上 ie11
  18. return obj.currentStyle[attr];
  19. }else{
  20. //兼容主流浏览器 ie11也不支持
  21. return getComputedStyle(obj,null)[attr];
  22. }
  23. }
  24. }
  25. </script>

[^obj.currentStyle[attr]:获取ie浏览器上的的样式属性,包括ie11]:

多物体缓动运动完整版

css代码

  1. <style type="text/css">
  2. *{
  3. padding:0px;
  4. margin:0px;
  5. }
  6. div{
  7. width:300px;
  8. height:150px;
  9. background-color:red;
  10. margin:20px 0px;
  11. border:4px solid #000;
  12. }
  13. </style>

html代码

  1. <div></div>
  2. <div></div>
  3. <div></div>

javascript代码

  1. <script type="text/javascript">
  2. window.onload = function(){
  3. var boxs = document.getElementsByTagName('div');
  4. for(var i = 0;i<boxs.length;i++){
  5. boxs[i].onmouseover = function(){
  6. startAnimation(this,600);
  7. }
  8. boxs[i].onmouseout = function(){
  9. startAnimation(this,300);
  10. }
  11. }
  12. var speed = 0,timer = null;
  13. function startAnimation(obj,endTarget){
  14. clearInterval(obj.timer);
  15. obj.timer = setInterval(function(){
  16. //0.获取样式属性
  17. var cur = parseInt(getStyle(obj,'width'));//string
  18. // 1.求速度
  19. speed = (endTarget - cur) / 20;
  20. speed = (endTarget > cur) ? Math.ceil(speed) : Math.floor(speed);
  21. //2.临界处理
  22. if(endTarget === cur){
  23. clearInterval(obj.timer);
  24. return;
  25. }
  26. //3.运动起来
  27. obj.style.width = cur + speed + 'px';
  28. },30)
  29. }
  30. //获取元素属性的函数
  31. // @param {object} obj当前元素对象
  32. // @param {object} attr 当前元素对象的属性
  33. function getStyle(obj,attr){
  34. if(obj.currentStyle){
  35. //判断是否在ie浏览器上 ie11
  36. return obj.currentStyle[attr];
  37. }else{
  38. //兼容主流浏览器 ie11也不支持
  39. return getComputedStyle(obj,null)[attr];
  40. }
  41. }
  42. }
  43. </script>

多值运动

javascript代码

  1. <script type="text/javascript">
  2. window.onload = function(){
  3. var boxs = document.getElementsByTagName('div');
  4. // for(var i = 0;i<boxs.length;i++){
  5. // boxs[i].onmouseover = function(){
  6. // startAnimation(this,600);
  7. // }
  8. // boxs[i].onmouseout = function(){
  9. // startAnimation(this,300);
  10. // }
  11. // }
  12. boxs[0].onmouseover = function(){
  13. startAnimation(this,'width',600);
  14. }
  15. boxs[0].onmouseout = function(){
  16. startAnimation(this,'width',300);
  17. }
  18. boxs[1].onmouseover = function(){
  19. startAnimation(this,'height',300);
  20. }
  21. boxs[1].onmouseout = function(){
  22. startAnimation(this,'height',150);
  23. }
  24. boxs[2].onmouseover = function(){
  25. startAnimation(this,'width',600);
  26. }
  27. boxs[2].onmouseout = function(){
  28. startAnimation(this,'width',300);
  29. }
  30. var speed = 0,timer = null;
  31. function startAnimation(obj,attr,endTarget){
  32. clearInterval(obj.timer);
  33. obj.timer = setInterval(function(){
  34. //0.获取样式属性
  35. var cur = parseInt(getStyle(obj,attr));//string
  36. // 1.求速度
  37. speed = (endTarget - cur) / 20;
  38. speed = (endTarget > cur) ? Math.ceil(speed) : Math.floor(speed);
  39. //2.临界处理
  40. if(endTarget === cur){
  41. clearInterval(obj.timer);
  42. return;
  43. }
  44. //3.运动起来
  45. //obj.style.width = cur + speed + 'px';
  46. obj.style[attr] = cur + speed + 'px';
  47. },30)
  48. }
  49. //获取元素属性的函数
  50. // @param {object} obj当前元素对象
  51. // @param {object} attr 当前元素对象的属性
  52. function getStyle(obj,attr){
  53. if(obj.currentStyle){
  54. //判断是否在ie浏览器上 ie11
  55. return obj.currentStyle[attr];
  56. }else{
  57. //兼容主流浏览器 ie11也不支持
  58. return getComputedStyle(obj,null)[attr];
  59. }
  60. }
  61. }
  62. </script>

多值运动-处理透明度

css代码如下

  1. <style type="text/css">
  2. *{
  3. padding:0px;
  4. margin:0px;
  5. }
  6. div{
  7. width:300px;
  8. height:150px;
  9. background-color:pink;
  10. margin:20px 0px;
  11. border:4px solid #000;
  12. opacity:0.3;
  13. filter:alpha(opacity:30);
  14. }
  15. </style>

javascript代码如下

  1. <script type="text/javascript">
  2. window.onload = function(){
  3. var boxs = document.getElementsByTagName('div');
  4. boxs[0].onmouseover = function(){
  5. startAnimation(this,'opacity',100);
  6. }
  7. boxs[0].onmouseout = function(){
  8. startAnimation(this,'opacity',30);
  9. }
  10. boxs[1].onmouseover = function(){
  11. startAnimation(this,'height',300);
  12. }
  13. boxs[1].onmouseout = function(){
  14. startAnimation(this,'height',150);
  15. }
  16. boxs[2].onmouseover = function(){
  17. startAnimation(this,'width',600);
  18. }
  19. boxs[2].onmouseout = function(){
  20. startAnimation(this,'width',300);
  21. }
  22. var speed = 0,timer = null;
  23. // alert(Math.round(0.07*100));//四舍五入一下
  24. function startAnimation(obj,attr,endTarget){
  25. clearInterval(obj.timer);
  26. obj.timer = setInterval(function(){
  27. var cur = 0;
  28. //透明度变化处理
  29. //0.获取样式属性
  30. if(attr === 'opacity'){
  31. cur = Math.round(parseFloat(getStyle(obj,attr))*100);//正常的四色五入
  32. }else{
  33. cur = parseInt(getStyle(obj,attr));
  34. }
  35. // console.log(typeof getStyle(obj,attr));//string
  36. // 1.求速度
  37. speed = (endTarget - cur) / 20;
  38. speed = (endTarget > cur) ? Math.ceil(speed) : Math.floor(speed);
  39. //2.临界处理
  40. if(endTarget === cur){
  41. clearInterval(obj.timer);
  42. return;
  43. }
  44. //3.运动起来
  45. //obj.style.width = cur + speed + 'px';
  46. if(attr === 'opacity'){
  47. obj.style[attr] = `alpha(opacity:${cur+speed})`;
  48. obj.style[attr] = (cur + speed)/100;
  49. }else{
  50. obj.style[attr] = cur + speed + 'px';
  51. }
  52. },30)
  53. }
  54. //获取元素属性的函数
  55. // @param {object} obj当前元素对象
  56. // @param {object} attr 当前元素对象的属性
  57. function getStyle(obj,attr){
  58. if(obj.currentStyle){
  59. //判断是否在ie浏览器上 ie11
  60. return obj.currentStyle[attr];
  61. }else{
  62. //兼容主流浏览器 ie11也不支持
  63. return getComputedStyle(obj,null)[attr];
  64. }
  65. }
  66. }
  67. </script>

链式运动

javascript代码

  1. <script type="text/javascript">
  2. window.onload = function(){
  3. var box = document.getElementById('box');
  4. box.onmouseover = function(){
  5. startAnimation(box,'width',500,function(){
  6. startAnimation(box,'height',400);
  7. });
  8. }
  9. box.onmouseout = function(){
  10. startAnimation(this,'width',300,function(){
  11. startAnimation(box,'height',150);
  12. });
  13. }
  14. }
  15. </script>

myAnimation3.js代码

  1. var speed = 0,timer = null;
  2. // 动画函数
  3. // @param {object} obj 当前的对象
  4. // @param {object} attr 当前元素对象的属性
  5. // @param {object} endTarget 末尾位置
  6. // alert(Math.round(0.07*100));//四舍五入一下
  7. function startAnimation(obj,attr,endTarget,fn){
  8. //针对于多物体的运动,定时器的返回值要绑定到当前的对象中
  9. clearInterval(obj.timer);
  10. obj.timer = setInterval(function(){
  11. var cur = 0;
  12. //透明度变化处理
  13. //0.获取样式属性
  14. if(attr === 'opacity'){
  15. cur = Math.round(parseFloat(getStyle(obj,attr))*100);
  16. }else{
  17. cur = parseInt(getStyle(obj,attr));
  18. }
  19. // 1.求速度
  20. speed = (endTarget - cur) / 20;
  21. speed = (endTarget > cur) ? Math.ceil(speed) : Math.floor(speed);
  22. //2.临界处理
  23. if(endTarget === cur){
  24. clearInterval(obj.timer);
  25. if(fn){
  26. fn();
  27. }
  28. return;
  29. }
  30. //3.运动起来
  31. //obj.style.width = cur + speed + 'px';
  32. if(attr === 'opacity'){
  33. obj.style[attr] = `alpha(opacity:${cur+speed})`;
  34. obj.style[attr] = (cur + speed)/100;
  35. }else{
  36. obj.style[attr] = cur + speed + 'px';
  37. }
  38. },30)
  39. }
  40. //获取元素属性的函数
  41. // @param {object} obj当前元素对象
  42. // @param {object} attr 当前元素对象的属性
  43. function getStyle(obj,attr){
  44. if(obj.currentStyle){
  45. //判断是否在ie浏览器上 ie11
  46. return obj.currentStyle[attr];
  47. }else{
  48. //兼容主流浏览器 ie11也不支持
  49. return getComputedStyle(obj,null)[attr];
  50. }
  51. }

同时运动

javascript代码

  1. <script type="text/javascript">
  2. window.onload = function(){
  3. var box = document.getElementById('box');
  4. // json文件里面没有函数
  5. box.onmouseover = function(){
  6. startAnimation(box,{"width":500,"opacity":30});
  7. }
  8. }
  9. </script>

myAnimation4.js代码

  1. var speed = 0,timer = null;
  2. // 动画函数
  3. // @param {object} obj 当前的对象
  4. // @param {object} attr 当前元素对象的属性
  5. // @param {object} endTarget 末尾位置
  6. // alert(Math.round(0.07*100));//四舍五入一下
  7. function startAnimation(obj,json,fn){
  8. //针对于多物体的运动,定时器的返回值要绑定到当前的对象中
  9. clearInterval(obj.timer);
  10. obj.timer = setInterval(function(){
  11. var cur = 0;
  12. var flag = true;//标杆 如果为true,证明所有属性都达到终点值
  13. for(var attr in json){
  14. switch(attr){
  15. case 'opacity':
  16. cur = Math.round(parseFloat(getStyle(obj,attr))*100);
  17. break;
  18. case 'scrollTop':
  19. cur = obj[attr];//cur = obj.scrollTop
  20. break;
  21. default:
  22. cur = parseInt(getStyle(obj,attr));
  23. break;
  24. }
  25. // 1.求速度
  26. speed = (json[attr] - cur) / 20;
  27. speed = (json[attr] > cur) ? Math.ceil(speed) : Math.floor(speed);
  28. //2.临界处理
  29. if(json[attr] !== cur){
  30. flag = false;
  31. }
  32. //3.运动起来
  33. switch(attr){
  34. case 'opacity':
  35. obj.style[attr] = `alpha(opacity:${cur+speed})`;
  36. obj.style[attr] = (cur + speed)/100;
  37. break;
  38. case 'scrollTop':
  39. obj.scrollTop = cur + speed;
  40. break;
  41. default:
  42. obj.style[attr] = cur + speed + 'px';
  43. break;
  44. }
  45. if(flag){
  46. clearInterval(obj.timer);
  47. if(fn){
  48. fn();
  49. }
  50. return;
  51. }
  52. }
  53. },30)
  54. }
  55. //获取元素属性的函数
  56. // @param {object} obj当前元素对象
  57. // @param {object} attr 当前元素对象的属性
  58. function getStyle(obj,attr){
  59. if(obj.currentStyle){
  60. //判断是否在ie浏览器上 ie11
  61. return obj.currentStyle[attr];
  62. }else{
  63. //兼容主流浏览器 ie11也不支持
  64. return getComputedStyle(obj,null)[attr];
  65. }
  66. }

完美动画框架

javascript代码

  1. <script type="text/javascript">
  2. window.onload = function(){
  3. var box = document.getElementById('box');
  4. // json文件里面没有函数
  5. box.onmouseover = function(){
  6. startAnimation(box,{"width":500,"opacity":30});
  7. }
  8. box.onmouseout = function(){
  9. startAnimation(box,{"width":200,"opacity":100});
  10. }
  11. }
  12. </script>

联动效果

css代码(380*380)

  1. <style type="text/css">
  2. *{padding:0px;margin:0px;}
  3. #ad{position:fixed;float:left;right:0px;bottom:0px;}
  4. #close{position:absolute;right:0px;top:0px;width:25px;height:25px;z-index:10;}
  5. </style>

html代码

  1. <div id="ad">
  2. <img src="images/ad.png" width="300">
  3. <span id="close"></span>
  4. </div>

javascript代码(myAnimation4.js)

  1. <script type="text/javascript">
  2. var ad = document.getElementById('ad');
  3. var close = document.getElementById('close');
  4. close.onclick = function(){
  5. startAnimation(ad,{"height":260},function(){
  6. startAnimation(ad,{"width":0},function(){
  7. ad.style.display = 'none';
  8. })
  9. })
  10. }
  11. </script>

侧边栏横幅效果

css代码

  1. <style type="text/css">
  2. *{padding:0px;margin:0px;}
  3. #aside{position:absolute;top:200px;left:0px;width:300px;}
  4. #aside img{width:100%;}
  5. </style>

html代码

  1. <body style="height:5000px;">
  2. <div id="aside">
  3. <img src="images/aside.png">
  4. </div>
  5. </body>

javascript代码()

  1. <script type="text/javascript">
  2. window.onload = function(){
  3. //1.获取标签
  4. var aside = document.getElementById('aside');
  5. var aside_top = aside.offsetTop;
  6. window.onscroll = function(){
  7. //3.获取页面滚动的高度
  8. var docScrollTop = document.documentElement.scrollTop || document.body.scrollTop;
  9. startAnimation(aside,{"top":docScrollTop + aside_top});
  10. }
  11. }
  12. </script>

[^document.documentElement.scrollTop:chrome浏览器,火狐浏览器可以,sarfi不行]:
[^document.body.scrollTop:chrome浏览器不行,火狐浏览器可以,sarfi可以]:

滚动监听特效结构和样式实现

css代码

  1. <style type="text/css">
  2. *{margin:0px;padding:0px;}
  3. ul{list-style:none;}
  4. a{text-decoration:none;}
  5. html,body{width:100%;height:100%;}
  6. .container{width:1190px;height:100%;margin:0px auto;}
  7. .container div{width:100%;height:100%;text-align:center;color:#fff;font-size:30px;}
  8. .aside{position:fixed;width:40px;right:20px;top:300px;font-size:16px;font-weight:700;text-align:center;}
  9. .aside li{height:50px;border-bottom:1px solid #ddd;}
  10. .aside li a{color:peru;}
  11. .aside li.current{background-color:coral;}
  12. .aside li.current a {color: #fff;}
  13. </style>

html代码:

  1. <body style="height:5000px;">
  2. <div class="container" id="box">
  3. <div class="current">爱逛好货</div>
  4. <div>好点主播</div>
  5. <div>品质特色</div>
  6. <div>猜你喜欢</div>
  7. </div>
  8. <ul class="aside" id="aside">
  9. <li class="current">
  10. <a href="javascript:void(0);">爱逛好货</a>
  11. </li>
  12. <li>
  13. <a href="javascript:void(0);">好点主播</a>
  14. </li>
  15. <li>
  16. <a href="javascript:void(0);">品质特色</a>
  17. </li>
  18. <li>
  19. <a href="javascript:void(0);">猜你喜欢</a>
  20. </li>
  21. </ul>
  22. </body>

javascript代码(myAnimation4.js)

  1. <script type="text/javascript">
  2. //1.获取事件源
  3. window.onload = function(){
  4. //1.获取标签
  5. var box = document.getElementById('box');
  6. var allBoxs = box.children;
  7. var aside = document.getElementById('aside');
  8. var lis = aside.children;
  9. var isClick = false;//默认没有滚动
  10. //2.上色
  11. var colors = ['red','pink','purple','blue'];
  12. for(var i=0;i<allBoxs.length;i++){
  13. allBoxs[i].style.backgroundColor = colors[i];
  14. }
  15. //3.监听侧边栏按钮的点击
  16. for(var j=0;j<lis.length;j++){
  17. lis[j].index = j;
  18. lis[j].onclick = function(){
  19. isClick = true;
  20. for(var k = 0;k < lis.length;k++){
  21. lis[k].className = '';
  22. }
  23. //设置当前的类
  24. this.className = 'current';
  25. //页面动画起来
  26. startAnimation(document.documentElement,{
  27. "scrollTop" : this.index * (document.body.clientHeight)
  28. },function(){
  29. isClick = false;
  30. })
  31. // document.documentElement.scrollTop = this.index*(document.body.clientHeight);
  32. }
  33. }
  34. //4.监听滚动
  35. window.onscroll = function(){
  36. if(!isClick){
  37. //4.1获取页面滚动的高度
  38. var docScrollTop = document.documentElement.scrollTop+20 || document.body.scrollTop+20;
  39. for(var i=0;i<lis.length;i++){
  40. if(docScrollTop > allBoxs[i].offsetTop){
  41. for(var j =0;j<allBoxs.length;j++){
  42. lis[j].className = '';
  43. }
  44. lis[i].className = 'current';
  45. }
  46. }
  47. }
  48. }
  49. }
  50. </script>

轮播图特效

css代码

  1. *{
  2. padding:0px;
  3. margin:0px;
  4. }
  5. .slider{
  6. width:400px;
  7. height:500px;
  8. margin:100px auto;
  9. position:relative;
  10. overflow: hidden;
  11. }
  12. .slider .slider_scroll{
  13. position:relative;
  14. width:400px;
  15. height:500px;
  16. }
  17. .slider_main{
  18. position:relative;
  19. width:400px;
  20. height:500px;
  21. }
  22. .slider_main .item{
  23. width:400px;
  24. height:500px;
  25. position:absolute;
  26. }
  27. .slider_main .item img{
  28. width:400px;
  29. height:500px;
  30. }
  31. .slider_index{
  32. width:400px;
  33. height:40px;
  34. text-align:center;
  35. color:#fff;
  36. font-weight:700;
  37. z-index:20;
  38. position:absolute;
  39. bottom:0;
  40. background-color:rgb(0,0,0,0.5);
  41. cursor:pointer;
  42. }
  43. .slider_index .slider_index_icon{
  44. display: inline-block;
  45. line-height: 40px;
  46. margin: 0 10px;
  47. }
  48. .slider_index .slider_index_icon.current{
  49. color: red;
  50. }
  51. .slider_scroll span{
  52. position: absolute;
  53. width:30px;
  54. height:68px;
  55. background:url(../images/icon-slides.png) no-repeat;
  56. top:50%;
  57. margin-top:-34px;
  58. cursor:pointer;
  59. z-index:30;
  60. }
  61. .slider_scroll span.next{
  62. right: 0;
  63. background-position: -46px 0;
  64. }
  65. .slider_scroll span.prev{
  66. left: 0;
  67. background-position: 0 0;
  68. }

html代码

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>p_20 轮播图特效</title>
  6. <link rel="stylesheet" href="css/index.css" type="text/css">
  7. </head>
  8. <body>
  9. <div id="slider" class="slider">
  10. <div class="slider_scroll" id="slider_scroll">
  11. <div class="slider_main" id="slider_main">
  12. <div class="item">
  13. <a href="#">
  14. <img src="images/img1.png">
  15. </a>
  16. </div>
  17. <div class="item">
  18. <a href="#">
  19. <img src="images/img2.png">
  20. </a>
  21. </div>
  22. <div class="item">
  23. <a href="#">
  24. <img src="images/img3.png">
  25. </a>
  26. </div>
  27. <div class="item">
  28. <a href="#">
  29. <img src="images/img4.png">
  30. </a>
  31. </div>
  32. </div>
  33. <span class="next" id="next"></span>
  34. <span class="prev" id="prev"></span>
  35. </div>
  36. <div class="slider_index" id="slider_index">
  37. <!-- 通过js脚本动态生成 -->
  38. </div>
  39. </div>
  40. <script src="../js/myAnimation4.js" type="text/javascript" charset="utf-8"></script>
  41. <script src="js/index.js" type="text/javascript" charset="utf-8"></script>
  42. </body>
  43. </html>

index.js代码

  1. window.onload = function(){
  2. //1.获取标签
  3. var slider = document.getElementById('slider');
  4. var slider_main = document.getElementById('slider_main');
  5. var allBoxs = slider_main.children;
  6. var next = document.getElementById('next');
  7. var prev = document.getElementById('prev');
  8. var slider_index = document.getElementById('slider_index');
  9. var iNow = 0;//当前可视元素的索引
  10. var timer =null;
  11. //2.动态创建索引器
  12. for(var i=0;i < allBoxs.length;i++){
  13. var span = document.createElement('span');
  14. if(i === 0){
  15. span.className = 'slider_index_icon current';
  16. }else{
  17. span.className = 'slider_index_icon';
  18. }
  19. span.innerText = i + 1;
  20. slider_index.appendChild(span);
  21. }
  22. //3.让滚动的元素归位
  23. var scroll_w = parseInt(getStyle(slider,'width'));
  24. // console.log(scroll_w);
  25. for(var j=1;j < allBoxs.length;j++){
  26. allBoxs[j].style.left = scroll_w +'px';
  27. }
  28. //4.监听下一张按钮的事件
  29. next.onclick = function(){
  30. // 1.让当前可视元素动画左移
  31. // 2.让下一张图片快速的显示到右边
  32. // 3.让这个元素动画进入
  33. startAnimation(allBoxs[iNow],{
  34. "left":-scroll_w
  35. })
  36. //让iNow更新
  37. iNow ++;
  38. if(iNow >= allBoxs.length){
  39. iNow = 0;
  40. }
  41. allBoxs[iNow].style.left = scroll_w +'px';
  42. startAnimation(allBoxs[iNow],{
  43. "left":0
  44. })
  45. //改变索引
  46. changeIndex();
  47. }
  48. //5.监听上一张按钮的事件
  49. prev.onclick = function(){
  50. // 1.让当前元素快速右移
  51. // 2.让上一个元素快速到左边
  52. // 3.让这个元素动画进入
  53. startAnimation(allBoxs[iNow],{
  54. "left":scroll_w
  55. })
  56. iNow--;
  57. if(iNow < 0){
  58. iNow =allBoxs.length-1;
  59. }
  60. allBoxs[iNow].style.left = -scroll_w + 'px';
  61. startAnimation(allBoxs[iNow],{
  62. "left":0
  63. })
  64. //改变索引器
  65. changeIndex();
  66. }
  67. var slider_index_icons = slider_index.children;
  68. //6.遍历索引器,添加监听事件
  69. for(var i=0;i<slider_index_icons.length;i++){
  70. slider_index_icons[i].onmousedown = function(){
  71. //6.1获取当前点击的索引
  72. var index = parseInt(this.innerText) - 1;
  73. //点击的索引与当前的索引iNow并与之对比
  74. if(index > iNow){
  75. //下一个操作
  76. startAnimation(allBoxs[iNow],{
  77. 'left':-scroll_w
  78. })
  79. allBoxs[index].style.left = scroll_w + 'px';
  80. }else if(index < iNow){
  81. //上一个操作
  82. startAnimation(allBoxs[iNow],{
  83. 'left':scroll_w
  84. })
  85. allBoxs[index].style.left = -scroll_w + 'px';
  86. }
  87. iNow = index;
  88. startAnimation(allBoxs[iNow],{
  89. "left":0
  90. })
  91. changeIndex();
  92. }
  93. }
  94. //7自动轮播图
  95. timer = setInterval(autoPlay,1000);
  96. slider.onmouseover = function(){
  97. clearInterval(timer);
  98. }
  99. slider.onmouseout = function(){
  100. timer = setInterval(autoPlay,1000);
  101. }
  102. function autoPlay(){
  103. // 1.让当前可视元素动画左移
  104. // 2.让下一张图片快速的显示到右边
  105. // 3.让这个元素动画进入
  106. startAnimation(allBoxs[iNow],{
  107. "left":-scroll_w
  108. })
  109. //让iNow更新
  110. iNow ++;
  111. if(iNow >= allBoxs.length){
  112. iNow = 0;
  113. }
  114. allBoxs[iNow].style.left = scroll_w +'px';
  115. startAnimation(allBoxs[iNow],{
  116. "left":0
  117. })
  118. //改变索引
  119. changeIndex();
  120. }
  121. //控制当前的索引
  122. function changeIndex(){
  123. for(var i=0;i<slider_index_icons.length;i++){
  124. slider_index_icons[i].className = 'slider_index_icon';
  125. }
  126. slider_index_icons[iNow].className = 'slider_index_icon current';
  127. }
  128. }
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议