webAPI

01-动画封装

  1. 应用到的知识点

    • 点击事件

    • 给元素设置一个绝对定位

    • 定时器(setInterval)

  2. 封装动画1的步骤:

    • 让元素设置为绝定位
    • 设置元素的开始位置(从哪开始移动)
    • 设置元素的目标位置(移动到哪)
    • 设置元素每次移动的距离
    • 设置元素每次移动的时间间隔(越短越好)
  3. 封装动画1遇到的问题

    • 如果快速的点击按钮,动画会有一个加速的效果

      原因: 多次点击按钮的时候,在程序中相当于开启了多个定时器导致的
      
    • 如何解决?

      解决途径: 不管点击多次按钮,始终只有一个定时器
      
    • 解决问题的核心步骤

      1. 将  var timeID = null; 设置为一个全局的公共变量2. 判断是否存在,如果存在就停住定时器,然后子在开启新的定时器(排他思想)
      //先判断程序中是否有定时器
      if(timeID != null) {//代表已经存在定时器, 立即将存在的定时器删除掉clearInterval(timeID);timeID = null;
      }
      
  4. 将动画2封装成一个函数,方便以后调用

    这个函数有5个参数:
    哪个元素设置动画,
    元素的开始位置
    元素的结束位置
    元素每次移动的距离
    元素每次移动的时间间隔function animation(element, current, target, step, time) {//先判断程序中是否有定时器if(timeID != null) {//代表已经存在定时器, 立即将存在的定时器删除掉clearInterval(timeID);timeID = null;}timeID = setInterval(function(){//开始移动元素的位置if(current >= target) {current = target;clearInterval(timeID);}else {current += step;}//设置box的位置element.style.left = current + 'px';}, time);
    }
    
  5. 如果将动画封装成一个函数后,每次点击都是从开始的位置 0 重新执行程序

    • 怎么解决?

      让元素的 current 值 始终 和 元素实际移动后的位置保持一致
      
    • 在解决方案中有什么问题?

      如何获取当前元素的位置?
      DOM.offsetLeft ----> 左侧的距离位置
      DOM.offsetTop ----> 上边的距离current = 当前元素的位置;
      
    • 最后的解决方案

      在函数中设置:current = element.offsetLeft;
      
  6. 为什么当页面中出现多个元素的时候,动画只能让最后一个元素执行动画?

    • 为什么?

      点击按钮的时候, 程序中共用了一个定时器导致的
      
    • 怎么解决

      每一个元素(对象)应该对应一个定时器在每一个timeID绑定一个对象function animation(element, current, target, step, time) {//让curren 值始终和当前元素的位置保持一致current = element.offsetLeft;//先判断程序中是否有定时器if(element.timeID != null) {//代表已经存在定时器, 立即将存在的定时器删除掉clearInterval(element.timeID);element.timeID = null;}element.timeID = setInterval(function(){//开始移动元素的位置if(current >= target) {current = target;clearInterval(element.timeID);}else {current += step;}//设置box的位置element.style.left = current + 'px';}, time);
      }
      
  7. 为什么元素从右向左移动的时候没有动画效果了?

    • 为什么?

      我们在程序中原来只是简单的判断 开始位置和结束位置 值的大小,而现在 向左移动的时候,开始位置的值就是比目标位置的值要大,所以动画就停止了条件判断写的有问题:if(current >= target) {current = target;clearInterval(element.timeID);}
      
    • 怎么解决?

      应该是求两点之间的距离 和 每次移动的距离比较大小1.在确定当前位置是否移动到了终点位置(目标位置), 要通过计算两点之间的距离实现
      if(Math.abs(target - current) <= Math.abs(step)) {current = target;clearInterval(element.timeID);
      }else {current += step;
      }2.当元素向左移动的时候,保证每次移动的距离  step 是一个负数(向左移动为负)//开始移动元素的位置
      if(current > target) {// 设置为负数step = -Math.abs(step);
      }
      
  8. 动画的最后一个问题,动画没有执行完,又可以执行另外一个动画

    设置一个标志位(节流阀)
    

02-BOM中获取元素的信息

  • 难点在哪?

    这个知识点容易和前面鼠标位置信息混淆
    
  • 复习获取鼠标位置信息

    • 怎么获取鼠标位置信息?

      通过事件对象参数获取
      
    • 获取鼠标的坐标信息

      • 事件对象参数.clientX [获取鼠标的横坐标, 相对可视区域的]
      • 事件对象参数.pageX [获取鼠标的横坐标, 相对整个页面,包括滚动条出去的位置]
      • 事件对象参数.screenX [获取鼠标的横坐标, 相对整个屏幕]
      • 事件对象参数.offsetX [获取鼠标的横坐标, 相对当前事件源]
  • 获取页面中元素的相关信息

    • offset系列的

      • DOM.offsetLeft : 获取元素在网页中的位置信息
      • DOM.offsetTop : 获取元素在网页中的位置信息
      • DOM.offsetWidth : 获取元素的宽度 ( 内容区域 + 边框 + 内边距 )
      • DOM.offsetHeight: 获取元素的高度 (内容区域 + 边框 + 内边距)
    • client系列

      • DOM.clientLeft : 元素左边框的宽度
      • DOM.clientTop : 元素上边框宽度
      • DOM.clientWidth: 元素的宽度(内容器区域 + 内边距)
      • DOM.clientHeight: 元素的高度(内容器区域 + 内边距)
    • scroll系列

      • DOM.scrollLeft : 元素内容区域滚动出去的距离(水平距离) [注册一个滚动的事件 onscroll]

      • DOM.scrollTop: 元素内容区域滚动出去的距离(垂直距离) [注册一个滚动的事件 onscroll]

        //注册一个滚动事件
        div.onscroll = function() {console.log(this.scrollTop);
        }
        
      • DOM.scrollWidth : 元素元素宽度(超出盒子宽度 + 左padding)

      • DOM.scrollHeight: 元素元素高度(超出盒子高度 + 上下padding)

03-拖拽案例

  • 鼠标按下时候的事件

    onmousedown
    
  • 鼠标抬起时候的事件

    onmouseup
    

问题:

  1. 改变元素的位置:

    • 相对定位
    • 绝对定位(有一个参照元素 + 脱标)
    • 固定定位
    • margin
    • padding
    • 2d位移
    • 3d位移
  2. offsetleft
    • 就是用来保存元素位置信息的
    • 不能设置

js(Dom+Bom)第七天(2)相关推荐

  1. js(Dom+Bom)第七天(1)

    JavaScript BOM介绍 概念 BOM(Browser Object Model)即浏览器对象模型. 本质: 通过对象抽象浏览器中的一些功能 例如:(刷新页面,alert,confirm,po ...

  2. js(Dom+Bom)第一天(1)

    JavaScript-DOM(BOM)操作 核心知识 获取页面元素 事件 设置样式 学习目标 能够使用id名,标签名等方式获取页面中元素 能够给标签注册点击事件,并实现对应效果 能够给标签通过js方式 ...

  3. js(Dom+Bom)第六天(1)

    webAPI 01-键盘事件 知识点-onkeydown事件[掌握] onkeydown: 当键盘上的键被按下时候触发的一个事件 知识点-onkeyup事件[掌握] onkeyup: 键盘上键弹起时候 ...

  4. js(Dom+Bom)第五天(2)

    webAPI 01-事件监听 为什么要学事件监听 之前给元素注册事件的时候,同一个事件会被覆盖掉 事件监听的本质 通过另外一种方式给元素注册事件, 同时可以解决同一个事件不会被覆盖掉. 知识点-通过 ...

  5. js(Dom+Bom)第五天(1)

    JavaScript BOM介绍 概念 BOM(Browser Object Model)即浏览器对象模型. 本质: 通过对象抽象浏览器中的一些功能 例如:(刷新页面,alert,confirm,po ...

  6. js(Dom+Bom)第一天(2)

    webAPI 00-复习 内置对象中的方法 01-JavaScript组成 知识点-ECMASCRIPT 重点回顾 存储容器 变量 数组 对象 逻辑语法 分支语句 循环语句 switch语句 知识点- ...

  7. js(Dom+Bom)第八天—Swiper(插件)

    Swiper插件(库) 01-基本介绍 Swiper 是一款免费以及轻量级的移动设备触控滑块的js框架,使用硬件加速过渡(如果该设备支持的话).主要使用于移动端的网站.移动web apps,nativ ...

  8. js(Dom+Bom)第四天(1)

    webAPI 1-通过DOM节点方式获取元素 1-0注意事项 下面的内容都在在文档树上直接操作的 (节点 + 元素)重点是: 与元素相关的内容 1-1与父节点相关的操作方式 1-1-1.知识点-判断父 ...

  9. js(Dom+Bom)第三天(2)

    webAPI 0-操作标签属性 系统属性 作用: 1. 可以操作标签身上的任何一个系统中的自带属性 (id, class, name ....) 2. 还可以操作用户自定义的属性 dom.getAtt ...

最新文章

  1. Java之Spring mvc详解(非原创)
  2. 从PCD文件写入和读取点云数据
  3. 创建多个Oracle数据库及相应的实例
  4. 从Xamarin.Essentials谈Xamarin库的封装
  5. C++std命名空间和头文件详解
  6. Nimbus三Storm源码分析--Nimbus启动过程
  7. 大学计算机基础python学多久_基于Python 的“大学计算机基础”课程教学设计
  8. NameError: name 'file' is not defined
  9. android 系统(34)--关机充电图标修改
  10. SpringMVC中RestFul风格
  11. “编程能力差,90%输在了这点上!”谷歌AI专家:其实你们都是瞎努力
  12. XSS_伪协议与编码绕过
  13. 天正电气图例_天正电气设计施工图中常用线路敷设方式
  14. 截止失真放大电路_技术分享:音频功放失真及常见改善方法
  15. 二进制计算机课教案,《二进制与计算机》教学设计
  16. 爬取豆瓣排名前100的电影
  17. Java将Word转为图片完美解决方案(免费无损不乱码)
  18. 使用scrapy爬取豆瓣上面《战狼2》影评
  19. 联发科Helio G25处理器怎么样 联发科g25相当于骁龙什么水平
  20. 三分钟了解企业产品发布会直播全流程

热门文章

  1. NAND FLASH/NOR FLASH/EMMC等存储器的比较和区别
  2. C++笔记——malloc基本用法
  3. 泰坦尼克数据集预测分析_探索性数据分析—以泰坦尼克号数据集为例(第1部分)
  4. 信用卡逾期不还是否要坐牢?看法律是怎么规定的
  5. iOS开发的学习笔记
  6. 我从草原来:自由摄影人李伟 (内蒙古电视台“蔚蓝的故乡”20110407)
  7. 《网球王子》与阿梅尔
  8. NB-IoT SNR RSRQ RSRP等信号参数解释
  9. oracle rac em cluster name,ORACLE 11G RAC重建EM问题
  10. php 跨域web访问权限,php:跨域 Web程序 - 贪吃蛇学院-专业IT技术平台