【無料】メモ書きにも使えるToDoリストとその作り方
使い方
- 入力フォームに To Do を入力して「Add」ボタンをクリックすると、To Do が追加される。複数追加も可能。
- 各To Doはドラッグ&ドロップで順番を入れ替えられる。
- 追加された To Do には完了判定用のチェックボックスがあり、チェックを入れると取り消し線が付く。
- 「Clear」ボタンをクリックするとアラートが表示され、「OK」をクリックするとTo Doがリセットされる。
- 追加 / 完了チェックしたTo Doは Local Storage に保存されるため、リロードしたりページを閉じて再度開いたりしても作業中の内容が表示され、リセットされない。(同じPC および ブラウザからのアクセスに限る。)
ご利用にあたっては、本Webアプリの 利用規約 も合わせてご確認ください。
目次
To Do リストの実装コード
<div class="container">
<input type="text" id="new-todo" placeholder="New task...">
<button id="add-btn">Add</button>
<button id="clear-btn">Clear</button>
<ul id="todo-list"></ul>
</div>
.customize input,
.customize button {
margin-right: 10px;
font-size: 18px;
}
#todo-list {
list-style-type: none;
padding: 0;
}
#todo-list li {
padding: 8px;
border-bottom: 1px solid #aaa;
display: flex;
align-items: center;
cursor: move;
}
#todo-list li.completed {
text-decoration: line-through;
color: grey;
}
#todo-list li input[type="checkbox"] {
margin-right: 10px;
}
document.addEventListener('DOMContentLoaded', function() {
const todoList = document.getElementById('todo-list');
const addBtn = document.getElementById('add-btn');
const clearBtn = document.getElementById('clear-btn');
const newTodoInput = document.getElementById('new-todo');
let todos = JSON.parse(localStorage.getItem('todos')) || [];
function renderTodos() {
todoList.innerHTML = '';
todos.forEach((todo, index) => {
const li = document.createElement('li');
li.draggable = true;
li.dataset.index = index;
const checkbox = document.createElement('input');
checkbox.type = 'checkbox';
checkbox.checked = todo.completed;
checkbox.addEventListener('change', () => toggleComplete(index));
li.appendChild(checkbox);
const span = document.createElement('span');
span.textContent = todo.text;
if (todo.completed) {
li.classList.add('completed');
}
li.appendChild(span);
li.addEventListener('dragstart', handleDragStart);
li.addEventListener('dragover', handleDragOver);
li.addEventListener('drop', handleDrop);
todoList.appendChild(li);
});
}
function addTodo() {
const text = newTodoInput.value.trim();
if (text !== '') {
todos.push({ text, completed: false });
newTodoInput.value = '';
saveTodos();
renderTodos();
newTodoInput.focus();
}
}
function toggleComplete(index) {
todos[index].completed = !todos[index].completed;
saveTodos();
renderTodos();
}
function clearTodos() {
if (confirm('To Do リストをすべてクリアします。よろしいですか?')) {
todos = [];
saveTodos();
renderTodos();
newTodoInput.focus();
} else {
newTodoInput.focus();
}
}
function saveTodos() {
localStorage.setItem('todos', JSON.stringify(todos));
}
function handleDragStart(event) {
event.dataTransfer.setData('text/plain', event.target.dataset.index);
}
function handleDragOver(event) {
event.preventDefault();
event.dataTransfer.dropEffect = 'move';
}
function handleDrop(event) {
event.preventDefault();
const draggedIndex = event.dataTransfer.getData('text/plain');
const targetIndex = event.target.closest('li').dataset.index;
if (draggedIndex !== targetIndex) {
const draggedTodo = todos.splice(draggedIndex, 1)[0];
todos.splice(targetIndex, 0, draggedTodo);
saveTodos();
renderTodos();
}
}
addBtn.addEventListener('click', addTodo);
clearBtn.addEventListener('click', clearTodos);
newTodoInput.addEventListener('keypress', function(event) {
if (event.key === 'Enter') {
addTodo();
}
});
renderTodos();
newTodoInput.focus();
});