原生Js实现按的数据源均分时间点幻灯片效果(已封装)


Posted in Javascript onDecember 28, 2010

建议在Chrom,Firefox,Opera,Safari等标准浏览器中查看. Ie下没有阴影及圆角.

实现了根据源数据(样例中是一个JSON数据组)总条数, 均分出时间点以平滑向右动画方式显示在时间线上, 当鼠标划过时间点时, 显示对应的日期及标题. 鼠标划过事件, 充分考虑了用户体验, 当用户快速(无意识移动)从时间点上划过时, 并不触发相应事件.

相关的方法说明及使用, 请参见下面的注释或发评论, 同时也欢迎大家找bug并提交.
原生Js实现按的数据源均分时间点幻灯片效果(已封装)
Js核心代码点此查看样例

var JSONData=[{...},{...},...];//数据源,一切皆因它而生,因它而灭 function iTimePoint(iTimeSlideId, dateId, timeLineId, titleTop, titleId, defaultShow){ 
/* 传入参数说明: 
* iTimeSlideId: 外围ID名. 本样例DOM中#itimeslide; 
* dateId: 日期ID名. 本样例DOM中#date; 
* timeLineId: 时间点分布ID名. 本样例DOM中#timeline; 
* titleTop: 标题容器上方小三角ID名. 本样例DOM中#titletop; 
* titleId: 标题容器ID名. 本样例DOM中#title; 
* defaultShow: 设定初始显示的时间点, 默认为0, 可不传值 
*/ 
//参数判断,测试用,成功运行后可删除 
if (arguments.length < 5 || arguments.length>6) { 
alert('参数传入错误,请传入5或6个值! :)'); 
return false; 
} 
//通用方法 
var iBase = { 
//document.getElementById 
Id: function(name){ 
return document.getElementById(name); 
}, 
//时间点动画显示 
PointSlide: function(elem, val){ 
//可通过修改i+=5中的5控制滑动速度 
for (var i = 0; i <= 100; i += 5) { 
(function(){ 
//这个pos定义很重要,若直接使用闭包获取到的不是上面的i 
var pos = i; 
//平滑移动 
setTimeout(function(){ 
elem.style.left = pos * val / 100 + 'px'; 
}, (pos + 1) * 10); 
})(); 
} 
}, 
//为元素添加样式 
AddClass: function(elem, val){ 
//若元素无class,直接赋值 
if (!elem.className) { 
elem.className = val; 
}else { 
//否则通过添加空格新增一个class 
var oVal = elem.className; 
oVal += ' '; 
oVal += val; 
elem.className = val; 
} 
}, 
//获取元素索引 
Index: function(cur, obj){ 
for (var i = 0; i < obj.length; i++) { 
if (obj[i] == cur) { 
return i; 
} 
} 
} 
} 
//整个函数变量定义区 
var dataLen = JSONData.length; 
var iTimeSilde = iBase.Id(iTimeSlideId); 
var date = iBase.Id(dateId); 
var timeLine = iBase.Id(timeLineId); 
var titletop = iBase.Id(titleTop); 
var title = iBase.Id(titleId); 
var iTimeSildeW = iTimeSilde.offsetWidth;//幻灯区实际宽度 
var timePoint = document.createElement('ul');//用来存储时间点的ul 
var timePointLeft = null;//时间点相对于父元素左边距离 
var timePointLeftCur = null;//每两个时间点间距 
var pointIndex = 0;//时间点在队列中的索引值 
var defaultShow = defaultShow || 0;//默认显示的时间 
var clearFun=null;//当用户无意识的划过时中止执行 
var that=null; 
//根据数据条数生成对应的时间点html 
for (var i = 0; i < dataLen; i++) { 
timePoint.innerHTML += '<li></li>'; 
} 
//将时间点插入到时间线DIV中 
timeLine.appendChild(timePoint) 
var timePoints = timeLine.getElementsByTagName('li'); 
//时间点平滑显示 
for (var i = 0; i < timePoints.length; i++) { 
//每两个时间点间间距 
timePointLeftCur = parseInt(iTimeSildeW / (dataLen + 1)); 
//计算对应时间点左边距 
timePointLeft = (i + 1) * timePointLeftCur; 
//时间点动画形式初始化 
iBase.PointSlide(timePoints[i], timePointLeft); 
//初始显示时间点 
setTimeout(function(){ 
timePoints[defaultShow].onmouseover(); 
}, 1200); 
//获取时间点默认class值,为鼠标事件做准备 
timePoints[i].oldClassName = timePoints[i].className; 
timePoints[i].onmouseover = function(){ 
that = this;//确保clearFun中的this是当前的this 
//提升用户体验,当用户无意识地划过时不执行函数 
clearFun=setTimeout(function(){ 
//计算出当前时间点索引值,为鼠标划出做准备 
pointIndex = iBase.Index(that, timePoints); 
//去除上一个时间点高亮样式 
for (var m = 0; m < timePoints.length; m++) { 
if (m != pointIndex) { 
timePoints[m].className = timePoints[m].oldClassName 
} 
} 
//为当前时间点加载高亮样式 
iBase.AddClass(that, 'hover'); 
//切换日期及标题值 
date.innerHTML = '<span>' + (JSONData[pointIndex]['date'] || '') + '</span><EM></EM>'; 
title.innerHTML = '<a href="' + (JSONData[pointIndex]['href'] || '') + '">' + (JSONData[pointIndex]['title'] || '') + '</a>'; 
//改变日期及标题的位置,此处减去的数字,可根据实际样式调整 
date.style.left = ((pointIndex + 1) * timePointLeftCur - 25) + 'px'; 
titletop.style.left = ((pointIndex + 1) * timePointLeftCur + 6) + 'px'; 
//当标题框左边距与标题框宽度之和大于外围宽度时,以右边为绝对点 
if ((title.offsetWidth + (pointIndex + 1) * timePointLeftCur) < iTimeSildeW) { 
title.style.left = ((pointIndex + 1) * timePointLeftCur - timePointLeftCur) + 'px'; 
}else { 
title.style.left = (iTimeSildeW - title.offsetWidth) + 'px'; 
} 
//显示日期/时间点/标题 
date.style.display = 'block'; 
titletop.style.display = 'block'; 
title.style.display = 'block'; 
},200);//200为认定无意识划过的时间,可自行调节 
} 
timePoints[i].onmouseout = function(){ 
//若停留时间低于200ms,认定为无意识划过,中止函数 
clearTimeout(clearFun); 
} 
} 
}
Javascript 相关文章推荐
JavaScript 中的replace方法说明
Apr 13 Javascript
CCPry JS类库 代码
Oct 30 Javascript
JQuery 中几个类选择器的简单使用介绍
Mar 14 Javascript
js对table的td进行相同内容合并示例详解
Dec 27 Javascript
node.js实现爬虫教程
Aug 25 Javascript
JS基础随笔(菜鸟必看篇)
Jul 13 Javascript
Vue.JS入门教程之自定义指令
Dec 08 Javascript
jQuery分页插件jquery.pagination.js使用方法解析
Feb 09 Javascript
jQuery简单判断值是否存在于数组中的方法示例
Apr 17 jQuery
vue2.0 如何在hash模式下实现微信分享
Jan 22 Javascript
javascript系统时间设置操作示例
Jun 17 Javascript
简述Vue中容易被忽视的知识点
Dec 09 Javascript
按给定几率进行随机抽取的js代码
Dec 28 #Javascript
围观tangram js库
Dec 28 #Javascript
让你的博文自动带上缩址的实现代码,方便发到微博客上
Dec 28 #Javascript
JS弹出对话框返回值代码(asp.net后台)
Dec 28 #Javascript
jQuery Tips 为AJAX回调函数传递额外参数的方法
Dec 28 #Javascript
JavaScript去掉空格的方法集合
Dec 28 #Javascript
js常用排序实现代码
Dec 28 #Javascript
You might like
PHP数据库链接类(PDO+Access)实例分享
2013/12/05 PHP
PHP实现将科学计数法转换为原始数字字符串的方法
2014/12/16 PHP
thinkPHP自动验证、自动添加及表单错误问题分析
2016/10/17 PHP
thinkPHP多语言切换设置方法详解
2016/11/11 PHP
在laravel中使用with实现动态添加where条件
2019/10/10 PHP
转自Jquery官方 jQuery1.1.3发布,速度提升800%,体积保持20K
2007/08/19 Javascript
jQuery+css实现图片滚动效果(附源码)
2013/03/18 Javascript
js获得网页背景色和字体色的方法
2014/03/21 Javascript
jQuery+ajax实现滚动到页面底部自动加载图文列表效果(类似图片懒加载)
2016/06/07 Javascript
jquery实现界面无刷新加载登陆注册
2016/07/30 Javascript
js 获取元素所有兄弟节点的实现方法
2016/09/06 Javascript
Vue+Element使用富文本编辑器的示例代码
2017/08/14 Javascript
JavaScript实现随机数生成器(去重)
2017/10/13 Javascript
使用socket.io制做简易WEB聊天室
2018/01/02 Javascript
详解NodeJs开发微信公众号
2018/05/25 NodeJs
基于vue.js中关于下拉框的值默认及绑定问题
2018/08/22 Javascript
在Vue中使用antv的示例代码
2020/06/29 Javascript
Python字符转换
2008/09/06 Python
python logging类库使用例子
2014/11/22 Python
python中OrderedDict的使用方法详解
2017/05/05 Python
python和flask中返回JSON数据的方法
2018/03/26 Python
python发送告警邮件脚本
2018/09/17 Python
python实现数据分析与建模
2019/07/11 Python
PyQt+socket实现远程操作服务器的方法示例
2019/08/22 Python
python3实现高效的端口扫描
2019/08/31 Python
TensorFlow2.0:张量的合并与分割实例
2020/01/19 Python
Spring http服务远程调用实现过程解析
2020/06/11 Python
浅谈tensorflow 中的图片读取和裁剪方式
2020/06/30 Python
小学体育教学反思
2014/01/31 职场文书
《小鹰学飞》教学反思
2014/04/23 职场文书
环保建议书100字
2014/05/14 职场文书
财务助理岗位职责范本
2014/10/09 职场文书
埃及王子观后感
2015/06/16 职场文书
nginx作grpc的反向代理踩坑总结
2021/07/07 Servers
详解OpenCV获取高动态范围(HDR)成像
2022/04/29 Python
Python使用Opencv打开笔记本电脑摄像头报错解问题及解决
2022/06/21 Python