移动端类似IOS的滚动年月控件(需要jQuery和iScroll)

http://www.cnblogs.com/ccblogs/p/5260949.html

一. 效果图

二. 功能介绍

  支持滚动和点击选择年月。(目前只支持设置年月的最大最小值,不支持整体的最大最小值)

三. 代码

  1. 在你的html中添加如下代码:

    直接加载<body>里面,这里是插件渲染html的地方。

<div id="datePlugin"></div>

  2. 在你的html中添加输入框:

    可以是直接的一个输入框,也可以是input-group样式的。

    我这里使用的时input-group,html是由JS加载的。

'<div class="item item-buydate input-group">' +
'<span class="input-group-span no-border-right" id="buydate-span">申购成交时间</span>' +
'<input class="txt-input txt-buydate no-border-left text-right" type="text" placeholder="请选择申购日期" readonly>' +
'</div>';

  3. 调用方法:

$('.item-buydate').date({ title: '申购成交时间' });

  4. JS源代码:

复制代码
(function($) {
  $.fn.date = function(options) {
    var that = $(this);
    var docType = $(this).is('input');
    var nowdate = new Date();
    var indexY = 1,
      indexM = 1;
    var initY = parseInt((nowdate.getYear() + '').substr(1, 2));
    var initM = parseInt(nowdate.getMonth() + '') + 1;
    var yearScroll = null,
      monthScroll = null;
    $.fn.date.defaultOptions = {
      title: '请选择年月',
      beginyear: 2000, //日期--年--份开始
      endyear: nowdate.getFullYear(), //日期--年--份结束
      beginmonth: 1, //日期--月--份结束
      endmonth: 12, //日期--月--份结束
      curdate: false, //打开日期是否定位到当前日期
      mode: null, //操作模式(滑动模式)
      event: "click", //打开日期插件默认方式为点击后后弹出日期
      isShowByDefault: false,
      isSetFinancialDefaultDateValue: false
    }
    var opts = $.extend(true, {}, $.fn.date.defaultOptions, options);
    if (opts.isSetFinancialDefaultDateValue) {
      if (opts.beginyear < opts.endyear) {
        initY = ((opts.endyear - 1) + '').substr(2, 2);
      } else if (opts.beginyear = opts.endyear) {
        initY = (opts.endyear + '').substr(2, 2);
      }
    }
    if (opts.isShowByDefault) {
      showDatePicker()
    }
    that.bind(opts.event, showDatePicker);

    function showDatePicker() {
      createUL();
      init_iScrll();
      extendOptions();
      that.blur();
      refreshDate();
      bindButton();
    }

    function refreshDate() {
      yearScroll.refresh();
      monthScroll.refresh();
      resetInitDete();
      yearScroll.scrollTo(0, initY * 40, 100, true);
      monthScroll.scrollTo(0, initM * 40 - 40, 100, true);
    }

    function resetIndex() {
      indexY = 1;
      indexM = 1;
    }

    function resetInitDete() {
      if (opts.curdate) {
        return false;
      } else if (that.val() === '') {
        if (that.children('input').val() === '') {
          return false;
        }
        initY = parseInt(that.children('input').val().substr(2, 2));
        initM = parseInt(that.children('input').val().substr(5, 2));
      } else {
        initY = parseInt(that.val().substr(2, 2));
        initM = parseInt(that.val().substr(5, 2));
      }
    }

    function bindButton() {
      resetIndex();
      $("#yearwrapper ul li").unbind('click').click(function() {
        if ($(this).hasClass("placeholder")) {
          return false;
        }
        var target = $(this).prev('li');
        yearScroll.scrollToElement(target[0]);
        indexY = $(this).attr('data-params');
        $("#dateconfirm").removeClass("disabled");
      });
      $("#monthwrapper ul li").unbind('click').click(function() {
        if ($(this).hasClass("placeholder")) {
          return false;
        }
        var target = $(this).prev('li');
        monthScroll.scrollToElement(target[0]);
        indexM = $(this).attr('data-params');
        $("#dateconfirm").removeClass("disabled");
      });
      $("#dateshadow").unbind('click').click(function() {
        $("#datePage").hide();
        $("#dateshadow").hide();
      });
      $("#dateconfirm").unbind('click').click(function() {
        if ($(this).hasClass('disabled')) {
          return false;
        }
        if (indexY !== undefined && indexY !== '') {
          indexY = parseInt(parseFloat(indexY).toFixed(0));
        }
        if (indexM !== undefined && indexM !== '') {
          indexM = parseInt(parseFloat(indexM).toFixed(0));
        }
        var datestr = $("#yearwrapper ul li:eq(" + indexY + ")").html().substr(0, $("#yearwrapper ul li:eq(" + indexY + ")").html().length - 1) + "-" +
          $("#monthwrapper ul li:eq(" + indexM + ")").html().substr(0, $("#monthwrapper ul li:eq(" + indexM + ")").html().length - 1);
        if (docType) {
          that.val(datestr);
          that.trigger('input');
        } else {
          that.children('input').val(datestr);
          that.children('input').trigger('input');
        }
        $("#datePage").hide();
        $("#dateshadow").hide();
      });
      $("#datecancle").click(function() {
        $("#datePage").hide();
        $("#dateshadow").hide();
      });
    }

    function extendOptions() {
      $("#datePage").show();
      $("#dateshadow").show();
    }
    //日期滑动
    function init_iScrll() {
      var oldIndexY = parseInt(indexY.toFixed(0));
      var oldIndexM = parseInt(indexM.toFixed(0));
      var strY = $("#yearwrapper ul li:eq(" + oldIndexY + ")").html().substr(0, $("#yearwrapper ul li:eq(" + oldIndexY + ")").html().length - 1);
      var strM = $("#monthwrapper ul li:eq(" + oldIndexM + ")").html().substr(0, $("#monthwrapper ul li:eq(" + oldIndexM + ")").html().length - 1);
      yearScroll = new iScroll("yearwrapper", {
        snap: "li",
        vScrollbar: false,
        onScrollMove: function() {
          $("#dateconfirm").addClass("disabled");
        },
        onScrollEnd: function() {
          indexY = (this.y / 40) * (-1) + 1;
          $("#dateconfirm").removeClass("disabled");
        }
      });
      monthScroll = new iScroll("monthwrapper", {
        snap: "li",
        vScrollbar: false,
        onScrollMove: function() {
          $("#dateconfirm").addClass("disabled");
        },
        onScrollEnd: function() {
          indexM = (this.y / 40) * (-1) + 1;
          $("#dateconfirm").removeClass("disabled");
        }
      });
    }

    function createUL() {
      CreateDateUI();
      $("#yearwrapper ul").html(createYEAR_UL());
      $("#monthwrapper ul").html(createMONTH_UL());
    }

    function CreateDateUI() {
      var str = '<div id="dateshadow"></div>' +
        '<div id="datePage" class="page">' +
        '<section>' +
        '<div id="datetitle">' + opts.title + '</div>' +
        '<div id="datemark"></div>' +
        '<div id="datescroll">' +
        '<div id="yearwrapper">' +
        '<ul></ul>' +
        '</div>' +
        '<div id="monthwrapper">' +
        '<ul></ul>' +
        '</div>' +
        '</div>' +
        '</section>' +
        '<footer id="dateFooter">' +
        '<div id="setcancle">' +
        '<ul>' +
        '<li id="dateconfirm">确定</li>' +
        '<li id="datecancle">取消</li>' +
        '</ul>' +
        '</div>' +
        '</footer>' +
        '</div>'
      $("#datePlugin").html(str);
    }

    function createYEAR_UL() {
      var str = '<li class="placeholder">&nbsp;</li>';
      for (var i = opts.beginyear; i <= opts.endyear; i++) {
        str += '<li data-params="' + (i - opts.beginyear + 1) + '">' + i + '年</li>';
      }
      return str + '<li class="placeholder">&nbsp;</li>';
    }

    function createMONTH_UL() {
      var str = '<li class="placeholder">&nbsp;</li>';
      for (var i = opts.beginmonth; i <= opts.endmonth; i++) {
        if (i < 10) {
          j = "0" + i;
        } else {
          j = i;
        }
        str += '<li data-params="' + (i - opts.beginmonth + 1) + '">' + j + '月</li>';
      }
      return str + '<li class="placeholder">&nbsp;</li>';
    }
  }
})(jQuery);
复制代码

   5. CSS样式:

复制代码
body,
div,
ul,
li,
h1 {
  padding: 0;
  margin: 0;
  font-family: Microsoft YaHei, Arail, sans-serif;
}

ul,
li {
  list-style: none;
  list-style-type: none;
}

#dateshadow {
  display: none;
  position: absolute;
   100%;
  height: 100%;
  top: 0;
  left: 0;
  background: #000000;
  opacity: 0.5;
}

#datePage {
  border-radius: 5px;
  position: absolute;
  top: 20%;
  margin: 0 auto;
  vertical-align: middle;
   80%;
  height: 238px;
  background: #FFFFFF;
  z-index: 9999999;
}

#datetitle {
  text-align: center;
  color: #666666;
  padding: 20px 10px 12px;
  line-height: 18px;
  font-size: 18px;
}

#datescroll {
  background: #F8F8F8;
  margin: 10px 18px;
  border: 1px solid #dddddd;
  border-radius: 3px;
  height: 120px;
  text-align: center;
  line-height: 40px;
}

.page {
  display: none;
  position: absolute;
  top: 0;
  left: 0;
  bottom: 0;
  right: 0;
   100%;
  height: 100%;
  overflow: hidden;
}

#datescroll div {
  float: left;
  margin-top: 15px;
}

#yearwrapper {
  position: absolute;
  margin-left: 16%;
  left: 0;
  top: 45px;
  bottom: 60px;
   32%;
}

#monthwrapper {
  position: absolute;
  margin-left: 28%;
  left: 26%;
  top: 45px;
  bottom: 60px;
   32%;
}

#yearwrapper ul li,
#monthwrapper ul li {
  color: #333333;
  font-size: 14px;
}

#setcancle ul {
  text-align: center;
  line-height: 30px;
}

#setcancle ul li {
  border-radius: 3px;
  float: left;
   32%;
  height: 30px;
  list-style-type: none;
  font-size: 14px;
}

#dateconfirm {
  position: absolute;
  background: #8e6dd1;
  right: 12%;
  color: #FFFFFF;
}

#dateconfirm.disabled {
  background: #dbdddd!important;
}

#datecancle {
  position: absolute;
  background: #dbdddd;
  left: 12%;
  color: #FFFFFF;
}

#datemark {
  left: 10%;
   80%;
  height: 30px;
  position: absolute;
  top: 104px;
  background: #eeeeee;
}

#datescroll_datetime {
  display: none;
  background: #F8F8F8;
   94%;
  margin: 10px 3%;
  margin-top: 10px;
  border: 1px solid #E0E0E0;
  border-radius: 4px;
  height: 120px;
  text-align: center;
  line-height: 40px;
}

#yearwrapper ul,
#monthwrapper ul {
   100%;
}

#dateFooter {
   100%;
  background: #fff;
  height: 44px;
  bottom: 0px;
  position: absolute;
}
复制代码
原文地址:https://www.cnblogs.com/libin-1/p/6043018.html