待辦事項(To-Do List)
在 assignment
資料夾下,建立以下資料夾及檔案:
vendors/jquery/jquery-3.4.1.min.js
第一步:基本介面及 text 欄位事件
提供 html 及 CSS:
<article class="task_container">
<h1 class="title1">任務管理</h1>
<div class="task_add_block">
<input type="text" class="task_name" placeholder="輸入待辦事項…">
<button type="button" class="task_add">新增</button>
</div>
<div class="task_list_parent">
<ul class="task_list">
</ul>
</div>
</article>
/* 基本 CSS */
* {
box-sizing: border-box;
}
html{
font-size: 62.5%;
}
body{
margin: 0;
background: rgb(10,0,36);
background: radial-gradient(circle, rgba(10,0,36,0.1110819327731093) 0%, rgba(9,9,121,0.1110819327731093) 5%, rgba(0,212,255,0.04665616246498594) 100%);
}
article.task_container{
width: 600px;
margin: 50px auto 0;
border-radius: 5px;
padding: 10px;
box-shadow: 1px 1px 5px gray;
}
h1.title1{
font-size: 2.4rem;
margin: 0 0 10px 0;
}
/* ===== 任務新增 ===== */
div.task_add_block{
font-size: 0;
transition: transform .5s, box-shadow .5s;
}
div.task_add_block.-on{
box-shadow: 0 0 5px gray;
transform: scale(1.01);
transform-origin: center center;
}
div.task_add_block input.task_name{
width: calc(100% - 50px);
border: 1px solid lightgray;
border-radius: 3px 0 0 3px;
height: 40px;
font-size: 2rem;
padding: 5px 10px;
outline: none;
display: inline-block;
vertical-align: top;
}
input.task_name::placeholder{
color: lightgray;
}
div.task_add_block button.task_add{
display: inline-block;
width: 50px;
height: 40px;
vertical-align: top;
border: 1px solid lightgray;
border-left: 0;
background-color: white;
box-shadow: none;
font-size: 1.6rem;
cursor: pointer;
outline: none;
border-radius: 0 3px 3px 0;
}
div.task_add_block button.task_add:active{
box-shadow: 1px 1px 3px lightgray inset, -1px -1px 3px lightgray inset;
background-color: #fcfcfc;
font-size: 1.5rem;
}
完成以下項目:
index.html 頁面需載入 jquery 以及 index.js
input.task_name
在 focus 事件觸發時,div.task_add_block
加上 -on
class。
input.task_name
在 blur 事件觸發時,div.task_add_block
移除 -on
class。
結果示意:
第二步:新增待辦事項
更新 html、css:
<!-- 載入 Font Awesome -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.0/js/all.min.js"></script>
/* ===== 任務列表 ===== */
div.task_list_parent{
margin-top: 30px;
}
div.task_list_parent ul.task_list{
margin: 0;
padding: 0;
list-style: none;
}
div.task_list_parent ul.task_list > li{
margin-bottom: 20px;
border-bottom: 1px solid gray;
padding-bottom: 20px;
}
div.task_list_parent ul.task_list > li:first-child{
border-top: 1px solid black;
padding-top: 20px;
}
div.task_list_parent ul.task_list > li:last-child{
margin-bottom: 0;
border-bottom: 0;
}
div.task_list_parent ul.task_list > li > div.item_flex{
display: flex;
/* border: 1px solid black; */
}
div.task_list_parent ul.task_list > li > div.item_flex > div{
/* border: 1px solid blue; */
}
div.task_list_parent ul.task_list > li > div.item_flex > div.left_block{
width: 100px;
flex-shrink: 0;
}
div.task_list_parent ul.task_list > li > div.item_flex > div.left_block div.btn_flex{
display: flex;
}
div.task_list_parent ul.task_list > li > div.item_flex > div.left_block div.btn_flex > button{
flex-grow: 1;
outline: none;
height: 40px;
font-size: 1.6rem;
padding: 0;
margin: 0;
background: none;
background-color: white;
border: 0;
cursor: pointer;
border: 1px solid #eee;
}
div.task_list_parent ul.task_list > li > div.item_flex > div.middle_block{
font-size: 1.8rem;
flex-grow: 1;
padding-left: 10px;
padding-right: 10px;
}
div.task_list_parent ul.task_list > li > div.item_flex > div.middle_block p.para{
margin: 0;
}
div.task_list_parent ul.task_list > li > div.item_flex > div.right_block{
width: 100px;
flex-shrink: 0;
}
div.task_list_parent ul.task_list > li > div.item_flex > div.right_block div.btn_flex{
display: flex;
}
div.task_list_parent ul.task_list > li > div.item_flex > div.right_block div.btn_flex > button{
flex-grow: 1;
outline: none;
height: 40px;
font-size: 1.6rem;
padding: 0;
margin: 0;
background: none;
background-color: white;
border: 0;
cursor: pointer;
border: 1px solid #eee;
}
新增待辦事項的 html:
<li>
<div class="item_flex">
<div class="left_block">
<div class="btn_flex">
<button type="button" class="btn_up">往上</button>
<button type="button" class="btn_down">往下</button>
</div>
</div>
<div class="middle_block">
<div class="star_block">
<span class="star" data-star="1"><i class="fas fa-star"></i></span>
<span class="star" data-star="2"><i class="fas fa-star"></i></span>
<span class="star" data-star="3"><i class="fas fa-star"></i></span>
<span class="star" data-star="4"><i class="fas fa-star"></i></span>
<span class="star" data-star="5"><i class="fas fa-star"></i></span>
</div>
<p class="para">這是任務這是任務這是任務這是任務這是任務這是任務這是任務這是任務這是任務這是任務這是任務這是任務</p>
</div>
<div class="right_block">
<div class="btn_flex">
<button type="button" class="btn_update">更新</button>
<button type="button" class="btn_delete">移除</button>
</div>
</div>
</div>
</li>
完成以下項目:
按下「新增」按鈕時,將以上的待辦事項 html,新增到 ul.task_list
裡,新增到裡面的最前面。
如果沒有輸入待辦事項,按「新增」的話,不能有任何反應。
輸入的待辦事項,如果文字的最左邊、最右邊有空格,需移除。(語法:JS 內建的 trim()
函式)。
結果示意:https://youtu.be/Q_E4yKXPfn8
第三步:移除與清空
更新 index.html:
將以下這行放到 h1 標籤之前:
<button type="button" class="btn_empty">清空</button>
更新 index.css:
/* ===== 清空按鈕 ===== */
button.btn_empty{
float: right;
background: none;
background-color: white;
padding: 0;
margin: 0;
border: 1px solid lightgray;
border-radius: 3px;
height: 30px;
width: 50px;
outline: none;
font-size: 1.6rem;
cursor: pointer;
}
完成以下項目:
按下「移除」按鈕,淡出 1 秒,然後移除該筆待辦事項。
按下「清空」按鈕,淡出 1 秒,清除全部的待辦事項。
結果示意:https://youtu.be/XmwhmcSA-Ic
第四步:更新待辦事項
index.js
檔案,待辦事項的 li 標籤,更新以下結構,以老師自己寫的為例,有以下這行:
<p class="para">${task_text}</p>
在其下方,加上這行(留意有加上 -none
這個 class):
<input type="text" class="task_name_update -none" placeholder="更新待辦事項…" value="${task_text}">
更新 index.css:
div.middle_block input.task_name_update{
width: 100%;
border: 1px solid lightgray;
border-radius: 3px 0 0 3px;
height: 40px;
font-size: 2rem;
padding: 5px 10px;
outline: none;
}
div.middle_block input.task_name_update::placeholder{
color: lightgray;
}
.-none{
display: none;
}
完成以下項目:
再按下「更新」按鈕,回到不可編輯的狀態,但待辦事項要是更新的。
如果所更新的待辦事項,沒有輸入文字,跳出提醒視窗(alert),顯示「請輸入待辦事項」。
待辦事項的文字若最左邊、最右邊有空格的話,需移除。
結果示意:https://youtu.be/KaMN5o4JybM
第五步:排序
更新 index.css:
div.task_list_parent ul.task_list > li:first-child button.btn_up{
background-color: lightgray !important;
cursor: not-allowed !important;
color: gray;
}
div.task_list_parent ul.task_list > li:last-child button.btn_down{
background-color: lightgray !important;
cursor: not-allowed !important;
color: gray;
}
jQuery 其它提示:(以下這行可以判斷父層裡的 li,它是不是第一個子元素)
$(this).closest("li").is(':first-child')
jQuery 其它提示:(以下這行可以判斷父層裡的 li,它是不是最後一個子元素)
$(this).closest("li").is(':last-child')
完成以下項目:
按下「往上」按鈕,與上面的待辦事項對調。(註:每個待辦事項是以 li
為單位。)
第一個的待辦事項,「往上」按鈕按了要沒反應;最後一個的待辦事項,「往下」按鈕按了要沒反應。
結果示意:https://youtu.be/-JXZ5VUC4DM
第六步:重要性的星號
更新 index.css:
/* ===== 重要性的星號 ===== */
div.star_block{
display: inline-block;
}
div.star_block > span.star{
cursor: pointer;
display: inline-block;
margin-right: 3px;
}
div.star_block > span.star.-on{
color: yellow;
}
完成以下項目:
點擊星號的時候,該星號加上 -on
這個 class,然後該筆待辦事項,星號數( data-star
)小於等於點擊的星號數的話,也要加上 -on
這個 class;反之則移除。
結果示意:
繳交方式
最晚繳交日期:0/(日) 晚上 12 點之前。
先將 assignment
資料夾壓成壓縮檔,然後透過以下網址繳交:
前端班: https://frontend.tibame.com/
Java 班: https://java.tibame.com/
參考作法
Last updated