基于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 相关文章推荐
IE、FF、Chrome浏览器中的JS差异介绍
Aug 13 Javascript
Jquery的hover方法让鼠标经过li时背景变色
Sep 06 Javascript
简单纯js实现点击切换TAB标签实例
Aug 23 Javascript
jquery对复选框(checkbox)的操作汇总
Jan 13 Javascript
JS实现搜索框文字可删除功能
Dec 28 Javascript
源码分析Vue.js的监听实现教程
Apr 23 Javascript
js实现简易聊天对话框
Aug 17 Javascript
Angular2.0/4.0 使用Echarts图表的示例代码
Dec 07 Javascript
使用百度地图实现地图网格的示例
Feb 06 Javascript
Vue.set() this.$set()引发的视图更新思考及注意事项
Aug 30 Javascript
JavaScript中的各种宽高属性的实现
May 08 Javascript
vue 解决uglifyjs-webpack-plugin打包出现报错的问题
Aug 04 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页面缓存方法小结
2015/01/10 PHP
PHP 中提示undefined index如何解决(多种方法)
2016/03/16 PHP
PHP命名空间简单用法示例
2018/12/28 PHP
php curl简单采集图片生成base64编码(并附curl函数参数说明)
2019/02/15 PHP
javascript之卸载鼠标事件的代码
2007/05/14 Javascript
javascript TextArea动态显示剩余字符
2008/10/22 Javascript
JS中 用户登录系统的解决办法
2013/04/15 Javascript
js实现文本框支持加减运算的方法
2015/08/19 Javascript
jQuery实现文本框邮箱输入自动补全效果
2015/11/17 Javascript
jquery可定制的在线UEditor编辑器
2015/11/17 Javascript
JS 滚动事件window.onscroll与position:fixed写兼容IE6的回到顶部组件
2016/10/10 Javascript
使用微信小程序开发前端【快速入门】
2016/12/05 Javascript
详解angular2采用自定义指令(Directive)方式加载jquery插件
2017/02/09 Javascript
Express+Nodejs 下的登录拦截实现代码
2017/07/01 NodeJs
JavaScript创建对象的七种方式全面总结
2017/08/21 Javascript
JS+jQuery实现注册信息的验证功能
2017/09/26 jQuery
Angular弹出模态框的两种方式
2017/10/19 Javascript
js实现各浏览器全屏代码实例
2018/07/03 Javascript
Vuex的初探与实战小结
2018/11/26 Javascript
vue生命周期的探索
2019/04/03 Javascript
CountUp.js实现数字滚动增值效果
2019/10/17 Javascript
vue中使用WX-JSSDK的两种方法(推荐)
2020/01/18 Javascript
python中的break、continue、exit()、pass全面解析
2017/08/05 Python
高质量Python代码编写的5个优化技巧
2017/11/16 Python
python制作mysql数据迁移脚本
2019/01/01 Python
详解用python写网络爬虫-爬取新浪微博评论
2019/05/10 Python
由面试题加深对Django的认识理解
2019/07/19 Python
Python读取图像并显示灰度图的实现
2020/12/01 Python
8款精美的CSS3表单设计(登录表单/下拉选择/按钮附演示及源码)
2013/02/04 HTML / CSS
CSS3哪些新特性值得称赞
2016/03/02 HTML / CSS
美体小铺美国官网:The Body Shop美国
2017/11/10 全球购物
英国计算机商店:Technextday
2019/12/28 全球购物
党员个人剖析材料
2014/09/30 职场文书
党的群众路线教育实践活动调研报告
2014/11/03 职场文书
世界红十字日活动总结
2015/02/10 职场文书
大四学生个人总结
2015/02/15 职场文书