基于javascript实现日历功能原理及代码实例


Posted in Javascript onMay 07, 2020

日历

在学习javascript过程中,菜鸟教程有一个javascript实例---css日历,感觉挺有趣的,在它的基础上增加了一些简单的功能(差点哭辽)。

功能

  • 按照传统日历方式显示该月的每一天。
  • 可以突出显示今天的日期
  • 可以翻阅上一个月和下一个月的日历

实现

  • step1 传统日历布局样式:分别将年份与月份、星期、该月的全部天数采用列表布局,排列组成传统日历的样式。
  • step2 初始化和更新月份:先将列表清空(debug过程中,有一个发现,初始化的列表便存在的一个childNodes,该项目中需要清空),然后再填入前导空白(为了和星期能够对应),再填入具体某一个月的天数。
  • step3 通过document获取列表对象,改变今天对应行的样式(className变化)来突出显示。
  • 其他细节在代码中实现

代码

html代码

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>CSS日历</title>
<link type="text/css" rel="stylesheet" href="style.css" rel="external nofollow" >
</head>
<body>
 
	<h1>CSS日历</h1> 
	<div class="month">
		<ul>
			<li class="prev" onclick="change(-1)">❮</li>
			<li class="next" onclick="change(1)">❯</li>
			<li style="text-align: center"><span id="month">August</span><br>
				<span style="font-size: 18px" id="year">2016</span></li>
		</ul>
	</div>

	<ul class="weekdays" id="weekdays">

	</ul>

	<ul class="days" id="days">
	</ul>
</body>
<script type="text/javascript" src="show.js"></script>
</html>

CSS代码

@charset "UTF-8";
* {box-sizing:border-box;}
ul {list-style-type: none;}
body {font-family: Verdana,sans-serif;}
.center {
  text-align: center;
  border: 3px solid green;
}

.month {
  padding: 70px 25px;
  width: 100%;
  background: #1abc9c;
}

.month ul {
  margin: 0;
  padding: 0;
}

.month ul li {
  color: white;
  font-size: 20px;
  text-transform: uppercase;
  letter-spacing: 3px;
}

.month .prev {
  float: left;
  padding-top: 10px;
}

.month .next {
  float: right;
  padding-top: 10px;
}

.weekdays {
  margin: 0;
  padding: 10px 0;
  background-color: #ddd;
}

.weekdays li {
  display: inline-block;
  width: 13.6%;
  color: #666;
  text-align: center;
}

.days {
  padding: 10px 0;
  background: #eee;
  margin: 0;
}

.days li {
  list-style-type: none;
  display: inline-block;
  width: 13.6%;
  text-align: center;
  margin-bottom: 5px;
  font-size:12px;
  color: #777;
}

.days li active {
  padding: 5px;
  background: #1abc9c;
  color: white !important;
}
/* Add media queries for smaller screens */
@media screen and (max-width:720px) {
  .weekdays li, .days li {width: 13.1%;}
}

@media screen and (max-width: 420px) {
  .weekdays li, .days li {width: 12.5%;}
  .days li .active {padding: 2px;}
}

@media screen and (max-width: 290px) {
  .weekdays li, .days li {width: 12.2%;}
}

javascript代码

var date = new Date();
var year = date.getFullYear();
var month=date.getMonth();
var day = date.getDate();
var week=date.getDay();
var p=(week-day+1+35)%7+day-1;
var monthName=[
	"January","February","March","April","May","June","July","August","September","October","November","December"
];
var monthNum=[
	31,28,31,30,31,30,31,31,30,31,30,31
];
var weekName=[
	"Su","Mo","Tu","We","Th","Fr","Sa"
];
var aimmonth=month,aimyear=year;

function init(){
	createTitle(year,month);
	var weekdays=document.getElementById("weekdays");
	for(var i=0;i<7;i++){ 
		var x = document.createElement("LI");
		var t = document.createTextNode(weekName[i]);
		x.appendChild(t);
		weekdays.appendChild(x);
	}
	delDay();
	createDay();
	isnow();
}
function change(x){ 
	aimmonth+=x;
	if(aimmonth==-1){
		aimyear-=1;
		aimmonth=11;
	}else if(aimmonth==12){
		aimyear+=1;
		aimmonth=0;
	}
	createTitle(aimyear,aimmonth);
	delDay(); 
	createDay();
	isnow();
}
function createTitle(y,m){
	document.getElementById("year").innerHTML=y;
	document.getElementById("month").innerHTML=monthName[m];
}
function createDay(){
	var datetmp=new Date();
	datetmp.setFullYear(aimyear,aimmonth,1);
	var firstday=datetmp.getDay(); 
	var days=document.getElementById("days"); 
	
	for(var i=0;i<firstday;i++){
		var x = document.createElement("LI");
		var t = document.createTextNode("");
		x.appendChild(t);
		days.appendChild(x);
	}
	for(var i=1;i<=getMonthDay();i++){ 
		var x = document.createElement("LI");
		var t = document.createTextNode(i);
		x.appendChild(t);
		days.appendChild(x);
	} 
}
function delDay(){ 
	var list=document.getElementById("days");
	var len=list.childNodes.length; 
	for(var i=0;i<len;i++){ 
		list.removeChild(list.childNodes[0]);
	}
}
function isnow(){ 
	if(aimyear==year&&aimmonth==month){
		days.childNodes[p].style="padding: 5px;background: #1abc9c;color: white !important;"
	} 
}
function getMonthDay(){
	if(aimmonth!=2){
		return monthNum[aimmonth];
	}else{
		if(aimyear%4!=0||aimyear%100==0&&aimyear%400!=0){
			return monthNum[aimmonth];
		}
		else return 29;
	}
} 
//main
init();

总结

javascript目前算是起步,最最基础的皮毛学会了,起码不会的东西可以通过去找函数,查资料学习,可能实现的有些复杂,但是最终能够表达出自己的构想,听开心的。下一步,再写一些实例去看jquery。

css仍是不足,有些东西可能会有冲突,无法实现想要的东西,仍要回去学基础的东西,最重要的一点是多练,积累经验,总结规律和思想。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
游戏人文件夹程序 ver 4.03
Jul 14 Javascript
测试JavaScript字符串处理性能的代码
Dec 07 Javascript
Javascript学习笔记之数组的遍历和 length 属性
Nov 23 Javascript
Vue.js实现一个自定义分页组件vue-paginaiton
Sep 05 Javascript
bootstrap table小案例
Oct 21 Javascript
JS实现touch 点击滑动轮播实例代码
Jan 19 Javascript
JS中静态页面实现微信分享功能
Feb 06 Javascript
Angular2自定义分页组件
Apr 19 Javascript
微信小程序中button组件的边框设置的实例详解
Sep 27 Javascript
Vue封装一个简单轻量的上传文件组件的示例
Mar 21 Javascript
Js代码中的span拼接问题解决
Nov 22 Javascript
JavaScript实现省市联动效果
Nov 22 Javascript
Vue简单实现原理详解
May 07 #Javascript
angular组件间通讯的实现方法示例
May 07 #Javascript
基于better-scroll 实现歌词联动功能的代码
May 07 #Javascript
Vue双向绑定实现原理与方法详解
May 07 #Javascript
JavaScript设计模式之观察者模式与发布订阅模式详解
May 07 #Javascript
微信小程序pinker组件使用实现自动相减日期
May 07 #Javascript
简单了解JavaScript弹窗实现代码
May 07 #Javascript
You might like
浅析php面向对象public private protected 访问修饰符
2013/06/30 PHP
PHP字符串的连接的简单实例
2013/12/30 PHP
php中操作memcached缓存进行增删改查数据的实现代码
2014/08/15 PHP
Yii2简单实现多语言配置的方法
2016/07/23 PHP
php脚本守护进程原理与实现方法详解
2017/07/20 PHP
js实现页面打印功能实例代码(附去页眉页脚功能代码)
2009/12/15 Javascript
使用insertAfter()方法在现有元素后添加一个新元素
2014/05/28 Javascript
Javascript快速排序算法详解
2014/12/03 Javascript
完美实现仿QQ空间评论回复特效
2015/05/06 Javascript
jquery实现简单的二级导航下拉菜单效果
2015/09/07 Javascript
解析javascript图片懒加载与预加载的分析总结
2016/10/27 Javascript
JavaScript实现简单的星星评分效果
2017/05/18 Javascript
详解超简单的react服务器渲染(ssr)入坑指南
2019/02/28 Javascript
微信小程序按钮点击动画效果的实现
2019/09/04 Javascript
Python实现partial改变方法默认参数
2014/08/18 Python
python实现对指定字符串补足固定长度倍数截断输出的方法
2018/11/15 Python
python中pygame安装过程(超级详细)
2019/08/04 Python
python实现LRU热点缓存及原理
2019/10/29 Python
SneakerStudio英国:最佳运动鞋商店
2019/05/22 全球购物
UNIX文件类型
2013/08/29 面试题
一道Delphi面试题
2016/10/28 面试题
如何掌握自荐信格式呢
2013/11/19 职场文书
求职简历中的自我评价分享
2013/12/08 职场文书
求职信范文英文版
2014/01/05 职场文书
小学生家长评语大全
2014/02/10 职场文书
经贸韩语专业大学生职业规划
2014/02/14 职场文书
40岁生日感言
2014/02/15 职场文书
细节决定成败演讲稿
2014/05/12 职场文书
演讲比赛的活动方案
2014/08/28 职场文书
小升初自荐信范文
2015/03/05 职场文书
2015年推普周活动方案
2015/05/06 职场文书
无罪辩护词范文
2015/05/21 职场文书
2016年少先队活动总结
2016/04/06 职场文书
如何将numpy二维数组中的np.nan值替换为指定的值
2021/05/14 Python
python实现Nao机器人的单目测距
2021/09/04 Python
JavaScript 与 TypeScript之间的联系
2021/11/27 Javascript