成果展现

代码

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