JSFiddle - React, Tailwind, and code Playground

by damngoto

HTML

<link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css">
<link rel="stylesheet" href="http://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.2.0/css/font-awesome.min.css">
<script src="http://h5.dataeye.com/assets/build/base.js?52f155a291cd28d9e97976bbb8d53a05"></script>
<div class="wrapper">
		<div id="el"></div>
	</div>

	<script id="main"  type="text/plain" >
		<h3>设置连选模式:</h3>
		<div class="btn btn-group">
			<button class="btn btn-default" on-click="selectMultiDays:-7">
				前7天
			</button>
			<button class="btn btn-default" on-click="selectMultiDays:-30">
				前30天
			</button>
			<button class="btn btn-default" on-click="selectMultiDays:7">
				后7天
			</button>
			<button class="btn btn-default" on-click="selectMultiDays:30">
				后30天
			</button>
			<button class="btn btn-default" on-click="selectMultiDays:0">
				自定义
			</button>
		</div>

		<calendar start="2014-11-06" end="2014-11-06"></calendar>
		<hr>
		<h3>单日选择模式:</h3>
		<calendar selected="2014-11-06"></calendar>
	</script>

	<script id="ractive-calendar" type="text/plain">
	<div class="de-calendar">
		<span class="form-control" on-click="toggle" style="cursor: pointer;">
			{{format(startDate)}}
			{{#isRange}}
				~ {{format(endDate)}}
			{{/}}
			<i class="fa fa-calendar"></i>
		</span>
		{{#show}}
		<div class="de-calendar-container {{next ? 'de-calendar-range':''}}">
			<div class="de-calendar-current">
				<table class="table">
					<thead>
						<tr>
							<td>
								<a href="javascript:;"><i class="fa fa-backward" on-click="goto:-1"></i></a>
							</td>
							<td colspan="5" style="text-align: center;">{{currentYear}}年{{currentMonth}}月</td>
							{{^next}}
							<td>
								<a href="javascript:;"><i class="fa fa-forward"...

CSS

.de-calendar {
	display: inline-block;
	position: relative;
	width:auto;
}

.de-calendar .form-control {
	display: inline-block;
}

.de-calendar .table {
	margin: 0;
}

.de-calendar .table thead td, .de-calendar .table tbody td {
	padding: 0;
	text-align: center;
	border-top: 0 !important;
	border-bottom: 0 !important;
}

.de-calendar .table thead a {
	color: #666;
}

.de-calendar .table thead td {
	padding: 10px 0;
}

.de-calendar .day div {
	width: 40px;
	padding: 5px 0;
	line-height: 18px;
	margin: 3px 0;
}

.de-calendar input {
	text-align: center;
}

.de-calendar .day {
	cursor: pointer;
}

.de-calendar .day div {
	color: #484848;
}

.de-calendar .day.selected div {
	background-color: #5A92C7;
	color: #fff;
}

.de-calendar .day.hovered div {
	background-color: #D1EEFC;
	color: #696969;
}

.de-calendar .day.start-date div{
	border-top-left-radius: 12px;
	border-bottom-left-radius: 12px;
}

.de-calendar .day.end-date div{
	border-top-right-radius: 12px;
	border-bottom-right-radius: 12px;
}

.de-calendar .day.hovered.start-date div{
	border-top-left-radius: 0;
	border-bottom-left-radius: 0;
}

.de-calendar .day.hovered.end-date div{
	border-top-right-radius: 0;
	border-bottom-right-radius: 0;
}

.de-calendar-range {
	width: 600px;
}

.de-calendar-container {
	position: absolute;
	top: 38px;
	left: 0;
	border: 1px solid #e1e1e1;
	background-color: #ffffff;
	border: 1px solid #AAAAAA;
	-webkit-border-radius: 2px;
	-moz-border-radius: 2px;
	border-radius: 2px;
	-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
	-moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
	box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
	-webkit-background-clip: padding-box;
	-moz-background-clip: padding;
	background-clip: padding-box;
	z-index: 9999;
}

.de-calendar-current {
	float:left;
	padding: 0 10px;
	width: 50%;
}

.de-calendar-next {
	float: right;
	padding: 0 10px;
	width: 50%;
}

.de-calendar-footer {
	background: #F3F3F3;
	background-image: -ms-linear-gradient(top, #FFFFFF,...

JavaScript

(function(global, factory) {
	'use strict';
	// Common JS (i.e. browserify) environment
	if (typeof module !== 'undefined' && module.exports && typeof require === 'function') {
		factory(require('ractive'));
	}
	// AMD?
	else if (typeof define === 'function' && define.amd) {
		define(['ractive'], factory);
	}
	// browser global
	else if (global.Ractive) {
		factory(global.Ractive);
	} else {
		throw new Error('Could not find Ractive! It must be loaded before the ractive-calendar plugin');
	}
}(typeof window !== 'undefined' ? window : this, function(Ractive) {

	// 获取月份相关信息:年、月、天数、本月首日周几
	var getMonthInfo = function(year, month) {
		var date = new Date(year, month, 1)
		var current = new Date(date.getTime() - 24 * 3600 * 1000)
		return {
			year: current.getFullYear(),
			month: current.getMonth() + 1,
			days: current.getDate(),
			// 周日按最后一天算
			day: new Date(year, month - 1, 1).getDay() || 7
		}
	}

	// 表格化数据,按周 6 * 7
	var tablify = function(items, rowLen, colLen) {
		var len = items.length
		var results = []
		for (var i = 0; i < rowLen; i++) {
			var array = []
			for (var j = 0; j < colLen; j++) {
				array.push(items[i * colLen + j])
			}
			results.push(array)
		}
		return results
	}

	// 获取当月日历表信息(固定42条数据)
	var getCalendarDays = function(year, month) {
		var current = getMonthInfo(year, month)
		var prev = getMonthInfo(year, month - 1)
		var next = getMonthInfo(year, month + 1)

		var items = []
		for (var i = 0; i < current.day - 1; i++) {
			items.unshift({
				year: prev.year,
				month: prev.month,
				date: prev.days - i,
				day: prev.day
			})
		}
		for (var i = 1; i <= current.days; i++) {
			items.push({
				year: current.year,
				month: current.month,
				date: i,
				day: current.day
			})
		}
		var paddingLen = 6 * 7 - current.days - (current.day - 1)
		for (var i = 1; i <= paddingLen; i++) {
			items.push({
				year: next.year,
				month: next.month,
				date: i,
				day: next.day
			})
		}
		return tablify(items, 6, 7)
	}

	//...