学习笔记整理-DOM-03-定时器

一、定时器

1. setInterval()函数

  • setInterval()函数可以重复调用一个函数,在每次调用之间具有固定的时间间隔

      setInterval(function () { // 这个函数将自动被以固定间隔时间调用 }, 2000);
    
    • 第一个参数是函数
    • 第二个参数是间隔时间,以毫秒为单位,1000毫秒是1秒
  • 函数的参数

    • setInterval()函数可以接收第3、4……个参数,它们将按顺序传入函数
          setInterval(function (a, b) {// 形式参数a的值是88,形式参数b的值是66 }, 2000, 88, 66);
      
      • 从第三个参数开始,表示传入函数内的参数
  • 具名函数也可以传入setInterval

      var a = 0; function fun() { console.log(++a);}setInterval(fun, 1000);  
    
    • 具名函数当做第一个参数,注意这里没有圆括号!
  • 清除定时器

    • clearInterval()函数可以清除一个定时器。
          // 设置定时器,并且用timer变量接收这个定时器 var timer = setInterval(function () {}, 2000);// 点击按钮时,清除定时器 oBtn.onclick = function () { clearInterval(timer); }
      
      • 用变量timer
      • 清除定时器的时候,要传入定时器变量

二、延时器

1. setTimeout()函数

  • setTimeout()函数可以设置一个延时器,当指定时间到了之后,会执行函数一次,不再重复执行。
        setTimeout(function () { // 这个函数会在2秒后执行一次 }, 2000);
    
  • 清除延时器
    • clearTimeout()函数可以清除延时器,和clearInterval()非常类似

三、异步语句

  • setInterval()setTimeout()是两个异步语句。

  • 异步(asynchronous):不会阻塞CPU继续执行其他语句,当异步完成时,会执行"回调函数"(callback)

      setTimeout(function () { console.log('A'); }, 2000); console.log('B');  
    
    • 打印:B A
    • console.log('B');异步语句不会阻塞程序的正常执行。
  • 使用定时器实现动画

    <!DOCTYPE html>
    <html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>#box {position: absolute;top: 100px;left: 100px;width: 100px;height: 100px;background-color: orange;}</style>
    </head><body><button id="btn">开始运动</button><div id="box"></div><script>// 得到元素var btn = document.getElementById('btn');var box = document.getElementById('box');// 全局变量盒子的left值var left = 100;// 按钮监听btn.onclick = function () {var timer = setInterval(function () {// 改变全局变量left += 10;if (left >= 1000) {clearInterval(timer);}// 设置left属性box.style.left = left + 'px';}, 20);};</script>
    </body></html>
    
    • 使用定时器可以实现动画,利用的就是"视觉暂留"原理。
    • 使用定时器实现动画较为不便:
      • 不方便根据动画总时间计算步长
      • 运动方向要设置正负
      • 多种运动进行叠加较为困难(比如一个方形一边移动 一边变为圆形)
  • JS和CSS3结合实现动画

    • JavaScript可以利用CSS3transition属性轻松实现元素动画。
    • JS和CSS3结合实现动画规避了定时器制作动画的缺点
  • 函数节流

    • 函数节流:一个函数执行一次后,只有大于设定的执行周期 后才允许执行第二次
    • 函数节流非常容易实现,只需要借助setTimeout()延时器
          var lock = true;function 需要节流的函数() {// 如果锁是关闭状态,则不执行 if (!lock) return; // 函数核心语句// 关锁 lock = false;// 指定毫秒数后将锁打开 setTimeout(function () { lock = true; }, 2000);}
      
  • 无缝连续滚动特效

    <!DOCTYPE html>
    <html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>* {margin: 0;padding: 0;}.box {width: 1000px;height: 130px;border: 1px solid #000;margin: 50px auto;overflow: hidden;}.box ul {list-style: none;/* 设置大一点,这样li才能浮动 */width: 5000px;position: relative;}.box ul li {float: left;margin-right: 10px;}</style>
    </head><body><div id="box" class="box"><ul id="list"><li><img src="images/number/0.png" alt=""></li><li><img src="images/number/1.png" alt=""></li><li><img src="images/number/2.png" alt=""></li><li><img src="images/number/3.png" alt=""></li><li><img src="images/number/4.png" alt=""></li><li><img src="images/number/5.png" alt=""></li></ul></div><script>var box = document.getElementById('box');var list = document.getElementById('list');// 复制多一遍所有的lilist.innerHTML += list.innerHTML;// 全局变量,表示当前list的left值var left = 0;// 定时器,全局变量var timer;move();// 动画封装成函数function move() {// 设表先关,防止动画积累clearInterval(timer);timer = setInterval(function () {left -= 4;// 验收if (left <= - 1260) {left = 0;}list.style.left = left + 'px';}, 20);}// 鼠标进入停止定时器box.onmouseenter = function () {clearInterval(timer);};// 鼠标离开继续定时器box.onmouseleave = function () {move();};</script>
    </body></html>
    
  • 跑马灯轮播图

    <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>*{margin: 0;padding: 0;}.carousel {width: 650px;height: 360px;border: 1px solid #000;margin: 50px auto;position: relative;overflow: hidden;}.carousel ul {list-style: none;width: 6000px;position: relative;left: 0px;transition: left .5s ease 0s;}.carousel ul li {float: left;}.carousel .leftbtn {position: absolute;left: 20px;top: 50%;margin-top: -25px;width: 50px;height: 50px;background-color: rgb(28, 180, 226);border-radius: 50%;}.carousel .rightbtn {position: absolute;right: 20px;top: 50%;margin-top: -25px;width: 50px;height: 50px;background-color: rgb(28, 180, 226);border-radius: 50%;}</style>
    </head>
    <body><div class="carousel"><ul id="list"><li><img src="images/beijing/0.jpg" alt=""></li><li><img src="images/beijing/1.jpg" alt=""></li><li><img src="images/beijing/2.jpg" alt=""></li><li><img src="images/beijing/3.jpg" alt=""></li><li><img src="images/beijing/4.jpg" alt=""></li></ul><a href="javascript:;" class="leftbtn" id="leftbtn"></a><a href="javascript:;" class="rightbtn" id="rightbtn"></a></div><script>// 得到按钮和ul,ul整体进行运动var leftbtn = document.getElementById('leftbtn');var rightbtn = document.getElementById('rightbtn');var list = document.getElementById('list');// 克隆第一张图片var cloneli = list.firstElementChild.cloneNode(true);list.appendChild(cloneli);// 当前ul显示到第几张了,从0开始数var idx = 0;// 节流锁var lock = true;// 右边按钮监听rightbtn.onclick = function () {// 判断锁的状态if (!lock) return; lock = false;// 给list加过渡,为什么要加??css中不是已经加了么??这是因为最后一张图片会把过渡去掉list.style.transition = 'left .5s ease 0s';idx ++;if (idx > 4) {// 设置一个延时器,延时器的功能就是将ul瞬间拉回0的位置,延时器的目的就是让过渡动画结束之后setTimeout(function() {// 取消掉过渡,因为要的是瞬间移动,不是“咕噜”回去list.style.transition = 'none';list.style.left = 0;idx = 0;}, 500);}list.style.left = -idx * 650 + 'px';// 函数节流setTimeout(function() {lock = true; }, 500);}// 左边按钮监听leftbtn.onclick = function () {if (!lock) return;lock = false;// 判断是不是第0张,如果是,就要瞬间用假的替换真的if (idx == 0) {// 取消掉过渡,因为要的是瞬间移动,不是“咕噜”过去list.style.transition = 'none';// 直接瞬间移动到最后的假图片上list.style.left = -5 * 650 + 'px';// 设置一个延时器,这个延时器的延时时间可以是0毫秒,虽然是0毫秒,但是可以让我们过渡先是瞬间取消,然后再加上setTimeout(function() {// 加过渡list.style.transition = 'left .5s ease 0s';// idx改为真正的最后一张idx = 4;list.style.left = -idx * 650 + 'px';}, 0);} else {idx --;list.style.left = -idx * 650 + 'px';}// 函数节流setTimeout(function() {lock = true; }, 500);}</script>
    </body>
    </html>
    
  • 呼吸轮播图

    <!DOCTYPE html>
    <html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>* {margin: 0;padding: 0;}.carousel {width: 650px;height: 360px;border: 1px solid #000;margin: 50px auto;position: relative;}.carousel ul {list-style: none;}.carousel ul li {position: absolute;top: 0;left: 0;/* 透明度都是0 */opacity: 0;transition: opacity 1s ease 0s;}/* 只有第一张透明度是1 */.carousel ul li:first-child {opacity: 1;}.carousel .leftbtn {position: absolute;left: 20px;top: 50%;margin-top: -25px;width: 50px;height: 50px;background-color: rgb(28, 180, 226);border-radius: 50%;}.carousel .rightbtn {position: absolute;right: 20px;top: 50%;margin-top: -25px;width: 50px;height: 50px;background-color: rgb(28, 180, 226);border-radius: 50%;}</style>
    </head><body><div class="carousel"><ul id="list"><li><img src="images/beijing/0.jpg" alt=""></li><li><img src="images/beijing/1.jpg" alt=""></li><li><img src="images/beijing/2.jpg" alt=""></li><li><img src="images/beijing/3.jpg" alt=""></li><li><img src="images/beijing/4.jpg" alt=""></li></ul><a href="javascript:;" class="leftbtn" id="leftbtn"></a><a href="javascript:;" class="rightbtn" id="rightbtn"></a></div><script>// 得到按钮和ul,ul整体进行运动var leftbtn = document.getElementById('leftbtn');var rightbtn = document.getElementById('rightbtn');var list = document.getElementById('list');var lis = list.getElementsByTagName('li');// 当前是第几张图显示var idx = 0;// 节流var lock = true;// 右按钮rightbtn.onclick = function () {// 判断节流if (!lock) return;lock = false;// 还没有改idx,此时的idx这个图片就是老图,老图淡出lis[idx].style.opacity = 0;idx++;if (idx > 4) idx = 0;// 改了idx,此时的idx这个图片就是新图,新图淡入lis[idx].style.opacity = 1;// 动画结束之后,开锁setTimeout(function () {lock = true;}, 1000);}// 左按钮leftbtn.onclick = function () {// 判断节流if (!lock) return;lock = false;// 还没有改idx,此时的idx这个图片就是老图,老图淡出lis[idx].style.opacity = 0;idx--;if (idx < 0) idx = 4;// 改了idx,此时的idx这个图片就是新图,新图淡入lis[idx].style.opacity = 1;// 动画结束之后,开锁setTimeout(function () {lock = true;}, 1000);}</script>
    </body></html>
    

重点内容

  • 访问元素节点有哪些方法?
  • 节点的关系有哪些?
  • 常用节点操作有哪些?
  • 节点的创建、移除和克隆要如何实现?
  • 事件捕获和冒泡是什么?应该如何设置?
  • 什么是事件委托?什么时候要用事件委托?
  • 使用定时器和CSS3的过度实现动画

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/36684.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot中间件使用之EventBus、Metric、CommandLineRunner

1、EventBus 使用EventBus 事件总线的方式可以实现消息的发布/订阅功能&#xff0c;EventBus是一个轻量级的消息服务组件&#xff0c;适用于Android和Java。 // 1.注册事件通过 EventBus.getDefault().register(); // 2.发布事件 EventBus.getDefault().post(“事件内容”); …

深入理解spring面经

1 了解SpringMVC的处理流程吗&#xff1f; 用户发送请求至前端控制器DispatcherServlet。DispatcherServlet通过处理器映射器HandlerMapping找到对应的处理器。DispatcherServlet将请求提交给对应的处理器Controller。Controller处理完请求后返回ModelAndView。DispatcherServ…

面试攻略,Java 基础面试 100 问(十三)

什么时候用 assert&#xff1f; assertion(断言)在软件开发中是一种常用的调试方式&#xff0c;很多开发语言中都支持这种机制。一般来说&#xff0c;assertion 用于保证程序最基本、关键的正确性。assertion 检查通常在开发和测试时开启。为了提高性能&#xff0c;在软件发布…

支持对接鸿蒙系统的无线模块及其常见应用介绍

近距离的无线通信得益于万物互联网的快速发展&#xff0c;基于集成部近距离无线连接&#xff0c;为固定和移动设备建立通信的蓝牙技术也已经广泛应用于汽车领域、工业生产及医疗领域。为协助物联网企业终端产品能快速接入鸿蒙生态系统&#xff0c;SKYLAB联手国产芯片厂家研发推…

找不到mfc140u.dll怎么办?mfc140u.dll丢失怎样修复?简单三招搞定

最近我遇到了一个问题&#xff0c;发现我的电脑上出现了mfc140u.dll文件丢失的错误提示。这个错误导致一些应用程序无法正常运行&#xff0c;让我感到非常困扰。经过一番研究和尝试&#xff0c;我终于成功修复了这个问题&#xff0c;并从中总结出了一些心得。 mfc140u.dll丢失原…

财报解读:继续押注Disney+,迪士尼距离盈利还有多远?

迪士尼最新一季的“答卷”&#xff0c;透露着不小的寒气。 近日&#xff0c;迪士尼披露了2023财年第三季度&#xff08;自然年2023年Q2&#xff09;业绩报告&#xff0c;营收223.3亿美元&#xff0c;同比仅增长4%&#xff0c;低于市场预期的225.1亿美元&#xff1b;归母净亏损…

【人工智能前沿弄潮】——生成式AI系列:Diffusers应用 (2) 训练扩散模型(无条件图像生成)

无条件图像生成是扩散模型的一种流行应用&#xff0c;它生成的图像看起来像用于训练的数据集中的图像。与文本或图像到图像模型不同&#xff0c;无条件图像生成不依赖于任何文本或图像。它只生成与其训练数据分布相似的图像。通常&#xff0c;通过在特定数据集上微调预训练模型…

OpenLayers入门,OpenLayers入门文档,OpenLayers入门手册,OpenLayers相比其他地图引擎有哪些优点?

专栏目录&#xff1a; OpenLayers入门教程汇总目录 前言 在学习OpenLayers之前&#xff0c;总是需要了解OpenLayers&#xff0c;知道OpenLayers是什么&#xff0c;OpenLayers能够做什么&#xff0c;OpenLayers有哪些用途和特性&#xff0c;然后OpenLayers相比其他地图引擎又有…

数学运算1

正确答案&#xff1a;F 你的答案&#xff1a;E 参考答案&#xff1a;最大排列为100 1 99 2 98 3…51 49 50 所以和为999897…1(100-50)因为是一个圈所以&#xff0c;100和50相接&#xff0c;所以等于5000 知识点&#xff1a;数学运算

MySQL 慢查询探究分析

目录 背景&#xff1a; mysql 整体结构&#xff1a; SQL查询语句执行过程是怎样的&#xff1a; 知道了mysql的整体架构&#xff0c;那么一条查询语句是怎么被执行的呢&#xff1a; 什么是索引&#xff1a; 建立索引越多越好吗&#xff1a;   如何发现慢查询&#xff1…

树结构--介绍--二叉树遍历的递归实现

目录 树 树的学术名词 树的种类 二叉树的遍历 算法实现 遍历命名 二叉树的中序遍历 二叉树的后序遍历 二叉树的后序遍历迭代算法 二叉树的前序遍历 二叉树的前序遍历迭代算法 树 树是一种非线性的数据结构&#xff0c;它是由n(n≥0)个有限节点组成一个具有层次关系…

Docker安装 elasticsearch-head

目录 前言安装elasticsearch-head步骤1&#xff1a;准备1. 安装docker2. 搜索可以使用的镜像。3. 也可从docker hub上搜索镜像。4. 选择合适的redis镜像。 步骤2&#xff1a;拉取elasticsearch-head镜像拉取镜像查看已拉取的镜像 步骤3&#xff1a;创建容器创建容器方式1&#…

SpringBoot复习:(28)【前后端不分离】自定义View

一、自定义View package cn.edu.tju.view;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.stereotype.Comp…

C# --- Case Study

C# --- Case Study C# — Mongo数据库事务的应用 C# — 如何解析Json文件并注入MongoDB C# — MongoDB如何安全的替换Collection

百度翻译API整合SpringBoot

案例背景,按照官方给的Demo,实在是太啰嗦了, 大致步骤 封装数据>签名>发送请求, 仔细一看劈里啪啦一大堆,最后还要手动关流关连接,难道整合到SpringBoot项目里面我还得为内存管理考虑 所以就有了如下需求 使用 RestTemplate的对象进行发送请求数据,RestTemplate由s…

Redis缓存删除略和内存淘汰策略及LRU

1、Redis内存若在配置文件中未设置&#xff0c;内存会无限制增长&#xff0c;直到超出物理内存&#xff0c;抛出out of memory内存耗尽异常 解决方法&#xff0c;调整maxmemory参数&#xff0c;一般设置为物理内存的3/4&#xff0c;并且添加缓存删除策略 2、Redis对于设置了过…

项目经理的会议之道:全参与还是精选参与?

引言 在项目管理中&#xff0c;会议是一个常见的工具&#xff0c;用于沟通信息、解决问题、做出决策等。然而&#xff0c;项目经理是否需要参加所有的会议呢&#xff1f;这是一个值得深思的问题。作为项目经理&#xff0c;我们需要权衡会议的重要性和我们的时间管理。我们不能…

【第一阶段】kotlin的函数

函数头 fun main() {getMethod("zhangsan",22) }//kotlin语言默认是public,kotlin更规范&#xff0c;先有输入&#xff08; getMethod(name:String,age:Int)&#xff09;再有输出(Int[返回值]) private fun getMethod(name:String,age:Int): Int{println("我叫…

Elasticsearch集群shard过多后导致的性能问题分析

1.问题现象 上午上班以后发现ES日志集群状态不正确&#xff0c;集群频繁地重新发起选主操作。对外不能正常提供数据查询服务&#xff0c;相关日志数据入库也产生较大延时 2.问题原因 相关日志 查看ES集群日志如下&#xff1a; 00:00:51开始集群各个节点与当时的master节点…

Playwright快速上手-1

前言 随着近年来对UI自动化测试的要求越来越高&#xff0c;,功能强大的测试框架也不断的涌现。本系列主讲的Playwright作为一款新兴的端到端测试框架,凭借其独特优势,正在逐渐成为测试工程师的热门选择。 本系列文章将着重通过示例讲解 Playwright python开发环境的搭建 …