uniapp 「小程序」考勤系统的日历组件

由于是用uniapp写的,所以在网页上也可以用,先上预览图


日历.gif

主要功能:

  • 点击选中样式
  • 滑动跳转月份
  • 点击非本月日期跳转相应月份

一、css部分

css样式原理如下,红色框为用户视图。拖拉的时候改变left数值就可以了。

视图.png

小tips:
当宽度为自适应,不知道具体数值,而需要用宽度计算时,可以用padding-bottom。这样我们就可以一行放下七个圆形了。

.day-item{
            width: 14%;
            display: block;
            border-radius: 50%;
            padding-bottom: 100%;
            height: 0;
        }

所有css如下:
数字偏上是预留位置给当天的状态显示。

.module{
        width: 92%;
        margin: 15px auto;
        background-color: #fff;
        border-radius:16px;
        padding: 30rpx 20rpx;
        overflow: hidden;

        .threeMonth{
            display: flex;
            width: 300%;
            position: relative;
        }
        
        .title{
            font-size: 35rpx;
            font-weight: bold;
            padding-bottom: 30rpx;
        }
        
        .day{
            display: flex;
            position: relative;
            width: 100%;
            justify-content: space-around;
            flex-wrap: wrap;
            text-align: center;
            align-content: flex-start;
            
            .active{
                background-color: #1972F0;
                color: #fff;
            }
        }

        
        .day-item{
            width: 14%;
            text{
                display: block;
                border-radius: 50%;
                width: 100%;
                padding-top: calc(50% - 1em);
                padding-bottom: calc(50% + 1em);
                height: 0;
            }
        }

}

二、template部分

<view class="day">
  <view class="day-item" v-for="(item,index) in ['日','一','二','三','四','五','六']">
      {{item}}
  </view>
</view>

<!-- 日期 -->
<view 
    class="threeMonth"    
    @touchstart='touchstart'
    @touchmove='touchmove' 
    @touchend='touchend' 
    :style="'left:calc(-100% + '+dayLeft+'px)'"
>
    <!-- 遍历集合三个月的列表 -->
    <view class="day" 
        v-for="(item,index) in monthList"
        :key="index"
    >
        <!-- 遍历每个月的天数 -->
        <view 
            class="day-item" 
            v-for="(item2,index2) in item" 
            :key="index2"
            @click="dayClick(index2)"
        >
            <!-- 不是本月的天数颜色为灰色 -->
            <text :class="item2.className" :style="item2.fromMonth=='nowMonth'?'':'color:#c8c9cc;'">{{item2.day}}</text> 
        </view>
    </view>
</view>

三、js部分

功能与解释都在注释中写明。

<script>
    export default {
        data() {
            return {
                nowYear:new Date().getFullYear(),//获取年份
                nowMonth:new Date().getMonth()+1,//获取月份
                monthList:[],
                dayLeft: 0,
                startLeft: 0
            }
        },
        created() {
            /*调用初始化当前考勤*/
            this.getThreeMonth();
        },
        methods: {
            // 日期模块点击
            touchstart(e){
                // 记录初始点击位置
                this.startLeft = e.touches[0].pageX
            },
            // 日期模块拖动
            touchmove(e){
                this.dayLeft = e.touches[0].pageX - this.startLeft
            },
            // 日期模块松手
            touchend(e){
                // 根据移动距离判断跳转上一月还是下一月
                if(this.dayLeft>100 )this.syy()
                if(this.dayLeft<-100 )this.xyy()
                this.dayLeft = 0
            },
            /*获取上一月*/
            syy(){
                if (this.nowMonth==1){
                    this.nowYear=parseInt(this.nowYear)-1;
                    this.nowMonth=12;
                    this.getThreeMonth();
                    return;
                }
                this.nowMonth=parseInt(this.nowMonth)-1;
                this.getThreeMonth();
            },
            /*获取下一月*/
            xyy(){
                if (this.nowMonth==12){
                    this.nowYear=parseInt(this.nowYear)+1;
                    this.nowMonth=1;
                    this.getThreeMonth();
                    return;
                }
                this.nowMonth=parseInt(this.nowMonth)+1;
                this.getThreeMonth();
            },

            /*闰年 时间判断*/
            isLeap(year) {
                return year % 4 == 0 ? (year % 100 != 0 ? 1 : (year % 400 == 0 ? 1 : 0)) : 0;
            },

            //获取某月日期
            getCalendar(Year,Month){
                //每个月的天数
                var days_per_month = new Array(31, 28 + this.isLeap(Year), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); 
                var dateList = []; 
                
                //获取本月的一号是星期几 0星期天
                var s=new Date(Year + '/' + Month + '/' + '01').getDay();
                //上月月份
                var lastMonth = Month==1? 12: Month-1
                
                // 上月天数
                var lastMonthDay = days_per_month[lastMonth - 1]
                // 补上 上月日期
                for(var i = s-1; i >= 0; i--) {
                        
                        var day = parseInt(lastMonthDay)-i;
                        dateList.push({
                             day,
                             fromMonth: 'lastMonth',
                             className: ''
                        })//获取上月末尾天数  补齐本月日历显示
                 }
                 
                 
                // 当月天数
                var nowMonthDay = days_per_month[Month - 1]
                
                // 添加当月日期
                for(var j = 0; j < nowMonthDay; j++) {
                    dateList.push({
                        day: j+1,
                        fromMonth: 'nowMonth',
                        className: ''
                    })
                }
                
                //获取本月最后一天是星期几 0星期天
                var l =new Date(Year + '/' + Month + '/' + nowMonthDay).getDay();
                
                if(l < 6){
                    // 补上 下月日期
                    for(var i = 1; i <= 6-l; i++) {
                            
                            dateList.push({
                                 day: i,
                                 fromMonth: 'nextMonth',
                                className: ''
                            })
                     }
                }
                
                return dateList
            },
            // 获取三月日期
            getThreeMonth(){
                let year,month
                this.monthList = []
                
                // 获取上一月日历
                if (this.nowMonth==1){
                    year = parseInt(this.nowYear)-1;
                    month = 12
                }else{
                    year = this.nowYear
                    month = parseInt(this.nowMonth)-1;
                }
                this.monthList.push(this.getCalendar(year,month))
                
                // 获取当前月日历
                this.monthList.push(this.getCalendar(this.nowYear,this.nowMonth))
                
                
                // 获取下一月日历
                if (this.nowMonth==12){
                    year = parseInt(this.nowYear)+1;
                    month = 1
                }else{
                    year = this.nowYear
                    month = parseInt(this.nowMonth)+1;
                }
                this.monthList.push(this.getCalendar(year,month))
            },
            
            //点击某一天
            dayClick(Index){
                
                // 如果 点击本月的日期
                if(this.monthList[1][Index].fromMonth=='nowMonth'){
                    this.monthList[1].map((item,inx)=>{
                        if(Index == inx){
                            item.className = 'active'
                        }else{
                            item.className = ''
                        }
                    })
                    return
                }
                
                //点击 哪一天
                let day = this.monthList[1][Index].day
                
                if(this.monthList[1][Index].fromMonth=='nextMonth'){
                    // 如果 点击下一月的日期 跳转下一月
                    this.xyy()
                    
                }else if(this.monthList[1][Index].fromMonth=='lastMonth'){
                    // 如果 点击上一月的日期 跳转上一月
                    this.syy()
                }
                
                
                //对应日期 选中状态
                let indx = this.monthList[1].findIndex(e => e.fromMonth=='nowMonth'&&e.day==day)
                this.monthList[1][indx].className = 'active'
                
                
            },
            
        },
        
    }
</script>

四、结语

好了,基本上就这些。感觉js写的有点笨。如果有不懂的 或者 有更好的方法请在评论区告诉我,谢谢!

https://blog.csdn.net/m0_49343686/article/details/114370311

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,794评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,050评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,587评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,861评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,901评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,898评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,832评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,617评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,077评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,349评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,483评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,199评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,824评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,442评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,632评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,474评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,393评论 2 352