JSFiddle - React, Tailwind, and code Playground
by birdie2019
HTML
<div class="container">
<h1>待辦事項</h1>
<div id="input-panel">
<input type="text" id="input" placeholder="請輸入待辦事項...">
<select id="event-cat" onchange="changeColor()">
<option value="none" selected disabled hidden>事項分類</option>
<option value="normal">一般</option>
<option value="important">重要</option>
<option value="urgent">緊急</option>
</select>
<button class="add-btn" onclick="add()" >+</button>
</div>
</div>
<div class="container">
<ul id="list">
</ul>
<button id="export-btn">匯出</button>
<button id="save-btn">儲存</button>
</div>
CSS
* {
box-sizing: border-box;
font-size: 10px;
color: #606060;
}
body {
background-color: #FFF0DF;
}
.container {
width: 500px;
margin: 30px auto;
}
/* input-panel */
h1 {
text-align: center;
font-size: 2.4rem;
letter-spacing: 3px;
}
#input-panel {
display: flex;
justify-content: center;
margin: 10px 0;
}
#input-panel > input {
flex: 1;
padding: 10px 8px;
border-radius: 5px 0 0 5px;
border: 0;
outline: 0;
font-size: 1.5rem;
letter-spacing: 1px;
}
.text-normal {
color: #6B8F71;
}
.text-important {
color: #F49344;
}
.text-urgent {
color: #BF1802;
}
#event-cat {
border: 0;
border-left: 3px solid #fffaf5;
width: 100px;
font-size: 1.5rem;
letter-spacing: 1px;
outline: 0;
text-align: center;
}
.add-btn {
border: 0;
width: 40px;
border-radius: 0 5px 5px 0;
font-size: 1.8rem;
font-weight: 700;
cursor: pointer;
background-color: #546A76;
color: #fff;
}
/* list */
#list > li {
display: flex;
justify-content: flex-end;
background-color: rgba(255, 255, 255, 0.8);
padding: 10px 8px;
margin-bottom: 8px;
border-radius: 5px;
}
#list > li :first-child {
flex: 1;
font-size: 1.5rem;
font-weight: 500;
letter-spacing: 1px;
}
#list > li :nth-child(2) {
width: 100px;
font-size: 1.3rem;
text-decoration: underline;
vertical-align: center;
letter-spacing: 1px;
color: #a6a6a6;
}
#list > li :last-child {
background-color: transparent;
color: #a6a6a6;
border: 0;
cursor: pointer;
font-weight: 700;
transition: all 0.3s;
}
#list > li :last-child:hover {
color: #FA829C;
transform: scale(1.1);
}
#list > li :nth-last-child(2) {
background-color: transparent;
color: #a6a6a6;
border: 0;
cursor: pointer;
font-weight: 700;
transition: all 0.3s;
}
#list > li :nth-last-child(2):hover {
color: #00bbbb;
transform: scale(1.1);
}
/* export-btn */
#export-btn, #save-btn {
background-color: #8E6F64;
border: 0;
color: #fff;
padding: 8px;
font-size:...
JavaScript
function add() {
var input = document.querySelector('#input');
var list = document.querySelector('#list');
var li = document.createElement('li');
var span = document.createElement('span');
var finishSpan = document.createElement('span');
var deleteBtn = document.createElement('button');
var finishBtn = document.createElement('button');
var eventCat = document.querySelector('#event-cat');
var eventCatIndex = eventCat.selectedIndex;
var eventValue = eventCat.options[eventCatIndex].value;
var inputValue = input.value;
if (eventValue != 'none' && inputValue != '') {
list.append(li);
li.append(span);
span.className = eventValue;
li.append(finishSpan);
finishSpan.style.display = 'none';
finishSpan.className = 'show-finish';
finishSpan.textContent = '(已完成)';
li.append(finishBtn);
finishBtn.textContent = '[ 標示為已完成 ]';
finishBtn.onclick = finishState;
li.append(deleteBtn);
deleteBtn.textContent = '[ 刪除 ]';
deleteBtn.onclick = deleteLi;
span.textContent = inputValue;
input.value = '';
eventCat.value = 'none';
input.className = '';
} else {
alert('請填寫待辦事項和事件分類');
}
}
function finishState () {
var e = event.target;
var showFinish = e.closest('li').querySelector('.show-finish');
if (e.textContent == '[ 標示為未完成 ]') {
e.textContent = '[ 標示為已完成 ]';
showFinish.style.display = 'none';
} else {
e.textContent = '[ 標示為未完成 ]';
showFinish.style.display = 'block';
}
}
function deleteLi() {
var yes = confirm('確定要刪除嗎?');
if (yes) {
event.target.closest('li').remove();
}
}
var exportBtn = document.querySelector('#export-btn');
exportBtn.onclick = exportList;
function exportList() {
var list = document.querySelectorAll('#list li');
var text = '';
var num = 1;
for (var item of list) {
var getClassName = item.querySelector('span').className;
var spanTextContent =...