基于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 相关文章推荐
关于恒等于(===)和非恒等于(!==)
Aug 20 Javascript
Javascript 设计模式(二) 闭包
May 26 Javascript
用JQUERY增删元素的代码
Feb 14 Javascript
JSON无限折叠菜单编写实例
Dec 16 Javascript
javascript求日期差的方法
Mar 02 Javascript
JS将网址url转化为JSON格式的方法
Jul 02 Javascript
使用validate.js实现表单数据提交前的验证方法
Sep 04 Javascript
如何进行微信公众号开发的本地调试的方法
Jun 16 Javascript
vue下axios拦截器token刷新机制的实例代码
Jan 17 Javascript
jQuery实现简易QQ聊天框
Feb 10 jQuery
jquery实现手风琴案例
May 04 jQuery
Vue 根据条件判断van-tab的显示方式
Aug 03 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 IDE phpstorm 常用快捷键
2015/05/18 PHP
php获取系统变量方法小结
2015/05/29 PHP
php生成图片验证码-附五种验证码
2015/08/19 PHP
jQuery 名称冲突的解决方法
2011/04/08 Javascript
jQuery学习笔记 操作jQuery对象 属性处理
2012/09/19 Javascript
javascript 循环调用示例介绍
2013/11/20 Javascript
js showModalDialog 弹出对话框的简单实例(子窗体)
2014/01/07 Javascript
jQuery的ready方法详解
2014/11/27 Javascript
jQuery修改class属性和CSS样式整理
2015/01/30 Javascript
js实现iframe框架取值的方法(兼容IE,firefox,chrome等)
2015/11/26 Javascript
让div运动起来 js实现缓动效果
2017/07/06 Javascript
get  post jsonp三种数据交互形式实例详解
2017/08/25 Javascript
详谈构造函数加括号与不加括号的区别
2017/10/26 Javascript
解决js ajax同步请求造成浏览器假死的问题
2018/01/18 Javascript
解决mpvue + vuex 开发微信小程序vuex辅助函数mapState、mapGetters不可用问题
2018/08/03 Javascript
elementUI select组件默认选中效果实现的方法
2019/03/25 Javascript
javascript设计模式 ? 代理模式原理与用法实例分析
2020/04/16 Javascript
python 从远程服务器下载日志文件的程序
2013/02/10 Python
Python中IPYTHON入门实例
2015/05/11 Python
好用的Python编辑器WingIDE的使用经验总结
2016/08/31 Python
django传值给模板, 再用JS接收并进行操作的实例
2018/05/28 Python
python实现一个简单的udp通信的示例代码
2019/02/01 Python
python面试题之列表声明实例分析
2019/07/08 Python
django如何通过类视图使用装饰器
2019/07/24 Python
tensorflow如何继续训练之前保存的模型实例
2020/01/21 Python
利用PyQt中的QThread类实现多线程
2020/02/18 Python
Django ForeignKey与数据库的FOREIGN KEY约束详解
2020/05/20 Python
Django启动时找不到mysqlclient问题解决方案
2020/11/11 Python
matplotlib之多边形选区(PolygonSelector)的使用
2021/02/24 Python
英国行业制服供应商:Alexandra
2019/09/14 全球购物
2014年十一国庆向国旗敬礼寄语
2014/04/11 职场文书
学生请假条格式
2014/04/11 职场文书
学校宣传标语
2014/06/18 职场文书
校园广播站开场白
2015/06/01 职场文书
对Keras自带Loss Function的深入研究
2021/05/25 Python
python单向链表实例详解
2022/05/25 Python