JavaScript——todolist 小案例

案例作品预览图

仅储存案例使用

 HTML代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="../案例清单-作品/ToDoList.css">
    <title>JavaScript小清单</title>
</head>
<body>
    <div class="container clearfix">
        <div class="header">
            <h1><img src="photos/待办事项.png" alt=""> 待办事项</h1>
            <div class="left-header">
                <div class="day">
                    <h2>现在时间:</h2>
                    <p id="data">2022年6月15日  周三 &nbsp; </p>
                    <p class="time">08:00:00</p>
                </div>
            </div>
            <div class="right-header">
                <div class="topic">
                    选择主题: &nbsp; &nbsp; 
                    <select name="选择主题" id="select">
                        <option value="skyblue" class="skyblue">天蓝色</option>
                        <option value="white" class="white">白色</option>
                        <option value="grey" class="grey">灰色</option>
                        <option value="pink" class="pink">粉色</option>
                        <option value="yellowgreen" class="yellowgreen">黄绿色</option>
                    </select>
                </div>
                <div class="back-img">
                    <button id="changeBackImg">
                        切换背景图片
                    </button>
                </div>
                <div class="carousel">
                    <ul class="clearfix" id="scroll">
                        <li><img src="photos/b1.jpg" alt=""></li>
                        <li><img src="photos/b2.jpg" alt=""></li>
                        <li><img src="photos/b3.jpg" alt=""></li>
                        <li><img src="photos/b4.jpg" alt=""></li>
                        <li><img src="photos/b1.jpg" alt=""></li>
                        <li><img src="photos/b2.jpg" alt=""></li>
                        <li><img src="photos/b3.jpg" alt=""></li>
                        <li><img src="photos/b4.jpg" alt=""></li>
                    </ul>
                </div>
            </div>
            
        </div>
        <div class="new-task">
            <h3>新任务</h3>
            <div class="new-content">
                <img id="img-add" src="photos/add1.png" alt="">
                <input id="input" type="text"  placeholder="请输入新的待办事项">
                <button id="add">添加</button>
            </div>
        </div>
        <div class="todo-list">
            <h2><img src="photos/未完成.png" alt=""> 未完成任务</h2>
            <div class="todo-number"></div>
            <hr>

            <div class="todo-main">
            </div>
        </div>
        <div class="done-list">
            <h2><img src="photos/已完成.png" alt="">已完成任务</h2>
            <div class="done-number"></div>
            <hr>

            <div class="done-main"></div>
        </div>
    </div>
    <div class="todo-example">
        <div class="todo-item">
            <div class="circle">
                <img class="unaccomplished" src="photos/circle1.png" alt="">
            </div>
            <div class="todo-content">
                <div contenteditable="true" class="todo-text">下班去拿快递</div>
                
                <div class="todo-type">任务</div>
            </div>
            <div class="timing" id="ding" name="ding">定时
                <select name="timing" id="timing">
                    <option value="null" class="null" >请选择</option>
                    <option value="1" class="1min" >1分钟 </option>
                    <option value="5" class="5min">5分钟</option>
                    <option value="10" class="10min">10分钟</option>
                    <option value="60"   class="1h">1小时 </option>
                    <option value="120"   class="2h">2小时 </option>
                </select>
            </div>
            <div class="delay" id="yan">延时
                <input type="text" id="delayTime" disabled>分
            </div>
            <div class="sign">
                <img class="star1" src="photos/important1.png" alt="">
                <img class="del" src="photos/删除.png" alt="">
            </div>
            
        </div>
    </div>
    <script src="../案例清单-作品/ToDoList.js"></script>
</body>
</html>

CSS代码

body{
    margin: 0;
    padding: 0;
    display: block;
    color: rgb(0, 0, 0);
}
ul,li{
    list-style: none;
    margin: 0;
    padding: 0;
}
a,a:hover{
    text-decoration: none;
    color: #000000;
}
.container{
    padding: 0 25px;
    margin: 20px auto;
    width: 1200px;
    height: auto;
    position: relative;
    border-radius: 25px;
    border: 3px rgb(0, 0, 0) solid;
    border-bottom: none;
    background-size: cover;
    background-color: skyblue;
    box-shadow: 20px 20px 20px rgb(103, 102, 102) ;
}
.header{
    margin: bottom 20px ;
}
.header h1{
    display: flex;
    align-items: center;
    justify-content: center;
}
.header h1 img{
    width: 52px;
    align-items: center;

}

h2{
    display: flex;
    align-items: center;
    justify-content: center;
}
h2 img{
    width: 40px;
    align-items: center;

}
.header .day{
    display: flex;
    align-items: center;
}
.header .right-header{
    float: right;
    position: absolute;
    top: 40px;
    right: 55px;
}
.right-header .back-img{
    margin-left: 73px;
    margin-top: 20px;
}

.right-header .back-img button{
    height: 30px;
}
.right-header .carousel{
    margin-top: 20px;
    margin-left: -32px;
    width: 200px;
    height: 62.5px;
    overflow: hidden;
    position: relative;
    border: 2px rgb(255, 0, 187) solid;
}
.right-header .carousel ul{
    width: 800px;
    position: relative;
}
.right-header .carousel ul li{
    float: left;
}
.right-header .carousel img{
    width: 100px;
    height: 62.5px;
}
.new-content{
    display: flex;
    align-items: center;
}
.new-task{
    border-bottom: 1px solid rgb(192, 192, 192);
    margin-bottom: 20px;
}
.new-task #img-add{
    height: 30px;
    width: 30px;
    margin-right: 20px;
}
.new-task #input{
    vertical-align: middle;
    border: none;
    border-radius: 20px;
    width: 750px;
    height: 50px;
    font-size: 15px ;
}
.new-task #add{
    margin-left: 10px;
    height: 30px;
    width: 55px;
    border-radius: 10px;
    cursor: pointer;
}
.todo-list{
    width: 49%;
    float: left;
    position: relative;
    border-radius: 10px;
    border: 2px #000000 solid;
    /* box-shadow: 10px 10px 10px rgb(103, 102, 102) ; */
    margin-bottom: 20px;
}
.done-list{
    width: 49%;
    float: right;
    position: relative;
    border-radius: 10px;
    border: 2px #000000 solid;
    /* box-shadow: 10px 10px 10px rgb(103, 102, 102) ; */
    margin-bottom: 20px;
}
.todo-item{
    position: relative;
    display: flex;
    align-items: center;
    border-bottom: 1px solid rgb(192, 192, 192);
    padding-top: 8px;
    padding-bottom: 8px;
    animation: sli 1s cubic-bezier(0.46, 0.03, 0.52, 0.96) 1;
}
.todo-content{
    padding-left: 35px;
    width: 270px;
}
.todo-item .todo-content .todo-text{
    font-size: 20px;
}
.todo-content .todo-type{
    font-size: 12px;
    color:rgb(167, 163, 163) ;
}
.circle,.sign{
    display: flex;
    /* 居中显示 */
    align-items: center;
}
.circle{
    margin-left: 5px;
    float: left;
    position: absolute;
    top: 17px;
}
.timing,.delay{
    font-size: 14px;
    margin-right: 9px;
}
.delay input{
    width: 20px;
}
.sign{
    float: right;
    position: absolute;
    right: 0;
    top: 15px;
}
.todo-item img{
    height: 25px;
    cursor: pointer;
}
.todo-item .sign img{
    margin-right: 16px;
}

.todo-example{
    display: none;
}


/* 完成数,未完成数 */
.todo-number{
    position: absolute;
    top: 23px;
    right: 28px;
    width: 40px;
    text-align: center;
    line-height: 40px;
    border-radius: 100%;
    font-size: 18px;
    font-weight: bold;
    background-color: rgb(228, 228, 228);
}
.done-number{
    position: absolute;
    top: 23px;
    right: 28px;
    width: 40px;
    text-align: center;
    line-height: 40px;
    border-radius: 100%;
    font-size: 18px;
    font-weight: bold;
    background-color: rgb(228, 228, 228);
}
@keyframes sli{
    0%{
        left: -300px;
    }
    100%{
        left:0px
    }
}



.clearfix::before {
    content: "";
    display: table;
}
.clearfix::after{
    content: '';
    clear: both;
    display: block;
}

JS代码

window.onload = function () {
    //初始化方法
    Day();
    starOnclick();
    delOnclik();
    change();
    // circleOnclick();
    changeBackImg();
    todoNumber();
    doneNumber();
    prevent();
    Carousel();
    //年月日 周几
    function Day() {
        var t = new Date();
        var year = t.getFullYear();
        var month = t.getMonth() + 1;
        var data = t.getDate();
        var weekday = new Array(7);
        var day = t.getDay();
        weekday = ["周日", "周一", "周二", "周三", "周四", "周五", "周六"]
        document.getElementById('data').innerHTML = year + "年" + month + "月" + data + "日   " + weekday[day] + "&nbsp;&nbsp";
    }
    //时间跳动
    var time = setInterval(function () {
        timer()
    }, 1000);

    function timer() {
        var t = new Date();
        var hour = t.toLocaleTimeString();
        document.querySelector(".time").innerHTML = hour;
    }

    //回车键添加任务
    var input = document.getElementById('input');
    input.onkeydown = function (event) {
        if (event.keyCode == 13) {
            addNew();
        }
    }
    //给添加按钮添加功能
    var add = document.getElementById('add');
    add.onclick = function () {
        addNew();
    }
    //封装添加新任务方法
    function addNew() {
        let task = input.value;
        if (task.trim() == '') {
            alert("!!!请输入任务!!!");
            input.value = '';
        } else {
            let example = document.querySelector('.todo-example');
            let newTask = example.cloneNode(true);
            //复制节点  ture可以复制该节点内的节点,false则只复制该节点
            //通过newTask找到example中的todo-item
            let newTaskNode = newTask.querySelector('.todo-item');
            newTaskNode.querySelector(".todo-text").innerText = task;
            var del=newTask.querySelector('.del');
            del.style.display='none';
            // console.log(newTaskNode);
            // document.getElementsByClassName('todo-item')[0].style.animation=' sli 1s cubic-bezier(0.46, 0.03, 0.52, 0.96) 1';
            //将输入的task加到未完成的第一个任务
            let firstTodo = document.querySelector('.todo-list .todo-item');
            document.querySelector('.todo-main').insertBefore(newTaskNode, firstTodo);
            //添加之后,输入框变为空
            input.value = '';
            // circleOnclick();
        }
        //点击圆圈完成任务
        var staus = null;
        var todo = document.querySelector('.unaccomplished');
        todo.onclick = function (event) {
            // var staus =1;
            var timingSelect = todo.parentElement.parentElement;
            var timing = timingSelect.querySelector('.timing');
            var delayTime = timingSelect.querySelector('.delay');
            var del=timingSelect.querySelector('.del');
            if (todo.src.includes("circle1")) {
                //判断是否完成
                staus = 2;
                //点击切换已完成
                todo.setAttribute('src', 'photos/circle2.png');
                //点击圆圈,任务加横线
                let todoText = todo.parentElement.parentElement.querySelector('.todo-text');
                // todoText.style.textDecoration='line-through';
                todoText.setAttribute('style', 'color:grey;text-decoration: line-through;');
                // var timingSelect = todo.parentElement.parentElement;
                // var timing = timingSelect.querySelector('.timing');
                // var delayTime = timingSelect.querySelector('.delay');
                timing.style.display = 'none';
                delayTime.style.display = 'none';
                del.style.display='block';
                //将输入的task加到已完成的任务
                document.querySelector('.done-main').appendChild(todo.parentElement.parentElement);
                // console.log(timingSelect);
                todoNumber();
                doneNumber();
            } else {
                staus = 1;
                //点击切换未完成
                todo.setAttribute('src', 'photos/circle1.png');
                //点击圆圈,任务取消横线
                let todoText = todo.parentElement.parentElement.querySelector('.todo-text');
                // todoText.style.textDecoration='none';
                todoText.setAttribute('style', 'text-decoration=none;');
                // var timingSelect = todo.parentElement.parentElement;
                // var timing = timingSelect.querySelector('.timing');
                // var delayTime = timingSelect.querySelector('.delay');
                timing.style.display = 'block';
                delayTime.style.display = 'block';
                del.style.display='none';
                //将任务添加到未完成
                //将输入的task加到未完成的第一个任务
                let firstTodo = document.querySelector('.todo-list .todo-item');
                document.querySelector('.todo-main').insertBefore(todo.parentElement.parentElement, firstTodo);
                // console.log(timingSelect);
                todoNumber();
                doneNumber();
            }
        }
        //定时功能
        var timingSelect = document.querySelector('#timing');
        var delayTime = document.querySelector('#delayTime');
        var tim = 0;
        var delayTim = 0;
        //定义未定时的状态为0
        var state = 0;
        timingSelect.onchange = function () {
            tim = timingSelect.value;
            // console.log(tim);
            if (state == 0) {
                var timeOut = setInterval(() => {
                    console.log(tim);
                    tim--;
                    if (tim == 0) {
                        console.log(staus);
                        clearInterval(timeOut);
                        let a = confirm("定时时间已到!如果未完成清单任务,请确认是否使用延时功能。");
                        if (a == true) {
                            delayTime.removeAttribute('disabled');
                            //延时功能
                            //延时回车确定时间,实现功能
                            delayTime.onkeydown = function (event) {
                                if (event.key == 'Enter') {
                                    //阻止默认
                                    // console.log(11111);
                                    event.preventDefault();
                                    //让元素失去焦点
                                    this.blur();
                                    delayTim = delayTime.value;
                                    // console.log(delayTim);
                                    setTimeout(() => {
                                        alert("延时时间已到!");
                                        let it = timingSelect.parentElement.parentElement;
                                        let todo = it.querySelector('.unaccomplished');
                                        todo.setAttribute('src', 'photos/circle2.png');
                                        //点击圆圈,任务加横线
                                        let todoText = it.querySelector('.todo-text');
                                        todoText.setAttribute('style', 'color:grey;text-decoration: line-through;');
                                        timingSelect.parentElement.style.display = 'none';
                                        delayTime.parentElement.style.display = 'none';
                                        todo.style.display = 'none';
                                        //将输入的task加到已完成的任务
                                        document.querySelector('.done-main').appendChild(it);
                                        todoNumber();
                                        doneNumber();
                                    }, 1000 * delayTim);
                                }
                            }
                        } else {
                            alert("您已完成该任务,继续加油吧!");
                            let it = timingSelect.parentElement.parentElement;
                            let todo = it.querySelector('.unaccomplished');
                            todo.setAttribute('src', 'photos/circle2.png');
                            //点击圆圈,任务加横线
                            let todoText = it.querySelector('.todo-text');
                            todoText.setAttribute('style', 'color:grey;text-decoration: line-through;');
                            timingSelect.parentElement.style.display = 'none';
                            delayTime.parentElement.style.display = 'none';
                            todo.style.display = 'none';
                            //将输入的task加到已完成的任务
                            document.querySelector('.done-main').appendChild(it);
                            todoNumber();
                            doneNumber();
                        }
                    }
                    if (staus == 2) {
                        clearInterval(timeOut);
                    }
                }, 1000);
                state = 1;
            } else {
                alert("您已定时,请勿重复定时!");
                tim=0;
                clearInterval(timeOut);
            }
        }
        starOnclick();
        delOnclik();
        todoNumber();
        doneNumber();
        prevent();
        // fixTime();
    }
    //点击星星,使星星变化
    function starOnclick() {
        var stars = document.querySelectorAll('.star1');
        stars.forEach(function (star) {
            star.onclick = function () {
                if (star.src.includes('2')) {
                    star.setAttribute('src', 'photos/important1.png');
                } else {
                    star.setAttribute('src', 'photos/important2.png');
                }
            }
        })
    }
    //删除操作
    function delOnclik() {
        var dels = document.querySelectorAll('.del');
        dels.forEach(function (del) {
            del.onclick = function () {
                let c = confirm("您确认删除此项记录吗?");
                if (c == true) {
                    del.parentElement.parentElement.remove();
                }
                todoNumber();
                doneNumber();
                tim=0;
            }
        })
    }
    //切换主题
    function change() {

        let select = document.querySelector('#select');
        select.onchange = function () {
            let color = select.value;
            let container = document.querySelector('.container')
            container.setAttribute('style', 'background-color: ' + color + ';');
        }

    }
    //改变背景功能
    function changeBackImg() {
        var changeBack = document.getElementById('changeBackImg');
        var i = 1;
        changeBack.onclick = (() => {
            let container = document.querySelector('.container');
            container.setAttribute('style', 'background-image: url(photos/b' + i + '.jpg);');
            // i++;
            if (i < 4) {
                i++;
            } else {
                i = 1;
            }
        })
    }
    //未完成数与完成数
    function todoNumber() {
        let num = document.querySelector('.todo-main').children.length;
        document.querySelector('.todo-number').innerHTML = num;
    }

    function doneNumber() {
        let num = document.querySelector('.done-main').children.length;
        document.querySelector('.done-number').innerHTML = num;
    }
    //编辑时阻止回车键
    function prevent() {
        var toText = document.querySelector('.todo-text');
        toText.onkeydown = function (event) {
            if (event.key == 'Enter') {
                //阻止默认
                event.preventDefault();
                //让元素失去焦点
                this.blur();
            }
        }
    }
    let CarouselTimer = 0;

    function Carousel() {
        var scroll = document.getElementById('scroll');
        var timer = setInterval(function timerr() {
            CarouselTimer--;
            scroll.setAttribute('style', 'left:' + CarouselTimer + "px;");
            if (CarouselTimer == -400) {
                CarouselTimer = 0;
            }
        }, 12);
        scroll.onmouseover = function () {
            clearInterval(timer);
        }
        scroll.onmouseout = function () {
            Carousel();
        }
    }
}

书写时有参考视频等他人创意,且部分代码过于繁杂,没有进行优化,有一点小BUG,不影响使用。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值