基于zepto的移动端轻量级日期插件

前言

作过移动Web开发的同窗都知道,移动端日期选择是很常见的需求。在PC端,咱们有很丰富的选择,比较出名的就有MobiscrolljQuery UI Datepicker。我的看来,这些插件存在的两个显而易见的问题,第一是太重的依赖,对于jQuery的插件,已经强制依赖了80多k的庞然大物,把不少移动端项目拒之门外;第二是太过强大的功能,不少插件花百分之八十的时间去完善插件百分之二十炫酷的额外功能,致使代码量变大,配置繁杂。因此一款少依赖轻量级使用简单的移动端日期选择插件是很是必要的。本文简单介绍近来写的一款基于zepto的移动端轻量级日期插件--date_pickercss

插件设计原则

只保留最必要的功能

日期选择插件无非就是能够进行年、月、日选择,而且提供必要的年月切换动画特效,至于什么最小时间、最大时间、主题定制,概不在本插件功能范围。html

保留必要的依赖

本插件虽然说是基于zepto,实际上还隐性依赖了Github上面一个比较牛的库fastclick。咱们知道,移动端点击事件处理有两个常见的问题:(1)移动端click事件有300ms,一般采用touch事件来代替click事件来提升灵敏性;(2)touch事件会存在穿透的问题,通常插件都不用touch事件;基于这两个问题,fastclick作了兼容,只须要简单调用它提供的api就可以愉快得和本来同样调用click事件,因此这个依赖不能省。至于依赖zepto,其实是无关紧要的,一来博主平时工做都是写原生js的,不用插件也没多大的感受,二来插件受众面就会小一些。不过鉴于zepto在移动端已然和zepto在PC端同样如鱼得水,就绝不客气采用了。android

既可以支持模块化又能本地引用文件使用的

久远一点的插件基本都是让你下载一个文件,而后用script去引用,这样本无可厚非,只不过放着最大的包管理器npm不用,岂不是对不起页面仔这个称号。因此本插件支持文件引用也支持CMD方式的模块引用。git

功能介绍

直接上图:
图片描述github

技术细节

transitionEnd事件

插件的主面板是当前月份的天数详情,若是点击上一个月或者下一个月插件须要计算出上一个月或者下一个月的天数信息,而后插入到DOM节点中。在插入到DOM节点以后,就须要采用动画效果来显示最新的一月而且褪去老的一个月,采用的方式是CSS2d转化加过渡。咱们须要处理的就是在旧的一个月褪去看不见的时候及时从DOM树中删除,否则若是用户一直点下一个月或者上一个月的话,内存会炸的。为了实现这个移除功能,一个办法是采用setTimeout事件在特定的时间去删除节点,通过尝试,发现因为Javascript定时器不许确的特性和先后一个月切换带来的逻辑复杂度增长,这种方案很不可行。
因而,本插件采用了第二个方案:transitionEnd事件。直接引用一下MDN的介绍:web

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.npm

也就是只要你不去随便乱动元素的CSS属性,在动画完成的时候,你就能够执行相应的操做(删除节点)。
再来看看兼容性:
图片描述
对于移动Web开发足矣!api

最后就是在绑定事件的兼容性问题,不一样厂商对于这个事件的定义并不一致,好比IOS里面监听的是transitionend事件,可是在安卓里面监听transitionend事件彻底没反应,通过一番Google,发现安卓须要监听webkitTransitionEnd事件。为了解决绑定事件时候的兼容性问题,就须要检测浏览器到底支持哪一种事件。下面贴上Stackoverflow上面一个问答的代码片断:浏览器

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.cssdatepicker.min.js

  • 从npm下载安装:npm install --save date_picker

使用

  • 引用样式datepicker.min.css

  • 引用datepicker.min.js或者引用模块var DatePicker = require('date_picker');

  • 实例化组件,绑定插件日期选择完成以后的回调函数

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();
    };

插件外置两个API: openclose,其中特别注意上面demo中_date在获取焦点以后里面强制去除了焦点,是为了不安卓下面为input标签设置readonly属性并不能禁止原生键盘弹出的问题。

在线Demo

点击连接在PC上查看效果或者手机扫码可直接在手机上查看效果:
图片描述

小结

本插件代码托管在Github上面,仓库地址为:https://github.com/yuanzm/simple-date-picker
npm上面的仓库地址为:https://www.npmjs.com/package/date_picker
最后打个小广告,欢迎follow个人github: https://github.com/yuanzm

参考资料

http://stackoverflow.com/questions/13823188/android-4-1-change-transition-and-webkittransition-defiend-how-to-properly-de

相关文章
相关标签/搜索