RaiseTechのReactコースの第4週目の課題。(すでに1週間遅れてるww)
お題は、「CodeSandboxを使用して、JavaScript/HTML/CSSでToDoアプリを作る」こと。
ヤバイヤバイ。
丸腰だから意味不明ww
何はともあれ、ググる。ググれ。ググろ。
とりあえず、アプリっぽいものができたので、丸腰の人が調べながらやった過程を記録。(8時間くらいかかったww)
ざっくりとやったことの流れ
- ToDoリストについて考えてみた(どんな機能があるか?)
- アイコン作った(ネコにしたかったw)
- Webの中の人のToDoリストを色々見てみた(機能的にまねできそうなところを探す)
- ToDoリストのデザインを考えた
- 同じことをやっていそうな人を探して、実装方法を参考にした
- CSSについてあまりよくわかってないことに気づき調べた
- CodeSandbox上で動作確認していたら、イベント発火しなくて2~3時間無駄にするw(別のブラウザ立ち上げて普通に動作確認したら、問題なかったというオチ)
- 概ね実装できたので、後は見た目をこねこね
- ToDoアプリっぽいのができて、とりあえず満足する
準備
まず、JavaScriptの前に、HTMLとCSSがわからないとお話しにならない。
HTMLはふわっとわかったつもりになっているが、CSSがよくわからないので、使いそうなところを簡単に調べる。
CSSまとめ
CodeSandboxの準備
CodeSandboxは、前に使ってみたので、環境の準備はOK。
準備はこのくらいかな。
あとは、とりあえず書いてみて、動かしてみて、試してみて、まず手を動かすのが一番早い。
出来上がりイメージ
これすごく大事。
イメージがないと、何も始まらない。
デザインとか、機能とか、まず妄想することが大事。
こういう感じ。(これは出来上がった画面だが、実際は各パーツを線で描いてみる程度)
機能
- テキストボックスに入力した「やること」をやることリストに追加
- やることリストの各項目の削除
- やることリストの各項目の完了
アイコン作る
ネコアイコンとニッキューアイコン作成w
高級なイラレとかPhotoshopとかはないので、Windows標準ペイントツールを使うが、背景が透過にならず、時間を浪費ww
普通のペイントは背景が透過にならないらしい!(キィィ!)
結局これもWindows標準だが、ペイント3Dで透過にした。
イメージに沿うようにHTMLを書く
これはそんなに難しくない。
静的に作りたいイメージをHTMLで書いていくだけ。
HTML
<html lang=""> <head> <meta charset="UTF-8"></meta> <title>ToDo List</title> <link href="src/styles.css" rel="stylesheet"></link> </head> <body> <h1>ToDo List</h1> <div class="flex"> <img alt="ネコアイコン" src="pics/neco_icon.png" title="ネコ" width="10%" /> <form class=""> <input class="task_input" type="text" /> <button class="task_submit" type="button">やること追加</button> </form> </div> <div id="table"> <h2>やることリスト</h2> <ul class="task_list"></ul> </div> <script src="src/index.js"></script> </body> </html>
出来上がりイメージ
JavaScriptで動的な部分を作っていく
ここが一番苦労した。
だって、予備知識なしからのスタートだから!!
getElementsByClassName
document.getElementsByClassName('task_input')[0];
と書くことで、引数(task_input)で指定されたクラス名を持つ、最初の要素を取得できる。
console.log() で出力してみるとわかりやすい。
要素が取得できていることがわかる。
これ、[0] がポイントで、[0] がないと、HTMLCollectionがドロドロ出てきてヤバイ。(語彙ww)
[0] つけないと、こういう情報が取れる。
addEventListener
これは、the JavaScriptの動的なやつって感じ。
EventTarget.addEventListener(対象とするイベントの種類, 処理したい関数);
第3引数はオプションなので、ここでは説明を省略。
今回は、「やること追加」ボタンを押されたら、やりたいことを第2引数にする。
JavaScript
taskSubmit.addEventListener('click', evt => { evt.preventDefault(); const task = taskInput.value; if (task === '') { window.alert('タスクを入力してください'); return; } addTasks(task); taskInput.value = ''; });
追加したいやることリストに何も入力されていない状態で、「やること追加」ボタンを押されたときに、エラーを表示する。
追加したいタスクがある場合は、addTask()関数をCallする。
createElement
document.createElement('li');
引数で指定した要素を作成する。
HTMLでは、ul要素までしか作っていないので、その中身の<li></li>要素をJavaScriptで作っていく。
appendChild
Node.appendChild(親ノードに追加する子ノード(要素));
特定の親ノード(li)の下に、追加したいタスクとDelete、Completeボタンを追加。
JavaScript
const addTasks = (task) => { const listItem = document.createElement('li'); const showItem = taskList.appendChild(listItem); showItem.innerHTML = task; const deleteButton = document.createElement('button'); deleteButton.className = 'task_button'; deleteButton.innerHTML = 'Delete'; listItem.appendChild(deleteButton); const completeButton = document.createElement('button'); completeButton.className = 'task_button'; completeButton.innerHTML = 'Complete'; listItem.appendChild(completeButton); deleteButton.addEventListener('click', (evt) => { evt.preventDefault(); deleteTasks(deleteButton); }); completeButton.addEventListener('click', (evt) => { evt.preventDefault(); completeTasks(completeButton); }); console.log(showItem); };
ここまでが、やることリストを作る作業。
次に、追加されたリストを削除する処理を作る。
closest
Element.closest(要素);
指定したセレクタ(要素)に一番近い要素を指定する。
classList
Element.classList.add(要素);
指定した要素のclass属性を追加する。
Element.classList.remove(要素);
removeChild
Node.removeChild(子ノード);
子ノードを取り除く。
今回の場合は、Deleteボタンを押されたときに、該当のタスクを削除する。
あとは、Completeボタンが押されたら、もうこのボタンは必要なくなるので、Completeボタンの削除をしている。
JavaScript
const deleteTasks = (deleteButton) => { const chosenTask = deleteButton.closest('li'); taskList.removeChild(chosenTask); }; const completeTasks = (completeButton) => { const chosenTask = completeButton.closest('li'); chosenTask.classList.add('complete'); chosenTask.removeChild(completeButton); };
CSSで見た目を整える
ここまでで、概ね実装は完了。
あとは、CSSで見た目を少し整える。
リストのアイコンはニッキュー画像で
CSS
ul li { background: url(../pics/pow_icon.png) no-repeat 0 0; background-size: auto 20px; padding-left: 30px; }
肉球画像は、20px*20pxで作成。
背景として設定している。
リストの文字列は折り返す
CSS
li { margin: 2rem 3rem 2rem 1rem; word-break: break-all; }
word-break: break-all; で、やることリストの文字列を折り返すことができる。
完了済のタスクはグレー文字色で取り消し線
CSS
.complete { text-decoration: line-through; color: #c0c0c0; }
このくらいかな~。
あとは、このToDoリストは、ブラウザをリロードすると消えてしまうので、それを保持できるように検討する必要がある。
それは次回にして、今回はここまで。
今回までのToDoアプリはここで確認できます。