DOM Scripting中的图片切换[兼容Firefox]


Posted in Javascript onJune 12, 2010

学习过程中多分析别人的代码实现是个好的习惯,哪怕不是很明白,跟着多敲几遍代码也是很培养感觉的事情。下面是实际的效果(一般我只在firefox中测试):

DOM Scripting中的图片切换[兼容Firefox]

       鼠标滑过上面的导航链接时 下面框中图片进行流畅的切换,左右移动的效果

html结构如下:  

<body> 
<h1>Web Design</h1> 
<p>These are the things you should know.</p> 
<ol id="linklist"> 
<li> 
<a href="structure.html">Structure</a> 
</li> 
<li> 
<a href="presentation.html">Presentation</a> 
</li> 
<li> 
<a href="behavior.html">Behavior</a> 
</li> 
</ol> 
</body>

实在是很简单啊。下面我们直接来看js代码,先给出两个辅助函数:
addLoadEvent
function addLoadEvent(func) { 
var oldonload = window.onload; 
if(typeof window.onload != "function") { 
window.onload = func; 
} else { 
window.onload = function() { 
oldonload(); 
func(); 
} 
} 
}

这个函数顾名思义就是加载window的onload事件所要处理的方法
insertAfter
function insertAfter(newElement, targetElement) { 
var parent = targetElement.parentNode; 
if(parent.lastChild == targetElement) { 
parent.appendChild(newElement); 
} else { 
parent.insertBefore(newElement, targetElement.nextSibling); 
} 
}

在DOM API中有个insertBefore但是没有insertAfter,所以这里自定义一个insertAfter方法,只要清楚appendChild和insertBefore这个函数很好理解,把newElement插入到targetElement之前。
接下来moveElement函数很核心:
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); 
if(elem.movement) { 
clearTimeout(elem.movement); 
} 
if(!elem.style.left) { 
elem.style.left = "0px"; 
} 
if(!elem.style.top) { 
elem.style.top = "0px"; 
} 
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) { 
var dist = Math.ceil((final_x - xpos)/10); 
xpos = xpos + dist; 
} 
if(xpos > final_x) { 
var dist = Math.ceil((xpos - final_x)/10); 
xpos = xpos - dist; 
} 
if(ypos < final_y) { 
var dist = Math.ceil((final_y - ypos)/10); 
ypos = ypos + dist; 
} 
if(ypos > final_y) { 
var dist = Math.ceil((ypos - final_y)/10); 
ypos = ypos - dist; 
} 
elem.style.left = xpos + "px"; 
elem.style.top = ypos + "px"; 
var repeat = "moveElement('" + elementID + "'," + final_x + "," + final_y + "," + interval + ")"; 
elem.movement = setTimeout(repeat, interval); 
}

final_x, final_y 分别为元素移动终止的left和top值,所以被移动元素要设置position属性("relative"或是"position"),这样它的left,top属性才会起作用,这个函数也不难,就是取得元素当前的left和top值然后和final_x,final_y做比较,接着对其left和top按照一定的步长改变,每次的步长就是每个if中的dist变量,因为每次dist都会根据被移动元素的最新left,top计算,所以有一种先加速后减速的移动效果,参数interval,和setTimeout配合让moveElement自我调用,直到元素移动到final_x和final_y.
接着是pepareSlideshow函数,动态的创建所需的dom元素:
prepareSlideshow
function prepareSlideshow() { 
//确保浏览器能理解DOM API 
if(!document.getElementsByTagName) return false; 
if(!document.getElementById) return false; 
//确保该元素已存在 
if(!document.getElementById("linklist")) return false; 
var slideshow = document.createElement("div"); 
/*如果在css中设置这些属性,此处可省 
slideshow.style.position = "relative"; 
slideshow.style.overflow = "hidden"; 
slideshow.style.width = "100px"; 
slideshow.style.height = "100px"; 
*/ 
slideshow.setAttribute("id", "slideshow"); 
var preview = document.createElement("img"); 
/*如果在css中设置,此处可省 
preview.style.position = "absolute"; 
*/ 
preview.setAttribute("src", "slideshow/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); 
//获得ol中所有的a元素 
var links = list.getElementsByTagName("a"); 
//给每个a的mouseover事件附加上moveElement方法 
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); 
} 
}

这里也就涉及到一些元素的创建,元素属性的设置等基本的DOM API运用,然后给ol[id="linklist"]中的a元素附加鼠标moveover事件对应的moveElement方法,最后用addLoadEvent(prepareSlideshow)就行了,结合html和效果图看,这个函数也是很好理解的。
代码打包下载 https://3water.com/jiaoben/27501.html
Javascript 相关文章推荐
jquery nth-child()选择器的简单应用
Jul 10 Javascript
在JavaScript中typeof的用途介绍
Apr 11 Javascript
jquery中get,post和ajax方法的使用小结
Feb 04 Javascript
使用ajaxfileupload.js实现ajax上传文件php版
Jun 26 Javascript
JQuery实现图片轮播效果
Sep 15 Javascript
JS 数字转换为大写金额的简单实例
Aug 04 Javascript
jQuery编写textarea输入字数限制代码
Mar 23 jQuery
文本溢出插件jquery.dotdotdot.js使用方法详解
Jun 22 jQuery
JQuery搜索框自动补全(模糊匹配)功能实现示例
Jan 08 jQuery
从组件封装看Vue的作用域插槽的实现
Feb 12 Javascript
深入学习TypeScript 、React、 Redux和Ant-Design的最佳实践
Jun 17 Javascript
解决nuxt页面中mounted、created、watch执行两遍的问题
Nov 05 Javascript
由JavaScript技术实现的web小游戏(不含网游)
Jun 12 #Javascript
ASP.NET中使用后端代码注册脚本 生成JQUERY-EASYUI的界面错位的解决方法
Jun 12 #Javascript
jquery form表单提交插件asp.net后台中文解码
Jun 12 #Javascript
JavaScript中yield实用简洁实现方式
Jun 12 #Javascript
EasySlider 基于jQuery功能强大简单易用的滑动门插件
Jun 11 #Javascript
JavaScript 开发规范要求(图文并茂)
Jun 11 #Javascript
cnblogs TagCloud基于jquery的实现代码
Jun 11 #Javascript
You might like
php array_flip() 删除数组重复元素
2009/01/14 PHP
php中session使用示例
2014/03/29 PHP
从刷票了解获得客户端IP的方法
2015/09/21 PHP
YII Framework框架教程之安全方案详解
2016/03/14 PHP
PHP如何实现跨域
2016/05/30 PHP
PHP构造二叉树算法示例
2017/06/21 PHP
jquery 选择器部分整理
2009/10/28 Javascript
Jquery调用webService远程访问出错的解决方法
2010/05/21 Javascript
js判断IE6/IE7/FF的代码[XMLHttpRequest]
2011/02/16 Javascript
jquery easyui combobox模糊过滤(示例代码)
2013/11/30 Javascript
wap浏览自动跳转到wap页面的js代码
2014/05/17 Javascript
网页禁用右键菜单和鼠标拖动选择方法小结
2015/02/25 Javascript
使用coffeescript编写node.js项目的方法汇总
2015/08/05 Javascript
用js实现博客打赏功能
2016/10/24 Javascript
原生Aajax 和jQuery Ajax 写法个人总结
2017/03/24 jQuery
Angular4 反向代理Details实践
2018/05/30 Javascript
JavaScript事件冒泡机制原理实例解析
2020/01/14 Javascript
浅谈python中的数字类型与处理工具
2017/08/02 Python
利用Python找出序列中出现最多的元素示例代码
2017/12/08 Python
Flask之flask-script模块使用
2018/07/26 Python
python中正则表达式 re.findall 用法
2018/10/23 Python
python 实现对文件夹中的图像连续重命名方法
2018/10/25 Python
python实现两个一维列表合并成一个二维列表
2019/12/02 Python
django-crontab实现服务端的定时任务的示例代码
2020/02/17 Python
python对数组进行排序,并输出排序后对应的索引值方式
2020/02/28 Python
Django自定义全局403、404、500错误页面的示例代码
2020/03/08 Python
Python 无限级分类树状结构生成算法的实现
2021/01/21 Python
电脑教师的自我评价
2013/12/18 职场文书
校庆接待方案
2014/03/18 职场文书
工商干部先进事迹
2014/05/14 职场文书
村党建工作汇报材料
2014/11/02 职场文书
2014七年级班主任工作总结
2014/12/05 职场文书
语文教师个人工作总结
2015/02/06 职场文书
保送生自荐信范文
2015/03/26 职场文书
2016党员干部廉政准则学习心得体会
2016/01/20 职场文书
Python利用机器学习算法实现垃圾邮件的识别
2021/06/28 Python