


Detailed explanation of sample code for HTML5 custom calendar control
HTML5Example of custom calendarcontrol Detailed code explanation
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>
The above is the detailed content of Detailed explanation of sample code for HTML5 custom calendar control. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

Guide to Table Border in HTML. Here we discuss multiple ways for defining table-border with examples of the Table Border in HTML.

This is a guide to Nested Table in HTML. Here we discuss how to create a table within the table along with the respective examples.

Guide to HTML margin-left. Here we discuss a brief overview on HTML margin-left and its Examples along with its Code Implementation.

Guide to HTML Table Layout. Here we discuss the Values of HTML Table Layout along with the examples and outputs n detail.

Guide to HTML Input Placeholder. Here we discuss the Examples of HTML Input Placeholder along with the codes and outputs.

Guide to the HTML Ordered List. Here we also discuss introduction of HTML Ordered list and types along with their example respectively

Guide to HTML onclick Button. Here we discuss their introduction, working, examples and onclick Event in various events respectively.

Guide to Moving Text in HTML. Here we discuss an introduction, how marquee tag work with syntax and examples to implement.
