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生成asp.net服务器控件的代码
Feb 04 Javascript
文件编码导致jquery失效的解决方法
Jun 26 Javascript
利用javascript实现全部删或清空所选的操作
May 27 Javascript
jQuery zclip插件实现跨浏览器复制功能
Nov 02 Javascript
javascript简单实现等比例缩小图片的方法
Jul 27 Javascript
JSON字符串和JSON对象相互转化实例详解
Jan 05 Javascript
微信小程序之发送短信倒计时功能
Aug 30 Javascript
网页爬虫之cookie自动获取及过期自动更新的实现方法
Mar 06 Javascript
手挽手带你学React之React-router4.x的使用
Feb 14 Javascript
jQuery中实现text()的方法
Apr 04 jQuery
vue-cli3项目展示本地Markdown文件的方法
Jun 07 Javascript
React Native中ScrollView组件轮播图与ListView渲染列表组件用法实例分析
Jan 06 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
同时提取多条新闻中的文本一例
2006/10/09 PHP
PHP写杨辉三角实例代码
2011/07/17 PHP
php 搜索框提示(自动完成)实例代码
2012/02/05 PHP
WordPress中用于获取文章作者与分类信息的方法整理
2015/12/17 PHP
php获取目录下所有文件及目录(多种方法)(推荐)
2019/05/14 PHP
Javascript Math ceil()、floor()、round()三个函数的区别
2010/03/09 Javascript
实现图片预加载的三大方法及优缺点分析
2014/11/19 Javascript
PHP中使用微秒计算脚本执行时间例子
2014/11/19 Javascript
jquery实现通用的内容渐显Tab选项卡效果
2015/09/07 Javascript
浅谈JavaScript的push(),pop(),concat()方法
2016/06/03 Javascript
基于JavaScript实现复选框的全选和取消全选
2017/02/09 Javascript
老生常谈jquery id选择器和class选择器的区别
2017/02/12 Javascript
webstorm添加vue.js支持的方法教程
2017/07/05 Javascript
详解vue组件基础
2018/05/04 Javascript
对vue v-if v-else-if v-else 的简单使用详解
2018/09/29 Javascript
微信小程序按钮点击跳转页面详解
2019/05/06 Javascript
浅谈监听单选框radio改变事件(和layui中单选按钮改变事件)
2019/09/10 Javascript
layui数据表格 table.render 报错的解决方法
2019/09/29 Javascript
python逐行读取文件内容的三种方法
2014/01/20 Python
Python UnicodeEncodeError: 'gbk' codec can't encode character 解决方法
2015/04/24 Python
200行python代码实现2048游戏
2019/07/17 Python
Django Rest framework解析器和渲染器详解
2019/07/25 Python
解决Django migrate不能发现app.models的表问题
2019/08/31 Python
Python编程快速上手——Excel表格创建乘法表案例分析
2020/02/28 Python
pytorch判断是否cuda 判断变量类型方式
2020/06/23 Python
python 监控服务器是否有人远程登录(详细思路+代码)
2020/12/18 Python
CSS3中的注音对齐属性ruby-align用法指南
2016/07/01 HTML / CSS
html5 input输入实时检测以及延时优化
2018/07/18 HTML / CSS
美国在线购买空气净化器、除湿器、加湿器网站:AllergyBuyersClub
2021/03/16 全球购物
介绍一下write命令
2014/08/10 面试题
茶叶店创业计划书范文
2014/01/19 职场文书
网管求职信
2014/03/03 职场文书
现场活动策划方案
2014/08/22 职场文书
如何签定毕业生就业协议书
2014/09/28 职场文书
群众路线教育查摆剖析材料
2014/10/10 职场文书
交通事故赔偿协议书
2014/10/16 职场文书