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

你可能感兴趣的文章
单工、半双工和全双工的定义
查看>>
Hdu【线段树】基础题.cpp
查看>>
时钟系统
查看>>
BiTree
查看>>
5个基于HTML5的加载动画推荐
查看>>
水平权限漏洞的修复方案
查看>>
静态链接与动态链接的区别
查看>>
如何使用mysql
查看>>
linux下wc命令详解
查看>>
敏捷开发中软件测试团队的职责和产出是什么?
查看>>
在mvc3中使用ffmpeg对上传视频进行截图和转换格式
查看>>
python的字符串内建函数
查看>>
Spring - DI
查看>>
微软自己的官网介绍 SSL 参数相关
查看>>
Composite UI Application Block (CAB) 概念和术语
查看>>
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前期准备
查看>>