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 相关文章推荐
Javascript 圆角div的实现代码
Oct 15 Javascript
javascript预览上传图片发现的问题的解决方法
Nov 25 Javascript
Jquery中CSS选择器用法分析
Feb 10 Javascript
js游戏人物上下左右跑步效果代码分享
Aug 28 Javascript
Easyui 之 Treegrid 笔记
Apr 29 Javascript
jQuery实现打开页面渐现效果示例
Jul 27 Javascript
利用JS实现点击按钮后图片自动切换的简单方法
Oct 24 Javascript
纯javascript版日历控件
Nov 24 Javascript
正则表达式基本语法及表单验证操作详解【基于JS】
Apr 07 Javascript
Vue.js在数组中插入重复数据的实现代码
Nov 17 Javascript
JQuery选中select组件被选中的值方法
Mar 08 jQuery
JS实现刷新网页后之前浏览位置保持不变示例详解
Aug 14 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生成高清缩略图实例详解
2015/12/07 PHP
Android App中DrawerLayout抽屉效果的菜单编写实例
2016/03/21 PHP
php使用ffmpeg向视频中添加文字字幕的实现方法
2016/05/23 PHP
在 Laravel 6 中缓存数据库查询结果的方法
2019/12/11 PHP
JavaScript中prototype为对象添加属性的误区介绍
2013/10/15 Javascript
JQuery实现左右滚动菜单特效
2015/09/28 Javascript
js判断出两个字符串最大子串的函数实现方法
2016/11/01 Javascript
判断横屏竖屏(三种)
2017/02/13 Javascript
Vue + Webpack + Vue-loader学习教程之功能介绍篇
2017/03/14 Javascript
原生JS+Canvas实现五子棋游戏
2020/05/28 Javascript
微信小程序switch组件使用详解
2018/01/31 Javascript
20个最常见的jQuery面试问题及答案
2018/05/23 jQuery
jQuery实现侧边栏隐藏与显示的方法详解
2018/12/22 jQuery
你了解vue3.0响应式数据怎么实现吗
2019/06/07 Javascript
jquery 键盘事件 keypress() keydown() keyup()用法总结
2019/10/23 jQuery
js将URL网址转为16进制加密与解密函数
2020/03/04 Javascript
node.js +mongdb实现登录功能
2020/06/18 Javascript
JS实现按比例缩小图片宽高
2020/08/24 Javascript
Swiper实现导航栏滚动效果
2020/10/16 Javascript
vuex Module将 store 分割成模块的操作
2020/12/07 Vue.js
[54:05]DOTA2-DPC中国联赛定级赛 SAG vs iG BO3第一场 1月9日
2021/03/11 DOTA
flask中使用SQLAlchemy进行辅助开发的代码
2013/02/10 Python
Python threading多线程编程实例
2014/09/18 Python
Python中集合的内建函数和内建方法学习教程
2015/08/19 Python
解析Mac OS下部署Pyhton的Django框架项目的过程
2016/05/03 Python
numpy排序与集合运算用法示例
2017/12/15 Python
python实现银联支付和支付宝支付接入
2019/05/07 Python
简单了解python中的f.b.u.r函数
2019/11/02 Python
Python sorted排序方法如何实现
2020/03/31 Python
护士自我鉴定范文
2013/10/06 职场文书
委托书的写法
2014/08/30 职场文书
项目经理岗位职责范本
2015/04/01 职场文书
大国崛起英国观后感
2015/06/02 职场文书
安全生产奖惩制度
2015/08/06 职场文书
学校运动会感想
2015/08/10 职场文书
2016年学校“6﹒26国际禁毒日”宣传活动总结
2016/04/05 职场文书