calendar_jinjian.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679
  1. <template>
  2. <view class="fu-calendar-wrap">
  3. <!-- 日历选择 start -->
  4. <view class="fu-calendar-data fu-flex fu-justify-center fu-align-center fu-margin fu-height-72" v-if="changeTitle">
  5. <block v-if="changeYear">
  6. <view class="fu-arrow fu-left fu-flex fu-justify-between fu-align-center" @click="prevYear">
  7. <text class="iconfont icon-changyongicon-" :style="[yaColor]"></text>
  8. </view>
  9. </block>
  10. <block v-if="changeMonth">
  11. <view class="fu-arrow single fu-left fu-flex fu-justify-between fu-align-center" @click="prevMonth">
  12. <text class="iconfont icon-jiantouyou" :style="[maColor]"></text>
  13. </view>
  14. </block>
  15. <view class="fu-title fu-text-32 fu-text-333">{{ currentDate[0] }}年{{ currentDate[1] }}月</view>
  16. <block v-if="changeMonth">
  17. <view class="fu-arrow single fu-right fu-flex fu-justify-between fu-align-center" @click="nextMonth">
  18. <text class="iconfont icon-jiantouyou" :style="[maColor]"></text>
  19. </view>
  20. </block>
  21. <block v-if="changeYear">
  22. <view class="fu-arrow fu-flex fu-right fu-justify-between fu-align-center" @click="nextYear">
  23. <text class="iconfont icon-changyongicon-" :style="[yaColor]"></text>
  24. </view>
  25. </block>
  26. </view>
  27. <!-- 日历选择 end -->
  28. <!-- 星期 start -->
  29. <view class="fu-week fu-flex fu-justify-between fu-align-center fu-text-333 fu-height-72">
  30. <view class="fu-week-item fu-text-center" v-for="item in weekData" :key="item">{{ item }}</view>
  31. </view>
  32. <!-- 星期 end -->
  33. <!-- 日历 start -->
  34. <view class="fu-calendar fu-flex fu-justify-between fu-align-center fu-flex-wrap fu-text-333">
  35. <!-- mode == date || mode == range -->
  36. <view
  37. class="fu-calendar-item fu-text-center"
  38. @click="changeCalendar(item, index)"
  39. :class="{ isNot: item.isNot, isFuture: item.isFuture && !item.isNot }"
  40. v-for="(item, index) in calendar"
  41. :key="index"
  42. >
  43. <view
  44. class="fu-calendar-num fu-flex fu-justify-center fu-align-center"
  45. :class="{ signin: mode == 'signin', range: mode == 'range', start: item.start, end: item.end }"
  46. :style="[(item.dayActive || item.start || item.end) && !item.isNot ? dayBg : {}, item.active && !item.isNot ? activeBg : {}]"
  47. >
  48. {{ item.day }}
  49. <view class="fu-calendar-text" v-show="item.start">{{ startText }}</view>
  50. <view class="fu-calendar-text" v-show="item.end">{{ endText }}</view>
  51. </view>
  52. </view>
  53. </view>
  54. <!-- 日历 end -->
  55. </view>
  56. </template>
  57. <script>
  58. /**
  59. * @author 邓东方
  60. */
  61. export default {
  62. props: {
  63. // 月份切换按钮箭头颜色
  64. 'month-arrow-color':{
  65. type: String,
  66. default: '#666666'
  67. },
  68. // 年份切换按钮箭头颜色
  69. 'year-arrow-color':{
  70. type: String,
  71. default: '#999999'
  72. },
  73. // 是否显示顶部年月
  74. 'change-title': {
  75. type: Boolean,
  76. default: true
  77. },
  78. // 是否显示顶部的切换年份方向的按钮
  79. 'change-year': {
  80. type: Boolean,
  81. default: true
  82. },
  83. // 是否显示顶部的切换月份方向的按钮
  84. 'change-month': {
  85. type: Boolean,
  86. default: true
  87. },
  88. // 日期模式 date 单个日期选择模式 range 日期段选择模式 signin 签到日期展示模式
  89. mode: {
  90. type: String,
  91. default: 'date'
  92. },
  93. // 未来日期是否可选择 默认不可选择
  94. future: {
  95. type: Boolean,
  96. default: false
  97. },
  98. // 日期段回显时 若只传入一个日期则不显示
  99. //日期段选择时默认显示开始时间
  100. 'start-time': {
  101. type: String,
  102. default: ''
  103. },
  104. //日期段选择时默认显示结束时间
  105. 'end-time': {
  106. type: String,
  107. default: ''
  108. },
  109. // 起始日期底部的提示文字
  110. 'start-text': {
  111. type: String,
  112. default: '开始'
  113. },
  114. // 结束日期底部的提示文字
  115. 'end-text': {
  116. type: String,
  117. default: '结束'
  118. },
  119. // 选择日期开始结束当天背景色
  120. 'active-bg-color': {
  121. type: String,
  122. default: 'rgba(41,121,255,1)'
  123. },
  124. // 选择日期中间的背景色
  125. 'range-bg-color': {
  126. type: String,
  127. default: 'rgba(41,121,255,0.13)'
  128. },
  129. // 当前日期是否高亮
  130. isDefaultDay: {
  131. type: Boolean,
  132. default: true
  133. },
  134. // 单个日期选择默认选中时间 xxxx-yy-dd
  135. currenTime: {
  136. type: String,
  137. default: ''
  138. },
  139. // 签到模式数据 [xxxx-yy-dd]
  140. signinData: {
  141. type: Array,
  142. default: function() {
  143. return [];
  144. }
  145. }
  146. },
  147. data() {
  148. return {
  149. weekData: ['日', '一', '二', '三', '四', '五', '六'], //星期
  150. calendar: [], //日历数组
  151. currentDate: [], //当前日期
  152. currentDay: '', //当天时间
  153. start: '', //开始时间
  154. end: '', //结束时间
  155. isEmit: true //mode == range是否推送
  156. };
  157. },
  158. computed: {
  159. // 背景色
  160. dayBg() {
  161. return { background: this.activeBgColor, color: '#ffffff' };
  162. },
  163. // 时间段背景色
  164. activeBg() {
  165. return { background: this.rangeBgColor, color: '#ffffff' };
  166. },
  167. // 年份箭头颜色
  168. yaColor(){
  169. return { color: this.yearArrowColor };
  170. },
  171. // 月份箭头颜色
  172. maColor(){
  173. return { color: this.monthArrowColor };
  174. }
  175. },
  176. watch: {
  177. signinData: {
  178. deep: true,
  179. handler(newVal, oldVal) {
  180. if (mode == 'signin') {
  181. this.singinFun(this.calendar, newVal);
  182. }
  183. }
  184. }
  185. },
  186. mounted() {
  187. let currentDate = this.currentime();
  188. let y = currentDate[0];
  189. let m = currentDate[1] > 9 ? currentDate[1] : '0' + currentDate[1];
  190. let d = currentDate[2] > 9 ? currentDate[2] : '0' + currentDate[2];
  191. this.currentDate = currentDate;
  192. // mode == 'date' 在传入单个时间时 currentDay不再显示默认的当前时间
  193. if (this.mode == 'date') {
  194. if (this.currenTime) {
  195. this.currentDay = this.currenTime;
  196. } else {
  197. if (this.isDefaultDay) {
  198. this.currentDay = `${y}-${m}-${d}`;
  199. }
  200. }
  201. }
  202. // mode == 'date' isDefaultDay == true时 当前时间才显示
  203. if (this.mode == 'range') {
  204. if (this.isDefaultDay) {
  205. this.currentDay = `${y}-${m}-${d}`;
  206. }
  207. }
  208. // 日历赋值
  209. this.calendar = this.getCalendar(currentDate[0], currentDate[1], currentDate[2]);
  210. },
  211. methods: {
  212. /**
  213. * @description 获取当前时间函数
  214. */
  215. currentime() {
  216. var date = new Date();
  217. var y = Number(date.getFullYear());
  218. var m = Number(date.getMonth() + 1);
  219. var d = Number(date.getDate());
  220. return [y, m, d];
  221. },
  222. isLeapYear(y){
  223. const cond1 = y % 4 == 0; //条件1:年份必须要能被4整除
  224. const cond2 = y % 100 != 0; //条件2:年份不能是整百数
  225. const cond3 = y % 400 == 0; //条件3:年份是400的倍数
  226. //当条件1和条件2同时成立时,就肯定是闰年,所以条件1和条件2之间为“与”的关系。
  227. //如果条件1和条件2不能同时成立,但如果条件3能成立,则仍然是闰年。所以条件3与前2项为“或”的关系。
  228. //所以得出判断闰年的表达式:
  229. return (cond1 && cond2) || cond3;
  230. },
  231. /**
  232. * @description 获取日历
  233. * @param {String,Number} y 年
  234. * @param {String,Number} m 月
  235. */
  236. getCalendar(y, m) {
  237. // 求解cy年cm月cd日是星期几,parseInt代表取整 d=1是去每个月第一天
  238. var cc = parseInt(y / 100); //c
  239. var cy = y - cc * 100; //y
  240. var cm = m; //m
  241. var cd = 1; //d
  242. // 某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算
  243. if (m == 1 || m == 2) {
  244. cc = parseInt((y - 1) / 100);
  245. cy = y - 1 - cc * 100;
  246. cm = 12 + m;
  247. }
  248. //w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
  249. // var csum = y + [y / 4] + [c / 4] - 2c+[26(m + 1)/10]+d-1;
  250. var csum = cy + parseInt(cy / 4) + parseInt(cc / 4) - 2 * cc + parseInt((26 * (cm + 1)) / 10) + cd - 1;
  251. // 注意使用蔡勒公式时出现负数情况 fd 每月第一天星期几
  252. if (csum < 0) {
  253. var fd = parseInt(((csum % 7) + 7) % 7);
  254. } else {
  255. var fd = parseInt(csum % 7);
  256. }
  257. // 上个月天数
  258. var cond1 = y % 4 == 0; //条件1:年份必须要能被4整除
  259. var cond2 = y % 100 != 0; //条件2:年份不能是整百数
  260. var cond3 = y % 400 == 0; //条件3:年份是400的倍数
  261. //当条件1和条件2同时成立时,就肯定是闰年,所以条件1和条件2之间为“与”的关系。
  262. //如果条件1和条件2不能同时成立,但如果条件3能成立,则仍然是闰年。所以条件3与前2项为“或”的关系。
  263. //所以得出判断闰年的表达式:
  264. var cond = this.isLeapYear(y);
  265. //判断当月有多少天
  266. var allDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][m - 1];
  267. if (cond && m == 2) {
  268. allDays = 29;
  269. }
  270. //上个月是不是去年
  271. let prevYear = y;
  272. let prevMonth = m - 1;
  273. if (m == 1) {
  274. prevYear = y - 1;
  275. prevMonth = 12;
  276. }
  277. let _prevMonth = prevMonth > 9 ? prevMonth : '0' + prevMonth;
  278. let _m = m > 9 ? m : '0' + m;
  279. //判断上个月天数
  280. var prevDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][prevMonth - 1];
  281. if(prevMonth === 2 && cond) prevDays = 29;
  282. var calendar = [];
  283. //这里塞入上个月末尾日期
  284. //day 日 active 是否选择 isNot 是不是这个月 formData 日期格式 isBg 是否加背景色(日期段筛选时使用)
  285. for (let i = 1; i <= fd; i++) {
  286. let prevDay = prevDays - fd + i;
  287. let _prevDay = prevDay > 9 ? prevDay : '0' + prevDay;
  288. calendar.push({
  289. day: prevDay,
  290. active: false,
  291. isNot: true,
  292. formData: prevYear + '-' + _prevMonth + '-' + _prevDay
  293. });
  294. }
  295. //这里塞入正常这个月的日期
  296. let week = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
  297. for (let i = 1; i <= allDays; i++) {
  298. let _i = i > 9 ? i : '0' + i;
  299. calendar.push({
  300. day: i,
  301. active: false,
  302. isNot: false,
  303. formData: y + '-' + _m + '-' + _i,
  304. week: week[((i + fd - 1) % 7) % 7],
  305. year: y,
  306. month: m,
  307. allDays: allDays
  308. });
  309. }
  310. //下个月是不是下一年
  311. let nextYear = y;
  312. let nextMonth = m + 1;
  313. if (m == 12) {
  314. nextYear = y + 1;
  315. nextMonth = 1;
  316. }
  317. let _nextMonth = nextMonth > 9 ? nextMonth : '0' + nextMonth;
  318. //判断数组最后一排剩余几个位置塞入下个月日期
  319. let takedie = calendar.length % 7;
  320. if (7 - takedie > 0 && 7 - takedie < 7) {
  321. for (let i = 1; i <= 7 - takedie; i++) {
  322. let _i = i > 9 ? i : '0' + i;
  323. calendar.push({
  324. day: i,
  325. active: false,
  326. isNot: true,
  327. formData: nextYear + '-' + _nextMonth + '-' + _i
  328. });
  329. }
  330. }
  331. // 默认当天时间加背景色
  332. if (this.mode == 'date') {
  333. // 在range模式时 start end不存在时走这个
  334. if (this.isDefaultDay || this.currentDay) {
  335. this.currentDayFun(calendar, this.currentDay, true);
  336. }
  337. }
  338. if (this.mode == 'range') {
  339. // 在range模式时 start end不存在时走这个
  340. if (this.isDefaultDay || this.currentDay) {
  341. if (!this.startTime || !this.endTime) {
  342. this.currentDayFun(calendar, this.currentDay, true);
  343. }
  344. }
  345. // 当开始时间与结束时间存在时
  346. if (this.startTime && this.endTime && this.startTime != this.endTime) {
  347. // 当没有选择过时 进行赋值操作 若是已经点击过 start end存在值 就不需要赋值了
  348. if (!this.start && !this.end) {
  349. this.start = this.startTime;
  350. this.end = this.endTime;
  351. // 判断开始结束值存入本地
  352. if (!uni.getStorageSync('startItem')) {
  353. let startItem = calendar.find(item => item.formData == this.start);
  354. uni.setStorageSync('startItem', JSON.stringify(startItem));
  355. }
  356. if (!uni.getStorageSync('endItem')) {
  357. let endItem = calendar.find(item => item.formData == this.end);
  358. uni.setStorageSync('endItem', JSON.stringify(endItem));
  359. }
  360. }
  361. }
  362. this.rangeDayFun(calendar,true);
  363. }
  364. if (this.mode == 'signin') {
  365. this.singinFun(calendar, this.signinData);
  366. }
  367. // 判断未来日期是否可选择
  368. if (!this.future) {
  369. let nowData = new Date().getTime();
  370. calendar.forEach(val => {
  371. val.isFuture = false;
  372. if (new Date(val.formData).getTime() > nowData) {
  373. val.isFuture = true;
  374. }
  375. });
  376. }
  377. return calendar;
  378. },
  379. /**
  380. * @description 高亮日期 签到模式
  381. */
  382. singinFun(calendar, data) {
  383. calendar.forEach(a => {
  384. a.dayActive = false;
  385. data.forEach(b => {
  386. if (a.formData == b.date) {
  387. a.dayActive = true;
  388. }
  389. });
  390. });
  391. this.calendar = calendar;
  392. this.$forceUpdate();
  393. },
  394. /**
  395. * @description 单个日期是否高亮
  396. * @param {Array} calendar 日历数组
  397. * @param {String} day 选择的日期
  398. * @param {Boolen} isInit 初始化触发change时间参数
  399. */
  400. currentDayFun(calendar, day,isInit = false) {
  401. let that = this;
  402. calendar.forEach(item => {
  403. item.dayActive = false;
  404. if (Math.floor(new Date(item.formData).getTime() / 1000) == Math.floor(new Date(day).getTime() / 1000)) {
  405. item.dayActive = true;
  406. if (this.mode == 'date') {
  407. that.$emit('change', { day: item.day, time: item.formData, week: item.week, year: item.year, month: item.month, allDays: item.allDays,isInit:isInit });
  408. }
  409. }
  410. });
  411. this.calendar = calendar;
  412. this.$forceUpdate();
  413. },
  414. /**
  415. * @description 日期范围选择
  416. */
  417. rangeDayFun(calendar,isInit = false) {
  418. // 判断 start end 和中间的时间
  419. calendar.forEach(val => {
  420. val.start = false;
  421. val.end = false;
  422. val.active = false;
  423. val.dayActive = false;
  424. // 开始时间
  425. if (new Date(val.formData).getTime() == new Date(this.start).getTime()) {
  426. val.start = true;
  427. }
  428. // 结束时间
  429. if (new Date(val.formData).getTime() == new Date(this.end).getTime()) {
  430. val.end = true;
  431. }
  432. // 当开始结束时间选择完毕 开始时间大于结束时间时进行翻转
  433. if (this.start && this.end && new Date(this.start).getTime() > new Date(this.end).getTime()) {
  434. let start = this.start;
  435. this.start = this.end;
  436. this.end = start;
  437. }
  438. // 开始结束中间时间段
  439. if (new Date(val.formData).getTime() > new Date(this.start).getTime() && new Date(val.formData).getTime() < new Date(this.end).getTime()) {
  440. val.active = true;
  441. }
  442. });
  443. if (this.start && this.end && this.isEmit) {
  444. let startItem = JSON.parse(uni.getStorageSync('startItem'));
  445. let endItem = JSON.parse(uni.getStorageSync('endItem'));
  446. this.$emit('change', {
  447. start: this.start,
  448. startYear: startItem.year,
  449. startWeek: startItem.week,
  450. startMonth: startItem.month,
  451. startDay: startItem.day,
  452. end: this.end,
  453. endYear: endItem.year,
  454. endWeek: endItem.week,
  455. endMonth: endItem.month,
  456. endDay: endItem.day,
  457. isInit:isInit
  458. });
  459. this.isEmit = false;
  460. }
  461. this.calendar = calendar;
  462. this.$forceUpdate();
  463. },
  464. /**
  465. * @description 点击日期
  466. * @param {Object} item 入参 所点击日期信息
  467. */
  468. changeCalendar(item, index) {
  469. // 签到模式纯展示模式
  470. if (this.mode == 'signin') return;
  471. // 未来日期 上下月日期不可选择
  472. if (item.isFuture || item.isNot) return;
  473. if (this.mode == 'date') {
  474. if(this.currentDay == item.formData) return;
  475. // 选择日期记录
  476. this.currentDay = item.formData;
  477. this.currentDayFun(this.calendar, item.formData);
  478. }
  479. if (this.mode == 'range') {
  480. // 当已经选择了开始结束时间时 再次点击时先清空之前的时间
  481. if (this.start && this.end) {
  482. this.start = '';
  483. this.end = '';
  484. this.isEmit = true;
  485. uni.removeStorageSync('startItem');
  486. uni.removeStorageSync('endItem');
  487. }
  488. // 默认先赋值开始时间
  489. if (!this.start && !this.end) {
  490. this.start = item.formData;
  491. uni.setStorageSync('startItem', JSON.stringify(item));
  492. } else if (this.start && !this.end) {
  493. // 当第二次选择时间和第一次相同时 不再触发赋值
  494. if (this.start == item.formData) return;
  495. this.end = item.formData;
  496. uni.setStorageSync('endItem', JSON.stringify(item));
  497. }
  498. this.rangeDayFun(this.calendar);
  499. }
  500. },
  501. /**
  502. * @description 上年今月
  503. */
  504. prevYear() {
  505. let currentDate = this.currentDate;
  506. currentDate = [currentDate[0] - 1, currentDate[1]];
  507. this.currentDate = currentDate;
  508. this.calendar = this.getCalendar(currentDate[0], currentDate[1]);
  509. },
  510. /**
  511. * @description 下年今月
  512. */
  513. nextYear() {
  514. let currentDate = this.currentDate;
  515. currentDate = [Number(currentDate[0]) + 1, Number(currentDate[1])];
  516. this.currentDate = currentDate;
  517. this.calendar = this.getCalendar(currentDate[0], currentDate[1]);
  518. },
  519. /**
  520. * @description 上月
  521. */
  522. prevMonth() {
  523. let currentDate = this.currentDate;
  524. if (currentDate[1] - 1 == 0) {
  525. currentDate = [currentDate[0] - 1, 12];
  526. } else {
  527. currentDate = [currentDate[0], currentDate[1] - 1];
  528. }
  529. this.currentDate = currentDate;
  530. this.calendar = this.getCalendar(currentDate[0], currentDate[1]);
  531. },
  532. /**
  533. * @description 下月
  534. */
  535. nextMonth() {
  536. let currentDate = this.currentDate;
  537. if (currentDate[1] == 12) {
  538. currentDate = [Number(currentDate[0]) + 1, 1];
  539. } else {
  540. currentDate = [Number(currentDate[0]), Number(currentDate[1]) + 1];
  541. }
  542. this.currentDate = currentDate;
  543. this.calendar = this.getCalendar(currentDate[0], currentDate[1]);
  544. }
  545. }
  546. };
  547. </script>
  548. <style scoped lang="scss">
  549. @import '@/static/font/iconfont.css';
  550. .fu-flex {
  551. display: flex;
  552. }
  553. .fu-justify-center {
  554. justify-content: center;
  555. }
  556. .fu-justify-between {
  557. justify-content: space-between;
  558. }
  559. .fu-align-center {
  560. align-items: center;
  561. }
  562. .fu-text-32 {
  563. font-size: 32rpx;
  564. }
  565. .fu-text-333 {
  566. color: #333333;
  567. }
  568. .fu-text-center {
  569. text-align: center;
  570. }
  571. .fu-margin {
  572. margin: 10rpx 0;
  573. }
  574. .fu-height-72 {
  575. height: 72rpx;
  576. line-height: 72rpx;
  577. }
  578. .fu-flex-wrap {
  579. flex-wrap: wrap;
  580. }
  581. // 日历选择 start
  582. .fu-calendar-data {
  583. .fu-title{
  584. padding: 0 10rpx;
  585. }
  586. .fu-arrow {
  587. height: 100%;
  588. // padding: 0 10rpx;
  589. text{
  590. font-size: 36rpx;
  591. }
  592. &.fu-left{
  593. transform: rotate(180deg);
  594. padding-left: 10rpx;
  595. }
  596. &.fu-right{
  597. padding-left: 10rpx;
  598. }
  599. &.single {
  600. text{
  601. font-size: 32rpx;
  602. }
  603. }
  604. }
  605. }
  606. // 日历选择 end
  607. // 星期 start
  608. .fu-week {
  609. .fu-week-item {
  610. width: calc(100% / 7);
  611. }
  612. }
  613. // 星期 end
  614. // 日历 start
  615. .fu-calendar {
  616. .fu-calendar-item {
  617. width: calc(100% / 7);
  618. padding-bottom: calc(100% / 7);
  619. position: relative;
  620. overflow: hidden;
  621. .fu-calendar-num {
  622. position: absolute;
  623. left: 0;
  624. top: 0;
  625. width: 100%;
  626. height: 100%;
  627. &.start {
  628. border-radius: 16rpx 0 0 16rpx;
  629. }
  630. &.end {
  631. border-radius: 0 16rpx 16rpx 0;
  632. }
  633. .fu-calendar-text {
  634. position: absolute;
  635. bottom: 4rpx;
  636. left: 0;
  637. width: 100%;
  638. font-size: 20rpx;
  639. color: #ffffff;
  640. text-align: center;
  641. }
  642. &.range {
  643. position: absolute;
  644. width: 100%;
  645. height: 90%;
  646. top: 50%;
  647. transform: translateY(-50%);
  648. }
  649. &.signin {
  650. position: absolute;
  651. width: 60%;
  652. height: 60%;
  653. left: 50%;
  654. top: 50%;
  655. transform: translate(-50%, -50%);
  656. border-radius: 50%;
  657. }
  658. }
  659. &.isNot {
  660. color: #eee;
  661. }
  662. &.isFuture {
  663. color: #999;
  664. }
  665. }
  666. }
  667. // 日历 end
  668. </style>