JavaScript实现精美Todolist

这周刚学习完JavaScript基础知识,并自己写了一项Todolist作品,给大家分享一下我的作品,并带着实现一下

目录

作品展示

JavaScript功能实现讲解

任务渲染模块:

当天月份时间的获取

​编辑

添加数据功能模块:

​编辑

更多功能实现:

​编辑

推迟时间功能模块

HTML代码

 JavaScript代码

 删除模块实现

复选框功能实现:

 定时器功能:

所有代码分享

 鼠标样式效果设置

主体部分HTML

主体部分css代码

主体部分JavaScript逻辑代码

右下角小人


作品展示

背景有雪花飘动的效果,右下角也有个小人,这个小人是动态的效果,你鼠标在哪个坐标它就会看向哪里,并且还会眨眼

 每次鼠标点击,对应位置会有随机颜色的文字出现,并有烟花效果

 对每一项任务都是可以设置时间和删除的

JavaScript功能实现讲解

任务渲染模块:

从浏览器中的数据库读取数据,并用JSON方法将数据转换为数组

然后用map方法将数组的数据用模版字符串的方式返回小li,最终将所有小li全部

添加到ul中,这样数据渲染就成功了

  const data = localStorage.getItem('tesk')
  const arr = data ? JSON.parse(data) : []
  const ul = document.querySelector('.list ul')
  const kuo = document.querySelector('.kuo')
 
  // 3. 渲染模块函数
  function render() {
    // 遍历数组 arr,有几个对象就生成几个 tr,然后追击给tbody
    // map 返回的是个数组  [tr, tr]
    const trArr = arr.map(function (item, i) {

      let time = item.time ? item.time : "暂未设置时间"
      time = item.istrue ? '您已完成' : time
      const timestyle = item.time =='已超时' ?'red':''
      const chek = item.istrue ? 'checked' : '';
      const line = item.istrue ? 'line':''
      const ha = item.istrue ? 'line' : ''
      const jj = item.import == '重要' ? '骂' :'眨眼'
      return `
        <li>
            <input type="checkbox" name="gou" id="" ${chek}>
            <div class="content">
              <div class="text ${line}">${item.text}</div>
              <div class="time ${timestyle}">${time}</div>
            </div>
           <div>
              <img src="./images/${jj}.png" alt="">
              <img class="zhan" src="./images/zhankai.png" alt="" data-id=${i}>
              
            </div>
          </li>
        `
    })
    document.querySelectorAll('[data-id="1"]')
    
    // 追加给ul
    // 因为 trArr 是个数组, 我们不要数组,我们要的是 trArr的字符串 join()
    ul.innerHTML = trArr.join('')
    zhankaile()
    checkbox()
    
  }
  render()

当天月份时间的获取

 // 获取当前日期
  const today = new Date();

  // 获取月份和星期几
  const months = ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'];
  const days = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
  
  const monthIndex = today.getMonth();
  const dayIndex = today.getDay();
  const dateNumber = today.getDate();
  const dateString = `${months[monthIndex]}${dateNumber}日 ${days[dayIndex]}`;
  document.querySelector('.date').innerHTML=dateString
  //判断
  function isElementHidden(element) {
    return window.getComputedStyle(element).getPropertyValue('display') == 'none';
  }

添加数据功能模块:

读取input输入框和下拉框的值,然后通过声明空对象,将数据添加到空对象中,再然后将对象添加到数组的最后边,最后再浏览器的数据库中更新数组

//添加数据功能模块
  let addInput = document.querySelector('.add input')
  addInput.addEventListener('keyup', function (e) {
    if (e.key === 'Enter') {
      
      let newText = addInput.value
      let importantInput = document.querySelector('.importantL').value
      if (newText === '') {
        return alert('输入内容不能为空')
      }
      //声明空对象
      const obj = {}
      obj.text = newText
      obj.import = importantInput
      obj.istrue =false
      arr.unshift(obj)
      localStorage.setItem('tesk', JSON.stringify(arr))
      render()
      // 重置表单
      addInput.value = ''
    }
  })

更多功能实现:

当鼠标移入和移出改变图片样式,然后点击后将图片更换,再次点击将图片换回来

获取点击扩展图片的位置,将原来设置隐藏的功能块显示并移动到相应位置

//展开功能模块
  function zhankaile() { 
    const zhan = document.querySelectorAll('.zhan')
  for (let i = 0; i < zhan.length; i++) {
    zhan[i].addEventListener('mouseenter', function (e) {
      if (!kuo.classList.contains('active')) {
        zhan[i].src = "./images/扩展.png"
      }
    })
    zhan[i].addEventListener('mouseleave', function () {
      if (isElementHidden(kuo)) {
        zhan[i].src = "./images/zhankai.png"
      }
    })
    
    zhan[i].addEventListener('click', function (e) {
      if (!kuo.classList.contains('active')) {
        let x = zhan[i].getBoundingClientRect().x
        let y = zhan[i].getBoundingClientRect().y
       
        kuo.classList.add('active')
        
        kuo.style.top = y - 45 + 'px'
        kuo.style.left = x + 50 + 'px'
        zhan[i].src = "./images/缩小.png"
        zhan[i].classList.add('suo1')
      } else {
        let temp = document.querySelector('.suo1')
        temp.src = "./images/zhankai.png"
        temp.classList.remove('suo1')
        kuo.classList.remove('active')
        zhan[i].src = "./images/zhankai.png"
      }
    })
  }
  }

推迟时间功能模块

在点击确认按钮后获取下拉框中的value值,如果这项任务本身没有设置时间,直接修改时间就OK了,如果本身就有时间,就将两者时间相加,在展示在时间块里

HTML代码

<div class="kuo" >
<select name="selctTime" class="selctTime" aria-placeholder="推迟">
  <option value="">推迟</option>
<option value="5">5分钟后</option>
<option value="15">15分钟后</option>
<option value="30">30分钟后</option>
<option value="60">1小时后</option>
<option value="180">3小时后</option>
<option value="明天">明天</option>
</select>
<div class="ok">
  确认
</div>
<div class="delete">
<img src="./images/delete.png" alt=""></div>
</div>

 JavaScript代码

  //推迟时间模块
  const ok = document.querySelector('.ok')
  const selctTime = document.querySelector('.selctTime')
  ok.addEventListener('click', function () { 
   
    // console.log(li)
    if (selctTime.value) { 
      const li = document.querySelector('.suo1').parentNode.parentNode.children[2].children[1]
      
      const time = document.querySelector('.suo1').parentNode.parentNode.children[1].children[1]
      if ((time.innerHTML == '暂未设置时间' || time.innerHTML == '已超时') && selctTime.value != '明天') {
        const temp = selctTime.value
        let hours = Math.floor(temp / 60) >= 10 ? Math.floor(temp / 60) : '0' + Math.floor(temp / 60)
        let mins = temp % 60 >= 10 ? temp % 60 : '0' + temp % 60
        time.innerHTML = hours + ":" + mins + " 小时后"
      } else if (time.innerHTML == '明天') { 
          alert('请于明天再修改哦!')
      } else if (selctTime.value == '明天') {
        time.innerHTML = '明天'
      }else{ 
        let temp = time.innerHTML
        let hours = parseInt(temp.slice(0,2));
        let minutes = parseInt(temp.slice(3, 5));
        temp = (+hours)*60 + (+minutes) + (+selctTime.value)
        console.log(+minutes)
        hours = Math.floor(temp / 60) >= 10 ? Math.floor(temp / 60) : '0' + Math.floor(temp / 60)
        mins = temp % 60 >= 10 ? temp % 60 : '0' + temp % 60
        time.innerHTML = hours + ":" + mins + " 小时后"
      }
        if(time.classList.contains('red')) time.classList.remove('red')
      // document.querySelector('.red').classList.remove('red')
      arr[li.dataset.id].time = time.innerHTML
      localStorage.setItem('tesk', JSON.stringify(arr))
      render()

    }
    // console.log(11111)
    selctTime.value = ''
    kuo.classList.remove('active')
    let temp = document.querySelector('.suo1')
    if (temp) {
      temp.src = "./images/zhankai.png"
      temp.classList.remove('suo1')
    }
  })

 删除模块实现

当点击删除选项后,浏览器会有弹窗问你‘您确定要删除这项任务吗?’当点击确定后才会删除

点击取消就不会  删除逻辑主要就是吸纳获取你点击的是数组中的哪个元素,然后将其在数组中删除,最后再浏览器中数据库中更新即可

  //删除模块
  const deletes=document.querySelector('.delete')
  deletes.addEventListener('click', function () {
    if (confirm('您确定要删除这项任务吗?')) { 
    const li = document.querySelector('.suo1').parentNode.parentNode.children[2].children[1]
    arr.splice(li.dataset.id, 1)
    localStorage.setItem('tesk', JSON.stringify(arr))
    render()
     
      //document.querySelector('.suo1').classList.remove('suo1')
      
    }
    kuo.classList.remove('active')
    let temp = document.querySelector('.suo1')
    if (temp) {
      document.querySelector('.suo1').classList.remove('suo1')
       temp.src = "./images/zhankai.png"
    }
  })

复选框功能实现:

当点击复选框中线判断复选框的对钩是否打上,如果打上会给对应任务添加到数组的最后边,然后文本加一个下划线,时间模块改为‘您已完成’,没完成的话机会添加到数组第一个,下划线取消

  //完成模块
  function checkbox() { 
    const gou = document.querySelectorAll('input[name="gou"]')
    for (let i = 0; i < gou.length; i++) { 
      gou[i].addEventListener('change', function () { 
        const li = gou[i].parentNode.children[2].children[1]
        let dd= arr.splice(li.dataset.id, 1)[0]
        if (gou[i].checked) {
          dd.istrue=true
          arr.push(dd)
        } else { 
          dd.istrue = false
          dd.time=''
          arr.unshift(dd)
        }
        localStorage.setItem('tesk', JSON.stringify(arr))
        render()
      }) 
    }
  }

 定时器功能:

首先获取每一项任务有效的时间模块的值,用逻辑判断然后将对应的值没一分钟减去一,当时间为00:00时浏览器会有弹窗告诉你时间到了,并会将时间模块的值改为‘已超时’并为红色字体

  //定时器
  setInterval(function () { 
   const times =document.querySelectorAll('.time')
    for (let i = 0; i < times.length; i++) { 
      if (times[i].innerHTML == '暂未设置时间' || times[i].innerHTML == '明天' || times[i].innerHTML == '已超时' || times[i].innerHTML == '您已完成') continue

      let hours =parseInt(times[i].innerHTML.slice(0,2))
      let min = parseInt(times[i].innerHTML.slice(3, 5))
      
      if (hours == '0' && min == '0') { 
        
        times[i].innerHTML = '已超时'
        const id = times[i].parentNode.parentNode.children[2].children[1].dataset.id
        arr[id].time = times[i].innerHTML
        alert('任务时间到了')
        continue
       
      }else if (min == '0') {
        hours = +hours - 1
        min = 59
      } else { 
        min= +min -1
      }
      hours = +hours >= 10 ? hours : '0'+hours
      min = +min >= 10 ? min : '0' + min
      times[i].innerHTML = hours + ':' + min + '小时后'
      const id=times[i].parentNode.parentNode.children[2].children[1].dataset.id
      arr[id].time = times[i].innerHTML
    }
    localStorage.setItem('tesk', JSON.stringify(arr))
    render()
  },60000)

所有代码分享

 鼠标样式效果设置

  <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
  <script type="text/javascript">
    
    /* 鼠标特效 */
    var a_idx = 0;
    jQuery(document).ready(function ($) {
      $("body").click(function (e) {
        var a = new Array("❤开心❤", "❤快乐❤", "❤高兴❤", "❤开心❤", "❤快乐❤", "❤开心❤", "❤开心❤", "❤开心❤", "❤开心❤", "❤开心❤", "❤开心❤", "❤开心❤");
        var $i = $("<span></span>").text(a[a_idx]);
        a_idx = (a_idx + 1) % a.length;
        var x = e.pageX, y = e.pageY;
        $i.css({
          "z-index": 999,
          "top": y - 20,
          "left": x,
          "position": "absolute",
          "font-weight": "bold",
          "color": "rgb(" + ~~(255 * Math.random()) + "," + ~~(255 * Math.random()) + "," + ~~(255 * Math.random()) + ")"
        });
        $("body").append($i);
        $i.animate({
          "top": y - 180,
          "opacity": 0
        },
          1500,
          function () {
            $i.remove();
          });
      });
    });
  </script>
  <script src="https://blog-static.cnblogs.com/files/Return-blog/xue.js"></script>
  <script src="https://blog-static.cnblogs.com/files/yjlblog/cursor-effects.js"></script>

这里面的像jquery均不需要导包,网上都有人家上传的网页版,就像我的开头一样

主体部分HTML

  <div class="container Snow">
   
    <div class="header">
      <h1>TODOLIST</h1>
    </div>

    <div class="center" style="position: relative;z-index: 100;"><div class="box">
      <div class="top">
      <div class="top-left">
      <h1>我的一天</h1>
      <span class="date" style="color: #f8b27a; font-weight: 800;">七月24日星期五</span>
      </div>
      <div class="top-right">今天</div>
      </div>
      <div class="list">
        <div class="add">
          <img src="" alt="">
          <div>+</div>
          <input type="text" placeholder="添加任务">
          <select name="important" class="importantL">
            <option value="重要">重要</option>
            <option value="不重要">不重要</option>
          </select>
        </div>
        <ul>
          
         
        </ul>
      </div>
    </div>
    </div>
    <canvas id="Snow" style="position: absolute; top: 0; left: 0; z-index: 9;"></canvas> 
  </div>
<div class="kuo" >
<select name="selctTime" class="selctTime" aria-placeholder="推迟">
  <option value="">推迟</option>
    <option value="5">5分钟后</option>
    <option value="15">15分钟后</option>
    <option value="30">30分钟后</option>
    <option value="60">1小时后</option>
    <option value="180">3小时后</option>
    <option value="明天">明天</option>
</select>

    <div class="ok">
      确认
    </div>
<div class="delete">
    <img src="./images/delete.png" alt=""></div>
</div>

主体部分css代码

   body {
     cursor: url(https://files.cnblogs.com/files/laoguantongxiegogo/pointer_24px_1231389_easyicon.net.ico), auto;
   }
.container {
  background-image: url(../images/bg1.webp);
  background-size: cover;
  /* position: relative; */
  height: 100vh;
  /* width: 100vh; */
  background-attachment: fixed;
  
}
.zhan:hover {
  cursor: url(https://files.cnblogs.com/files/laoguantongxiegogo/click_24px_1231393_easyicon.net.ico), auto;
}
select:hover {
  cursor: url(https://files.cnblogs.com/files/laoguantongxiegogo/click_24px_1231393_easyicon.net.ico), auto;
}

.center{
display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
}

.header{
  
  height: 100px;
  margin: 0,auto;
  text-align: center;
  line-height: 100px;
}
.header h1{
  font-size: 80px;
  color: white;
}
.box{
    width: 500px;
    height: 530px;
        border-top: 1px solid rgba(255, 255, 255, 0.5);
        border-left: 1px solid rgba(255, 255, 255, 0.5);
        border-bottom: 1px solid rgba(255, 255, 255, 0.2);
        border-right: 1px solid rgba(255, 255, 255, 0.2);
        backdrop-filter: blur(2px); 
        background: rgba(50, 50, 50, 0.1);
        border-radius: 20px;
        margin-top: 120px;
        color: white;
        padding: 30px 50px;
}

.top{
  display: flex;
  justify-content: space-between;
}

.list input{
  background: rgba(255, 255, 255, 0);
    border: 0px ;
      height: 55px;
      width: 350px;
    border-radius: 5px;
      color: rgba(255, 255, 255, 0.9);
      font-size: 14px;
      letter-spacing: 2px;
      font-weight: 600;
}

.add{
   display: flex; 
  justify-content: space-between; 
  border-bottom: 3px dashed rgb(16, 52, 81) ;
  text-align: center;
}
.add div{
  font-size: 33px;
  padding-right: 18px;
}
.add select{
      width: 80px;
      height: 27px;
        outline: none;
        border-radius: 5px;
        border: 1px solid #b8daff;
        /* padding-left: 5px; */
        box-sizing: border-box;
        margin-top: 15px;
}

ul::-webkit-scrollbar {
  background-color: rgba(0, 0, 0, 0.2);

}
.list >ul{

  height: 300px;
  margin-top: 20px;
  border: 2px solid rgba(255, 255, 255, 0.5);
  border-radius: 20px;
  backdrop-filter: blur(5px);
    background: rgba(23, 103, 144, 0.3);
    overflow-y:auto ; 
}

.list ul li {
  display: flex;
  justify-content: space-around;
  /* border: 3px dashed white; */
  border-radius: 20px;
  backdrop-filter: blur(5px);
    background: rgba(20, 64, 89, 0.9);
    margin-top: 3px;
}

.list ul li input{
width: 30px;

}
.list ul li .text{
  font-size: 20px;
  color:rgb(238, 239, 171);
  margin-top: 6px;
  font-weight: 600;
  overflow: hidden;
  width: 160px;
}
.list ul li img{
  margin-top: 13px;
  width: 30px;
  height: 30px;
  
}

.list ul li .zhan{
  color: aliceblue;
}

.kuo{
  position: absolute;
  z-index: 666;
  top: 50px;
  left: 50px;
  /* background-color: pink; */
  width: 100px;
  height: 112px;
  display: none;
}
.kuo select{
  width: 100px;
    height: 37px;
    outline: none;
    border-radius: 5px;
    border: 1px solid #b8daff;
    /* padding-left: 5px; */
    box-sizing: border-box;
    /* margin-top: 15px; */
    text-align: center;
    text-align-last: center;
}
.kuo select option{
  height: 150px;
}

.kuo select:hover{
  background-color: rgb(125, 155, 148);
}

.kuo select:hover option{
  background-color: white;
}
.kuo select> option:hover{
  background-color: blue;
  color: blue;
}

.kuo img{
  width: 20px;
}
.kuo .ok{
  width: 100px;
  height: 37px;
  text-align: center;
  line-height: 37px;
  background-color: white;
    border-radius: 5px;
      border-left: 1px solid #b8daff;
      border-right: 1px solid #b8daff;
      /* padding-left: 5px; */
      box-sizing: border-box;
}
.ok:hover{
  background-color: rgb(125, 155, 148);
}
.delete img:hover{
  background-color: rgb(125, 155, 148);
}
.kuo .delete:hover{
  background-color: rgb(125, 155, 148);
}


.kuo .delete{

  width: 100px;
    height: 37px;
    text-align: center;
    line-height: 37px;
    background-color: white;
    border-radius: 5px;
    border: 1px solid #b8daff;
    /* padding-left: 5px; */
    box-sizing: border-box;
}
.active{
  display: block;
}

.none{
  display: none;
  
}
.line{
  text-decoration: line-through;
  text-decoration-color: rgb(122, 122, 213);
text-decoration-thickness: 5px;
  /* 穿过线的粗细 */
}
.red{
  color: red;
}

主体部分JavaScript逻辑代码

window.onload = () => {
  const data = localStorage.getItem('tesk')
  const arr = data ? JSON.parse(data) : []
  const ul = document.querySelector('.list ul')
  const kuo = document.querySelector('.kuo')
 
  // 3. 渲染模块函数
  function render() {
    // 遍历数组 arr,有几个对象就生成几个 tr,然后追击给tbody
    // map 返回的是个数组  [tr, tr]
    const trArr = arr.map(function (item, i) {

      let time = item.time ? item.time : "暂未设置时间"
      time = item.istrue ? '您已完成' : time
      const timestyle = item.time =='已超时' ?'red':''
      const chek = item.istrue ? 'checked' : '';
      const line = item.istrue ? 'line':''
      const ha = item.istrue ? 'line' : ''
      const jj = item.import == '重要' ? '骂' :'眨眼'
      return `
        <li>
            <input type="checkbox" name="gou" id="" ${chek}>
            <div class="content">
              <div class="text ${line}">${item.text}</div>
              <div class="time ${timestyle}">${time}</div>
            </div>
           <div>
              <img src="./images/${jj}.png" alt="">
              <img class="zhan" src="./images/zhankai.png" alt="" data-id=${i}>
              
            </div>
          </li>
        `
    })
    document.querySelectorAll('[data-id="1"]')
    
    // 追加给ul
    // 因为 trArr 是个数组, 我们不要数组,我们要的是 trArr的字符串 join()
    ul.innerHTML = trArr.join('')
    zhankaile()
    checkbox()
    
  }
  render()



  //添加数据功能模块
  let addInput = document.querySelector('.add input')
  addInput.addEventListener('keyup', function (e) {
    if (e.key === 'Enter') {
      
      let newText = addInput.value
      let importantInput = document.querySelector('.importantL').value
      if (newText === '') {
        return alert('输入内容不能为空')
      }
      //声明空对象
      const obj = {}
      obj.text = newText
      obj.import = importantInput
      obj.istrue =false
      arr.unshift(obj)
      localStorage.setItem('tesk', JSON.stringify(arr))
      render()
      // 重置表单
      addInput.value = ''
    }
  })

  

  //展开功能模块
  function zhankaile() { 
    const zhan = document.querySelectorAll('.zhan')
  for (let i = 0; i < zhan.length; i++) {
    zhan[i].addEventListener('mouseenter', function (e) {
      if (!kuo.classList.contains('active')) {
        zhan[i].src = "./images/扩展.png"
      }
    })
    zhan[i].addEventListener('mouseleave', function () {
      if (isElementHidden(kuo)) {
        zhan[i].src = "./images/zhankai.png"
      }
    })
    
    zhan[i].addEventListener('click', function (e) {
      if (!kuo.classList.contains('active')) {
        let x = zhan[i].getBoundingClientRect().x
        let y = zhan[i].getBoundingClientRect().y
       
        kuo.classList.add('active')
        
        kuo.style.top = y - 45 + 'px'
        kuo.style.left = x + 50 + 'px'
        zhan[i].src = "./images/缩小.png"
        zhan[i].classList.add('suo1')
      } else {
        let temp = document.querySelector('.suo1')
        temp.src = "./images/zhankai.png"
        temp.classList.remove('suo1')
        kuo.classList.remove('active')
        zhan[i].src = "./images/zhankai.png"
      }
    })

  }
  }
  // zhankaile()
  
  // 隐藏默认的"推迟"选项
  const select = document.querySelector('.kuo select');
  select.options[0].style.display = 'none';

  
  //推迟时间模块
  const ok = document.querySelector('.ok')
  const selctTime = document.querySelector('.selctTime')
  ok.addEventListener('click', function () { 
   
    // console.log(li)
    if (selctTime.value) { 
      const li = document.querySelector('.suo1').parentNode.parentNode.children[2].children[1]
      
      const time = document.querySelector('.suo1').parentNode.parentNode.children[1].children[1]
      if ((time.innerHTML == '暂未设置时间' || time.innerHTML == '已超时') && selctTime.value != '明天') {
        const temp = selctTime.value
        let hours = Math.floor(temp / 60) >= 10 ? Math.floor(temp / 60) : '0' + Math.floor(temp / 60)
        let mins = temp % 60 >= 10 ? temp % 60 : '0' + temp % 60
        time.innerHTML = hours + ":" + mins + " 小时后"
      } else if (time.innerHTML == '明天') { 
          alert('请于明天再修改哦!')
      } else if (selctTime.value == '明天') {
        time.innerHTML = '明天'
      }else{ 
        let temp = time.innerHTML
        let hours = parseInt(temp.slice(0,2));
        let minutes = parseInt(temp.slice(3, 5));
        temp = (+hours)*60 + (+minutes) + (+selctTime.value)
        console.log(+minutes)
        hours = Math.floor(temp / 60) >= 10 ? Math.floor(temp / 60) : '0' + Math.floor(temp / 60)
        mins = temp % 60 >= 10 ? temp % 60 : '0' + temp % 60
        time.innerHTML = hours + ":" + mins + " 小时后"
      }
        if(time.classList.contains('red')) time.classList.remove('red')
      // document.querySelector('.red').classList.remove('red')
      arr[li.dataset.id].time = time.innerHTML
      localStorage.setItem('tesk', JSON.stringify(arr))
      render()

    }
    // console.log(11111)
    selctTime.value = ''
    kuo.classList.remove('active')
    let temp = document.querySelector('.suo1')
    if (temp) {
      temp.src = "./images/zhankai.png"
      temp.classList.remove('suo1')
    }
  })

     
  //删除模块
  const deletes=document.querySelector('.delete')
  deletes.addEventListener('click', function () {
    if (confirm('您确定要删除这项任务吗?')) { 
    const li = document.querySelector('.suo1').parentNode.parentNode.children[2].children[1]
    arr.splice(li.dataset.id, 1)
    localStorage.setItem('tesk', JSON.stringify(arr))
    render()
     
      //document.querySelector('.suo1').classList.remove('suo1')
      
    }
    kuo.classList.remove('active')
    let temp = document.querySelector('.suo1')
    if (temp) {
      document.querySelector('.suo1').classList.remove('suo1')
       temp.src = "./images/zhankai.png"
    }
  })



  //完成模块
  function checkbox() { 
    const gou = document.querySelectorAll('input[name="gou"]')
    for (let i = 0; i < gou.length; i++) { 
      gou[i].addEventListener('change', function () { 
        const li = gou[i].parentNode.children[2].children[1]
        let dd= arr.splice(li.dataset.id, 1)[0]
        if (gou[i].checked) {
          dd.istrue=true
          arr.push(dd)
        } else { 
          dd.istrue = false
          dd.time=''
          arr.unshift(dd)
        }
        localStorage.setItem('tesk', JSON.stringify(arr))
        render()
      }) 
    }
  }
  // checkbox()
  //定时器
  setInterval(function () { 
   const times =document.querySelectorAll('.time')
    for (let i = 0; i < times.length; i++) { 
      if (times[i].innerHTML == '暂未设置时间' || times[i].innerHTML == '明天' || times[i].innerHTML == '已超时' || times[i].innerHTML == '您已完成') continue

      let hours =parseInt(times[i].innerHTML.slice(0,2))
      let min = parseInt(times[i].innerHTML.slice(3, 5))
      
      if (hours == '0' && min == '0') { 
        
        times[i].innerHTML = '已超时'
        const id = times[i].parentNode.parentNode.children[2].children[1].dataset.id
        arr[id].time = times[i].innerHTML
        alert('任务时间到了')
        continue
       
      }else if (min == '0') {
        hours = +hours - 1
        min = 59
      } else { 
        min= +min -1
      }
      hours = +hours >= 10 ? hours : '0'+hours
      min = +min >= 10 ? min : '0' + min
      times[i].innerHTML = hours + ':' + min + '小时后'
      const id=times[i].parentNode.parentNode.children[2].children[1].dataset.id
      arr[id].time = times[i].innerHTML
    }
    localStorage.setItem('tesk', JSON.stringify(arr))
    render()
  },60000)


  // 获取当前日期
  const today = new Date();

  // 获取月份和星期几
  const months = ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'];
  const days = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
  
  const monthIndex = today.getMonth();
  const dayIndex = today.getDay();
  const dateNumber = today.getDate();
  const dateString = `${months[monthIndex]}${dateNumber}日 ${days[dayIndex]}`;
  document.querySelector('.date').innerHTML=dateString
  //判断
  function isElementHidden(element) {
    return window.getComputedStyle(element).getPropertyValue('display') == 'none';
  }

}

右下角小人

<script src="https://cdn.jsdelivr.net/npm/live2d-widget@3.1.4/lib/L2Dwidget.min.js"></script>
  
  <script>
    L2Dwidget.init({
      "model": {
        jsonPath: "https://unpkg.com/live2d-widget-model-haruto/assets/haruto.model.json",
        "scale": 1
      },
      "display": {
        "position": "right",
        "width": 150,
        "height": 190,
        "hOffset": 0,
        "vOffset": 0
      },
      "mobile": {
        "show": true,
        "scale": 0.5
      },
      "react": {
        "opacityDefault": 0.7,
        "opacityOnHover": 0.2
      }
    });
  </script>

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值