基于zepto的移動(dòng)端輕量級(jí)日期插件--date_picker
前言
做過移動(dòng)Web開發(fā)的同學(xué)都知道,移動(dòng)端日期選擇是很常見的需求。在PC端,我們有很豐富的選擇,比較出名的就有Mobiscroll和jQuery UI Datepicker。個(gè)人看來,這些插件存在的兩個(gè)顯而易見的問題,第一是過重的依賴,對(duì)于jQuery的插件,已經(jīng)強(qiáng)制依賴了80多k的龐然大物,把很多移動(dòng)端項(xiàng)目拒之門外;第二是太過強(qiáng)大的功能,很多插件花百分之八十的時(shí)間去完善插件百分之二十炫酷的額外功能,導(dǎo)致代碼量變大,配置繁雜。所以一款少依賴、輕量級(jí)和使用簡(jiǎn)單的移動(dòng)端日期選擇插件是非常必要的。本文簡(jiǎn)單介紹近來寫的一款基于zepto的移動(dòng)端輕量級(jí)日期插件--date_picker。
插件設(shè)計(jì)原則
只保留最必要的功能
日期選擇插件無非就是可以進(jìn)行年、月、日選擇,并且提供必要的年月切換動(dòng)畫特效,至于什么最小時(shí)間、最大時(shí)間、主題定制,概不在本插件功能范圍。
保留必要的依賴
本插件雖說是基于zepto,實(shí)際上還隱性依賴了Github上面一個(gè)比較牛的庫(kù)fastclick。我們知道,移動(dòng)端點(diǎn)擊事件處理有兩個(gè)常見的問題:(1)移動(dòng)端click事件有300ms,通常采用touch事件來代替click事件來提高靈敏性;(2)touch事件會(huì)存在穿透的問題,一般插件都不用touch事件;基于這兩個(gè)問題,fastclick做了兼容,只需要簡(jiǎn)單調(diào)用它提供的api就能夠愉快得和原本一樣調(diào)用click事件,所以這個(gè)依賴不能省。至于依賴zepto,實(shí)際上是可有可無的,一來博主平時(shí)工作都是寫原生js的,不用插件也沒多大的感覺,二來插件受眾面就會(huì)小一些。不過鑒于zepto在移動(dòng)端已然和zepto在PC端一樣如魚得水,就毫不客氣采用了。
既能夠支持模塊化又能本地引用文件使用的
久遠(yuǎn)一點(diǎn)的插件基本都是讓你下載一個(gè)文件,然后用script去引用,這樣本無可厚非,只不過放著最大的包管理器npm不用,豈不是對(duì)不起頁面仔這個(gè)稱號(hào)。所以本插件支持文件引用也支持CMD方式的模塊引用。
功能介紹
直接上圖:

技術(shù)細(xì)節(jié)
transitionEnd事件
插件的主面板是當(dāng)前月份的天數(shù)詳情,如果點(diǎn)擊上一個(gè)月或者下一個(gè)月插件需要計(jì)算出上一個(gè)月或者下一個(gè)月的天數(shù)信息,然后插入到DOM節(jié)點(diǎn)中。在插入到DOM節(jié)點(diǎn)之后,就需要采用動(dòng)畫效果來顯示最新的一月并且褪去老的一個(gè)月,采用的方式是CSS2d轉(zhuǎn)化加過渡。我們需要處理的就是在舊的一個(gè)月褪去看不見的時(shí)候及時(shí)從DOM樹中刪除,不然如果用戶一直點(diǎn)下一個(gè)月或者上一個(gè)月的話,內(nèi)存會(huì)炸的。為了實(shí)現(xiàn)這個(gè)移除功能,一個(gè)辦法是采用setTimeout事件在特定的時(shí)間去刪除節(jié)點(diǎn),經(jīng)過嘗試,發(fā)現(xiàn)由于Javascript定時(shí)器不準(zhǔn)確的特性和前后一個(gè)月切換帶來的邏輯復(fù)雜度增加,這種方案很不可行。
于是,本插件采用了第二個(gè)方案:transitionEnd事件。直接引用一下MDN的介紹:
The transitionend event is fired when a CSS transition has completed. In the case where a transition is removed before completion, such as if the transition-property is removed, then the event will not fire. The event will also not fire if the animated element becomes display: none before the transition fully completes.
也就是只要你不去隨便亂動(dòng)元素的CSS屬性,在動(dòng)畫完成的時(shí)候,你就可以執(zhí)行相應(yīng)的操作(刪除節(jié)點(diǎn))。
再來看看兼容性:

對(duì)于移動(dòng)Web開發(fā)足矣!
最后就是在綁定事件的兼容性問題,不同廠商對(duì)于這個(gè)事件的定義并不一致,比如IOS里面監(jiān)聽的是transitionend事件,但是在安卓里面監(jiān)聽transitionend事件完全沒反應(yīng),經(jīng)過一番Google,發(fā)現(xiàn)安卓需要監(jiān)聽webkitTransitionEnd事件。為了解決綁定事件時(shí)候的兼容性問題,就需要檢測(cè)瀏覽器到底支持哪種事件。下面貼上Stackoverflow上面一個(gè)問答的代碼片段:
function whichTransitionEvent() {
var t,
el = document.createElement('fakeelement');
transitions = {
'OTransition' :'oTransitionEnd',
'MSTransition' :'msTransitionEnd',
'MozTransition' :'transitionend',
'WebkitTransition' :'webkitTransitionEnd',
'transition' :'transitionEnd'
};
for(t in transitions){
if( el.style[t] !== undefined ){
return transitions[t];
}
}
return false;
}
安裝使用
安裝
支持下面兩種方式
- git clone之后直接拷貝引用bin文件夾下面的datepicker.min.css和datepicker.min.js
- 從npm下載安裝:npm install --save date_picker
使用
引用樣式datepicker.min.css
引用datepicker.min.js或者引用模塊var DatePicker = require('date_picker');
實(shí)例化組件,綁定插件日期選擇完成之后的回調(diào)函數(shù)
var _date = document.getElementById('date');
var datePicker = new DatePicker({
confirmCbk: function(data) {
_date.value = data.year + '-' + data.month + '-' + data.day;
}
});
_date.onfocus = function(e) {
_date.blur();
datePicker.open();
};
插件外置兩個(gè)API: open和close,其中特別注意上面demo中_date在獲取焦點(diǎn)之后里面強(qiáng)制去除了焦點(diǎn),是為了避免安卓下面為input標(biāo)簽設(shè)置readonly屬性并不能禁止原生鍵盤彈出的問題。
- zepto.js中tap事件阻止冒泡的實(shí)現(xiàn)方法
- zepto中使用swipe.js制作輪播圖附swipeUp,swipeDown不起效果問題
- zepto與jquery的區(qū)別及zepto的不同使用8條小結(jié)
- 基于zepto.js實(shí)現(xiàn)仿手機(jī)QQ空間的大圖查看組件ImageView.js詳解
- 基于zepto.js簡(jiǎn)單實(shí)現(xiàn)上傳圖片
- 移動(dòng)端翻頁插件dropload.js(支持Zepto和jQuery)
- jQuery插件zepto.js簡(jiǎn)單實(shí)現(xiàn)tab切換
- Zepto實(shí)現(xiàn)密碼的隱藏/顯示
相關(guān)文章
jquery實(shí)現(xiàn)標(biāo)題字體變換的滑動(dòng)門菜單效果
這篇文章主要介紹了jquery實(shí)現(xiàn)標(biāo)題字體變換的滑動(dòng)門菜單效果,通過調(diào)用自定義函數(shù)實(shí)現(xiàn)頁面tab切換及字體樣式同步變換的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09
基于jQuery.Validate驗(yàn)證庫(kù)知識(shí)點(diǎn)的詳解
本篇文章介紹了,基于jQuery.Validate驗(yàn)證庫(kù)知識(shí)點(diǎn)的詳解。需要的朋友參考下2013-04-04
Jquery實(shí)現(xiàn)點(diǎn)擊切換圖片并隱藏顯示內(nèi)容(2種方法實(shí)現(xiàn))
電腦屏幕大小是固定的,那么如何在有限的空間放更多的內(nèi)容呢,jquery的tab切換式瀏覽卻可以解決這個(gè)問題2013-04-04
jQuery插件MixItUp實(shí)現(xiàn)動(dòng)畫過濾和排序
MixItUp過濾排序jQuery插件是一款鼠標(biāo)滑過圖片顯示描述的jQuery過濾排序插件。是一款輕量,但功能強(qiáng)大的 jQuery 插件,提供了對(duì)分類和有序內(nèi)容的美麗的動(dòng)畫過濾和排序功能。特別適合用于作品集網(wǎng)站,畫廊,圖片博客以及任何的分類或有序內(nèi)容。2015-04-04
jQuery 如何實(shí)現(xiàn)一個(gè)滑動(dòng)按鈕開關(guān)
本文給大家分享一段jquery代碼實(shí)現(xiàn)滑動(dòng)按鈕開關(guān)的效果,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的的朋友參考下2016-12-12

