用new Date() 制作好看的日历控件

现在网络上有很多第三方插件,使用起来也很方便,但插件功能一般都比较丰富,造成我们只需要某个小功能而引入了一个较大的文件,这增大了项目体积和增加用户流量的使用,我个人不太喜欢用插件,更推崇自己实现。该例介绍了一个日历控件的实现。

日历控件

实现思路: 根据需求,我们需要一个实现年月的头,一栏显示周一到周日的地方,和日期的列表,列表我们可以用二维数组实现,第一维控制0~6,第二维则根据月份来设定,同时还要注意本月一号的起始位置。ok,贴上代码:

html代码

  <div class="content">
        <div class="date-picker">
            <div class="month" riot-style="{monthColor}">
                <img style="float:left; padding-left: 2rem;" src="img/icon/nav_back.png" onclick={clickPreMonth}>
                <img style="float:right; padding-right: 2rem" src="img/icon/exchange_white_right_icon.gif"
                     onclick={clickNextMonth}>
                <p>{month_title}</p>
            </div>
            <div class="week" riot-style="{workDayColor}">
                <div class="week-item"><p riot-style="{weekendsDayColor}">日</p></div>
                <div class="week-item"><p>一</p></div>
                <div class="week-item"><p>二</p></div>
                <div class="week-item"><p>三</p></div>
                <div class="week-item"><p>四</p></div>
                <div class="week-item"><p>五</p></div>
                <div class="week-item"><p riot-style="{weekendsDayColor}">六</p></div>
            </div>
            <div class="day">
                <div class="day-line" each="{week in weeks}">
                    <div class="day-item" onclick={clickDay} each="{day in week}">
                        <div if="{day.isSelected}" class="day-item-selected">
                            <p name="{day.day}" if="{day.day == '今天'}" style="color:white;">{day.day}</p>
                            <p name="{day.day}" if="{day.day != '今天'}">{day.day}</p>
                        </div>
                        <div if="{!day.isSelected}">
                            <p name="{day.day}" if="{day.isPassedDayInCurrentMonth}" style="color:#97999d;">
                                {day.day}</p>
                            <p name="{day.day}" if="{day.day == '今天' && !day.isPassedDayInCurrentMonth }"
                               style="color:#0a79ff;">{day.day}</p>
                            <p name="{day.day}" if="{day.day != '今天' && !day.isPassedDayInCurrentMonth}"
                               riot-style="{dayColor}">{day.day}</p>
                        </div>
                    </div>
                </div>
            </div>
        </div>
        <div class="confirm" onclick="{clickConfirm}">
            <div class="confirm-btn"><p>确定</p></div>
        </div>
    </div>

显示日期的二维数组代码

function showDate() {
    var cDate = date ? date : new Date();
    var cDayOnWeek = cDate.getDay()
    self.pageMonth = cDate.getMonth()
    self.pageYear = cDate.getFullYear()
    var tmp = new Date(self.pageYear, self.pageMonth + 1, 0)
    var daysOnMonth = tmp.getDate()
    tmp = new Date(self.pageYear, self.pageMonth, 1)
    var dayOnWeek = tmp.getDay()
    var dayLines = new Array()

    for (var i = 0; i <= 5; i++) {
        dayLines[i] = new Array()
    }
    for (var i = 1; i <= daysOnMonth; i++) {
        dayLineIndex = parseInt((i + dayOnWeek - 1) / 7)
        dayOnWeekIndex = (i + dayOnWeek - 1) % 7
        if ((self.currentDate.getDate() == i) && (self.pageMonth == self.currentDate.getMonth()) &&
            (self.pageYear == self.currentDate.getFullYear())) {
            dayLines[dayLineIndex][dayOnWeekIndex] = '今天'
        } else {
            dayLines[dayLineIndex][dayOnWeekIndex] = i
        }
    }

    self.month_title = self.pageYear + '年' + (self.pageMonth + 1) + '月'
    self.weeks = new Array()
    for (var i = 0; i <= 5; i++) {
        var dayLine = dayLines[i];
        if (dayLine.length > 0) {
            self.weeks[i] = new Array()
            for (var j = 0; j < 7; j++) {
                if (dayLine[j]) {
                    self.weeks[i][j] = {
                        'day': dayLine[j],
                        'isSelected': isPickedDay(self.pageYear, self.pageMonth, dayLine[j]),
                        'isPassedDayInCurrentMonth': isPassedDayInCurrentMonth(self.pageYear, self.pageMonth, dayLine[j])
                    }
                } else {
                    self.weeks[i][j] = {'day': '', 'isSelected': false, 'isPassedDayInCurrentMonth': false}
                }
            }
        }
    }
}

点击选中日期效果

self.clickDay = function (e) {
    if (!self.canSelectDays) {
        return
    }

    var attributes = e.target.attributes;
    if ((!attributes) || (attributes.length == 0) || (!attributes['name'])) {
        return
    }

    var day = attributes['name'].value

    if (isPassedDayInCurrentMonth(self.pageYear, self.pageMonth, day)) {
        return
    }

    for (var i = self.weeks.length - 1; i >= 0; i--) {
        for (var j = self.weeks[i].length - 1; j >= 0; j--) {
            if (self.weeks[i][j].day == day) {
                self.weeks[i][j].isSelected = true;
                self.pickedDay = {
                    'year': self.pageYear,
                    'month': self.pageMonth,
                    'date': self.weeks[i][j].day
                }
            } else {
                self.weeks[i][j].isSelected = false;
            }
        }
    }

    self.update()
}

点击下一个月 (点击上个月与此类似)

self.clickNextMonth = function (e) {
    self.selectedMonthSpan++;

    if (self.pageMonth == 11) {
        self.pageMonth = 0
        self.pageYear++
    } else {
        self.pageMonth++
    }

    showDate(new Date(self.pageYear, self.pageMonth, 1))
    updateMonthStyle()
}

点击选择日期效果切换

function updateMonthStyle() {
    self.update({
        monthColor: {
            'background': self.canSelectDays ? '#0a79ff' : '#97999d'
        },

        workDayColor: {
            'color': self.canSelectDays ? '#181a28' : '#97999d'
        },

        weekendsDayColor: {
            'color': self.canSelectDays ? '#0a79ff' : '#97999d'
        },

        dayColor: {
            'color': self.canSelectDays ? '#181a28' : '#97999d'
        }
    })
}

判断是否为 “今天 ”

function isPickedDay(year, month, date) {
    if (self.pickedDay.year == 0) {
        return false
    }

    var today = self.currentDate.getDate()

    return ((self.pickedDay.year == year) && (self.pickedDay.month == month) &&
        ((self.pickedDay.date == date)) || ((self.pickedDay.date == today) && (date == '今天')) )
}

"今天 " 以前时间置灰

function isPassedDayInCurrentMonth(year, month, day) {
    return ((year == self.currentDate.getFullYear()) &&
    (month == self.currentDate.getMonth()) &&
    (day < self.currentDate.getDate()))
}


以下为样式列表

.content {
    position: relative;
    display: block;
    width: 100%;
    height: 100%;
}

.date-picker {
    width: 25.993rem;
    margin-left: 2rem;
    margin-right: 2rem;
    /*height: 28.1667rem;*/
    margin-top: 3rem;
    background: white;
}

.month {
    width: 100%;
    height: 3.1667rem;
}

.month p {
    display: block;
    color: white;
    line-height: 3.1667rem;
    text-align: center;
}

.month img {
    height: 1.2rem;
    margin-top: 0.9667rem;
    margin-bottom: 0.9667rem;
}

.week {
    width: 24rem;
    height: 2rem;
    margin-top: 1.5rem;
    margin-left: 0.8rem;
}

.week-item {
    width: 3.42rem;
    height: 100%;
    float: left;
}

.week-item p, .day-item p {
    text-align: center;
    line-height: 2rem;
    font-size: 0.833rem;
    width: 100%;
}

.day {
    width: 24rem;
    margin-top: 1rem;
    margin-left: 0.8rem;
    height: 20rem;
}

.day-item {
    width: 2rem;
    height: 2rem;
    margin-top: 1rem;
    margin-left: 0.71rem;
    margin-right: 0.71rem;
    float: left;
}

.day-item-selected {
    width: 2rem;
    height: 2rem;
    -moz-border-radius: 1rem;
    -webkit-border-radius: 1rem;
    border-radius: 1rem;
    background: #0a79ff;
}

.day-item-selected p {
    color: white;
}

.confirm {
    margin-top: 2.667rem;
    width: 100%;
    height: 8.5rem;
}

.confirm-btn {
    margin-left: 0.1667rem;
    height: 100%;
    width: 29.6666rem;
    background: url(img/icon/train_tickets_btn.png);
    background-size: cover;
}

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

推荐阅读更多精彩内容