闲的可以用JQ手写一个模拟小程序的显示本周的小日历,看效果感觉挺简单,但是发现写的还是挺复杂。而且还有好多可以优化的代码。发上来就可以当个笔记,练练手!
简单的效果: 往左边减少不能小于本周的日期, 往右边显示下一周的日期.
css:
.date {
width: 500px;
height: 100px;
margin: 100px auto;
display: flex;
justify-content: space-around;
align-items: center;
flex-direction: column;
}
.detailDate {
display: flex;
justify-content: center;
align-items: center;
}
.leftBtn, .rightBtn {
font-size: 30px;
}
.show_all_date {
color: #00ac2f;
position: relative;
padding: 5px;
}
.showDate {
width: 232px;
}
.week {
display: flex;
justify-content: space-around;
}
.week span {
width: 25px;
}
html:
<div class="date"> <div class="topNowDate"> <p class="today"> </p> </div> <div class="detailDate"> <div class="leftBtn"><</div> <div class="show_all_date"> <p>全部</p> </div> <div class="showDate"> <div class="week" id="weekNum"> <span data="1">一</span> <span data="2">二</span> <span data="3">三</span> <span data="4">四</span> <span data="5">五</span> <span data="6">六</span> <span data="0">日</span> </div> <div class="week" id="dateNum"> <span></span> <span></span> <span></span> <span></span> <span></span> <span></span> <span></span> </div> </div> <div class="rightBtn">></div> </div> </div>
js:
//日期模块 (function () { //全部按钮 $( ".show_all_date" ).click( function () { } ); //定义计数器 控制上一页什么时候不能上翻 var boo = 0; //获取当天 这个是服务器的时间最为准确 服务器的时间,当前发起的时间, let nowDate = new Date(); let date = formatDate( nowDate ); $( ".today" ).html( date ); let year = nowDate.getFullYear(); //本月 let thisMonth = getWeek( nowDate, 0 ).month; let monthDays = getMonthdays( year, thisMonth ); let nextMonth = nowDate.getMonth() + 2; let today = nowDate.getDate(); //获取下个月的1号 let dateTemp = new Date(); dateTemp.setDate( 1 ); dateTemp.setMonth( nextMonth ); //显示本周日期 这里的性能应该可以优化 for ( let i = 0; i < $( "#weekNum>span" ).length; i++ ) { if ( $( "#weekNum>span" ).eq( i ).attr( "data" ) === nowDate.getDay().toString() ) { //和日历的周几对应,并给默认颜色 $( "#dateNum>span" ).eq( i ).attr( "month", thisMonth ).html( nowDate.getDate() ) .css( "color", "#00ac2f" ); //动态形成前几天的日期 let prevAllDay = $( "#dateNum>span" ).eq( i ).prevAll(); for ( let j = 0; j < prevAllDay.length; j++ ) { //从今天的日期 减---- if ( today <= 1 ) { today = getMonthdays( year, thisMonth ) + 1; //下边today-- } if ( today > 1 ) { today--; prevAllDay.eq( j ).html( today ); } } //动态形成后几天的日期 let nextAllDay = $( "#dateNum>span" ).eq( i ).nextAll(); let fristDay = 1; for ( let j = 0; j < nextAllDay.length; j++ ) { if ( nowDate.getDate() + (j + 1) <= monthDays ) { nextAllDay.eq( j ).html( nowDate.getDate() + (j + 1) ); } //如果超过了这个月最后一天,从1开始 更新下个月的天数 if ( nowDate.getDate() + (j + 1) > monthDays ) { monthDays = getMonthdays( year, nextMonth ); nextAllDay.eq( j ).html( fristDay++ ); } } } } //给绑定月份属性 bindMonthForWeekDay( thisMonth, $( "#dateNum>span" ), monthDays ); $( ".rightBtn" ).click( function () { //计数器++ boo++; let weekLastDay = $( "#dateNum > span" ).eq( $( "#weekNum > span" ).length - 1 ).html(); weekLastDay = parseInt( weekLastDay ); for ( let i = 0; i < $( "#weekNum > span" ).length; i++ ) { let weekDayHtml = $( "#dateNum > span" ).eq( i ).html(); weekDayHtml = parseInt( weekDayHtml ); if ( weekDayHtml >= monthDays ) { thisMonth++; let nextMonthDays = getMonthdays( year, thisMonth ); monthDays = nextMonthDays; } //说明要进入下个月的日期 if ( weekLastDay >= monthDays ) { weekLastDay = 0; } //当前的日期大于这个月的天数 上月的31号 大于下个月的30号 weekLastDay++; $( "#dateNum > span" ).eq( i ).html( weekLastDay ); if ( thisMonth > 12 ) { thisMonth = 1; year = year + 1; } } //给每个日期绑定一个month属性 bindMonthForWeekDay( thisMonth, $( "#dateNum>span" ), monthDays ); } ); $( ".leftBtn" ).click( function () { if( boo > 0 ){ boo--; let weekFirstDay = $( "#dateNum > span" ).eq( 0 ).html(); weekFirstDay = parseInt( weekFirstDay ); //从最后一个开始赋值 for ( let i = $( "#weekNum > span" ).length - 1; i >= 0; i-- ) { let weekDayHtml = $( "#dateNum > span" ).eq( i ).html(); weekDayHtml = parseInt( weekDayHtml ); if ( weekFirstDay <= 1 ) { thisMonth--; let prevMonthDays = getMonthdays( year, thisMonth ); monthDays = prevMonthDays; } if ( thisMonth <= 0 ) { thisMonth = 12; year = year - 1; } if ( weekFirstDay <= monthDays ) { if ( weekFirstDay <= 1 ) { weekFirstDay = getMonthdays( year, thisMonth ); $( "#dateNum > span" ).eq( i ).html( weekFirstDay ); continue; } weekFirstDay--; $( "#dateNum > span" ).eq( i ).html( weekFirstDay ); continue; } } //给每个日期绑定一个month属性 bindMonthForWeekDay( thisMonth, $( "#dateNum>span" ), monthDays ); } } ); //选择日期 $( "#dateNum>span" ).click( function () { $( this ).css( "color", "#00ac2f" ).siblings().css( "color", "#000" ); } ); /*给每一周日期绑定对应的月份属性 * param1 { Number } thisMonth * param2 { array } html数组,这里是每个日期span * param3 { Number } 月份的总天数 * */ function bindMonthForWeekDay( thisMonth, spanArr, monthDays ) { let mon = thisMonth; for ( let i = 0; i < spanArr.length; i++ ) { if ( Number( spanArr.eq( i ).html() ) === monthDays ) { //这个月的最后一天是这个月的 特殊处理 spanArr.eq( i ).attr( "month", mon ); mon++; if ( mon > 12 ) { mon = 1; } //给每一个span绑定月份 for ( let j = 0; j < spanArr.eq( i ).nextAll().length; j++ ) { spanArr.eq( i ).nextAll().eq( j ).attr( "month", mon ); } return; } spanArr.eq( i ).attr( "month", mon ); } }; function getMonthdays( year, month ) { let now = new Date( year, month, 0 ); let dayCount = now.getDate(); return dayCount; }; function formatDate( date ) { let year = date.getFullYear(); let month = date.getMonth() + 1; let day = date.getDate(); let week = date.getDay(); switch ( week ) { case 0: week = "星期日"; break; case 1: week = "星期一"; break; case 2: week = "星期二"; break; case 3: week = "星期三"; break; case 4: week = "星期四"; break; case 5: week = "星期五"; break; case 6: week = "星期六"; break; default: week = "未知"; break; } let str = "今天是" + year + "年" + month + "月" + day + "日" + week + "" return str; }; function getWeek( date, weekDay ) { //当今天是星期天的时候,获取到的是下周的 let getWeek = {}; let firstDay = null; if ( Number( date.getDay() ) === 0 ) { firstDay = new Date( date - (date.getDay() + 6) * 86400000 ); } if ( Number( date.getDay() ) !== 0 ) { firstDay = new Date( date - (date.getDay() - 1) * 86400000 ); } firstDay.setDate( firstDay.getDate() + weekDay ); let mon = Number( firstDay.getMonth() ) + 1; getWeek.year = firstDay.getFullYear(); getWeek.month = mon; getWeek.date = firstDay.getDate(); return getWeek; }; })()