`
君淋天下
  • 浏览: 32563 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

仿Windows 7的Javascript日历组件

 
阅读更多

最近在做前端的东西比较多,为更好的掌握的前端技能水平,想通过写web前端组件来提供前端代码能力,第一个组件选了Windows 7右下角的日历为模仿对象

效果如下

  

 

Javascript代码

		<script type="text/javascript">
			var weekAry = ['日', '一', '二', '三', '四', '五', '六'];
			var monthAry = ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'];
			var currentYear;
			var currentMonth;
			var navYear;
			var attachParent = null;
			var sourcePosition;
			//月份模式选择时的年
			$(document).ready(function() {
				$('#birthday').bind('focus', function() {
					attachParent = $(this);
					sourcePosition = $(this).offset();
					var showDate = new Date();
					render_calendar();
				});

				$('#birthday').bind('focusout', function() {
					//$("#cal").hide();
				});

				$('#n_img').bind('click', function() {
					var neighboring = neighboringMonth(currentYear, currentMonth, 'n');
					render_calendar(new Date(neighboring.year, neighboring.month - 1, 1));
				});

				$('#p_img').bind('click', function() {
					var neighboring = neighboringMonth(currentYear, currentMonth, 'p');
					render_calendar(new Date(neighboring.year, neighboring.month - 1, 1));
				});

				$(document).bind('keypress', function(event) {
					if($('#cal').css('display') == 'block') {
						if(event.keyCode == 27) {//ESC
							$('#cal').hide();
						} else if(event.keyCode == 33) {//Page Up
							var neighboring = neighboringMonth(currentYear, currentMonth, 'p');
							render_calendar(new Date(neighboring.year, neighboring.month - 1, 1));
						} else if(event.keyCode == 34){//Page Down
							var neighboring = neighboringMonth(currentYear, currentMonth, 'n');
							render_calendar(new Date(neighboring.year, neighboring.month - 1, 1));
						}
					}

				});
			});
			//点击 从输入框中获取日期,然后弹出日历框 跳到对应日期 如果日期为空则为当天日期
			function show_calendar(input) {

			}

			//画日历
			function render_calendar(to_showday) {
				$("#cal_tab thead tr").remove();
				$("#cal_tab tbody tr").remove();
				$('#yms').html("");

				var showday = to_showday || new Date();
				var year = showday.getFullYear();
				var month = showday.getMonth() + 1;
				var day = showday.getDate();
				var dayOfWeek = showday.getDay();
				//星期几

				currentYear = year;
				currentMonth = month;
				navYear = year;

				$("#cal_tab thead").append('<tr></tr>');
				for(var i = 0; i < weekAry.length; i++) {
					$("#cal_tab thead tr").append('<td>' + weekAry[i] + '</td>');
				}

				var firstDay = new Date(year, month - 1, 1);
				//日历显示月的1号
				var firstDayOfWeek = firstDay.getDay();
				//一号是星期几
				var days = getDaysOfMonth(year, month);
				var lastMonthDays = month == 1 ? getDaysOfMonth(year - 1, 12) : getDaysOfMonth(year, month - 1);
				//前一个月有几天

				var dayArry = [];
				//上一个月
				var lastMonthBegin = firstDayOfWeek == 0 ? 7 : firstDayOfWeek;
				for(var i = lastMonthBegin - 1; i >= 0; i--) {
					dayArry.push(lastMonthDays - i);
				}

				//当前月
				for(var i = 1; i <= days; i++) {
					dayArry.push(i);
				}

				//下个月
				var leftDay = 42 - dayArry.length;
				for(var i = 1; i <= leftDay; i++) {
					dayArry.push(i);
				}

				//生成当前月
				$("#cal_tab tbody").append('<tr></tr>');
				for(var i = 0; i < 42; i++) {
					if(i <= lastMonthBegin - 1) {
						$("#cal_tab tbody tr:last").append("<td class='pm d_cell'>" + dayArry[i] + "</td>");
					} else if(i < lastMonthBegin + days) {
						$("#cal_tab tbody tr:last").append("<td class='cm d_cell'>" + dayArry[i] + "</td>");
					} else {
						$("#cal_tab tbody tr:last").append("<td class='nm d_cell'>" + dayArry[i] + "</td>");
					}
					if(i != 0 && (i + 1) % 7 == 0) {
						$("#cal_tab tbody").append('<tr></tr>');
					}
				}

				$('#cal_tab tbody tr td').bind('click', function() {
					if($(this).hasClass('pm')) {
						var neighboring = neighboringMonth(currentYear, currentMonth, 'p');
						$('#birthday').val(neighboring.year + '-' + neighboring.month + '-' + $(this).text());
						$('#cal').hide();
					} else if($(this).hasClass('cm')) {
						$('#birthday').val(currentYear + '-' + currentMonth + '-' + $(this).text());
						$('#cal').hide();
					} else {
						var neighboring = neighboringMonth(currentYear, currentMonth, 'n');
						$('#birthday').val(neighboring.year + '-' + neighboring.month + '-' + $(this).text());
						$('#cal').hide();
					}
				});

				$('#yms').bind('click', showYearTable);
				$('#yms').html(year + "年" + month + "月");
				if(sourcePosition != null){
					$("#cal").css({'left':sourcePosition.left,'top':sourcePosition.top+20,'position':'absolute'});
				} else {
				} 
				
				$("#cal").show();
				$("#day_cal").show();
			}

			function showYearTable() {
				$('#day_cal').hide();
				$('#month_cal table  tr').remove();
				$('#yyyy').html(navYear + '年');
				$('#month_cal table').append('<tr></tr>');
				for(var i = 0; i < monthAry.length; i++) {
					$('#month_cal table tr:last').append("<td class='m_cell' m='" + (i + 1) + "'>" + monthAry[i] + "</td>");
					if((i + 1) % 4 == 0 && i != monthAry.length - 1) {
						$('#month_cal table').append('<tr></tr>')
					}
				}

				// py_img  ny_img
				$('#py_img').unbind('click');
				$('#py_img').bind('click', function() {
					navYear = navYear - 1;
					showYearTable();
				});

				$('#ny_img').unbind('click');
				$('#ny_img').bind('click', function() {
					navYear = navYear + 1;
					showYearTable()
				});

				$('.m_cell').unbind('click');
				$('.m_cell').bind('click', function() {
					var m = $(this).attr('m');
					$('#month_cal').hide();
					$('#day_cal').show();
					render_calendar(new Date(navYear, parseInt(m) - 1, 1));
				});

				$('#cal').show();
				$('#month_cal').show();
			}

			/**
			 * flag 'n' or 'p'
			 */
			function neighboringMonth(year, month, flag) {
				if(flag === 'n') {
					var nYear = month === 12 ? year + 1 : year;
					var nMonth = month === 12 ? 1 : month + 1;
					return {
						'year' : nYear,
						'month' : nMonth
					};
				} else {
					var nYear = month === 1 ? year - 1 : year;
					var nMonth = month === 1 ? 12 : month - 1;
					return {
						'year' : nYear,
						'month' : nMonth
					};
				}
			}

			function getDaysOfMonth(year, month) {
				var dayOfMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
				var dayOfMonthLeap = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
				if(year % 100 == 0 && year % 400 == 0) {
					return dayOfMonthLeap[month - 1];
				} else if(year % 4 == 0) {
					return dayOfMonthLeap[month - 1];
				} else {
					return dayOfMonth[month - 1];
				}
			}
		</script>

 

 html代码

<body>
		<h1>仿Windows 7 日历</h1>
		<form style="position: absolute;top:60px;left: 50px;">
			<label  for="birthday">生日</label>
			<input type="text" style="width: 100px;" class="date_select" id="birthday"/>
			<label  for="birthday">名字</label>
			<input type="text" style="width: 100px;" class="date_select" id="yourname"/>
		</form>
		<div id="cal" style="width: 175px;height: 150px;display: none;">
			<div id="day_cal">
				<div><img src="img/p_month.jpg" id="p_img"/><span id="yms" style=""></span><img src="img/n_month.jpg" id="n_img"/>
				</div>
				<table id="cal_tab">
					<thead>
						<tr></tr>
					</thead>
					<tbody></tbody>
				</table>
			</div>
			<div id="month_cal">
				<div><img src="img/p_month.jpg" id="py_img"/><span id="yyyy"></span><img src="img/n_month.jpg" id="ny_img"/>
				</div>
				<table id="month_tab"></table>
			</div>
		</div>
	</body>

 日历组件代码还需要改进,包括功能改进、如何被其它页面调用等,有空再继续完善

  • 大小: 20.2 KB
分享到:
评论

相关推荐

    一款仿Windows风格系统时间和日历

    在实际的网页开发中,实现仿Windows风格的时间和日历组件可能会涉及到以下技术点: 1. HTML结构:HTML代码将定义日历和时间组件的基本布局,包括时间的显示区域、日历的打开和关闭按钮等。 2. CSS样式:CSS将用于...

    仿Vista的日历控件

    开发者可以通过研究这些源码学习如何创建交互式的Web日历组件,并可以根据需要自定义其样式和功能。此外,如果博客文章提供了详细的教程或解释,那么这对提升开发者在前端交互设计和JavaScript编程技能上会有很大...

    Windows风格的js日历插件(基于my97)

    【Windows风格的js日历插件(基于my97)】是一个JavaScript实现的日期选择器,它模拟了经典的Windows操作系统的界面风格,为网页提供了一种熟悉且易于使用的日期选择体验。这款插件的主要特点是对旧版Windows界面的...

    原生js实现仿window10系统日历效果的实例

    总结来说,这个实例展示了如何利用原生JavaScript实现一个功能完备的日历组件,包括获取当前日期和时间、动态生成年月选择器、以及创建交互式的日历表格。这个日历组件可以被应用于各种Web项目中,提供日期选择功能...

    WIN7 财经日历Gadget

    "WIN7 财经日历Gadget"是一款专为Windows 7操作系统设计的小工具,它集成在桌面侧边栏,提供实时的财经新闻、股市数据、经济指标等信息,帮助用户快速掌握金融市场动态。这款小工具是Windows 7用户进行金融投资决策...

    日历以及时间轴

    描述中提到的"会根据当月的日期数量展示"意味着日历组件需要动态调整布局,以适应不同月份的天数。例如,2月可能只需要4行,而4月或6月可能需要6行。此外,为了提高用户体验,日历应该支持用户点击日期,触发相应的...

    最好最实用的jsp日历用于插入自己软件中

    将JSP文件的后缀名改为HTML,说明这个日历组件在客户端也能以静态HTML的形式预览,这可能是通过在JSP中嵌入静态HTML和JavaScript代码实现的。开发者为了便于测试和调试,给出了这种简单快捷的查看方式。 【标签】:...

    win8风格日历

    【win8风格日历】是一种基于Windows 8操作系统界面设计灵感的日历组件,它提供了现代化、用户友好的日期和时间选择功能。在Web开发中,此类控件常常用于提升网站或应用的用户体验,使得用户能够方便地输入或选择日期...

    日历控件大全 - 日历控件

    在Java中,Swing和JavaFX提供了内置的日历组件,而在.NET Framework中,Windows Forms和WPF也有相应的控件。对于移动开发,iOS的UIKit和Android的Material Design都包含了日历组件,同时还有第三方库如React Native...

    Kalendar浏览器中功能齐全响应式轻量级的日历

    【Kalendar:浏览器中功能齐全,...综上所述,Kalendar是一个强大的JavaScript日历组件,结合Vue.js的灵活性和响应式设计的优势,为Web开发人员提供了一种高效、易用的解决方案,用于构建具有优秀日历功能的应用程序。

    百度用到的Js日历 大家可以看看

    7. 响应式设计:虽然从内容描述中没有明确提及,但是一个优秀的日历组件还应考虑到屏幕尺寸变化时的适应性,即响应式设计,以便在不同尺寸的设备上都能提供良好的用户体验。 8. 代码规范和维护性:为了保证代码的...

    日历 (IE,FireFox,Safari)

    开发者在实现日历组件时,可能需要使用特定的ActiveX控件或者JavaScript库来模拟日历功能,因为这些旧版本的IE不支持HTML5的`&lt;input type="date"&gt;`。然而,从IE8开始,微软开始逐步支持HTML5,所以在这些较新的版本...

    很好用的日历控件,日历、控件

    - 框架集成:在React、Vue、Angular等现代前端框架中,有许多第三方组件库提供了丰富的日历组件,如Ant Design的Calendar、Element UI的DatePicker等。 4. 平台应用: - 移动端:在iOS和Android应用中,日历控件...

    漂亮的日历控件

    "漂亮的日历控件"通常指的是那些不仅功能强大,而且设计美观,能够提升用户体验的日历组件。这类控件能够让用户在直观的界面中选择日期,进行事件安排或数据输入。 DaintyDateDemo可能是一个示例项目或者一个库,它...

    日历

    - 有时,开发者会利用开放源码的日历组件,如Google Calendar API或iCal格式,以集成到自己的应用中。 4. **另类应用**: - 日历不仅可以用于基本的时间管理,还可以与其他功能结合,如天气预报、工作任务、会议...

    移动端 滑动日历 mobiscroll

    在移动端应用开发中,日历组件通常是必不可少的元素,例如在事件管理、约会安排或者时间选择等场景下。Mobiscroll不仅提供了基本的日历视图,还支持时间选择器、日期时间选择器等多种模式,能满足不同应用场景的需求...

    经典的日历控件(一)

    同时,第三方控件库如DevExpress、Telerik等提供了丰富的日历组件,它们不仅外观精美,还包含许多高级功能,如多选日期、拖放操作等,极大地提高了开发效率。 在设计日历控件时,用户体验是关键。良好的设计应考虑...

    介绍一个ActiveX日历控件.ocx

    7. **兼容性问题**:由于ActiveX主要与Windows和Internet Explorer兼容,因此在非IE浏览器或非Windows操作系统上可能无法工作,这限制了其在现代Web开发中的广泛应用。 8. **安全性**:ActiveX控件可能带来安全风险...

    下拉式日历

    在Web开发中,JavaScript库如jQuery UI、Bootstrap Datepicker或Angular Material提供了现成的下拉日历组件。这些库通常提供丰富的配置选项,可以自定义样式、日期格式、禁用日期等。在原生移动应用开发中,iOS的...

Global site tag (gtag.js) - Google Analytics