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 操作option的实现代码
Mar 03 Javascript
转义字符(\)对JavaScript中JSON.parse的影响概述
Jul 17 Javascript
关于JS数组追加数组采用push.apply的问题
Jun 09 Javascript
通过jquery 获取URL参数并进行转码
Aug 18 Javascript
jQuery团购倒计时特效实现方法
May 07 Javascript
js创建对象的方法汇总
Jan 07 Javascript
angularjs 表单密码验证自定义指令实现代码
Oct 27 Javascript
jquery tmpl模板(实例讲解)
Sep 02 jQuery
快速将Vue项目升级到webpack3的方法步骤
Sep 14 Javascript
vue 通过下拉框组件学习vue中的父子通讯
Dec 19 Javascript
js实现简单分页导航栏效果
Jun 28 Javascript
微信小程序学习总结(三)条件、模板、文件引用实例分析
Jun 04 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中实现图片的锐化
2006/10/09 PHP
php实现读取和写入tab分割的文件
2015/06/01 PHP
php安装扩展mysqli的实现步骤及报错解决办法
2017/09/23 PHP
Laravel + Elasticsearch 实现中文搜索的方法
2020/02/02 PHP
Javascript的闭包
2009/12/31 Javascript
jQuery动画效果-fadeIn fadeOut淡入浅出示例代码
2013/08/28 Javascript
为何JS操作的href都是javascript:void(0);呢
2015/11/12 Javascript
jQuery简单实现title提示效果示例
2016/08/01 Javascript
微信小程序 加载 app-service.js 错误解决方法
2016/10/12 Javascript
javascript跨域请求包装函数与用法示例
2016/11/03 Javascript
easyui combobox开启搜索自动完成功能的实例代码
2016/11/08 Javascript
vue日期组件 支持vue1.0和2.0
2017/01/09 Javascript
基于jQuery实现瀑布流页面
2017/04/11 jQuery
关于meta viewport中target-densitydpi属性详解(推荐)
2017/08/18 Javascript
jQuery模拟爆炸倒计时功能实例代码
2017/08/21 jQuery
Vue.js项目模板搭建图文教程
2017/09/20 Javascript
node.js express框架实现文件上传与下载功能实例详解
2019/10/15 Javascript
vue-cli3项目打包后自动化部署到服务器的方法
2020/09/16 Javascript
vue3.0封装轮播图组件的步骤
2021/03/04 Vue.js
python中for语句简单遍历数据的方法
2015/05/07 Python
Python获取邮件地址的方法
2015/07/10 Python
python使用Pycharm创建一个Django项目
2018/03/05 Python
python字符串切割:str.split()与re.split()的对比分析
2019/07/16 Python
Python3 webservice接口测试代码详解
2020/06/23 Python
如何基于Python爬取隐秘的角落评论
2020/07/02 Python
零基础学python应该从哪里入手
2020/08/11 Python
全球知名的婚恋交友网站:Match.com
2017/01/05 全球购物
应届生船舶驾驶求职信
2013/10/19 职场文书
环境工程大学生自荐信
2013/10/21 职场文书
艺术学院毕业生自我评价
2014/03/02 职场文书
乡镇机关党员民主评议表自我评价
2014/09/21 职场文书
闪闪的红星观后感
2015/06/08 职场文书
全家福照片寄语怎么写?
2019/04/02 职场文书
MySQL学习总结-基础架构概述
2021/04/05 MySQL
Python函数中apply、map、applymap的区别
2021/11/27 Python
分享python函数常见关键字
2022/04/26 Python