uniapp 「小程序」考勤系統(tǒng)的日歷組件

由于是用uniapp寫的舒裤,所以在網(wǎng)頁上也可以用另锋,先上預覽圖


日歷.gif

主要功能:

  • 點擊選中樣式
  • 滑動跳轉月份
  • 點擊非本月日期跳轉相應月份

一、css部分

css樣式原理如下望伦,紅色框為用戶視圖疹启。拖拉的時候改變left數(shù)值就可以了古程。

視圖.png

小tips:
當寬度為自適應,不知道具體數(shù)值喊崖,而需要用寬度計算時挣磨,可以用padding-bottom。這樣我們就可以一行放下七個圓形了荤懂。

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

所有css如下:
數(shù)字偏上是預留位置給當天的狀態(tài)顯示茁裙。

.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"
    >
        <!-- 遍歷每個月的天數(shù) -->
        <view 
            class="day-item" 
            v-for="(item2,index2) in item" 
            :key="index2"
            @click="dayClick(index2)"
        >
            <!-- 不是本月的天數(shù)顏色為灰色 -->
            <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() {
            /*調(diào)用初始化當前考勤*/
            this.getThreeMonth();
        },
        methods: {
            // 日期模塊點擊
            touchstart(e){
                // 記錄初始點擊位置
                this.startLeft = e.touches[0].pageX
            },
            // 日期模塊拖動
            touchmove(e){
                this.dayLeft = e.touches[0].pageX - this.startLeft
            },
            // 日期模塊松手
            touchend(e){
                // 根據(jù)移動距離判斷跳轉上一月還是下一月
                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){
                //每個月的天數(shù)
                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
                
                // 上月天數(shù)
                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: ''
                        })//獲取上月末尾天數(shù)  補齊本月日歷顯示
                 }
                 
                 
                // 當月天數(shù)
                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()
                }
                
                
                //對應日期 選中狀態(tài)
                let indx = this.monthList[1].findIndex(e => e.fromMonth=='nowMonth'&&e.day==day)
                this.monthList[1][indx].className = 'active'
                
                
            },
            
        },
        
    }
</script>

四、結語

好了廊宪,基本上就這些矾瘾。感覺js寫的有點笨。如果有不懂的 或者 有更好的方法請在評論區(qū)告訴我箭启,謝謝壕翩!

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

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市傅寡,隨后出現(xiàn)的幾起案子放妈,更是在濱河造成了極大的恐慌,老刑警劉巖荐操,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芜抒,死亡現(xiàn)場離奇詭異,居然都是意外死亡托启,警方通過查閱死者的電腦和手機宅倒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來驾中,“玉大人唉堪,你說我怎么就攤上這事模聋。” “怎么了唠亚?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵链方,是天一觀的道長。 經(jīng)常有香客問我灶搜,道長祟蚀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任割卖,我火速辦了婚禮前酿,結果婚禮上,老公的妹妹穿的比我還像新娘鹏溯。我一直安慰自己罢维,他們只是感情好,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布丙挽。 她就那樣靜靜地躺著肺孵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪颜阐。 梳的紋絲不亂的頭發(fā)上平窘,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機與錄音凳怨,去河邊找鬼瑰艘。 笑死,一個胖子當著我的面吹牛肤舞,可吹牛的內(nèi)容都是我干的紫新。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼萨赁,長吁一口氣:“原來是場噩夢啊……” “哼弊琴!你這毒婦竟也來了?” 一聲冷哼從身側響起杖爽,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎紫皇,沒想到半個月后慰安,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡聪铺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年化焕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铃剔。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡撒桨,死狀恐怖查刻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情凤类,我是刑警寧澤穗泵,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站谜疤,受9級特大地震影響佃延,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜夷磕,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一履肃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧坐桩,春花似錦尺棋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至抖坪,卻和暖如春萍鲸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背擦俐。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工脊阴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蚯瞧。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓嘿期,卻偏偏與公主長得像,于是被迫代替她去往敵國和親埋合。 傳聞我的和親對象是個殘疾皇子备徐,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348