欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

js手写日历插件

程序员文章站 2022-07-06 12:37:17
日历
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>日历</title>
  <style>
    table {
      width: 320px;
      background: #333;
      color: #fff
    }

    td,
    th {
      text-align: center;
      height: 30px;
    }
  </style>
</head>
<body>
  <table>
    <thead>
      <tr>
        <th colspan="2">
          <span class="left"><<</span>
        </th>
        <th colspan="3">
          <span class="time"></span>
        </th>
        <th colspan="2">
          <span class="right">>></span>
        </th>
      </tr>
      <tr>
        <th>日</th>
        <th>一</th>
        <th>二</th>
        <th>三</th>
        <th>四</th>
        <th>五</th>
        <th>六</th>
      </tr>
    </thead>
    <tbody class="main"></tbody>
  </table>

  <script>
    // 获取元素
    let otime = $('.time')
    let omain = $('.main')
    let leftbtn = $('.left')
    let rightbtn = $('.right')
    let time = new date()
    
    createcells() // 1. 创建表格
    getprevdays(time) // 2.获取上一个月占的格子
    getcurrentdays(time); // 3.获取当前月所占的格子数
    minhead(time) // 4.设置头部显示的内容
    mainlist(time, getprevdays(time), getcurrentdays(time)) // 5. 月份显示的详情
    leftbtn.onclick = function() { // 6.绑定两边的按钮 实现上一月下一月
      time.setmonth(time.getmonth() - 1)
      getprevdays(time)
      getcurrentdays(time)
      minhead(time)
      mainlist(time, getprevdays(time), getcurrentdays(time))
    }
    rightbtn.onclick = function() {
      time.setmonth(time.getmonth() + 1)
      getprevdays(time)
      getcurrentdays(time)
      minhead(time)
      mainlist(time, getprevdays(time), getcurrentdays(time))
    }
    /*
     * 
     * 获取元素 
     * 
    */
    function $(container) {
      return document.queryselector(container)
    }

    /*
    *
     * 创建表格
     * 
    */
    function createcells() {
      for (var i=0; i<6; i++) {
        var tr = document.createelement('tr')
        for(var k=0; k<7; k++) {
          var td = document.createelement('td')
          tr.appendchild(td)
        }
        omain.appendchild(tr)
      }
    }

    /*
    *
    * getprevdays 获取上一个月 占的格子
    *  
    */
    function getprevdays(time) {
      var time = new date(time) // 拷贝一份时间 防止修改时间引发冲突
      var list = [] // 上一个月所占的天数
      time.setdate(1) // 设置为当月第一天方便查看是星期几
      var day = time.getday() == 0 ? 7 : time.getday() // 如果是0 说明需要空出来一行 显示上个月的时间
      // 获取上一个月的天数
      time.setdate(0)
      var maxday = time.getdate()
      for(var i=maxday; i> (maxday-day); i--) {
        list.push(i)
      }
      list.reverse()
      return list
    }

    /*
    * 获取当月所占的格子
    */
    function getcurrentdays(time) {
      // debugger
      var time = new date(time) // 拷贝一份时间 防止修改时间造成全局时间冲突
      time.setdate(1) // 确保不会出现跨越现象 比如1.31跑到三月份去了
      var list = []
      // 下面的代码是为了获取当前月的信息
      time.setmonth(time.getmonth() + 1)
      console.log(time.getmonth())
      time.setdate(0) // 修改日期0
      var maxday = time.getdate() // 获取当月的天数
      for(var i=1; i<=maxday; i++) {
        list.push(i)
      }
      return list
    }

    /*
    * minhead 设置头部的显示
    */
    function minhead(time) {
      // otime.innerhtml = time.getfullyear() + '年' + time.getmonth() + 1
      otime.innerhtml = `${time.getfullyear()}年${time.getmonth() + 1}月`
    }

    function getymd(time) {
      time = time || new date()
      return `${time.getfullyear()}-${time.getmonth() + 1}-${time.getdate()}`
    }

    /*
    * 月份显示的详情 上个月最后 + 本月 + 下个月开始的
    */
    function mainlist(time, prevdays, currentdays) {
      var beforecount = prevdays.length + currentdays.length
      var celllist = document.queryselectorall('td')
      // 1. 展示上个月的
      for(var i=0; i<prevdays.length; i++) {
        celllist[i].innerhtml = `<font color='red'>${prevdays[i]}</font>`
      }
      // 2. 展示本月的
      for(var i=0; i<currentdays.length; i++) {
        if (getymd() === getymd(time) && currentdays[i] == time.getdate()) { // 如果是今天 展示另外一种颜色
          celllist[i + prevdays.length].innerhtml = `<font color='yellow'>${currentdays[i]}</font>`
        } else {
          celllist[i + prevdays.length].innerhtml = `<font color='white'>${currentdays[i]}</font>`
        }
        
      }
      // 3. 展示下个月的
      for(var i=1; i< (42-beforecount); i++) {
        celllist[i + beforecount - 1].innerhtml = `<font color='red'>${i}</font>`
      }
    }
  </script>
</body>
</html>