原生Js實(shí)現(xiàn)按的數(shù)據(jù)源均分時(shí)間點(diǎn)幻燈片效果(已封裝)
實(shí)現(xiàn)了根據(jù)源數(shù)據(jù)(樣例中是一個(gè)JSON數(shù)據(jù)組)總條數(shù), 均分出時(shí)間點(diǎn)以平滑向右動(dòng)畫(huà)方式顯示在時(shí)間線(xiàn)上, 當(dāng)鼠標(biāo)劃過(guò)時(shí)間點(diǎn)時(shí), 顯示對(duì)應(yīng)的日期及標(biāo)題. 鼠標(biāo)劃過(guò)事件, 充分考慮了用戶(hù)體驗(yàn), 當(dāng)用戶(hù)快速(無(wú)意識(shí)移動(dòng))從時(shí)間點(diǎn)上劃過(guò)時(shí), 并不觸發(fā)相應(yīng)事件.
相關(guān)的方法說(shuō)明及使用, 請(qǐng)參見(jiàn)下面的注釋或發(fā)評(píng)論, 同時(shí)也歡迎大家找bug并提交.

Js核心代碼點(diǎn)此查看樣例
var JSONData=[{...},{...},...];//數(shù)據(jù)源,一切皆因它而生,因它而滅
function iTimePoint(iTimeSlideId, dateId, timeLineId, titleTop, titleId, defaultShow){
/* 傳入?yún)?shù)說(shuō)明:
* iTimeSlideId: 外圍ID名. 本樣例DOM中#itimeslide;
* dateId: 日期ID名. 本樣例DOM中#date;
* timeLineId: 時(shí)間點(diǎn)分布ID名. 本樣例DOM中#timeline;
* titleTop: 標(biāo)題容器上方小三角ID名. 本樣例DOM中#titletop;
* titleId: 標(biāo)題容器ID名. 本樣例DOM中#title;
* defaultShow: 設(shè)定初始顯示的時(shí)間點(diǎn), 默認(rèn)為0, 可不傳值
*/
//參數(shù)判斷,測(cè)試用,成功運(yùn)行后可刪除
if (arguments.length < 5 || arguments.length>6) {
alert('參數(shù)傳入錯(cuò)誤,請(qǐng)傳入5或6個(gè)值! :)');
return false;
}
//通用方法
var iBase = {
//document.getElementById
Id: function(name){
return document.getElementById(name);
},
//時(shí)間點(diǎn)動(dòng)畫(huà)顯示
PointSlide: function(elem, val){
//可通過(guò)修改i+=5中的5控制滑動(dòng)速度
for (var i = 0; i <= 100; i += 5) {
(function(){
//這個(gè)pos定義很重要,若直接使用閉包獲取到的不是上面的i
var pos = i;
//平滑移動(dòng)
setTimeout(function(){
elem.style.left = pos * val / 100 + 'px';
}, (pos + 1) * 10);
})();
}
},
//為元素添加樣式
AddClass: function(elem, val){
//若元素?zé)oclass,直接賦值
if (!elem.className) {
elem.className = val;
}else {
//否則通過(guò)添加空格新增一個(gè)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;
}
}
}
}
//整個(gè)函數(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ū)實(shí)際寬度
var timePoint = document.createElement('ul');//用來(lái)存儲(chǔ)時(shí)間點(diǎn)的ul
var timePointLeft = null;//時(shí)間點(diǎn)相對(duì)于父元素左邊距離
var timePointLeftCur = null;//每?jī)蓚€(gè)時(shí)間點(diǎn)間距
var pointIndex = 0;//時(shí)間點(diǎn)在隊(duì)列中的索引值
var defaultShow = defaultShow || 0;//默認(rèn)顯示的時(shí)間
var clearFun=null;//當(dāng)用戶(hù)無(wú)意識(shí)的劃過(guò)時(shí)中止執(zhí)行
var that=null;
//根據(jù)數(shù)據(jù)條數(shù)生成對(duì)應(yīng)的時(shí)間點(diǎn)html
for (var i = 0; i < dataLen; i++) {
timePoint.innerHTML += '<li></li>';
}
//將時(shí)間點(diǎn)插入到時(shí)間線(xiàn)DIV中
timeLine.appendChild(timePoint)
var timePoints = timeLine.getElementsByTagName('li');
//時(shí)間點(diǎn)平滑顯示
for (var i = 0; i < timePoints.length; i++) {
//每?jī)蓚€(gè)時(shí)間點(diǎn)間間距
timePointLeftCur = parseInt(iTimeSildeW / (dataLen + 1));
//計(jì)算對(duì)應(yīng)時(shí)間點(diǎn)左邊距
timePointLeft = (i + 1) * timePointLeftCur;
//時(shí)間點(diǎn)動(dòng)畫(huà)形式初始化
iBase.PointSlide(timePoints[i], timePointLeft);
//初始顯示時(shí)間點(diǎn)
setTimeout(function(){
timePoints[defaultShow].onmouseover();
}, 1200);
//獲取時(shí)間點(diǎn)默認(rèn)class值,為鼠標(biāo)事件做準(zhǔn)備
timePoints[i].oldClassName = timePoints[i].className;
timePoints[i].onmouseover = function(){
that = this;//確保clearFun中的this是當(dāng)前的this
//提升用戶(hù)體驗(yàn),當(dāng)用戶(hù)無(wú)意識(shí)地劃過(guò)時(shí)不執(zhí)行函數(shù)
clearFun=setTimeout(function(){
//計(jì)算出當(dāng)前時(shí)間點(diǎn)索引值,為鼠標(biāo)劃出做準(zhǔn)備
pointIndex = iBase.Index(that, timePoints);
//去除上一個(gè)時(shí)間點(diǎn)高亮樣式
for (var m = 0; m < timePoints.length; m++) {
if (m != pointIndex) {
timePoints[m].className = timePoints[m].oldClassName
}
}
//為當(dāng)前時(shí)間點(diǎn)加載高亮樣式
iBase.AddClass(that, 'hover');
//切換日期及標(biāo)題值
date.innerHTML = '<span>' + (JSONData[pointIndex]['date'] || '') + '</span><EM></EM>';
title.innerHTML = '<a href="' + (JSONData[pointIndex]['href'] || '') + '">' + (JSONData[pointIndex]['title'] || '') + '</a>';
//改變?nèi)掌诩皹?biāo)題的位置,此處減去的數(shù)字,可根據(jù)實(shí)際樣式調(diào)整
date.style.left = ((pointIndex + 1) * timePointLeftCur - 25) + 'px';
titletop.style.left = ((pointIndex + 1) * timePointLeftCur + 6) + 'px';
//當(dāng)標(biāo)題框左邊距與標(biāo)題框?qū)挾戎痛笥谕鈬鷮挾葧r(shí),以右邊為絕對(duì)點(diǎn)
if ((title.offsetWidth + (pointIndex + 1) * timePointLeftCur) < iTimeSildeW) {
title.style.left = ((pointIndex + 1) * timePointLeftCur - timePointLeftCur) + 'px';
}else {
title.style.left = (iTimeSildeW - title.offsetWidth) + 'px';
}
//顯示日期/時(shí)間點(diǎn)/標(biāo)題
date.style.display = 'block';
titletop.style.display = 'block';
title.style.display = 'block';
},200);//200為認(rèn)定無(wú)意識(shí)劃過(guò)的時(shí)間,可自行調(diào)節(jié)
}
timePoints[i].onmouseout = function(){
//若停留時(shí)間低于200ms,認(rèn)定為無(wú)意識(shí)劃過(guò),中止函數(shù)
clearTimeout(clearFun);
}
}
}
相關(guān)文章
原生js實(shí)現(xiàn)移動(dòng)開(kāi)發(fā)輪播圖、相冊(cè)滑動(dòng)特效
原生JS實(shí)現(xiàn)圖片自動(dòng)輪播緩沖切換特效,很實(shí)用流暢的圖片輪播特效,在較現(xiàn)代的瀏覽器上展現(xiàn)的圓角效果,兼容差點(diǎn)的是直角效果,全部原生JS實(shí)現(xiàn),還是很不錯(cuò)的值得大家學(xué)習(xí)并利用,推薦下載。2015-04-04JS組件系列之MVVM組件 vue 30分鐘搞定前端增刪改查
這篇文章主要介紹了JS組件系列之MVVM組件 vue 30分鐘搞定前端增刪改查,需要的朋友可以參考下2017-04-04使用GPT寫(xiě)代碼實(shí)現(xiàn)高亮頁(yè)面關(guān)鍵字
這篇文章主要為大家介紹了使用GPT寫(xiě)代碼實(shí)現(xiàn)高亮頁(yè)面關(guān)鍵字示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04JS中g(shù)etElementsByClassName與classList兼容性問(wèn)題解決方案分析
這篇文章主要介紹了JS中g(shù)etElementsByClassName與classList兼容性問(wèn)題解決方案,結(jié)合實(shí)例形式分析了getElementsByClassName與classList的使用方法、原理及兼容性問(wèn)題的處理技巧,需要的朋友可以參考下2019-08-08javascript+xml技術(shù)實(shí)現(xiàn)分頁(yè)瀏覽
基于web的技術(shù)中,分頁(yè)是一個(gè)老的不能再老的,但大家津津樂(lè)道的問(wèn)題,隨著xml技術(shù)的日漸應(yīng)用,把xml應(yīng)用到分頁(yè)當(dāng)中,也是一種可能,當(dāng)然網(wǎng)上的教程很多,當(dāng)我都是看得稀里糊涂,索性自己寫(xiě)一個(gè),與大家分享、指正。2008-07-07JavaScript實(shí)現(xiàn)頁(yè)面滾動(dòng)圖片加載(仿lazyload效果)
網(wǎng)上的很多這樣的效果都是用jQuery的方法,可是如果不用jQuery的站長(zhǎng)難道就不能用這種方法了么2011-07-07uni-app小程序分享功能實(shí)現(xiàn)方法舉例
這篇文章主要給大家介紹了關(guān)于uni-app小程序分享功能實(shí)現(xiàn)方法的相關(guān)資料,uni-app中有分享的API接口,但是需要現(xiàn)在QQ或者微信等開(kāi)發(fā)者平臺(tái)上注冊(cè)賬號(hào),驗(yàn)證公司信息,而且只能分享圖片或者文本等內(nèi)容,需要的朋友可以參考下2023-07-07一個(gè)關(guān)于javascript匿名函數(shù)的問(wèn)題分析
一個(gè)關(guān)于javascript匿名函數(shù)的問(wèn)題分析,學(xué)習(xí)js的朋友可以參考下2012-03-03