这周刚学习完JavaScript基础知识,并自己写了一项Todolist作品,给大家分享一下我的作品,并带着实现一下
目录
作品展示
背景有雪花飘动的效果,右下角也有个小人,这个小人是动态的效果,你鼠标在哪个坐标它就会看向哪里,并且还会眨眼
每次鼠标点击,对应位置会有随机颜色的文字出现,并有烟花效果
对每一项任务都是可以设置时间和删除的
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>