原生Js實現(xiàn)按的數(shù)據(jù)源均分時間點幻燈片效果(已封裝)
更新時間:2010年12月28日 23:14:00 作者:
騰訊新聞詳情頁有一個事件進展效果, 覺得挺有意思. 于是, 就有了本文的效果: 按數(shù)據(jù)源均分時間點幻燈. 花了三個多小時寫的, 當然, 包括樣式與調(diào)試. 兼容主流。
建議在Chrom,Firefox,Opera,Safari等標準瀏覽器中查看. Ie下沒有陰影及圓角.
實現(xiàn)了根據(jù)源數(shù)據(jù)(樣例中是一個JSON數(shù)據(jù)組)總條數(shù), 均分出時間點以平滑向右動畫方式顯示在時間線上, 當鼠標劃過時間點時, 顯示對應的日期及標題. 鼠標劃過事件, 充分考慮了用戶體驗, 當用戶快速(無意識移動)從時間點上劃過時, 并不觸發(fā)相應事件.
相關的方法說明及使用, 請參見下面的注釋或發(fā)評論, 同時也歡迎大家找bug并提交.

Js核心代碼點此查看樣例
var JSONData=[{...},{...},...];//數(shù)據(jù)源,一切皆因它而生,因它而滅
function iTimePoint(iTimeSlideId, dateId, timeLineId, titleTop, titleId, defaultShow){
/* 傳入?yún)?shù)說明:
* iTimeSlideId: 外圍ID名. 本樣例DOM中#itimeslide;
* dateId: 日期ID名. 本樣例DOM中#date;
* timeLineId: 時間點分布ID名. 本樣例DOM中#timeline;
* titleTop: 標題容器上方小三角ID名. 本樣例DOM中#titletop;
* titleId: 標題容器ID名. 本樣例DOM中#title;
* defaultShow: 設定初始顯示的時間點, 默認為0, 可不傳值
*/
//參數(shù)判斷,測試用,成功運行后可刪除
if (arguments.length < 5 || arguments.length>6) {
alert('參數(shù)傳入錯誤,請傳入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;
}
}
}
}
//整個函數(shù)變量定義區(qū)
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;//幻燈區(qū)實際寬度
var timePoint = document.createElement('ul');//用來存儲時間點的ul
var timePointLeft = null;//時間點相對于父元素左邊距離
var timePointLeftCur = null;//每兩個時間點間距
var pointIndex = 0;//時間點在隊列中的索引值
var defaultShow = defaultShow || 0;//默認顯示的時間
var clearFun=null;//當用戶無意識的劃過時中止執(zhí)行
var that=null;
//根據(jù)數(shù)據(jù)條數(shù)生成對應的時間點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
//提升用戶體驗,當用戶無意識地劃過時不執(zhí)行函數(shù)
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>';
//改變?nèi)掌诩皹祟}的位置,此處減去的數(shù)字,可根據(jù)實際樣式調(diào)整
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為認定無意識劃過的時間,可自行調(diào)節(jié)
}
timePoints[i].onmouseout = function(){
//若停留時間低于200ms,認定為無意識劃過,中止函數(shù)
clearTimeout(clearFun);
}
}
}
實現(xiàn)了根據(jù)源數(shù)據(jù)(樣例中是一個JSON數(shù)據(jù)組)總條數(shù), 均分出時間點以平滑向右動畫方式顯示在時間線上, 當鼠標劃過時間點時, 顯示對應的日期及標題. 鼠標劃過事件, 充分考慮了用戶體驗, 當用戶快速(無意識移動)從時間點上劃過時, 并不觸發(fā)相應事件.
相關的方法說明及使用, 請參見下面的注釋或發(fā)評論, 同時也歡迎大家找bug并提交.

Js核心代碼點此查看樣例
復制代碼 代碼如下:
var JSONData=[{...},{...},...];//數(shù)據(jù)源,一切皆因它而生,因它而滅
function iTimePoint(iTimeSlideId, dateId, timeLineId, titleTop, titleId, defaultShow){
/* 傳入?yún)?shù)說明:
* iTimeSlideId: 外圍ID名. 本樣例DOM中#itimeslide;
* dateId: 日期ID名. 本樣例DOM中#date;
* timeLineId: 時間點分布ID名. 本樣例DOM中#timeline;
* titleTop: 標題容器上方小三角ID名. 本樣例DOM中#titletop;
* titleId: 標題容器ID名. 本樣例DOM中#title;
* defaultShow: 設定初始顯示的時間點, 默認為0, 可不傳值
*/
//參數(shù)判斷,測試用,成功運行后可刪除
if (arguments.length < 5 || arguments.length>6) {
alert('參數(shù)傳入錯誤,請傳入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;
}
}
}
}
//整個函數(shù)變量定義區(qū)
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;//幻燈區(qū)實際寬度
var timePoint = document.createElement('ul');//用來存儲時間點的ul
var timePointLeft = null;//時間點相對于父元素左邊距離
var timePointLeftCur = null;//每兩個時間點間距
var pointIndex = 0;//時間點在隊列中的索引值
var defaultShow = defaultShow || 0;//默認顯示的時間
var clearFun=null;//當用戶無意識的劃過時中止執(zhí)行
var that=null;
//根據(jù)數(shù)據(jù)條數(shù)生成對應的時間點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
//提升用戶體驗,當用戶無意識地劃過時不執(zhí)行函數(shù)
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>';
//改變?nèi)掌诩皹祟}的位置,此處減去的數(shù)字,可根據(jù)實際樣式調(diào)整
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為認定無意識劃過的時間,可自行調(diào)節(jié)
}
timePoints[i].onmouseout = function(){
//若停留時間低于200ms,認定為無意識劃過,中止函數(shù)
clearTimeout(clearFun);
}
}
}
相關文章
原生js實現(xiàn)移動開發(fā)輪播圖、相冊滑動特效
原生JS實現(xiàn)圖片自動輪播緩沖切換特效,很實用流暢的圖片輪播特效,在較現(xiàn)代的瀏覽器上展現(xiàn)的圓角效果,兼容差點的是直角效果,全部原生JS實現(xiàn),還是很不錯的值得大家學習并利用,推薦下載。2015-04-04JS組件系列之MVVM組件 vue 30分鐘搞定前端增刪改查
這篇文章主要介紹了JS組件系列之MVVM組件 vue 30分鐘搞定前端增刪改查,需要的朋友可以參考下2017-04-04JS中getElementsByClassName與classList兼容性問題解決方案分析
這篇文章主要介紹了JS中getElementsByClassName與classList兼容性問題解決方案,結合實例形式分析了getElementsByClassName與classList的使用方法、原理及兼容性問題的處理技巧,需要的朋友可以參考下2019-08-08JavaScript實現(xiàn)頁面滾動圖片加載(仿lazyload效果)
網(wǎng)上的很多這樣的效果都是用jQuery的方法,可是如果不用jQuery的站長難道就不能用這種方法了么2011-07-07