狠狠撸

狠狠撸Share a Scribd company logo
IntroductiontoProgramming
with
JavaScript
JavaScriptから始める
プログラミング2016
京都大学工学部情報学科
計算機科学コース3回
KMC2回 drafear
第3回
IntroductiontoProgramming
withJavaScript 自己紹介
? id
- drafear(どらふぃあ, どらふぁー)
? 所属
- 京都大学 工学部 情報学科 計算機科学コース 3回
? 趣味
- ゲーム(特にパズルゲー), ボドゲ, ボカロ, twitter
? 参加プロジェクト
- これ, 競プロ, ctf, 終焉のC++, coq, 組み合わせ最適化読書会
※青: 新入生プロジェクト
@drafear
2@drafear_ku @drafear_carryok @drafear_evolve @drafear_sl @gekimon_1d1a @cuigames
IntroductiontoProgramming
withJavaScript
? 学部学科
? id (入部してたら) or 名前
? 趣味
? 好きな講義(授業)
自己紹介
1. KMC 2回生
2. 新入生
3. KMC 3回生
4. KMC 4回生
5. KMC n回生
3
IntroductiontoProgramming
withJavaScript この講座で使用するブラウザとエディタ
? Google Chrome
- https://chrome.google.com
? Atom
- https://atom.io/
4
IntroductiontoProgramming
withJavaScript 今日の目標
? JavaScriptの基本的構文をマスターする
? CSSで好きなレイアウトを組めるようになる
5
IntroductiontoProgramming
withJavaScript 本日の内容
? JavaScript
- 変数のスコープ
- 再帰
- インクリメント, デクリメント (++i, i++, --i, i--)
- 繰り返し文(無限ループ, while文, for文, continue, break)
- 配列
- elem.getElementsByTagName, elem.getElementsByClassName
- elem.querySelector, elem.querySelectorAll
- elem.children, elem.parentElement
- elem.dataset
6
IntroductiontoProgramming
withJavaScript 本日の内容
? CSS
- セレクタ
- インラインボックス と ブロックボックス
- flexbox
? HTML
- article, section (ちょっと紹介するだけ)
- ul, li
7
IntroductiontoProgramming
withJavaScript 今日作るもの
? ゴリラを倒すゲーム
- http://drafear.ie-t.net/js2016/gorilla/
8
IntroductiontoProgramming
withJavaScript はじめに
? 今回は山場です
? 今回を乗り越えれば
- 次回以降は楽です
- JavaScriptから始めるプログラミングは9割終わり
後はJavaScriptを極めていこう
? 乗り越えられなくても
- (2回に渡って理解していただくために)
次回復習回を設けておりますので, 全然大丈夫です!
9
IntroductiontoProgramming
withJavaScript てんぷれ
? 以下から雛形などをダウンロードしてください
- https://github.com/kmc-jp/js2016
10
11
1. 復習
IntroductiontoProgramming
withJavaScript 復習
? 第2回のスライドを見て復習していきます
12
13
2. JavaScript
IntroductiontoProgramming
withJavaScript 変数のスコープ
14
let a = 10;
let func = () => {
let b = 6;
if (a === 10) {
let c = 5;
let a = 5;
console.log(b); // 6
console.log(a); // 5
a = 30;
}
console.log(a); // 10
console.log(c); // error
};
func();
console.log(b); // error
main.js
? スコープ = 見える範囲
IntroductiontoProgramming
withJavaScript 変数のスコープ
15
let a = 10;
let func = () => {
let b = 6;
if (a === 10) {
let c = 5;
let a = 5;
console.log(b); // 6
console.log(a); // 5
a = 30;
}
console.log(a); // 10
console.log(c); // error
};
func();
console.log(b); // error
main.js
? スコープ = 見える範囲
IntroductiontoProgramming
withJavaScript 変数のスコープ
? スコープ = 見える範囲
? let と定義された行よりも下で,
同じ {} 内もしくはそれよりも {} が深いところから
その変数を読めます
? 同じ名前の変数が複数あれば, {} の深さが近いところ優先
? 一番外に定義された変数をグローバル変数といいます
? それ以外の変数をローカル変数といいます
16
IntroductiontoProgramming
withJavaScript 変数のスコープ
17
let a = 10; // グローバル変数
let func = () => {
let b = 6;
if (a === 10) {
let c = 5;
let a = 5;
console.log(b); // 6
console.log(a); // 5
a = 30;
}
console.log(a); // 10
console.log(c); // error
};
func();
console.log(b); // error
main.js
? スコープ = 見える範囲
IntroductiontoProgramming
withJavaScript
main.js
再帰
? 自分の関数内で自分自身を呼ぶことを再帰といいます
18
// nの階乗 n! を求める
let fact = (n) => {
if (n === 0) {
return 1;
}
return n * fact(n-1);
};
console.log( fact(3) ); // 6
console.log( fact(10) ); // 3628800
IntroductiontoProgramming
withJavaScript 演習
? Math.powを使わずに ? ?
を計算する関数 power を
作ってみよう
- ? ≥ 1, ? ≥ 0
- ??? ????? = ?, ? => …
? 時間が余った方は power 関数の高速化を考えてみよう
19
演習
IntroductiontoProgramming
withJavaScript 演習
? ? =
1 ? = 0
? ? ? ??1
(? ≥ 1)
20
演習
let power = (x, n) => { // ? ?
を計算する
if (n === 0) return 1;
return power(x, n-1) * x;
};
main.js
計算回数: ?回程度
IntroductiontoProgramming
withJavaScript 演習
? ?
=
1 ? = 0
? ? ? ??1 (?: ???)
? ?/2 2
(?: ????)
21
演習
let square = (x) => { // ?2
を計算する
return x * x;
};
let power = (x, n) => { // ? ? を計算する
if (n === 0) return 1;
if (n % 2 === 1) return x * power(x, n-1);
return square( power(x, n/2) );
};
main.js
計算回数: log2 ? 回程度
IntroductiontoProgramming
withJavaScript 無限ループとbreak
? while (true) { 処理; }
- 処理を永遠に繰り返す
? break
- 処理を中断し, while (true) {} を抜ける
22
// n! を計算する
let fact = (n) => {
let res = 1;
while (true) {
if (n === 0) break;
res *= n;
--n; // n -= 1; と等価
}
return res;
};
例
> fact(3)
6
> fact(0)
1
> fact(10)
3628800
例の動作例
IntroductiontoProgramming
withJavaScript インクリメント, デクリメント
? インクリメント
++a または a++
a += 1 とほぼ等価
? デクリメント
--a または a--
a -= 1 とほぼ等価
23
IntroductiontoProgramming
withJavaScript while文
? while (条件式) { 処理; }
- 次と等価
- 条件式 が 真(true) である間 (一連の)処理 を繰り返す
- 処理の途中で条件式が 偽(false) になっても途中では抜けない
24
while (true) {
if ( !(条件式) ) break;
処理;
}
IntroductiontoProgramming
withJavaScript while文
? 例
25
// n! を計算する
let fact = (n) => {
let res = 1;
while (n > 0) {
res *= n;
--n; // n -= 1; と等価
}
return res;
};
main.js
> fact(3)
6
> fact(0)
1
> fact(10)
3628800
例の動作例
IntroductiontoProgramming
withJavaScript continue
? while文の } の手前まで処理をスキップする
? ふつう, if文と一緒に使う
- 次の2つは等価
26
while (条件式1) {
処理1;
if (条件式2) continue;
処理2;
}
while (条件式1) {
処理1;
if ( !(条件式2) ) {
処理2;
}
}
IntroductiontoProgramming
withJavaScript 演習
? 2で割れるだけ割った値を返す関数 toOdd を
実装してみましょう
- ??? ????? = ? => …
- 再帰ではなくwhile文を用いて実装してみよう
27
演習
> toOdd(8)
1
> toOdd(20)
5
> toOdd(7)
7
例の動作例
IntroductiontoProgramming
withJavaScript 演習
? 2で割れるだけ割った値を返す関数 toOdd を
実装してみましょう
28
演習
// 2で割れるだけ割った値を返す
let toOdd = (n) => {
while (n % 2 === 0) {
n /= 2;
}
return n;
};
main.js
IntroductiontoProgramming
withJavaScript do … while文
? do { 処理; } while (条件式);
- 次と等価 (処理にcontinueを含まない場合)
- 初回は条件式の真偽に関わらず実行するwhile文
- あまり使わないのでこんなのあったなーくらいでおk
- (普通のwhile文も今のところは
こんなのあったなーくらいになると思いますがw)
29
while (true) {
処理;
if ( !(条件式) ) break;
}
IntroductiontoProgramming
withJavaScript for文
? for (初期化処理; 継続条件; ステップ処理) { 処理; }
- 次と等価 (処理にcontinueを含まない場合)
30
初期化処理;
while (継続条件) {
処理;
ステップ処理;
}
1. 初期化処理を行う
2. 継続条件が偽なら終了
3. 処理を行う
break が実行された場合は処理を中断し, 終了
continue が実行された場合は処理を中断し, 4 に移る
4. ステップ処理を行う
5. 2に戻る
IntroductiontoProgramming
withJavaScript for文
? たいてい, 次の形で使われる
- i を 0 から n-1 までまわす (各i に対する処理を行う)
- i によらない処理を n回 実行することもある
31
for (let i = 0; i < n; ++i) {
処理;
}
IntroductiontoProgramming
withJavaScript for文
? 例(3の倍数を順に10個出力)
32
for (let i = 1; i <= 10; ++i) {
console.log(3*i);
}
main.js
IntroductiontoProgramming
withJavaScript for文
? 例(九九)
33
for (let i = 1; i <= 9; ++i) {
for (let j = 1; j <= 9; ++j) {
console.log(`${i} × ${j} = ${i*j}`);
}
}
main.js
IntroductiontoProgramming
withJavaScript 配列
? 複数のデータを扱えるもの
34
let ary = [1, 1, 4, 5, 1, 4];
console.log(ary[0]); // 1
console.log(ary[1]); // 1
console.log(ary[2]); // 4
console.log(ary[3]); // 5
console.log(ary[4]); // 1
console.log(ary[5]); // 4
console.log(ary); // [1, 1, 4, 5, 1, 4]
main.js
IntroductiontoProgramming
withJavaScript 配列
? 値の読み出し(参照)
? 値の書き換え(代入)
? 要素数
35
let ary = [1, 1];
ary[1] = 5;
console.log(ary.length); // 2
console.log(ary); // [1, 5]
ary[2] = 10;
console.log(ary.length); // 3
console.log(ary); // [1, 5, 10]
main.js
ary[i]
ary[i] = hoge
ary.length
IntroductiontoProgramming
withJavaScript 配列とfor
? 例
36
// 配列の各要素の和を計算する
let calcSum = (ary) => {
let res = 0;
for (let i = 0; i < ary.length; ++i) {
res += ary[i];
}
return res;
};
main.js
> calcSum([10, 20, 3])
33
> calcSum([])
0
例の動作例
IntroductiontoProgramming
withJavaScript どうでも良い話
for (let i = 0; i < ary.length; ++i)
vs
for (let i = 0; i < ary.length; i++)
37
? ++i の方が昔は高速だった
? i++ って書く人が多いらしい。なんでや。
? i++) の方が shiftキー をカチャカチャしなくて済むからか!?
? 私は ++i って書く老害
? hoge += fuga の感覚で 変数名書いてから ++ 書きたいのかな
IntroductiontoProgramming
withJavaScript 演習
? 配列の中の最小値を求める関数 minElement を作ってみよう
- ??? ?????????? = ??? => …
- 例) minElement([10, 50, 30, 8, 9]) → 8
38
演習
IntroductiontoProgramming
withJavaScript 演習
? 配列の中の最小値を求める関数 minElement を作ってみよう
39
演習
let minElement = (ary) => {
let res = ary[0];
for (let i = 1; i < ary.length; ++i) {
res = Math.min(res, ary[i]);
}
return res;
};
main.js
40
3. CSS
IntroductiontoProgramming
withJavaScript セレクタの基礎
? .クラス名 { … } と書いてきましたが .クラス名 以外にも
指定の仕方(セレクタ)はいくつかあります
- idで指定する
?#id { … }
- タグで指定する
?tag { … }
41
index.html
<div class="class1">A</div>
<div id="id1">B</div>
<div>C</div>
style.css
div { border: 3px solid black; }
.class1 { background-color: red; }
#id1 { background-color: green; }
IntroductiontoProgramming
withJavaScript セレクタの基礎
? セレクタ1 > セレクタ2
- セレクタ1の子でセレクタ2にマッチするもの
- 子とはその要素の直下の要素
42
index.html
style.css
.class1 > div {
border: 10px solid red;
}
<div class="class1">
<div>
<div>a</div>
<div>b</div>
</div>
<div>c</div>
</div>
IntroductiontoProgramming
withJavaScript セレクタの基礎
? セレクタ1 > セレクタ2
- セレクタ1の子でセレクタ2にマッチするもの
- 子とはその要素の直下の要素
43
index.html
style.css
.class1 > div > div {
border: 10px solid red;
}
<div class="class1">
<div>
<div>a</div>
<div>b</div>
</div>
<div>c</div>
</div>
IntroductiontoProgramming
withJavaScript セレクタの基礎
? セレクタ1 セレクタ2
- セレクタ1の子孫でセレクタ2にマッチするもの
- 子孫とは 子 または 子孫の子 (子, 子の子, 子の子の子, …)
44
index.html
style.css
.class1 div {
border: 10px solid red;
}
<div class="class1">
<div>
<div>a</div>
<div>b</div>
</div>
<div>c</div>
</div>
IntroductiontoProgramming
withJavaScript セレクタの基礎
? idやclass名で更なる条件を設定して絞り込む
45
index.html
style.css
.select > div {
width: 40px; height: 20px;
border: 1px solid black;
margin: 10px;
}
.select > div.selected {
background-color: rgb(200, 220, 255);
}
<div class="select">
<div>elem1</div>
<div class="selected">elem2</div>
<div>elem3</div>
<div>elem4</div>
</div>
IntroductiontoProgramming
withJavaScript セレクタの基礎
? セレクタ1 + セレクタ2
- 直後の兄弟
46
index.html
style.css
div {
width: 40px; height: 20px;
border: 1px solid black;
margin: 10px;
}
div + div {
background-color: rgb(255, 200, 200);
}
<div>elem1</div>
<div>elem2</div>
<p>ほげ</p>
<div>elem3</div>
<div>elem4</div>
<div>elem5</div>
IntroductiontoProgramming
withJavaScript セレクタの基礎
? セレクタ1 ~ セレクタ2
- それ以降の兄弟
47
index.html
style.css
div {
width: 40px; height: 20px;
border: 1px solid black;
margin: 10px;
}
div ~ div {
background-color: rgb(255, 200, 200);
}
<div>elem1</div>
<div>elem2</div>
<p>ほげ</p>
<div>elem3</div>
<div>elem4</div>
<div>elem5</div>
IntroductiontoProgramming
withJavaScript セレクタの基礎
? セレクタ1 ~ セレクタ2
- それ以降の兄弟
48
index.html
style.css
h1 ~ h1 {
margin-top: 50px;
}
<h1>見出し1</h1>
<p>内容1</p>
<h1>見出し2</h1>
<p>内容2</p>
<h1>見出し3</h1>
<p>内容3</p>
<h1>見出し4</h1>
<p>内容4</p>
<h1>見出し5</h1>
<p>内容5</p>
IntroductiontoProgramming
withJavaScript セレクタの基礎
? まとめ
- #id, .className, tagName
- セレクタ1 セレクタ2
?子孫
- セレクタ1 > セレクタ2
?子(直下)
- セレクタ1 + セレクタ2
?直後の兄弟
- セレクタ1 ~ セレクタ2
?それ以降の兄弟
- セレクタ.className, セレクタ#id
?更なる絞り込み
49
IntroductiontoProgramming
withJavaScript ボックス
? ブロックボックス
- 要素の直後に改行が入ります
- width, height, margin, padding の指定ができます
- 横幅を指定しなければ親要素の100%となります
50
https://nulab-inc.com/ja/blog/nulab/css-
basics-for-engineer-boxmodel/
IntroductiontoProgramming
withJavaScript ボックス
? インラインボックス
- 文章の一部のようにふるまい, 横に並びます
- width, height の指定ができません
- margin は左右方向にしか指定できません
- padding は期待通りに動きません
51
https://nulab-inc.com/ja/blog/nulab/css-
basics-for-engineer-boxmodel/
IntroductiontoProgramming
withJavaScript ボックス
? 指定
- CSS の display プロパティで指定でき,
inline または block と指定します
52
IntroductiontoProgramming
withJavaScript ボックス
? span タグは display の初期値が inline です
? div タグは display の初期値が block です
53
index.html
<span class="class1">A</span>
<span class="class1">B</span>
<span class="class1">C</span>
style.css
.class1 {
background-color: green;
border: 1px solid red;
}
IntroductiontoProgramming
withJavaScript ボックス
? span タグは display の初期値が inline です
? div タグは display の初期値が block です
54
index.html
<div class="class1">A</div>
<div class="class1">B</div>
<div class="class1">C</div>
style.css
.class1 {
background-color: green;
border: 1px solid red;
}
IntroductiontoProgramming
withJavaScript ボックス
? span タグは display の初期値が inline です
? div タグは display の初期値が block です
55
index.html
<div class="class1">A</div>
<div class="class1">B</div>
<div class="class1">C</div>
style.css
.class1 {
display: inline;
background-color: green;
border: 1px solid red;
}
IntroductiontoProgramming
withJavaScript ボックス
? インラインボックスとブロックボックスの違い
- 上と下がインライン, 真ん中がブロックです
- 要は, inline は単に囲むだけ, block は長方形領域を生成する
56
https://blog.codecamp.jp/block_inline
IntroductiontoProgramming
withJavaScript flexbox
? 至高のレイアウトツール flexbox ─divが横に並んでいる!?
57
<div class="flex-container">
<div>要素1</div>
<div>要素2</div>
<div>要素3</div>
</div>
index.html
.flex-container {
width: 400px;
border: 1px solid blue;
display: flex;
}
.flex-container > div {
width: 80px;
height: 100px;
border: 1px solid red;
}
style.css
IntroductiontoProgramming
withJavaScript flexbox
? 至高のレイアウトツール flexbox
- こんな感じで設定していきます
58
.flex-container {
width: 400px;
border: 1px solid blue;
display: flex;
flex-direction: column;
}
style.css
上から下に
IntroductiontoProgramming
withJavaScript flexbox
? flex-direction 向き
59
row(default) row-reverse
column column-reverse
http://coliss.com/articles/build-websites/operation/css/css3-flexbox-properties-by-scotch.html
IntroductiontoProgramming
withJavaScript flexbox
? flex-wrap 折り返し
60
nowrap(default)
http://coliss.com/articles/build-websites/operation/css/css3-flexbox-properties-by-scotch.html
wrap wrap-reverse
IntroductiontoProgramming
withJavaScript flexbox
? justify-content 主軸方向の余白の使い方
61
flex-start(default) flex-end
center
http://coliss.com/articles/build-websites/operation/css/css3-flexbox-properties-by-scotch.html
space-aroundspace-between
IntroductiontoProgramming
withJavaScript flexbox
? align-content クロス軸方向全体としての余白の使い方
62
center
http://coliss.com/articles/build-websites/operation/css/css3-flexbox-properties-by-scotch.html
flex-end
stretch(default)
flex-start
IntroductiontoProgramming
withJavaScript flexbox
? align-content クロス軸方向全体としての余白の使い方
63
space-around
http://coliss.com/articles/build-websites/operation/css/css3-flexbox-properties-by-scotch.html
space-between
IntroductiontoProgramming
withJavaScript flexbox
? align-items 各行でのクロス軸方向の余白の使い方
64
stretch(default) center
http://coliss.com/articles/build-websites/operation/css/css3-flexbox-properties-by-scotch.html
flex-start flex-end
baseline
IntroductiontoProgramming
withJavaScript 演習
? 次の表示をするものを作ってみよう
65
演習
IntroductiontoProgramming
withJavaScript 演習
66
演習
<div class="top">
<div>要素1</div>
<div>要素2</div>
<div>要素3</div>
</div>
index.html
.top {
width: 140px;
height: 300px;
border: 1px solid blue;
display: flex;
flex-direction: column;
justify-content: space-around;
align-items: center;
}
.top > div {
width: 60px;
height: 40px;
background-color: red;
color: white;
}
style.css
IntroductiontoProgramming
withJavaScript 演習(復習)
? タイトル<h2>~</h2>をクリックすると内容<div>~</div>の
表示非表示が切り替わるようにしてみよう
- index.html も適宜編集して下さい
67
<h2>タイトル</h2>
<div>内容</div>
index.html
IntroductiontoProgramming
withJavaScript 演習(復習)
? タイトル<h2>~</h2>をクリックすると内容<div>~</div>の
表示非表示が切り替わるようにしてみよう
68
<h2 id="title">タイトル</h2>
<div id="content">内容</div>
index.html
document.getElementById("title").addEventListener("click", (e) => {
document.getElementById("content").classList.toggle("hide");
});
main.js
.hide {
display: none;
}
style.css
IntroductiontoProgramming
withJavaScript 一般化しよう!
? 次の実装を考える
- showHide クラスが設定された要素の子には
h2要素 と p要素 がこの順で1つずつ並んでいる
- h2要素 がクリックされると p要素 の 表示/非表示 が反転する
- p要素 は div要素 と似ているが, "段落" の意味を持ち
デフォルトで margin を持つ
69
<div class="showHide">
<h2>見出し</h2>
<p>内容</p>
</div>
index.html
IntroductiontoProgramming
withJavaScript show / hide
? とりあえず css
70
<div class="showHide">
<h2>見出し</h2>
<p>内容</p>
</div>
index.html
.showHide > h2 {
cursor: pointer;
}
.showHide > h2:hover {
text-decoration: underline;
}
.hide {
display: none;
}
style.css
IntroductiontoProgramming
withJavaScript show / hide
? js部分
- document.getElementsByClassName(className)
?そのクラス名を持つ要素を配列で得る
- elem.querySelector(selector)
?cssのセレクタを渡すと, その要素以下で
そのセレクタにマッチする最初の要素を得る
71
<div class="showHide">
<h2>見出し</h2>
<p>内容</p>
</div>
index.html
let toggleShowHide = (e) => { ... } // show/hide 切り替え
let initShowHide = () => { // クリックイベントを設定する
let elems = document.getElementsByClassName("showHide");
for (let i = 0; i < elems.length; ++i) {
elems[i].querySelector("h2").addEventListener("click", toggleShowHide);
}
};
initShowHide();
main.js
IntroductiontoProgramming
withJavaScript show / hide
? js部分
- document.getElementsByClassName(className)
?そのクラス名を持つ要素を配列で得る
- document.getElementsByTagName(tagName)
?指定したタグ名の要素を配列で得る
- elem.querySelector(selector)
?cssのセレクタを渡すと, その要素以下で
そのセレクタにマッチする最初の要素を得る
- elem.querySelectorAll(selector)
?cssのセレクタを渡すと, その要素以下で
そのセレクタにマッチする全ての要素を配列で得る
72
IntroductiontoProgramming
withJavaScript show / hide
? js部分
- elem.parentElement
?親要素
- e.currentTarget
?そのイベントが設定された要素
73
<div class="showHide">
<h2>見出し</h2>
<p>内容</p>
</div>
index.html
let toggleShowHide = (e) => { // show/hide 切り替え
e.currentTarget.parentElement.querySelector("p").classList.toggle("hide");
};
let initShowHide = () => { // クリックイベントを設定する
let elems = document.getElementsByClassName("showHide");
for (let i = 0; i < elems.length; ++i) {
elems[i].querySelector("h2").addEventListener("click", toggleShowHide);
}
};
initShowHide();
main.js
IntroductiontoProgramming
withJavaScript show / hide
? js部分
- elem.parentElement
?親要素
- elem.children
?子要素 (配列)
- e.currentTarget
?そのイベントが設定された要素
74
IntroductiontoProgramming
withJavaScript show / hide
? 使用例
75
<div class="showHide">
<h2>見出し1</h2>
<p>内容1</p>
</div>
<div class="showHide">
<h2>見出し2</h2>
<p>内容2</p>
</div>
<div class="showHide">
<h2>見出し3</h2>
<p>内容3</p>
</div>
index.html
IntroductiontoProgramming
withJavaScript show / hide
? 使用例
- div は意味を持たない
- html要素に意味を持たせると
webページを巡回するプログラムなどが
読みやすい
- articleはそれ1つで独立したコンテンツ
その部分だけで1つのコンテンツとして
機能する
- headerはヘッダ
- sectionはそれ1つで独立したコンテンツ
にはならないが, 見出しをつけられる
1つの章や節
- 例示など詳しくは第六回以降にやります
76
<article>
<header>
<h1>見出し</h1>
</header>
<section class="showHide">
<h2>見出し1</h2>
<p>内容1</p>
</section>
<section class="showHide">
<h2>見出し2</h2>
<p>内容2</p>
</section>
<section class="showHide">
<h2>見出し3</h2>
<p>内容3</p>
</section>
</article>
index.html
IntroductiontoProgramming
withJavaScript セレクタの基礎(再掲)
? idやclass名で更なる条件を設定して絞り込む
77
index.html
style.css
.select > div {
width: 40px; height: 20px;
border: 1px solid black;
margin: 10px;
}
.select > div.selected {
background-color: rgb(200, 220, 255);
}
<div class="select">
<div>elem1</div>
<div class="selected">elem2</div>
<div>elem3</div>
<div>elem4</div>
</div>
IntroductiontoProgramming
withJavaScript 演習
? 1つだけ選択できるものを作ってみよう
- 一般化はしなくても良いです
? できた方は
- デザインしてみよう
- 一般化してみよう
- タブコントロールを作ってみよう
78
演習
<div class="select">
<div class="selected">A</div>
<div>B</div>
<div>C</div>
<div>D</div>
</div>
index.html
.select > div:hover,
.select > div.selected {
text-decoration: underline;
}
style.css
IntroductiontoProgramming
withJavaScript 演習
79
演習
let select = (e) => { // e.currentTarget を選択
let clearTargets = e.currentTarget.parentNode.children;
for (let i = 0; i < clearTargets.length; ++i) {
clearTargets[i].classList.remove("selected");
}
e.currentTarget.classList.add("selected");
};
let initSelect = () => { // select初期化
let elems = document.getElementsByClassName("select");
for (let i = 0; i < elems.length; ++i) {
let chs = elems[i].children;
for (let j = 0; j < chs.length; ++j) {
chs[j].addEventListener("click", select);
}
}
};
initSelect();
main.js
IntroductiontoProgramming
withJavaScript 演習
? ul, li
- 箇条書き
?子要素には順序がなく, 入れ替えても
意味的に変わらない
- 中身には0個以上の li のみ
?ul の直下に li 以外を置いてはいけない
80
演習
<ul class="select">
<li class="selected">A</li>
<li>B</li>
<li>C</li>
<li>D</li>
</ul>
index.html
IntroductiontoProgramming
withJavaScript 演習
? ul, li
- デフォルトだと, ドット「?」で表現
されるので, 「list-style: none」にする
- デフォルトだと, ドット「?」の分padding-left が入っているので,
padding に 0 を指定する
- これも詳しくは次回以降やります
81
演習
<ul class="select">
<li class="selected">A</li>
<li>B</li>
<li>C</li>
<li>D</li>
</ul>
index.html
.select {
list-style: none;
padding: 0;
}
style.css
82
4. ゴリラ倒す
IntroductiontoProgramming
withJavaScript ゲーム仕様
? 面倒なのでプレイしてくれ
- http://drafear.ie-t.net/js2016/gorilla/
? 攻撃すると全員攻撃してくる
? 倒した敵の攻撃力分攻撃力上昇
83
IntroductiontoProgramming
withJavaScript 素材
? ハートと剣は二次配布おkらしいので
テンプレをダウンロードしたときについてきてるはず
? なかったらこちらからー
- https://github.com/kmc-jp/js2016/
? ゴリラに替わるものは探してくれ
84
IntroductiontoProgramming
withJavaScript ディレクトリ構造
.
├── image
│ ├── enemy.png
│ ├── heart.png
│ └── sword.png
├── index.html
├── main.js
└── style.css
85
IntroductiontoProgramming
withJavaScript HTML構造
86
div
IntroductiontoProgramming
withJavaScript 背景等
87
body {
margin: 0;
background-color: #fdd;
}
style.css
bodyには元々marginがあって
邪魔なので消してしまおう
IntroductiontoProgramming
withJavaScript プレイヤー部分
88
div
<div class="player">
<div class="hp">
<img src=/slideshow/3-javascript2016/62274728/"image/heart.png" alt="hp">
<span></span>
</div>
<div class="atk">
<img src="image/sword.png" alt="atk">
<span></span>
</div>
</div>
index.html
IntroductiontoProgramming
withJavaScript プレイヤー部分
89
.player {
display: flex;
width: 100vw;
height: 40px;
justify-content: center;
background-color: #ddd;
}
.player > div {
display: flex;
align-items: center;
margin: 0 10px;
}
.player > div > img {
box-sizing: border-box;
width: 40px;
height: 40px;
padding: 5px;
}
style.css
<div class="player">
<div class="hp">
<img src=/slideshow/3-javascript2016/62274728/"image/heart.png" alt="hp">
<span></span>
</div>
<div class="atk">
<img src="image/sword.png" alt="atk">
<span></span>
</div>
</div>
index.html
IntroductiontoProgramming
withJavaScript プレイヤー部分
90
.player {
display: flex;
width: 100vw;
height: 40px;
justify-content: center;
background-color: #ddd;
}
.player > div {
display: flex;
align-items: center;
margin: 0 10px;
}
.player > div > img {
box-sizing: border-box;
width: 40px;
height: 40px;
padding: 5px;
}
style.css
<div class="player">
<div class="hp">
<img src=/slideshow/3-javascript2016/62274728/"image/heart.png" alt="hp">
<span></span>
</div>
<div class="atk">
<img src="image/sword.png" alt="atk">
<span></span>
</div>
</div>
index.html
100vw = ブラウザ横幅100%
100vh = ブラウザ縦幅100%
margin: [上下] [左右];
IntroductiontoProgramming
withJavaScript 敵部分
91
<div id="enemy" class="enemy">
<div>
<img src=/slideshow/3-javascript2016/62274728/"image/enemy.png" alt="enemy">
<div class="hp">
<img src=/slideshow/3-javascript2016/62274728/"image/heart.png" alt="hp">
<span></span>
</div>
<div class="atk">
<img src="image/sword.png" alt="atk">
<span></span>
</div>
</div>
...
</div>
index.html
IntroductiontoProgramming
withJavaScript 敵部分
92
<div id="enemy" class="enemy">
<div>
<img src=/slideshow/3-javascript2016/62274728/"image/enemy.png" alt="enemy">
<div class="hp">
<img src=/slideshow/3-javascript2016/62274728/"image/heart.png" alt="hp">
<span></span>
</div>
<div class="atk">
<img src="image/sword.png" alt="atk">
<span></span>
</div>
</div>
<div>
<img src=/slideshow/3-javascript2016/62274728/"image/enemy.png" alt="enemy">
<div class="hp">
<img src=/slideshow/3-javascript2016/62274728/"image/heart.png" alt="hp">
<span></span>
</div>
index.html
<div class="atk">
<img src="image/sword.png" alt="atk">
<span></span>
</div>
</div>
<div>
<img src=/slideshow/3-javascript2016/62274728/"image/enemy.png" alt="enemy">
<div class="hp">
<img src=/slideshow/3-javascript2016/62274728/"image/heart.png" alt="hp">
<span></span>
</div>
<div class="atk">
<img src="image/sword.png" alt="atk">
<span></span>
</div>
</div>
</div>
IntroductiontoProgramming
withJavaScript HTML構造
93
div
IntroductiontoProgramming
withJavaScript 敵部分
94
.enemy {
display: flex;
justify-content: center;
width: 100vw;
}
.enemy > div {
display: flex;
flex-direction: column;
align-items: center;
box-sizing: border-box;
width: 110px;
margin: 50px 30px;
padding: 1px;
}
style.css
.enemy > div:hover {
border: 1px solid red;
padding: 0;
cursor: pointer;
}
.enemy > div > img {
width: 100px;
height: 100px;
}
.enemy > div > div {
display: flex;
align-items: center;
justify-content: center;
}
.enemy > div > div > img {
box-sizing: border-box;
width: 30px;
height: 30px;
padding: 4px;
}
IntroductiontoProgramming
withJavaScript 死んだ敵を非表示にする部分
? !important
- 同じプロパティの指定が複数箇所で行われていた場合優先される
95
.hide {
display: none !important;
}
style.css
IntroductiontoProgramming
withJavaScript JavaScript部分
96
// プレイヤーと敵の能力値(初期値)
let player = { hp: 1000, atk: 20 };
let enemy = [
{ hp: 80, atk: 100 },
{ hp: 1000, atk: 50 },
{ hp: 50, atk: 30 },
];
main.js
IntroductiontoProgramming
withJavaScript JavaScript部分
97
// creature(player/enemy)が生きているか
let isAlive = (c) => { ... }
// プレイヤーが敵に攻撃する
let attack = (e) => {
... // プレイヤーが死んでいたら何もしない
... // プレイヤーの攻撃
... // 敵の攻撃
update(); // 画面に反映
};
// 画面に反映する
let update = () => { ... }
// 最初にする処理
let init = () => {
... // 敵をクリックしたときのイベント設定. attackをそのまま呼ぶ.
update();
};
init();
main.js
IntroductiontoProgramming
withJavaScript JavaScript部分
98
// 最初にする処理
let init = () => {
let chs = document.getElementById("enemy").children;
for (let i = 0; i < chs.length; ++i) {
enemy[i].elem = chs[i];
enemy[i].atkElem = enemy[i].elem.querySelector(".atk > span");
enemy[i].hpElem = enemy[i].elem.querySelector(".hp > span");
chs[i].addEventListener("click", attack);
chs[i].dataset.index = i;
}
player.elem = document.getElementById("player");
player.hpElem = player.elem.querySelector(".hp > span");
player.atkElem = player.elem.querySelector(".atk > span");
update();
};
main.js
IntroductiontoProgramming
withJavaScript JavaScript部分
99
// 画面に反映する
let update = () => {
// player
player.hpElem.textContent = player.hp;
player.atkElem.textContent = player.atk;
// enemy
for (let i = 0; i < enemy.length; ++i) {
if ( !isAlive(enemy[i]) ) {
enemy[i].elem.classList.add("hide");
}
else {
enemy[i].hpElem.textContent = enemy[i].hp;
enemy[i].atkElem.textContent = enemy[i].atk;
}
}
};
main.js
IntroductiontoProgramming
withJavaScript JavaScript部分
100
// プレイヤーが敵に攻撃する
let attack = (e) => {
// プレイヤーが死んでいたら何もしない
if ( !isAlive(player) ) return;
// プレイヤーの攻撃
let idx = e.currentTarget.dataset.index;
enemy[idx].hp -= player.atk;
if ( !isAlive(enemy[idx]) ) {
player.atk += enemy[idx].atk;
}
// 敵の攻撃
...
// 画面に反映
update();
};
main.js
IntroductiontoProgramming
withJavaScript JavaScript部分
101
// プレイヤーが敵に攻撃する
let attack = (e) => {
...
// 敵の攻撃
for (let i = 0; i < enemy.length; ++i) {
// 生きている敵だけ攻撃してくる
if ( isAlive(enemy[i]) ) {
player.hp -= enemy[i].atk;
}
}
// プレイヤーのhpの最小値は0
if (player.hp < 0) {
player.hp = 0;
}
// 画面に反映
update();
};
main.js
IntroductiontoProgramming
withJavaScript JavaScript部分
102
// creatureが生きているか
let isAlive = (c) => {
return c.hp > 0;
};
main.js
IntroductiontoProgramming
withJavaScript 完成!お疲れ様です!!
103
IntroductiontoProgramming
withJavaScript 今後の予定
? 5/29(日) 13:00 ~ 16:00
- 復習回
- 何かを作ろう
? 6/5(日) 13:00 ~ 16:00
- クラスを学ぶ
- 避けゲーを作る
? 6/12(日) 13:00 ~ 16:00
- JavaScriptの細かな便利関数の紹介
- CSS3による簡単なデザインの紹介
104

More Related Content

第3回 JavaScriptから始めるプログラミング2016