定时器的使用

图1

我们先来体验一下定时器

设置定时器

图2

我们定义个函数show弹窗,然后使用setInterval(show,1000);

这里setInterval第一个参数为执行函数,第二个为执行间隔,单位毫秒,因此我们上图就实现了每1s弹窗一次,函数返回定时器对象

定时器还有一个函数setTimeout,参数和上面一样,但是只执行一次,而且是到时间执行

图3

停止定时器

clearInterval()停止定时器,里面传入定时器参数,例子如下图

图4

我们定义2个函数,一个开启一个关闭,点击开启。就设置定时器启动,点击关闭就设置关闭,为了能把定时器传给关闭的函数clearInterval,我们把timer初始化在外层,然后设置定时器时利用返回值赋值,关闭时就可以实现关闭

当然clearTimeout是停止那个延时定时器


案例,数码时钟

图5

想做一个数码时钟显示为xx:xx:xx时分秒6位数字显示(视频里数字用的是专门的图片),而且根据实际时间允许,这里我们需要了解时间对象

var date=new Date();我们就创建了时间对象,我们可以使用getHours获得小时数,getMinutes获得分钟数,getSeconds获得秒数,

图6

因为我找图片实在是太麻烦,就用文字设置了,这里要注意,由于setInterval,第一下不是马上执行,会导致::时间开始1s不显示,为了出现效果,我们需要单独运行下show(),最终完成效果

这里因为返回的时分秒为数字需要转换成字符串,就用了字符串拼接的方法实现

关于字符串访问字符

有2种写法[下标]和.charAt(下标),前者低版本ie不兼容

图7

上图代码,都能弹出数字3,但是是高版本浏览器

图8

我们之前看了日期有时分秒属性获得,其实还有获得年月日,星期几的方法

图9

这里需要注意的是getDay()返回值0-6,0代表周日,歪果仁从周日开始一周


下面说一个延时的应用,比如我们鼠标移到qq头像,会显示一个信息框,我们移出,过一段可消失,我们可以点击这个信息框,

图10

我们设置2个div框,可以设置onmouseover d2就显示,然后移出的时候d2延时1s消失,即可,如上

如果我们想鼠标到d2不消失呢,还有我们是不是可以合并一些重复的东西,里面涉及到一些js的面向对象的思路

图11

我们d1,d2的移入都是让d2显示,但是d2已经显示了,我们还显示有用么,其实这里还有清除定时器timer的作用,因我们不想1s就关闭,当然移出的时候我们都要考虑调用定时器延时设置d2的属性


例子:无缝滚动

我们经常看到有些网站一些图片拼成一行或一列,像走马灯一样滚动,这就是我们要做的例子

图12

为了实现这个例子,我们先做个div矩形,设置position属性为absolute,即绝对位置,我们同时设置top,left值,就可以设置其在网页中的位置,我们还可以用点击响应其属性offsetLeft,来获得左侧距离,可以看到就是我们设置的200

图13

我们给其加上50的margin页边距,就可以看到提示的是250,即靠左侧的绝对偏移,所以我们使用offsetLeft比较准确,当然我们也有offsetTop,offsetHeight,offsetWidth属性

图14

所以我们设置如上,让定时器修改其属性,就可以实现修改其偏移,实现移动,当使用margin的时候会发现,移动有问题,因为offsetLeft含了额外的偏移,导致不匀速,还有这里我尝试获得style.left和style.margin属性都是string,但是其长度都是0,即意味着是空字符串,所以我曾经想使用切片来设置没有成功

现在我们跟据上面的实现来设置我们的无缝滚动,代码如下

图15

我们这个代码只实现了4张图自己跑,而且会跑出div,而且右侧也没有图片补上,不管怎么样,这是第一步,先来分析一波。

我们给div设置了宽高,当然我们图片都是30*30,所以宽120,高30,我们设置margin:100px auto,可以设置据上方100而且居中显示,位置,我们使用相对位置,背景因为图片透明,这里设置为红色

我们给所有的标签都设置边距margin,padding为0,这样能保证图片是严丝合缝,正好用上120放4张

我们给ul设置绝对位置,同时左上都为0,这是相对容器d1的

我们设置li 向左浮动,即li都在一行,这样我们图片就是水平滚动,list-style:none去掉那个点,长宽设置和图片一样

然后程序里就是简单地设置图片移动了,这里有个需要注意的是,我oul开始尝试用id获取元素,竟然获取不到,只有通过标签名才行,

我们设置30ms是因为大于24帧人眼识别不出来,2像素是凭感觉,我们运行结果如下图,如我们开始说的,我们对齐移动还没做限制,而且,我们的移动后右边没有补图片

图16

下面我们开始完善功能

图17

代码如上,我们想我们为了移动到头能补齐,我们对内部进行操作,把ul的li扩充,但是如果再写一遍太LOW了,我们还记得.innerHTML可获得内部html,我们给其添加自身,即可实现8图长度,但是还是有点小问题,如下图

图18

为了让在一行,我们有如下代码

图19

我这里有疑问的是,为什么不开始设置240宽度呢,我试了还不行,只有使用上图的代码,将ul的样式宽度,使用获取li的绝对宽度*个数再加上px变成字符串才行,结果终于变成了一行。留了个坑!

但是我们一行也还是会移动出去,其实我们这里设置一个小技巧,当我们的一半移动出去了,我们就将ul位置重置即可

图20

如上图,我们判断左侧位置,当然偏移是负的,如果小于长度一半了,我们就让其置0,然而我们每次还是都能看见8个,现在我们想让div以外的隐藏掉,就需要给div设置overflow:hidden对溢出部分隐藏

图21
图22

当然我们这样就实现了左移,如果是像右移动呢,我们可以设置一个speed,当然我们还可以设置左右按钮,然后还可以加速移动减速移动等等,先不说,我们的无缝滚动希望,我们停留在某个图片就停止滚动,当然这又是onmouseover,onmouseout事件,是否停止定时器的问题。

图23

我们如上设置,就实现了放上去停,移出继续滚动,当然这里有个注意点是,我之前有的变量没有使用var声明,这里加不加的区别是,有作用域是函数内部,但是不加作用域是全局的,可以外部访问

还有我们之前给事件绑定函数使用.事件=function(){};如果已经有函数了,我们赋值函数名,而不是函数调用结果

其实我们的innerHTML那里还可以写成+=

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容