08第二种定时器_封装动画函数_轮播图_offset系列

前面复习:

下面会说第二种定时器。

第二种定时器:

第一种的定时器回顾:

另一个定时器 setTimeout() 它是一个一次性的定时器:

因为,代码是从上往下执行的,btn 还没有生成,所以getElementById("btn").onclick = 肯定是会报错的。

它是一次性的定时器,如果没有取消的话,它会一直占着空间,所以一般都要写按钮btn 去取消timeId  .

 1 <!DOCTYPE>
 2 <html lang="en">
 3     <head>
 4         <meta charset="UTF-8">
 5         <title>这是网页标题</title>
 6     </head>
 7     <body>
 8         <input type="button" value="停止" id="btn">
 9
10         <script src="js/common.js"></script>
11         <script>
12             //注册定时器(一次性的)
13             var timeId = window.setTimeout(function () {
14                 console.log("hehhehe");
15             },5000); //5s 之后调用
16
17             //注册点击事件 (点击之后取消定时器)
18             getId$("btn").onclick = function () {
19                 window.clearTimeout(timeId);
20             };
21         </script>
22     </body>
23 </html>

一次性的定时器

注:定时器一般还是使用第一种定时器。一次性的定时器用的比较少。

定时器(第一种)案例:协议按钮禁用:

 1 <!DOCTYPE>
 2 <html lang="en">
 3     <head>
 4         <meta charset="UTF-8">
 5         <title>这是网页标题</title>
 6     </head>
 7     <body>
 8         <textarea name="texta" id="" cols="30" rows="10">必须看完,fasdf进度款sea大姐夫会计法大水坑借方考虑将大家开始的加法,发的空间风口浪尖反倒是咖啡加快。你必须同意才可以注册。
 9
10         </textarea>
11         <input type="button" value="请仔细阅读协议(5)" id="btn" disabled >
12
13         <script src="js/common.js"></script>
14         <script>
15             //注册定时器
16             var sec =5;
17             var timeId = window.setInterval(function () {
18                 sec--;
19                 if(sec<0){
20                     window.clearInterval(timeId);  //当sec <0 时,就取消定时器。
21                     getId$("btn").value="同意";
22                     getId$("btn").disabled=false;
23                 }else{
24                     getId$("btn").value="请仔细阅读协议("+sec+")";
25                 }
26             },1000);
27
28         </script>
29     </body>
30 </html>

 1 <!DOCTYPE>
 2 <html lang="en">
 3     <head>
 4         <meta charset="UTF-8">
 5         <title>这是网页标题</title>
 6     </head>
 7     <body>
 8         <textarea name="texta" id="" cols="30" rows="10">必须看完,fasdf进度款sea大姐夫会计法大水坑借方考虑将大家开始的加法,发的空间风口浪尖反倒是咖啡加快。你必须同意才可以注册。
 9
10         </textarea>
11         <input type="button" value="请仔细阅读协议(5)" id="btn" disabled >
12
13         <script src="js/common.js"></script>
14         <script>
15             //注册定时器
16             var sec =5;
17             var timeId = window.setInterval(function () {
18                 sec--;
19                 getId$("btn").value="请仔细阅读协议("+sec+")";
20                 if(sec<0){
21                     window.clearInterval(timeId);  //当sec <0 时,就取消定时器。
22                     getId$("btn").value="同意";
23                     getId$("btn").disabled=false;
24                 }
25             },1000);
26
27         </script>
28     </body>
29 </html>

优化if-else结构之后

定时器  案例:div 的渐变:

透明度的设置是通过 style.opacity 来设置的。

opacity 是不透明的意思。

所以 1 代表不透明   0 代表完全透明。

 1 <!DOCTYPE>
 2 <html lang="en">
 3     <head>
 4         <meta charset="UTF-8">
 5         <title>这是网页标题</title>
 6
 7         <style>
 8             div{
 9                 width: 300px;
10                 height: 300px;
11                 background-color: darkred;
12             }
13         </style>
14
15     </head>
16     <body>
17         <div id="dv"></div>
18         <input type="button" value="开始渐变" id="btn">
19
20
21         <script src="js/common.js"></script>
22         <script>
23             getId$("btn").onclick = function () {
24                 //其实 渐变是假的, 它真实改变的是透明度
25                 var opacity =10;
26                 var timeId = window.setInterval(function () {
27                     opacity --;
28                     getId$("dv").style.opacity = opacity/10;  //不透明度  (之所以用10是因为整数比小数更精确。)
29
30                     if(opacity <=0){
31                         window.clearInterval(timeId);
32                     }
33                 },1000); //1 s变一次
34             };
35         </script>
36     </body>
37 </html>

view code

定时器  案例:点击按钮设置 div 的宽度:

 1 <!DOCTYPE>
 2 <html lang="en">
 3     <head>
 4         <meta charset="UTF-8">
 5         <title>这是网页标题</title>
 6
 7         <style>
 8             *{
 9                 margin:0;
10                 padding:0;
11             }
12             div{
13                 width: 200px;
14                 height: 100px;
15                 background-color: darkred;
16                 border-radius: 50px;
17             }
18         </style>
19     </head>
20     <body>
21         <div id="dv"></div>
22         <input type="button" value="变宽" id="btn">
23         <script src="js/common.js"></script>
24         <script>
25             getId$("btn").onclick = function () {
26                 var width = 200;
27
28                 var timeId = window.setInterval(function () {
29                     width +=10;
30                     getId$("dv").style.width = width;
31                     if(width>=800){
32                         window.clearInterval(timeId);  //如果大于 等于800 就取消定时器
33                     }
34                 },200);  //0.2s 变宽一次
35             };
36         </script>
37     </body>
38 </html>

定时器  案例:点击按钮移动元素:

这里需要注意的是:对于style中的设置,如果再上面的style中写设置,Js无法直接通过属性名获取到。

但是如果是使用style属性设置的,可以通过js获取。

也不是没办法获取,只是不能直接获取,获取方法如下:

offset+首字母大写的属性名 进行获取。例如(offsetLeft)但是就不用再用style了,即getId("dv").offsetLeft;  而不是getId("dv").style.offsetLeft;

 1 <!DOCTYPE>
 2 <html lang="en">
 3     <head>
 4         <meta charset="UTF-8">
 5         <title>这是网页标题</title>
 6
 7         <style>
 8             *{
 9                 margin:0;
10                 padding:0;
11             }
12             input{
13                 margin-top: 20px;
14             }
15             div{
16                 width:100px;
17                 height: 50px;
18                 background-color: green;
19                 margin-top: 30px;
20             /*    div要移动,所以要脱离文档流*/
21                 position: absolute;
22                 left: 50px;
23             }
24
25         </style>
26     </head>
27     <body>
28         <input type="button" value="移动到400" id="btn1">
29         <input type="button" value="移动到800" id="btn2">
30         <div id="dv"></div>
31
32
33         <script src="js/common.js"></script>
34         <script>
35             // 点击第一个按钮 移动到400px
36             getId$("btn1").onclick = function(){
37                 var timeId = setInterval(function () {
38                     //获取div 的当前位置
39                     var current = getId$("dv").offsetLeft; //数字类型   没有 px
40                     //速度  每次移动多少px
41                     var step = 10;
42                     current += step;
43                     //将每次移动后的位置 设置上去
44                     getId$("dv").style.left = current +"px";
45                     if(current == 400){
46                         window.clearInterval(timeId);
47                     }
48                 },20); //0.02s
49             };
50             // 点击第二个按钮 移动到800px
51
52
53
54
55         </script>
56     </body>
57 </html>

移动到400px

它是有问题的,每点击一次按钮就会创建一个定时器,所以如果点击多次按钮就会创建多个定时器,div移动的速度也就越来越快了。

我们现在要做的是无论点击多少次按钮,只开启一个定时器。

 1 <!DOCTYPE>
 2 <html lang="en">
 3     <head>
 4         <meta charset="UTF-8">
 5         <title>这是网页标题</title>
 6
 7         <style>
 8             *{
 9                 margin:0;
10                 padding:0;
11             }
12             input{
13                 margin-top: 20px;
14             }
15             div{
16                 width:100px;
17                 height: 50px;
18                 background-color: green;
19                 margin-top: 30px;
20             /*    div要移动,所以要脱离文档流*/
21                 position: absolute;
22                 left: 50px;
23             }
24
25         </style>
26     </head>
27     <body>
28         <input type="button" value="移动到400" id="btn1">
29         <input type="button" value="移动到800" id="btn2">
30         <div id="dv"></div>
31
32
33         <script src="js/common.js"></script>
34         <script>
35             // 点击第一个按钮 移动到400px
36             getId$("btn1").onclick = function(){
37                 var timeId = setInterval(function () {
38                     //获取div 的当前位置
39                     var current = getId$("dv").offsetLeft; //数字类型   没有 px
40                     //速度  每次移动多少px
41                     var step = 10;
42                     current = current<400?current+step:current-step;
43                     //将每次移动后的位置 设置上去
44                     getId$("dv").style.left = current +"px";
45                     if(current == 400){
46                         window.clearInterval(timeId);
47                     }
48                 },20); //0.02s
49             };
50             // 点击第二个按钮 移动到800px
51             getId$("btn2").onclick = function(){
52                 var timeId = setInterval(function () {
53                     //获取div 的当前位置
54                     var current = getId$("dv").offsetLeft; //数字类型   没有 px
55                     //速度  每次移动多少px
56                     var step = 10;
57                     current += step;
58                     //将每次移动后的位置 设置上去
59                     getId$("dv").style.left = current +"px";
60                     if(current == 800){
61                         window.clearInterval(timeId);
62                     }
63                 },20); //0.02s
64             };
65         </script>
66     </body>
67 </html>

上面代码有很多bug ,下面解决。

封装动画函数:

轮播图

offset系列

原文地址:https://www.cnblogs.com/zach0812/p/11749284.html

时间: 2024-10-08 06:45:37

08第二种定时器_封装动画函数_轮播图_offset系列的相关文章

Jquery基础(动画效果的轮播图特效)

jquery文档准备的三种写法: $(document).ready(function() { }); $().ready(function() { }); $(function() { }); jquery选择器 基本选择器 $('*') / $('.div') / $('div') / $('#first') / 多项选择器 $('#first, div, .second') 层级选择器 $('aside summary') //aside的子元素summary $('aside > det

通过轮播图例子复习封装动画函数和定时器

概述:使用js实现自动播放.无缝连接的轮播图 图片轮播的实质是改变图片相对于父对象的左边距的值,利用offsetLeft获取,利用style.left修改 封装动画函数如下: function animate(element,target) { clearInterval(element.timeId); element.timeId=setInterval(function(){ var current=element.offsetLeft; var step=10; step=target>

js-BOM之offset家族、移动函数的封装升级(轮播图)

Obj.style.width/obj.style.height与obj.offsetWidth/obj.offsetHeight的区别: <style> #div1{ height: 200px; background-color: red; } #div2{ width: 200px; height: 200px; background-color: green; } </style> </head> <body> <div style="

c/c++_渐变动画制作_合成视频

1.渐变动画制作原理: 两幅图像加权相加,img = a*img1 + (1-a)img2,效果从img1变到img2,取值从1到0,取值间隔可以随意,间隔越小,视觉上越自然. 2.代码 (c/c++_渐变动画制作_合成视频) opencv版本是:3.4.5 #include <opencv2/opencv.hpp>#include <opencv2/opencv.hpp> using namespace cv; void gradient(cv::Mat& im1_src

原生JS面向对象思想封装轮播图组件

原生JS面向对象思想封装轮播图组件 在前端页面开发过程中,页面中的轮播图特效很常见,因此我就想封装一个自己的原生JS的轮播图组件.有了这个需求就开始着手准备了,代码当然是以简洁为目标,轮播图的各个功能实现都分别分为不同的模块.目前我封装的这个版本还不适配移动端,只适配PC端. 主要的功能有:自动轮播,点击某一张图片对应的小圆点就跳转到指定图片,有前后切换按钮.使用的时候只需要传入图片的路径以及每张图片分别所对应的跳转路径还有目标盒子ID就可以了,还可以自定义每张图轮播的延时,不过延时参数不是必须

初识 swift 封装轮播图

一.简介 换了一家公司.换了一个环境刚开始来公司自然不能有一丝一毫的放松,每天即使是没有什么工作也是看看这个博客.那个源码.尽量让自己更充实.慢慢的开始写几篇博客记录下自己遇到的一些问题和解决方法.其实也没什么就是瞎写没有什么思路反正就是遇到问题然后解决掉.最后分享出去. 随着工作走向正规公司的项目不是那么赶.也就有时间尝试一些新的东西.只是不想刚开始编程哪会那么激进今天学这个明天学那个了.APPLE 发布 swift 有一年多了.不能说好也不能说不好.总之没有了解过时没有话语权的.所以就想试试

JavaScript动画:offset和匀速动画详解(含轮播图的实现)

本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. offset简介 我们知道,三大家族包括:offset/scroll/client.今天来讲一下offset,以及与其相关的匀速动画. offset的中文是:偏移,补偿,位移. js中有一套方便的获取元素尺寸的办法就是offset家族.offset家族包括: offsetWidth offsetHight offsetLeft offsetTop offsetParen

如何用面向对象的思维去封装一个小型轮播图插件

1.面向对象与面向过程 既然说到面向对象的思维,那就免不了要对面向过程的编程思维与面向对象的思维做一番比较. 笔者有 一段时间天真的认为有一个类,然后new一个对象就是面向对象编程了,现在想想还是太naive了呀. 其实面向对象的编程思维和面向过程的编程思维重要的不是对象和过程,而是思维. 比如说在生活中我们要做一道西红柿炒鸡蛋,很多人的第一反应就是西红柿炒鸡蛋第一步.第二步.第三步应该怎么做,每一步放什么调料.然后在做的过程中找每一步需要的调料.这就是很典型的面向过程的思维方式:怎么做,需要什

BootStrap学习(7)_轮播图

一.轮播图 Bootstrap 轮播(Carousel)插件是一种灵活的响应式的向站点添加滑块的方式.除此之外,内容也是足够灵活的,可以是图像.内嵌框架.视频或者其他您想要放置的任何类型的内容. 如果您想要单独引用该插件的功能,那么您需要引用BootStrap中的 carousel.js. 示例: 1.使用 Bootstrap 轮播(Carousel)插件显示了一个循环播放元素的通用组件.为了实现轮播,您只需要添加带有该标记的代码即可.不需要使用    data 属性,只需要简单的基于 clas