JSFiddle - React, Tailwind, and code Playground
by ZooeyLai
HTML
<div id="app">
<div class="card">
<div class="card-header">
<h2>TODO LIST</h2>
</div>
<div class="card-body">
<div class="add-task">
<h3>新增事項</h3>
<form id="taskForm" action="">
<div class="form-group">
<input type="text" id="newTask" class="form-input" placeholder="請輸入任務" autocomplete="on">
<select name="statusType" id="statusType" class="form-input" onchange="showValue()">
<option value="" selected disabled>狀態</option>
<option value="normal">一般</option>
<option value="important">重要</option>
<option value="urgent">緊急</option>
</select>
<button class="btn btn-primary" onclick="addTask()" id="submitBtn"type="submit">新增</button>
</div>
</form>
</div>
<div class="tasks-box">
<h3>今日待辦</h3>
<ul id="incomplete-tasks" class="task-list">
<li>
<span>洗衣服</span>
<button onclick="deleteTask()" class="btn btn-outline-primary">刪除</button>
</li>
<li class="status-danger">
<span>買文具</span>
<button onclick="deleteTask()" class="btn btn-outline-primary">刪除</button>
</li>
<li class="status-warning">
<span>去健身房</span>
<button onclick="deleteTask()" class="btn btn-outline-primary">刪除</button>
</li>
</ul>
<button class="btn btn-secondary"...
CSS
:root{
--primary: #4f46e5;
--secondary:#2563eb;
--secondary100: #dbeafe;
--gray800: #333;
--white: #fff;
--background:#e4e4e4;
--warning100 :#ffedd5;
--warning : #ea580c;
--danger100 :#fee2e2;
--danger : #dc2626;
}
*{
box-sizing: border-box;
font-size: 1rem;
}
body{
background: var(--background);
color: var(--gray800);
font-family: Lato, sans-serif;
}
.card{
width: 560px;
margin: 40px auto 0;
padding: 1rem;
background: var(--white);
border-radius: 0.25rem;
box-shadow: 0 0 12px rgba(0, 0, 0, 0.15);
}
h2 {
text-align: center;
margin: 1rem 0;
font-size: 1.75rem;
}
h3{
font-size: 1.125rem;
padding: 0.5rem 0;
border-bottom: 2px solid var(--gray800);
}
ul {
margin: 0;
padding: 0;
}
li{
list-style: none;
}
.form-group{
margin-bottom: 1rem;
display: flex;
flex-flow: row;
}
.form-label{
font-size: 0.75rem;
margin-bottom: 0.25rem;
}
.form-input{
border: 1px solid #94a3b8;
padding: 0.5rem 1rem;
border-radius: 0.25rem;
flex: auto;
margin-right: 1rem;
}
.form-input:focus{
border-color: var(--primary);
box-shadow: 0px 0px 0px 3px rgb(79 70 229 / 40%);
outline: none;
}
.input-warning{
border-color: var(--warning);
background-color: var(--warning100);
}
.input-warning:focus{
border-color: var(--warning);
box-shadow: 0px 0px 0px 3px rgb(234 88 12 / 40%);
outline: none;
}
.input-danger{
border-color: var(--danger);
background-color: var(--danger100);
}
.input-danger:focus{
border-color: var(--danger);
box-shadow: 0px 0px 0px 3px rgb(220 38 38/ 40%);
...
JavaScript
// 新增任務
function addTask(){
let taskInput = document.getElementById('newTask').value; // 建立變數,取得input的value
let incompleteTasksHolder = document.getElementById('incomplete-tasks'); // 建立變數,取得ul的id
let taskList = document.createElement('li'); // 建立變數,新增li元素
let createNewTaskEl = document.createElement('span'); // 建立變數,新增span元素
let deleteBtn = document.createElement('button');
let statusType = document.getElementById('statusType').value;
if (taskInput === ''){
return alert('請輸入新任務')
}else{
incompleteTasksHolder.append(taskList); //在ul底下新增li
taskList.append(createNewTaskEl); //在li底下新增span
createNewTaskEl.append(taskInput); //把input的value新增進li
// 判斷任務分類
if( statusType === 'important'){
taskList.className = taskList.className + 'status-warning'
}else if(statusType === 'urgent'){
taskList.className = taskList.className + 'status-danger'
}
clearInput();
taskList.append(deleteBtn); //增加按鈕
deleteBtn.textContent ='刪除';
deleteBtn.classList.add('btn', 'btn-outline-primary');
deleteBtn.onclick = deleteTask;
}
}
// 清空input
function clearInput(){
let taskInput = document.getElementById('newTask');
taskInput.value ='';
taskInput.classList.remove('input-warning', 'input-danger');
document.getElementById('statusType').value ='';
}
function deleteTask(){
event.target.parentElement.remove();
}
// 點擊enter送出表單
let taskForm = document.getElementById('taskForm');
taskForm.addEventListener('submit', (e) => {
e.preventDefault();
})
...