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 相关文章推荐
js图片滚动效果时间可随意设定当鼠标移上去时停止
Jun 26 Javascript
jQuery中focus事件用法实例
Dec 26 Javascript
javascript实现ecshop搜索框键盘上下键切换控制
Mar 18 Javascript
JS延时器提示框的应用实例代码解析
Apr 27 Javascript
Vuex简单入门
Apr 19 Javascript
基于BootStrap multiselect.js实现的下拉框联动效果
Jul 28 Javascript
jquery插件开发之选项卡制作详解
Aug 30 jQuery
JS中promise化微信小程序api
Apr 12 Javascript
对 Vue-Router 进行单元测试的方法
Nov 05 Javascript
jQuery实现的解析本地 XML 文档操作示例
Apr 30 jQuery
JavaScript Image对象实现原理实例解析
Aug 26 Javascript
手动实现vue2.0的双向数据绑定原理详解
Feb 06 Vue.js
由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
写了一个layout,拖动条连贯,内容区可为iframe
2007/08/19 Javascript
JavaScript 拖拉缩放效果
2008/12/10 Javascript
Javascript 面向对象 继承
2010/05/13 Javascript
jquery实现输入框动态增减的实例代码
2013/07/14 Javascript
方便实用的jQuery checkbox复选框全选功能简单实例
2013/10/09 Javascript
javascript 实现子父窗体互相传值的简单实例
2014/02/17 Javascript
JS将数字转换成三位逗号分隔的样式(示例代码)
2014/02/19 Javascript
zeroclipboard 单个复制按钮和多个复制按钮的实现方法
2014/06/14 Javascript
js设置控件的隐藏与显示的两种方法
2014/08/21 Javascript
connection reset by peer问题总结及解决方案
2016/10/21 Javascript
jquery 多个radio的click事件实例
2016/12/03 Javascript
使用nodejs爬取前程无忧前端技能排行
2017/05/06 NodeJs
浅谈JavaScript的innerWidth与innerHeight
2017/10/12 Javascript
Vue.js划分组件的方法
2017/10/29 Javascript
jquery 获取索引值在一定范围的列表方法
2018/01/25 jQuery
微信小程序实现通过双向滑动缩放图片大小的方法
2018/12/30 Javascript
详解JS浏览器事件循环机制
2019/03/27 Javascript
Vue(定时器)解决mounted不能获取到data中的数据问题
2020/07/30 Javascript
vue element ui validate 主动触发错误提示操作
2020/09/21 Javascript
JQuery Ajax如何实现注册检测用户名
2020/09/25 jQuery
微信小程序实现锚点跳转
2020/11/23 Javascript
python+mysql实现简单的web程序
2014/09/11 Python
浅谈python标准库--functools.partial
2019/03/13 Python
python实现一个函数版的名片管理系统过程解析
2019/08/27 Python
python框架flask表单实现详解
2019/11/04 Python
使用Python paramiko模块利用多线程实现ssh并发执行操作
2019/12/05 Python
django中related_name的用法说明
2020/05/20 Python
canvas之自定义头像功能实现代码示例
2017/09/29 HTML / CSS
详解canvas绘图时遇到的跨域问题
2018/03/22 HTML / CSS
化工工艺设计求职信
2014/06/25 职场文书
软件项目经理岗位职责
2015/04/01 职场文书
建党伟业的观后感
2015/06/01 职场文书
JavaScript 防篡改对象的用法示例
2021/04/24 Javascript
Python-typing: 类型标注与支持 Any类型详解
2021/05/10 Python
Python pandas求方差和标准差的方法实例
2021/08/04 Python
JS开发前端团队展示控制器来为成员引流
2022/08/14 Javascript