视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
HTML5自定义日历控件的示例代码详解
2020-11-27 15:10:02 责编:小采
文档
 http://www.gxlcms.com/wiki/1118.html" target="_blank">HTML5自定义日历控件的示例代码详解

ys_datetime_selector.css

.ys-datetime-selector{
 position:fixed;
 left:0;
 right:0;
 top:0;
 bottom:0;
 background-color:rgba(0,0,0,0.3);
 z-index: 999;
}
 
.ys-datetime-selector.display-hide{
 transform: translate3d(100%,0,0);
 -webkit-transform: translate3d(100%,0,0);
 visibility: hidden;
}
 
.ys-datetime-selector .ys-datetime-selector-content{
 position:absolute;
 left:0;
 right:0;
 bottom:0;
 background-color:#fff;
}
 
/* ======================================== ys-datetime-operation-bar ======================================== */
.ys-datetime-selector .ys-datetime-selector-content .ys-datetime-operation-bar{
 height:45px;
 line-height: 44px;
 border-bottom:1px solid #e0e0e0;
 text-align: center;
}
 
.ys-datetime-selector .ys-datetime-selector-content .ys-datetime-operation-bar span{
 color:#333;
 font-size:16px;
}
.ys-datetime-selector .ys-datetime-selector-content .ys-datetime-operation-bar a{
 position:absolute;
 top:0;
 bottom:0;
 padding:0 15px;
 font-size:16px;
 color:#4e9dcf;
}
.ys-datetime-selector .ys-datetime-selector-content .ys-datetime-operation-bar a.ys-datetime-cancel-btn{left:0;}
.ys-datetime-selector .ys-datetime-selector-content .ys-datetime-operation-bar a.ys-datetime-ok-btn{right:0;}
 
/* ======================================== ys-datetime-blocks ======================================== */
.ys-datetime-selector .ys-datetime-selector-content .ys-datetime-blocks{
 position:relative;
 height:170px;
 -webkit-mask-box-image: -webkit-linear-gradient(top, rgba(0,0,0,0.2), rgba(0,0,0,0.4) 20%,rgba(0,0,0,0.6) 39%,
 white 40%, white 60%,rgba(0,0,0,0.6) 41%, rgba(0,0,0,0.4) 80%,rgba(0,0,0,0.2));
 -webkit-mask-box-image: linear-gradient(to top, rgba(0,0,0,0.2), rgba(0,0,0,0.2), rgba(0,0,0,0.4) 20%,rgba(0,0,0,0.6) 39%,
 white 40%, white 60%,rgba(0,0,0,0.6) 41%, rgba(0,0,0,0.4) 80%,rgba(0,0,0,0.2));
}
 
.ys-datetime-selector .ys-datetime-selector-content .ys-datetime-blocks:before{
 content:"";
 position:absolute;
 left:0;
 right:0;
 height:1px;
 background-color:#cdcdcd;
 top:68px;
}
 
.ys-datetime-selector .ys-datetime-selector-content .ys-datetime-blocks:after{
 content:"";
 position:absolute;
 left:0;
 right:0;
 height:1px;
 background-color:#cdcdcd;
 bottom:68px;
}
 
 
.ys-datetime-selector .ys-datetime-selector-content .ys-datetime-blocks>div{
 width:33.333%;
 float:left;
}
 
.ys-datetime-selector .ys-datetime-selector-content .ys-datetime-blocks>div.block-hide{
 display:none;
}
 
.ys-datetime-selector .ys-datetime-selector-content .ys-datetime-blocks>div.width-50{
 width:50%;
}
 
.ys-datetime-selector .ys-datetime-selector-content .ys-datetime-blocks>div.width-100{
 width:100%;
}
 
 
.ys-datetime-selector .ys-datetime-selector-content .ys-datetime-blocks .swiper-container{
 height:170px;
}
.ys-datetime-selector .ys-datetime-selector-content .ys-datetime-blocks .swiper-container .swiper-slide{
 height:34px;
 line-height: 34px;
 text-align: center;
}
 
/* ================================================== page animation start ================================================== */
.ys-datetime-selector .datetime-selector-animated{
 animation-duration: 0.3s;
 -webkit-animation-duration: 0.3s;
 -webkit-animation-fill-mode: both;
 animation-fill-mode: both;
}
 
/* datetime-selector-slide-down-in */
.ys-datetime-selector .datetime-selector-slide-down-in{
 animation-name:datetime-selector-slide-down-in;
 -webkit-animation-name:datetime-selector-slide-down-in;
}
 
@keyframes datetime-selector-slide-down-in {
 from{
 -webkit-transform: translate3d(0, 100%, 0);
 transform: translate3d(0, 100%, 0);
 }
 to{
 -webkit-transform: translate3d(0, 0, 0);
 transform: translate3d(0, 0, 0);
 }
}
@-webkit-keyframes datetime-selector-slide-down-in {
 from{
 -webkit-transform: translate3d(0, 100%, 0);
 transform: translate3d(0, 100%, 0);
 }
 to{
 -webkit-transform: translate3d(0, 0, 0);
 transform: translate3d(0, 0, 0);
 }
}
 
/* datetime-selector-slide-down-out */
.datetime-selector-slide-down-out{
 animation-name:datetime-selector-slide-down-out;
 -webkit-animation-name:datetime-selector-slide-down-out;
}
 
@keyframes datetime-selector-slide-down-out {
 from{
 -webkit-transform: translate3d(0, 0, 0);
 transform: translate3d(0, 0, 0);
 }
 to{
 -webkit-transform: translate3d(0, 100%, 0);
 transform: translate3d(0, 100%, 0);
 }
}
@-webkit-keyframes datetime-selector-slide-down-out {
 from{
 -webkit-transform: translate3d(0, 0, 0);
 transform: translate3d(0, 0, 0);
 }
 to{
 -webkit-transform: translate3d(0, 100%, 0);
 transform: translate3d(0, 100%, 0);
 }
}

ys_datetime_selector.js

(function($){
 
 var container = $(".ys-datetime-selector");
 var currentYear = new Date().getFullYear();
 var currentMonth = new Date().getMonth()+1;
 var currentDate = new Date().getDate();
 var currentDayCount = getMaxDateInMonth(currentYear,currentMonth);
 var yearSwiper =null;
 var monthSwiper =null;
 var dateSwiper =null;
 var callback = function(year,month,date){};
 
 var html = "<div class='ys-datetime-selector display-hide'> "+
 " <div class='ys-datetime-selector-content'> "+
 " <div class='ys-datetime-operation-bar'> "+
 " <a class='ys-datetime-cancel-btn'>取消</a>"+
 " <span>选择日期</span> "+
 " <a class='ys-datetime-ok-btn'>确定</a> "+
 " </div> "+
 " <div class='ys-datetime-blocks'> "+
 " <div class='ys-datetime-year-block'> "+
 " <div class='swiper-container'> "+
 " <div class='swiper-wrapper'></div>"+
 " </div> "+
 " </div> "+
 " <div class='ys-datetime-month-block'> "+
 " <div class='swiper-container'> "+
 " <div class='swiper-wrapper'></div>"+
 " </div> "+
 " </div> "+
 " <div class='ys-datetime-date-block'> "+
 " <div class='swiper-container'> "+
 " <div class='swiper-wrapper'></div>"+
 " </div> "+
 " </div> "+
 " <div style='clear:both;'></div> "+
 " </div> "+
 " </div> "+
 "</div> ";
 
 /* ======================================== initialize the page view ======================================== */
 function render(){
 container = $(html).appendTo("body");
 
 yearSwiper = new Swiper(".ys-datetime-year-block .swiper-container", {
 direction : "vertical",
 freeMode:true,
 freeModeSticky:true,
 slidesPerView: "auto",
 onTransitionEnd:function(swiper){
 var activeIndex = swiper.activeIndex;
 var slidesLen = swiper.slides.length;
 if(activeIndex<20){
 var firstYear = parseInt($(swiper.slides[0]).attr("data-year"));
 var prevYears = [];
 for(var i=firstYear-1;i>=firstYear-100;i--){
 prevYears.push("<div class='swiper-slide' data-year='"+i+"'>"+i+"年</div>");
 }
 swiper.prependSlide(prevYears);
 }else if(slidesLen-activeIndex<20){
 var lastYear = parseInt($(swiper.slides[slidesLen-1]).attr("data-year"));
 var nextYears = [];
 for(var i=lastYear+1;i<=lastYear+100;i++){
 nextYears.push("<div class='swiper-slide' data-year='"+i+"'>"+i+"年</div>");
 }
 swiper.appendSlide(nextYears);
 }
 
 // 计算这个月有多少天
 currentYear = parseInt($(swiper.slides[activeIndex+2]).attr("data-year"));
 updateDateSwiper();
 
 }
 });
 var yearSlides = [];
 for(var i=currentYear-2;i<=currentYear+102;i++){
 yearSlides.push("<div class='swiper-slide' data-year='"+i+"'>"+i+"年</div>");
 }
 var prevYears = [];
 for(var i=currentYear-3;i>currentYear-100;i--){
 prevYears.push("<div class='swiper-slide' data-year='"+i+"'>"+i+"年</div>");
 }
 yearSwiper.appendSlide(yearSlides);
 yearSwiper.prependSlide(prevYears);
 
 
 monthSwiper = new Swiper(".ys-datetime-month-block .swiper-container", {
 direction :"vertical",
 freeMode:true,
 freeModeMomentumRatio:0.2,
 loop:true,
 loopAdditionalSlides:24,
 freeModeSticky:true,
 slidesPerView:"auto",
 onTransitionEnd:function(swiper){
 var activeIndex = swiper.activeIndex;
 if(isNaN(activeIndex)){
 return;
 }
 // 计算这个月有多少天
 currentMonth = parseInt($(swiper.slides[activeIndex+2]).attr("data-month"));
 updateDateSwiper();
 }
 });
 var monthSlides=[];
 for(var i=1;i<=12;i++){
 monthSlides.push("<div class='swiper-slide' data-month='"+i+"'>"+i+"月</div>");
 }
 monthSwiper.appendSlide(monthSlides);
 monthSwiper.appendSlide(monthSlides);
 monthSwiper.appendSlide(monthSlides);
 
 dateSwiper = new Swiper(".ys-datetime-date-block .swiper-container", {
 direction :"vertical",
 loop : true,
 freeMode:true,
 freeModeMomentumRatio:0.2,
 freeModeSticky:true,
 slidesPerView:"auto",
 onTransitionEnd:function(swiper){
 var activeIndex = swiper.activeIndex;
 if(isNaN(activeIndex)){
 return;
 }
 // 计算这个月有多少天
 currentDate = parseInt($(swiper.slides[activeIndex+2]).attr("data-date"));
 }
 });
 var dateSlides=[];
 for(var i=1;i<=currentDayCount;i++){
 dateSlides.push("<div class='swiper-slide' data-date='"+i+"'>"+i+"日</div>");
 }
 dateSwiper.appendSlide(dateSlides);
 }
 
 /* ======================================== bind events ======================================== */
 function bindEvents(){
 container.on("click",function(e){
 e.stopPropagation();
 e.preventDefault();
 container.find(".ys-datetime-selector-content").addClass("datetime-selector-slide-down-out");
 });
 
 container.on("click",".ys-datetime-selector-content",function(e){
 e.stopPropagation();
 e.preventDefault();
 });
 
 container.on("click",function(e){e.preventDefault();e.stopPropagation();});
 
 container.on("click",".ys-datetime-cancel-btn",function(e){
 e.stopPropagation();
 e.preventDefault();
 container.find(".ys-datetime-selector-content").addClass("datetime-selector-slide-down-out");
 });
 
 container.on("click",".ys-datetime-ok-btn",function(e){
 e.stopPropagation();
 e.preventDefault();
 
 callback(currentYear,currentMonth,currentDate);
 container.find(".ys-datetime-selector-content").addClass("datetime-selector-slide-down-out");
 });
 
 container.find(".ys-datetime-selector-content").on("animationend webkitAnimationEnd",function(){
 if($(this).hasClass("datetime-selector-slide-down-out")){
 container.addClass("display-hide");
 }
 $(this).removeClass("datetime-selector-slide-down-in").removeClass("datetime-selector-slide-down-out");
 });
 }
 
 var initialized = false;
 function init(){
 if(initialized){
 return;
 }
 initialized = true;
 render();
 bindEvents();
 }
 
 /* ======================================== common methods ======================================== */
 function getMaxDateInMonth(year,month){
 var date = new Date();
 date.setFullYear(year);
 date.setMonth(month);
 date.setDate(0);
 return date.getDate();
 }
 
 function updateDateSwiper(){
 var nextDayCount = getMaxDateInMonth(currentYear,currentMonth);
 if(currentDayCount>nextDayCount){
 for(var i=currentDayCount-1;i>=nextDayCount;i--){
 dateSwiper.removeSlide(i);
 }
 
 }else if(currentDayCount<nextDayCount){
 for(var i=currentDayCount+1;i<=nextDayCount;i++){
 dateSwiper.appendSlide("<div class='swiper-slide' data-date='"+i+"'>"+i+"日</div>");
 }
 }
 currentDayCount = nextDayCount;
 
 currentDate = parseInt($(dateSwiper.slides[dateSwiper.activeIndex+2]).attr("data-date"));
 
 }
 
 function showDateTime(options){
 
 
 
 options = options||{};
 var year = options.year;
 var month = options.month;
 var date = options.date;
 
 var type = options.type||"year-month-date";
 if(type=="year-month-date"){
 container.find(".ys-datetime-year-block").removeClass("block-hide").removeClass("width-50").removeClass("width-100");
 container.find(".ys-datetime-month-block").removeClass("block-hide").removeClass("width-50").removeClass("width-100");
 container.find(".ys-datetime-date-block").removeClass("block-hide").removeClass("width-50").removeClass("width-100");
 }else if(type=="year-month"){
 container.find(".ys-datetime-date-block").addClass("block-hide");
 container.find(".ys-datetime-year-block").addClass("width-50").removeClass("width-100").removeClass("block-hide");
 container.find(".ys-datetime-month-block").addClass("width-50").removeClass("width-100").removeClass("block-hide");
 }else if(type=="year"){
 container.find(".ys-datetime-date-block").addClass("block-hide");
 container.find(".ys-datetime-month-block").addClass("block-hide");
 container.find(".ys-datetime-year-block").addClass("width-100");
 }
 
 callback = options.callback||callback;
 currentYear = year||currentYear;
 currentMonth = month||currentMonth;
 currentDate = date||currentDate;
 currentDayCount = getMaxDateInMonth(currentYear,currentMonth);
 
 var yearSlidesLength = yearSwiper.slides.length;
 var minYear = parseInt($(yearSwiper.slides[2]).attr("data-year"));
 var maxYear = parseInt($(yearSwiper.slides[yearSlidesLength-3]).attr("data-year"));
 if(currentYear<minYear){
 var prevYears = [];
 for(var i=minYear-3;i>currentYear-20;i--){
 prevYears.push("<div class='swiper-slide' data-year='"+i+"'>"+i+"年</div>");
 }
 yearSwiper.prependSlide(prevYears);
 yearSwiper.slideTo(17);
 }else if(currentYear>maxYear){
 var nextSlides = [];
 for(var i=maxYear+2;i<=currentYear+20;i++){
 nextSlides.push("<div class='swiper-slide' data-year='"+i+"'>"+i+"年</div>");
 }
 yearSwiper.appendSlide(nextSlides);
 yearSwiper.slideTo(currentYear-minYear+1);
 }else{
 yearSwiper.slideTo(currentYear-minYear);
 }
 
 monthSwiper.slideTo(currentMonth+9);
 dateSwiper.slideTo(currentDayCount-3+currentDate);
 
 
 container.removeClass("display-hide");
 container.find(".ys-datetime-selector-content").addClass("datetime-selector-animated").addClass("datetime-selector-slide-down-in");
 }
 
 var DateTimeWidget = {
 show:function(options){
 init();
 showDateTime(options);
 }
 };
 
 window.DateTimeWidget = DateTimeWidget;
})(jQuery);

datetime.html

<!DOCTYPE html>
<head>
 <meta charset="utf-8">
 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
 <title></title>
 <meta name="description" content="">
 <meta name="viewport" content="width=device-width, initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
 <meta name="format-detection" content="telephone=no">
 <!-- 导入CSS -->
 <link href="dist/css/swiper.min.css" rel="stylesheet">
 <link href="css/common/ys_datetime_selector.css" rel="stylesheet">
 
 <!-- 导入JS -->
 <script src="dist/js/jquery-1.11.3.min.js"></script>
 <script src="dist/js/swiper.jquery.min.js"></script>
 
 
</head>
<body>
 
 
 <script src="js/common/ys_datetime_selector.js"></script>
 <script>
 DateTimeWidget.show({
 year:2018,
 month:12,
 date:31,
// type:"year",
 callback:function(year,month,date){
 console.log(year+"年"+month+"月"+date+"日");
 }
 });
 </script>
</body>
</html>

下载本文
显示全文
专题