博客
关于我
强烈建议你试试无所不能的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

你可能感兴趣的文章
java编程经典语录
查看>>
豆瓣小站维护:【代码review】数据结构与算法分析(C++) 1.3题
查看>>
Java虚拟机监控命令
查看>>
1. Hello World - WebService based on Spring
查看>>
IntelliJ IDEA设置统一编码utf-8
查看>>
…… are only available on JDK 1.5 and higher 错误(spring 的jdk版本检测在jdk 8下的修订)...
查看>>
分布式缓存小结
查看>>
uva 437 hdu 1069
查看>>
JAVA大作业汇总2
查看>>
IIR滤波器设计(调用MATLAB IIR函数来实现)(转)
查看>>
分数CSD编码
查看>>
phpstudy配置域名
查看>>
稀疏表示、字典学习和压缩感知(基本概念)
查看>>
新手小白Linux(Centos6.5)部署java web项目(mysql5.7安装及相关操作)
查看>>
ruby实现生产者和消费者
查看>>
node.js 之 http 架设
查看>>
MongoDB 备份与还原
查看>>
Oracle启动与关闭数据库实例
查看>>
Spring day01
查看>>
hihocoder-1740-替换函数
查看>>