博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javascript dom编程艺术学习笔记之实现动画效果
阅读量:4343 次
发布时间:2019-06-07

本文共 4560 字,大约阅读时间需要 15 分钟。

目录

javascript dom编程艺术学习笔记之实现动画效果

@(JavaScript)[学习笔记]



1.动画基础知识

动画是让元素的位置随时间的变化不断变化

1.1 位置

假定有个id为message的元素,可以用javascript来设置这个属性的位置positionMessage()

也可以用javascript来改变元素的位置"moveMessage()"
页面加载时,两个函数几乎同时运行,肉眼看不到变化,位置就改变了,无法实现动画效果

1.2 时间

可以用setTimeout("function", interbal)函数

第一个参数是函数名
第二个参数是延时时间,单位毫秒
取消函数clearTimeout(variable)

function positionMessage() {  if (!document.getElementById) return false;  if (!document.getElementById("message")) return false;  var elem = document.getElementById("message");  elem.style.position = "absolute";  elem.style.left = "50px";  elem.style.top = "100px";  movement = setTimeout("moveMessage()" , 5000)  }

movement是一个全局变量。可以在该函数以外任意位置取消跳跃

1.3 时间递增量

更新moveMessage函数,让元素以渐变方式移动

  • 获取元素的位置
  • 如果元素到达目的地,则退出这个函数
  • 如果尚未到达,向目的地移动
  • 经过一段时间间隔,重复步骤一

JavaScript函数parseInt可以把字符串数值提取出来

parseFloaat函数可以提取浮点数

1.4 抽象

编写moveElement函数

function moveElement(elementID,final_x,final_y,interval) {  if (!document.getElementById) return false;  if (!document.getElementById(elementID)) return false;  var elem = document.getElementById(elementID);  var xpos = parseInt(elem.style.left);  var ypos = parseInt(elem.style.top);  if (xpos == final_x && ypos == final_y) {    return true;  }  if (xpos < final_x) {    xpos++;  }  if (xpos > final_x) {    xpos--;  }  if (ypos < final_y) {    ypos++;  }  if (ypos > final_y) {    ypos--;  }  elem.style.left = xpos + "px";  elem.style.top = ypos + "px";  var repeat = "moveElement('"+elementID+"',"+final_x+","+final_y+","+interval+")";  movement = setTimeout(repeat,interval);}
1.5 使用moveElement函数
moveElement("mwssage", 200, 100, 10);

2. 实用的动画

动画元素易引起用户反感,除非浏览器允许用户“冻结”移动的内容,否则就应该避免内容在页面中移动

2.1 提出问题

有一个包含一些列链接的网页,用户鼠标悬停某个链接,用先睹为快的方式告诉用户链接去往何处,可以展示一张预览图片

标记语言如下

  
Web Design

Web Design

These are the things you should know.

building blocks of web design
2.3 CSS

overflow属性处理元素尺寸超过容器的情况。

overflow可取属性有四种:visible,hidden,scroll,auto

  • visible:不裁减溢出内容
  • hidden:隐藏溢出内容
  • scroll:隐藏溢出内容,但有一个滚动条
  • auto:发生溢出时才有滚动条,无溢出不滚动

    2.4 JavaScript
function prepareSlideshow() {// Make sure the browser understands the DOM methods  if (!document.getElementsByTagName) return false;  if (!document.getElementById) return false;// Make sure the elements exist  if (!document.getElementById("linklist")) return false;  var slideshow = document.createElement("div");  slideshow.setAttribute("id","slideshow");  var preview = document.createElement("img");  preview.setAttribute("src","topics.gif");  preview.setAttribute("alt","building blocks of web design");  preview.setAttribute("id","preview");  slideshow.appendChild(preview);  var list = document.getElementById("linklist");  insertAfter(slideshow,list);// Get all the links in the list  var links = list.getElementsByTagName("a");// Attach the animation behavior to the mouseover event  links[0].onmouseover = function() {    moveElement("preview",-100,0,10);  }  links[1].onmouseover = function() {    moveElement("preview",-200,0,10);  }  links[2].onmouseover = function() {    moveElement("preview",-300,0,10);  }}addLoadEvent(prepareSlideshow);
2.5 变量作用域问题

如果把鼠标在链接间快速移动,动画效果会变得很混乱

这是由全局变量引起的,在抽象化过程,未对变量movement做任何修改
存在与特定元素有关的变量,就是属性

function moveElement(elementID,final_x,final_y,interval) {  if (!document.getElementById) return false;  if (!document.getElementById(elementID)) return false;  var elem = document.getElementById(elementID);  if (elem.movement){      clearTimeout(elem.movement);  }  var xpos = parseInt(elem.style.left);  var ypos = parseInt(elem.style.top);  if (xpos == final_x && ypos == final_y) {    return true;  }  if (xpos < final_x) {    xpos++;  }  if (xpos > final_x) {    xpos--;  }  if (ypos < final_y) {    ypos++;  }  if (ypos > final_y) {    ypos--;  }  elem.style.left = xpos + "px";  elem.style.top = ypos + "px";  var repeat = "moveElement('"+elementID+"',"+final_x+","+final_y+","+interval+")";  elem.movement = setTimeout(repeat,interval);}

如果函数执行时已经有movement属性,就用clearTimeout对其复位,这样就只执行一条函数调用语句

2.6 改进动画效果

让过度更平滑一些,每次移动十分之一

dist = (final_x - dlist)/10;xpos = xpos + dlist;

Math对象的ceil方法:返回不小于结果值的一个整数

Math对象的floor方法:返回大于结果值的一个整数
Math对象的round方法:返回与之最接近的一个整数

2.7 添加安全检查
var xpos = parseInt(elem.style.left);  var ypos = parseInt(elem.style.top);

这里有一个假设,必须有left和top属性

方法一:

if (!elem.stytle.left || !elem.stytle.top) return false;

方法二:

if (!elem.stytle.left){    elem.stytle.left = "0px";}if (!elem.stytle.top){    elem.stytle.top = "0px";}
2.8 生成HTML标记
  • 创建div元素
  • 创建img元素
  • 把img元素加入div子元素

转载于:https://www.cnblogs.com/yohann/p/7590441.html

你可能感兴趣的文章
ajax跨域,携带cookie
查看>>
阶段3 2.Spring_01.Spring框架简介_03.spring概述
查看>>
阶段3 2.Spring_01.Spring框架简介_05.spring的优势
查看>>
阶段3 2.Spring_02.程序间耦合_7 分析工厂模式中的问题并改造
查看>>
阶段3 2.Spring_03.Spring的 IOC 和 DI_2 spring中的Ioc前期准备
查看>>
阶段3 2.Spring_03.Spring的 IOC 和 DI_4 ApplicationContext的三个实现类
查看>>
阶段3 2.Spring_02.程序间耦合_8 工厂模式解耦的升级版
查看>>
阶段3 2.Spring_03.Spring的 IOC 和 DI_6 spring中bean的细节之三种创建Bean对象的方式
查看>>
阶段3 2.Spring_04.Spring的常用注解_2 常用IOC注解按照作用分类
查看>>
阶段3 2.Spring_09.JdbcTemplate的基本使用_5 JdbcTemplate在spring的ioc中使用
查看>>
阶段3 3.SpringMVC·_07.SSM整合案例_02.ssm整合之搭建环境
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第1节零基础快速入门SpringBoot2.0_3、快速创建SpringBoot应用之手工创建web应用...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第1节零基础快速入门SpringBoot2.0_5、SpringBoot2.x的依赖默认Maven版本...
查看>>
阶段3 3.SpringMVC·_07.SSM整合案例_08.ssm整合之Spring整合MyBatis框架
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第2节 SpringBoot接口Http协议开发实战_9、SpringBoot基础HTTP其他提交方法请求实战...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第2节 SpringBoot接口Http协议开发实战_12、SpringBoot2.x文件上传实战...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第4节 Springboot2.0单元测试进阶实战和自定义异常处理_19、SpringBoot个性化启动banner设置debug日志...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第4节 Springboot2.0单元测试进阶实战和自定义异常处理_20、SpringBoot2.x配置全局异常实战...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第5节 SpringBoot部署war项目到tomcat9和启动原理讲解_23、SpringBoot2.x启动原理概述...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第4节 Springboot2.0单元测试进阶实战和自定义异常处理_21、SpringBoot2.x配置全局异常返回自定义页面...
查看>>