主要分为三个部分,1:获取li元素 2:如何填写对应的日期 3:如何获取点击li元素的事件。

1:通过节点间关系的属性children 获取li元素(两个for循坏遍历);
2:在遍历填写日期时,在第一行判断在当月的第一天在星期几,然后从第一天开始填写,直到大于当月的天数就暂停填写,并开始填写下个月的日期。第一行上个月的日期显示 : 上月天数显示开始值 = 计算上个月的天数 - 这个月开始的第一天在星期几的值 -1,然后在第一行上月天数显示开始值自加。
3:利用JS的事件冒泡获取li的innerHTML显示出对应日期
效果图:
代码如下:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="Generator" content="EditPlus®">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<title>calendar</title>
<style>
.clear:after{
content:"";
display:table;
clear:both;
}
.left{
float:left;
}
ul{
padding:0px;
margin-top:5px;
margin-bottom:0px;
}
ul>li{
float:left;
list-style:none;
width:30px;
height: 21px;
border: 1px solid #ccc;
text-align:center;
}
.gray{
color:#766565;
}
.top {
height:25px;
}
.top .lf-tri{
border:10px solid transparent;
border-right-color:black;
margin-top:4px;
}
.top .rf-tri{
border:10px solid transparent;
border-left-color:black;
margin-top:4px;
}
.top .content{
width:185px;
height:5px;
text-align:center;
}
</style>
</head>
<body>
<div class="top clear">
<div class="left lf-tri" onclick="lastMonth()"></div>
<div class="left content">2017年2月1日</div>
<div class="left rf-tri" onclick=" nextMonth()"></div>
</div>
<div>
<div id="week">
<ul class="clear">
<li>日</li>
<li>一</li>
<li>二</li>
<li>三</li>
<li>四</li>
<li>五</li>
<li>六</li>
<ul>
</div>
<div id="date" onclick='getDateNum(event)'>
<ul class="clear">
<li>30</li>
<li>31</li>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
</ul>
<ul class="clear">
<li>6</li>
<li>7</li>
<li>8</li>
<li>9</li>
<li>10</li>
<li>11</li>
<li>12</li>
</ul>
<ul class="clear">
<li>13</li>
<li>14</li>
<li>15</li>
<li>16</li>
<li>17</li>
<li>18</li>
<li>19</li>
</ul>
<ul class="clear">
<li>20</li>
<li>21</li>
<li>22</li>
<li>23</li>
<li>24</li>
<li>25</li>
<li>26</li>
</ul>
<ul class="clear">
<li>27</li>
<li>28</li>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
</ul>
<ul class="clear">
<li>27</li>
<li>28</li>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
</ul>
</div>
<div>
<script>
function $(id){
return document.getElementById(id);
}
function change(cls){
return document.getElementsByClassName(cls);
}
function getDateNum(e) {
console.log(e && e.target.nodeName)//打印发生事件的元素,再获取元素nodeName
if(e.target.nodeName=="LI"){//先判断nodeName是LI
if(e.target.className!="gray"){//点击本月的日期,显示在日期栏
change("content")[0].innerHTML = year+'年'+(month+1)+'月'+e.target.innerHTML+'日';
}else{//点击灰色日期即(上个月或者下个月日期)切换到当月
if(e.target.innerHTML>14){
lastMonth();
}else {
nextMonth();
}
}
}
}
//获取年、月
var today = new Date();
var year=today.getFullYear(), month = today.getMonth();
var totalDay;
var uls=$("date").children,list;
function loadCalendar(){
totalDay=getMonthDays(year,month+1);//计算一个月的天数
var firstDay = (new Date(year,month,1)).getDay();//计算每个月1号在星期几
var lastMonthDay=getMonthDays(year,month);
var lastDayCal=lastMonthDay-firstDay+1;//计算上个月在第一行显示的天数
//获取ul元素
var num=1 ,nextNum=1;//日期显示
// 类数组对象 转 数组
//uls = Array.prototype.slice.call(uls)
//获取li元素 填充
for(var r=0;r<uls.length;r++){
list=uls[r].children;//遍历ul,获得li
for(var line=0;line<list.length;line++){
if(r==0){//在第一行 与第一天进行判断 大于等于第一天时载入日期
if(line>=firstDay){
list[line].innerHTML=num++;
list[line].setAttribute("class","");
}else {
list[line].innerHTML=lastDayCal++;//第一行的上个月天数显示
list[line].setAttribute("class","gray");
}
}else {
//判断是否超出天数 ,不超出则继续加,超出则显示下个月日期
if(num<=totalDay){
list[line].setAttribute("class","");
list[line].innerHTML=num++;
}else {
list[line].innerHTML=nextNum++;//下个月日期显示
list[line].setAttribute("class","gray");
}
}
}
}
}
loadCalendar();
function getMonthDays(year,month){
//判断2月份天数
if(month==2){
days= (year%4==0)&&(year%100!=0)||(year%400==0)? 29:28;
}else {
//1-7月 单数月为31日
if(month<7){
days= month%2==1?31:30;
}else {
//8-12月 双月为31日
days = month%2==0?31:30;
}
}
return days;
}
//右击箭头下个月
//change("rf-tri")[0].onclick =
function nextMonth() {
month++;
if(month>11){
year+=1;
month=0;
}
change("content")[0].innerHTML=year+"年"+(month+1)+"月"+"1日";
//console.log(month+1);
loadCalendar();
}
//左击箭头上个月
//change("lf-tri")[0].onclick =
function lastMonth() {
month--;
if(month<0){
month=11;
year-=1;
}
change("content")[0].innerHTML=year+"年"+(month+1)+"月"+"1日";
//console.log(month+1);
loadCalendar();
}
</script>
</body>
</html>
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# js
# 日历
# js css+html实现简单的日历
# 轻量级的原生js日历插件calendar.js使用指南
# JS学习之一个简易的日历控件
# Vue.js创建Calendar日历效果
# JS日历 推荐
# 纯js简单日历实现代码
# js编写当天简单日历效果【实现代码】
# js日历控件(可精确到分钟)
# php+javascript的日历控件
# HTML+CSS+JavaScript实现简单日历效果
# 上个月
# 下个月
# 遍历
# 当月
# 上月
# 一个月
# 每个月
# 这个月
# 切换到
# 右击
# 判断是否
# top
# body
# px
# margin
# width
# bottom
# list
# display
# table
相关文章:
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
建站之星24小时客服电话如何获取?
建站之星价格显示格式升级,你的预算足够吗?
大连网站设计制作招聘信息,大连投诉网站有哪些?
建站之星如何防范黑客攻击与数据泄露?
怎么将XML数据可视化 D3.js加载XML
北京营销型网站制作公司,可以用python做一个营销推广网站吗?
香港服务器租用费用高吗?如何避免常见误区?
C#怎么使用委托和事件 C# delegate与event编程方法
如何在香港服务器上快速搭建免备案网站?
英语简历制作免费网站推荐,如何将简历翻译成英文?
如何配置FTP站点权限与安全设置?
建站之星伪静态规则如何设置?
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
如何基于云服务器快速搭建个人网站?
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
企业微网站怎么做,公司网站和公众号有什么区别?
实现点击下箭头变上箭头来回切换的两种方法【推荐】
沈阳制作网站公司排名,沈阳装饰协会官方网站?
建站之星代理商如何保障技术支持与售后服务?
建站之星云端配置指南:模板选择与SEO优化一键生成
建站主机系统SEO优化与智能配置核心关键词操作指南
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
测试制作网站有哪些,测试性取向的权威测试或者网站?
如何在云服务器上快速搭建个人网站?
建站之星2.7模板:企业网站建设与h5定制设计专题
如何在IIS管理器中快速创建并配置网站?
php json中文编码为null的解决办法
如何在IIS7中新建站点?详细步骤解析
微课制作网站有哪些,微课网怎么进?
制作企业网站建设方案,怎样建设一个公司网站?
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
在线制作视频网站免费,都有哪些好的动漫网站?
网站制作费用多少钱,一个网站的运营,需要哪些费用?
c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】
网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?
如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
广东企业建站网站优化与SEO营销核心策略指南
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
如何快速生成凡客建站的专业级图册?
宝塔建站教程:一键部署配置流程与SEO优化实战指南
实现虚拟支付需哪些建站技术支撑?
如何快速搭建高效香港服务器网站?
深圳网站制作案例,网页的相关名词有哪些?
图册素材网站设计制作软件,图册的导出方式有几种?
西安专业网站制作公司有哪些,陕西省建行官方网站?
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
如何通过PHP快速构建高效问答网站功能?
*请认真填写需求信息,我们会在24小时内与您取得联系。