JavaScript日历制作并实现拖动选择日期

简介: JavaScript日历制作并实现拖动选择日期

效果展示

代码

html
<html 
  onmouseup="mouseup(event)"
  onmousedown="mousedown(event)"
  onmousemove="mouseover(event)">
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <div id="timetable"></div>
    <button id="clear">清空</button>
    <div id="showSelected"></div>
    <input id="yearInput" placeholder="年份" style="line-height: 2rem; width: 50%;margin-left: 25%;margin-bottom: 1rem;"/>
    <input id="monthInput" placeholder="月份" style="line-height: 2rem; width: 50%;margin-left: 25%;margin-bottom: 1rem;"/>
    <button id="confirm" style="height:2rem; width:10rem;margin: 0 auto;">确认</button>
  </body>
</html>
css
body{
  display: flex;
  flex-direction: column;
}
#timetable{
  justify-content: center;
  align-items: center;
  align-content: center;
  -webkit-user-select:none;
  -moz-user-select:none;
  -ms-user-select:none;
  user-select:none;
  margin: 0 auto;
  margin-top: 10rem;
}
#timetable .tr{
  display: flex;
  flex: row;
}
#timetable .tr .cell{
  border: #000000 1px solid;
  height: 2.5rem;
  line-height: 2.5rem;
  text-align: center;
  width: 2rem;
}
#timetable .tr .title{
  border: #000000 1px solid;
  height: 2.5rem;
  line-height: 2.5rem;
  text-align: center;
  width: 2rem;
  background-color: bisque;
}
#clear{
  justify-content: center;
  align-items: center;
  align-content: center;
  -webkit-user-select:none;
  -moz-user-select:none;
  -ms-user-select:none;
  user-select:none;
  margin: 2rem auto;
}
#showSelected{
  text-align: center;
  margin: 0 auto;
  width: 80%;
}
.selected{
  background-color: grey !important;
}
.today{
  background-color: cornflowerblue;
}
JavaScript
//定义行数、列数和天数
var hang = 6,lie = 7,days = 30,year = new Date().getFullYear() ,month = new Date().getMonth() + 1,day = new Date().getDate();
//鼠标按下和抬起的坐标
var startX1 = 0,startY1 = 0,endX1 = 0,endY1 = 0,flag = false;
var weekday = ["日", "一", "二", "三", "四", "五", "六"];
//判断润年
function isLeapYear(year){
  if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0) return true;//2月份29日
  return false;
}
//判断日期的星期
function monthStartWeek(date){
  console.log(date);
  let ind = new Date(date).getDay();
  return ind;
}
//获取天数
function getDays(){
  if(month == 2){
    days = 28;
    if(isLeapYear(year)) days = 29;
  }else if([1,3,5,7,8,10,12].indexOf(parseInt(month)) != -1){
    days = 31;
  }else{
    days = 30;
  }
}
getDays();
//确定按钮
let confirm = document.getElementById('confirm');
confirm.onclick =function(){
  year = document.getElementById('yearInput').value;
  month = document.getElementById('monthInput').value;
  getDays();
  // let ind = monthStartWeek(year + '-' + month + '-1');
  let ind = new Date(year + '-' + month + '-01').getDay();
  drawTable(ind);
}
//绘制表格
function drawTable(ind){
  console.log('111111111',ind);
  let timetable = document.getElementById('timetable');
  timetable.innerHTML = "";
  //-------------表头------------
  let tr = document.createElement('div');
  tr.classList.add('tr');
  for(let i = 0; i < lie; i++){
    let node = document.createElement('div');
    let text = weekday[i];
    node.innerText = text;
    node.classList.add('title');
    tr.appendChild(node); 
  }
  timetable.appendChild(tr);
  //-----------------
  console.log('year',year,'month',month,'days',days);
  for(let i = 0; i < hang; i++){
    let tr = document.createElement('div');
    tr.classList.add('tr');
    for(let j = 0; j < lie; j++){
      let text = i * lie + j - ind + 1;
      let node = document.createElement('div');
      if(text == day) node.classList.add('today');
      if(text > 0) node.innerText = text;
      node.classList.add('cell');
      tr.appendChild(node); 
      if(text >= days){
        timetable.appendChild(tr);
        return;
      } 
    }
    timetable.appendChild(tr); 
  }
}
drawTable(new Date(year + '-' + month + '-01').getDay());
//监听鼠标按下
function mousedown(e) {
  // console.log('down');
  startX1 = e.x;
  startY1 = e.y;
  flag = true;
}
//监听鼠标抬起
function mouseup(e) {
  select(e.x,e.y);
  flag = false;
}
//监听鼠标移动
function mouseover(e){
  //判断鼠标是不是为按压状态
  if(!flag) return;
  select(e.x,e.y);
}
//选择区间
function select(x,y){
  endX1 = x;
  endY1 = y;
  let timetable = document.getElementById('timetable');
  //获取小格子的宽高、表格的宽高
  let cell = document.getElementsByClassName('cell')[0];
  let cellH = cell.offsetHeight,
    cellW = cell.offsetWidth,
    tableL = timetable.getBoundingClientRect().left,
    tableT = timetable.getBoundingClientRect().top,
    tableR = timetable.getBoundingClientRect().right,
    tableB = timetable.getBoundingClientRect().bottom;
  tableR = tableL + lie * cellW;
  tableB = tableT + hang * cellH;
  //小的为开始坐标、大的为结束坐标
  let startX = Math.min(startX1,endX1),
    startY = Math.min(startY1,endY1),
    endX = Math.max(startX1,endX1),
    endY = Math.max(startY1,endY1);
  //转换为数组下标
  let indsx = Math.max(Math.floor((startX - tableL)/cellW),0);
  let indsy = Math.max(Math.floor((startY - tableT)/cellH),0);
  let index = Math.min(Math.floor((endX - tableL)/cellW),lie - 1);
  let indey = Math.min(Math.floor((endY - tableT)/cellH),hang);
  let tr = timetable.children;
  //将选择的内容展示出来
  let showSelected = document.getElementById('showSelected');
  let showtext = [];
  //循环找出当前选中的区域并做上标记,并将未选中的区域标记去除
  for(let i = 0; i < tr.length; i++){
    let td = tr[i].children;
    for(let j = 0; j < td.length; j++){
      if(i >= indsy && i <= indey && j >=indsx && j <= index){
        if(td[j].innerText.length == 0) continue;
        if(i > 0) td[j].classList.add('selected');
        if(i > 0) showtext.push(td[j].innerText);
      }else{
        td[j].classList.remove('selected')
      }
    }
  }
  showSelected.innerText = showtext.join('、');
}
//清空选择区域
var clear = document.getElementById("clear"); 
clear.onclick =function(){
  console.log('清空');
  let timetable = document.getElementById('timetable');
  let tr = timetable.children;
  for(let i = 0; i < tr.length; i++){
    let td = tr[i].children;
    for(let j = 0; j < td.length; j++){
      td[j].classList.remove('selected');
    }
  }
}

…………

Gitee地址:https://gitee.com/zheng_yongtao/html-css-js-Achieve-cool-results.git


目录
相关文章
|
2月前
|
JavaScript 前端开发
JavaScript Date(日期) 对象
JavaScript Date(日期) 对象
46 2
|
7月前
|
JavaScript
JS设置日期为0时0分0秒
项目中经常要给设置默认值,搜索从哪天开始,这时候,如果直接通过new Date()来获取时间,会有时分秒,如果快速设置为0时0分0秒?
302 0
|
7月前
|
JavaScript 前端开发
javascript 如何判断字符串日期是否相差七天
在JavaScript中,你可以使用`Date`对象来比较两个日期之间的差异。下面是一个简单的示例,演示如何判断两个字符串日期是否相差七天: ```javascript function isSevenDaysDifference(date1, date2) { // 确保输入是字符串 if (typeof date1 !== 'string' || typeof date2 !== 'string') { return false; } // 将字符串转换为Date对象 var d1 = new Date(date1);
194 1
|
7月前
|
移动开发 JavaScript 前端开发
分享76个时间日期JS特效,总有一款适合您
分享76个时间日期JS特效,总有一款适合您
71 0
|
7月前
|
JavaScript 前端开发 UED
分享89个时间日期JS特效,总有一款适合您
分享89个时间日期JS特效,总有一款适合您
82 3
|
3月前
|
JavaScript 前端开发
js时间戳转日期时间
js时间戳转日期时间
88 20
|
1月前
|
JavaScript 前端开发 搜索推荐
Moment.js、Day.js、Miment,日期时间库怎么选?
【10月更文挑战第29天】如果你需要一个功能强大、插件丰富的日期时间库,并且对性能要求不是特别苛刻,Moment.js是一个不错的选择;如果你追求极致的轻量级和高性能,那么Day.js可能更适合你;而如果你有一些特定的日期时间处理需求,并且希望在性能和功能之间取得平衡,Miment也是可以考虑的。
|
2月前
|
JavaScript 前端开发
|
3月前
|
JavaScript 前端开发
|
3月前
|
JavaScript 前端开发
JS配合CSS3实现动画和拖动小星星小Demo
本文通过代码示例展示了如何使用JavaScript和CSS3实现动画效果和拖动小星星的交互效果,包括文字掉落动画和鼠标拖动产生小星星动画的实现方法。
55 0
JS配合CSS3实现动画和拖动小星星小Demo