基于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 相关文章推荐
使用prototype.js进行异步操作
Feb 07 Javascript
js 文件引入实现代码
Apr 23 Javascript
javascript处理table表格的代码
Dec 06 Javascript
jquery 添加节点的几种方法介绍
Sep 04 Javascript
Knockout text绑定DOM的使用方法
Nov 15 Javascript
toggle()隐藏问题的解决方法
Feb 17 Javascript
jQuery焦点图轮播特效代码分享(3款)
Sep 05 Javascript
jQuery的each循环用法简单示例
Jun 12 Javascript
Node.js中多进程模块Cluster的介绍与使用
May 27 Javascript
JS实现的邮箱提示补全效果示例
Jan 30 Javascript
vue elementUI table 自定义表头和行合并的实例代码
May 22 Javascript
javascript事件循环event loop的简单模型解释与应用分析
Mar 14 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 截取字符串并以零补齐str_pad() 函数
2011/05/07 PHP
深入理解:XML与对象的序列化与反序列化
2013/06/08 PHP
PHP使用mongoclient简单操作mongodb数据库示例
2019/02/08 PHP
宝塔面板在NGINX环境中TP5.1如何运行?
2021/03/09 PHP
JQuery this 和 $(this) 的区别
2009/08/23 Javascript
JavaScript 读取元素的CSS信息的代码
2010/02/07 Javascript
js对象与打印对象分析比较
2013/04/23 Javascript
jquery ajax同步异步的执行最终解决方案
2013/04/26 Javascript
Javascript代码在页面加载时的执行顺序介绍
2013/05/03 Javascript
Js+Jq获取URL参数的集中方法示例代码
2014/05/20 Javascript
详解JavaScript中shift()方法的使用
2015/06/09 Javascript
jQuery用FormData实现文件上传的方法
2016/11/21 Javascript
脚本div实现拖放功能(两种)
2017/02/13 Javascript
详解如何使用vue-cli脚手架搭建Vue.js项目
2017/05/19 Javascript
vue 对象添加或删除成员时无法实时更新的解决方法
2019/05/01 Javascript
vue项目中将element-ui table表格写成组件的实现代码
2019/06/12 Javascript
[00:56]2014DOTA2国际邀请赛 DK、iG 赛前探访
2014/07/10 DOTA
浅析python继承与多重继承
2018/09/13 Python
Python 从列表中取值和取索引的方法
2018/12/25 Python
python根据txt文本批量创建文件夹
2020/12/08 Python
python实现给微信指定好友定时发送消息
2019/04/29 Python
Python3的socket使用方法详解
2020/02/18 Python
HTML5+CSS3实现无插件拖拽上传图片(支持预览与批量)
2017/01/05 HTML / CSS
HTML5实现文件断点续传的方法
2017/01/04 HTML / CSS
英国领先的在线鱼贩:The Fish Society
2020/08/12 全球购物
专升本自我鉴定
2013/10/10 职场文书
《再别康桥》教学反思
2014/02/12 职场文书
银行柜员求职自荐书
2014/06/18 职场文书
欢迎领导标语
2014/06/27 职场文书
高中生学习计划书
2014/09/15 职场文书
办理收楼委托书范本
2014/10/09 职场文书
学习经验交流会演讲稿
2015/11/02 职场文书
严以用权专题学习研讨会发言材料
2015/11/09 职场文书
跟班学习心得体会(共6篇)
2016/01/23 职场文书
Java新手教程之ArrayList的基本使用
2021/06/20 Java/Android
Python实现科学占卜 让视频自动打码
2022/04/09 Python