自适配日历组件开发

效果图

PC端

挪动端

预览

预览地址:预览地址

1、传入参数

1.1、顶部背景图片

如上图红圈区域的照片背景设置

在组件参数中定义

bgSrc: {    type: String,        default: 'https://images8.alphacoders.com/992/992329.jpg'}

1.2、日历题目


如上图圈住区域文字设置

在组件参数中定义

title: {    type: String,    default: '日历'}

2、回调办法

2.1、选中日期

应用this.$emit()向父组件传递数据。

在组件日期点击事件中执行。

clickDay (day) {    this.selectDay = day    this.$emit('selectDay', day)}

2.2、切换月份

应用this.$emit()向父组件传递数据。

在组件日期点击事件中执行。

//上个月toPreMonth () {    let year = this.selectMonth.split('-')[0]    let month = this.selectMonth.split('-')[1]    month = parseInt(month) - 1    if (month === 0) {        month = 12        year = parseInt(year) - 1    }    this.days = this.fillDays(year, month)    this.$emit('changeMonth', year + '-' + this.zero(month))},//下个月toNextMonth () {    let year = this.selectMonth.split('-')[0]    let month = this.selectMonth.split('-')[1]    month = parseInt(month) + 1    if (month === 13) {        month = 1        year = parseInt(year) + 1    }    this.days = this.fillDays(year, month)    this.$emit('changeMonth', year + '-' + this.zero(month))}

3、组件js模块开发流程

3.1、月份天数确认

3.1.1、判断润年
/** * 判断润年 * @param {string} year 须要判断的年份 * @return {Boolean} */function isLeap(year) {    if((year%4==0 && year%100!=0)||(year%400==0)){        return true;    }    return false;}
3.1.2、获取月份天数
/** * 获取月份天数 * @param {string} year  年份 * @param {string} month 月份 * @return {string} */function getMonthDays(year,month) {    month = parseInt(month) - 1;    if(month < 0 || month > 11) return ''    let months = [31,28,31,30,31,30,31,31,30,31,30,31];    if(isLeap(year)){        months[1] = 29;    }    return months[month];}
3.1.3、获取星期
/** * 获取星期 * @param {string} date 须要获取星期的日期 * @return {string} */function getWeek(date){    let weeks = new Array("日","一","二","三","四","五","六");    let Stamp = new Date(date);    console.log(weeks[Stamp.getDay()])}
3.1.4、补充满天数
/** * 补零 * @param {string} str 须要补零的数 * @return {string} */function zero(str){    return str > 9 ? str : '0' + str;}/** * 补充满天数 * @param {string} year  年份 * @param {string} month 月份 * @return {string} */function fillDays(year,month) {    const months = getMonthDays(year,month);    const startWeek = getWeek(year + '-' + month + '-' + '01');    const endWeek = getWeek(year + '-' + month + '-' + months);    year = parseInt(year);    month = parseInt(month);    let preYear = year;    let preMonth = month - 1;    if(preMonth == 0){        preMonth = 12;        preYear = year - 1;    }    const preMonths = getMonthDays(preYear,preMonth);    let nextYear = year;    let nextMonth = month + 1;    if(nextMonth == 13){        nextMonth = 1;        nextYear = year + 1;    }    const nextMonths = getMonthDays(nextYear,nextMonth);    let days = [];    for(let i = 0; i < startWeek; i++){        days.unshift(preYear + '-' + preMonth + '-' + (preMonths - i));    }    for(let i = 1; i <= months; i++){        days.push(year + '-' + zero(month) + '-' + zero(i));    }    for(let i = 0; i < (6 - endWeek); i++){        days.push(nextYear + '-' + nextMonth + '-0' + (i + 1));    }    return days;}

3.2、点击事件

3.2.1、月份切换
toPreMonth () {    let year = this.selectMonth.split('-')[0]    let month = this.selectMonth.split('-')[1]    month = parseInt(month) - 1    if (month === 0) {        month = 12        year = parseInt(year) - 1    }    this.days = this.fillDays(year, month)    this.$emit('changeMonth', year + '-' + this.zero(month))},toNextMonth () {    let year = this.selectMonth.split('-')[0]    let month = this.selectMonth.split('-')[1]    month = parseInt(month) + 1    if (month === 13) {        month = 1        year = parseInt(year) + 1    }    this.days = this.fillDays(year, month)    this.$emit('changeMonth', year + '-' + this.zero(month))}
3.2.2、日期点击
clickDay (day) {    this.selectDay = day    this.$emit('selectDay', day)}

4、html模块

<template>    <div>        <div id="header" class="header">            <div class="header-title">{{title}}</div>            <div class="btn-list">        <div class="btn-list-left">          <div class="btn-pre" @click="toPreMonth()"><</div>          <div class="select-month">{{selectMonth}}</div>          <div class="btn-next" @click="toNextMonth()">></div>        </div>                <div class="btn-today" @click="toNowDay()">回到明天</div>            </div>        </div>        <div class="content" id="content">          <div class="calendar-content">             <div class="grid-week grid" v-for="(item,index) in weeks" :key="index">                 周{{item}}             </div>             <div @click="clickDay(item)"                  class="grid-day grid"                  :class="{'selected': item == selectDay}"                  v-for="(item,index) in days"                  :key="index">                 {{item.split('-')[2]}}             </div>          </div>        </div>    </div></template>

5、CSS款式

<style lang="scss" scoped>  @media screen and (max-width:500px) {    .header{      height: calc(100vw * 9 / 16);    }  }  .header{    display: flex;    flex-direction: column;    .header-title{      line-height: 5rem;    }    .btn-list{      display: flex;      padding: 1rem;      margin-top: auto;      .btn-list-left{        padding: 0.5rem;        width: 40%;        display: flex;        .select-month{          flex: 2;        }        .btn-pre{          flex: 1;          background-color: #0080FF;        }        .btn-next{          flex: 1;          background-color: #0080FF;        }      }      .btn-today{        padding: 0.5rem;        margin-left: auto;        margin-right: 1rem;        background-color: #076678;        color: white;      }    }  }    .calendar-content{        display: flex;        flex-wrap: wrap;        width: 100%;    .selected{      background-color: #007FAA;    }    .grid{      width: calc((100% - 9px)/7);      height: 3rem;      line-height: 3rem;      border-left: #005599 solid 1px;      border-bottom: #005599 solid 1px;    }    .grid-week{      border-top: #005599 solid 1px;    }    .grid-week:nth-child(7){      border-right: #005599 solid 1px;    }    .grid-day:nth-child(14){      border-right: #005599 solid 1px;    }    .grid-day:nth-child(21){      border-right: #005599 solid 1px;    }    .grid-day:nth-child(28){      border-right: #005599 solid 1px;    }    .grid-day:nth-child(35){      border-right: #005599 solid 1px;    }    .grid-day:nth-child(42){      border-right: #005599 solid 1px;    }    }</style>

源码地址

Gitee:https://gitee.com/zheng_yongtao/jyeontu-component-warehouse/tree/master/components

喜爱的能够给个start★★★★★