# ググる!勉強会:JavaScript編【第2回】 本日は、ググる!勉強会にお越しくださいましてありがとうございます。 ## 本勉強会の目的 「実際にプログラミングしながら、ソフトウェア開発に必要なググり力(Google検索力)を身につけることです。」 第2回では、こういうの作ります。 https://js-page-7umggk7w6a-uc.a.run.app/ 作ったWebページは、第3回のWebページ公開編でURLからWebページを見れるようにします。 ### Webページでできる事を知る ググるためには、やりたいこと。知りたいこと。 が必要です。 Webページで出来る事がわかれば、後は、調べるだけです。 [MUUUUU.ORG](https://muuuuu.org/) [![](https://i.imgur.com/kHycg2l.png)](https://muuuuu.org/) [SANKOU! Webデザインギャラリー・参考サイト集](https://sankoudesign.com/) [![](https://i.imgur.com/hvnio91.png)](https://sankoudesign.com/) ## 技術の概要 ### 「フロントエンド」とは 検索すると分かるように、 「**フロントエンド**」と「**バックエンド**」 の2種類の用語があることがわかります。 ![](https://i.imgur.com/6Qjbpn1.png) 2つの対になる言葉(対義語)や似た用語が出た場合、 「**違い**」 と検索するとわかりやすくなります。 これは、前者の場合、1つの単語調べるため、専門的な説明が出てきますが、 後者の「**違い**」を検索すると 両者の特徴的な違いが検索結果に出ます。 ![](https://i.imgur.com/dAzZt9q.png) 下記の単語も検索してみると良いでしょう。 ``` CUI GUI 違い ``` 中級編 ``` AI 機械学習 違い ``` 上級編 ``` モノリシック マイクロサービス 違い ``` 「**フロントエンド**」は、ユーザーが見る、触れる、Webサイトの部分です。 言語:HTML、CSS、JavaScriptなど 「**バックエンド**」は、 目につかない裏側の処理を言います。 例えば、ログイン機能や決済、インフラ(サーバなど)があります。 企業によっては、「サーバーサイド」とも言います。 言語:Java、PHP、Python、SQL、**Node.js**など ## フロントエンドで使われる言語について ### HTML ![](https://i.imgur.com/htJVhgu.png) HTMLは、Webページの**文書の各部分が、 どのような役割を持っているのかを示す**(マークアップする)ための言語です。 ### CSS ![](https://i.imgur.com/v7CCvvT.png) CSSとは、HTMLに色や大きさや背景などを加えて見栄えを良くする(装飾する)ための言語です。 ### JavaScript(JS) ![](https://i.imgur.com/97oUZv9.png) JavaScript(JS)は、Webページの動的な処理を記述するためのプログラミング言語です。 例えば、 Googleフォームでユーザーが入力していないと「<span style="color:red;">この質問は必須です</span>」と出現させる。 ![](https://i.imgur.com/8iHTBdj.png) JSの強みは、Webサイトとサーバでいちいち情報を送受信しなくとも、 **Webページ上(フロントエンド)だけで処理を実行させることが出来る**ことです。 もしJS(Webページ上で動くプログラミング言語)がなく、表示を変えたい場合、、、 ![](https://i.imgur.com/hEXuet3.png) ちょっとした処理ならサーバを介さず、JSがやってくれる。 但し、複雑な処理やデータをきちんと保存する場合、サーバに情報を送る必要がある。 ![](https://i.imgur.com/ecyXepv.png) 近年は、SPA(シングルページアプリケーション)という単一ページのWebアプリもあります。 JSでHTML(正確には、DOM:後述)を操作し、更新したい部分だけをサーバに伝えることで高速で快適なWebページを作る技術です。 グリグリ回すと地図を読み込んでいますが、 Webページ全体をいちいち読み込んではありません。 [Google Map](https://www.google.co.jp/maps/?hl=ja) ## JSの文法 ### 変数とは プログラミング言語では、文字列や数値などのデータに名前を付けることが出来ます。 これを「**変数**」と言います。 ### 数式で変数を表してみる $$ y = 2x $$ プログラミング言語では、`x`に好きな名前を付けられます。 `hensu`と命名してみます。 $$ hensu = 3 $$ $$ y = 2hensu $$ $$ y = 6 $$ ### JavaScriptでの変数 JavaScriptでも、変数を宣言し、定義できます。 JavaScriptでは、「これは変数です」という宣言をするキーワードとして、 `var`、`let`、`const`の3つがあります。 使う場面によって意見が別れますが、今回は、`let` [JavaScriptで変数を使う方法【初心者向け】](https://techacademy.jp/magazine/5290) 今回は、`let`の後に**変数名**(変数の名前)を付けて変数を定義しています。 ### [**JavaScript実行環境**](https://liveweave.com/console/index.html)で実行してみる ```javascript= // 変数宣言 let suuti = 120; let mozi = "秒後に別のサイトに飛びます"; // alertでポップアップを表示 alert(suuti + mozi); ``` ### 関数とは 関数は変数や処理を一つにまとめてくれます。 #### 数式で関数を表してみる $$ f(2x) $$ 数式では、`x`に`3`を代入すると、`2 x 3 = 6`と計算できます。 プログラミング言語では、代入する値に名前を付けられます(**変数**)。 $$ hensu = 3 $$ 数式の`f`も好きな名前を付けられます。 $$ kansumei(2*hensu) = 6 $$ このように関数は処理を一つにまとめられます。 大きな処理も関数にまとめておけば、値を入れるだけで結果を得られます。 #### JavaScriptで表現する `function`で関数を使うことを宣言します。 ```javascript= function kansumei() { // この中に好きな処理を書いていく } ``` ```javascript= let x = 10; let y = 20; function kakezan(x, y) { // returnでkakezan()内に値を入れる return x + y ; } alert('求めた数値は、' + kakezan(x, y)); ``` 今回は関数に数値を入れるため、 関数の外で変数を定義し、`kakezan()`に値を代入しています。 ### switchで条件分岐 JavaScriptでは、数値や文字列を単純に比較したい場合、`switch`文を使います。 ```javascript= let 変数 = '入力値'; switch (変数){ case '入力値': 処理; break; // breakで処理はここまで!と言う。 case '入力値': 処理; break; // breakしないと次も処理実行されます。 default: // それ以外の場合、 それ以外の処理; break; } ``` 実行してみましょう ```javascript= let drink = 'オレンジジュース'; switch (drink){ case 'コーヒー': console.log('100円です。'); break; // breakで処理はここまで!と言う。 case 'オレンジジュース': console.log('120円です。'); break; // breakしないと次も処理実行されます。 default: // それ以外の場合、 console.log('すみません。品切れです。'); break; } ``` ### if...elseで条件分岐 もし、この条件の時、こういう処理を行いたい、、、場合、`if...else`文を使います <details> <summary>if...elseの説明(今回は使わないので割愛)</summary> `if`と`else`の意味は、プログラミングでも同じです。 `if`もし〜なら `else`がそれ以外 を表します。 JavaScriptでは、`if..else`文を以下のように書きます。 ```javascript= if (条件式) { 処理; } else if (条件式) { 処理; } else { 処理; } ``` 「条件式」というのが、「〜〜の条件の時」という意味を表す式になります。 | 比較演算子 | 意味 | | -------- | -------- | | A == B | AとBは、同じ | | A != B | AとBは、異なる | | A > B | Aの方が大きい | | A < B | Bのほうが大きい | | A >= B | AはBと同じもしくは大きい(AはB以上) | | A <= B | BはAと同じもしくは大きい(BはA以上) | 例えば、`60`点が合格のテストがあり、 「不合格」、「合格」を比較演算子を使い、判定を自動化してみる。 ```javascript= let tensu = 40; let goukaku = 60; // tensuは、goukaku以上? let kekka = tensu >= goukaku; console.log("合格点越えてる?:" + kekka); ``` `>=`で`tensu`は`goukaku`以上? となるので、 `tensu`が`40`の場合、 結果:`false`になります。 「以上」なので、`60`点は、`True`になります。 ### JavaScriptでif..else 条件が複数あり、比較、区別したい場合に`if...else`文を使います。 JavaScriptでは、`if...else`文は以下の書き方をします。 ```javascript= if (条件) { 処理; } else if (条件) { 処理; } else { 処理; } ``` テストの点数を自動振り分けしたい。 ![](https://i.imgur.com/ywogEiU.png) ```javascript= let score = 40; // もしsocreが60点以上ならば合格を出力 // console.logで文字を書き出します。 if (score >= 60) { console.log("合格です!おめでとう!"); } else if (score >= 50) { console.log("不合格です!おしい!"); } else { console.log("不合格です!がんばれ!"); } ``` </details> ## JSでWebページを操作する 検索キーワード ``` js webページ 操作 ``` と検索すると`DOM`という単語が出てきますが、 [https://developer.mozilla.org/ja/docs/Web/API/Document_Object_Model](https://developer.mozilla.org/ja/docs/Web/API/Document_Object_Model) このサイトを辞書のように使うと良いでしょう。 ### DOMとは DOMとは、ブラウザがHTMLを構造化し、JSなど外部からアクセスできるようにするための規格です。 ブラウザがHTMLをDOMでキレイに決まった形で構造化しているため、 JavaScriptなどのプログラミング言語でHTMLを操作できます。 ```htmlmixed= <body> <div> <h1>タイトル</h1> </div> <div> <p>適当な文章</p> <p>適当な文章</p> </div> </body> ``` ![](https://i.imgur.com/0lLwTi9.png) ブラウザ(Chromeなど)がDOMに則り、階層構造にしてくれることでJSなどのプログラミング言語でHTMLの要素を指定できるようになります。 ![](https://i.imgur.com/V7BheqD.png) JSで`div`要素を指定したい場合、 ```javascript= document.getElementsByTagName('div'); ``` :::info `document`はブラウザに読み込まれたDOM全体を表します。 ::: ## JSでWebページを書き換える Netflixという動画配信サービスがあります。 セレクトボックスを選ぶと動画が紹介されます。 画像は、入れ替わりますが、いちいちページを読み込んでいません。 このような機能を実装してみましょう。 [![Netflix](https://i.imgur.com/EOW4HhS.png)](https://drive.google.com/file/d/1Vy5LQy7sjqZ_lfoXB87APYeQkLcbGQ9N/view?usp=sharing) ## [liveweave](https://liveweave.com/)で実行する ## 前回のコード ### HTML ```htmlmixed= <!DOCTYPE html> <html> <head> <title>ググる!勉強会!</title> </head> <body> <div class="main"> <h1 class="title-class">ググる!勉強会!</h1> <p>Webページには、様々な技術が使われています。</p> <p>この勉強会では、HTML、CSS、JSなどの言語を使い、</p> <p>1からWebサイト公開までの工程を体験できます。</p> <img src="https://i.imgur.com/L11kB5t.jpg"> </div> </body> </html> ``` ### CSS ```css= .main { background-color: #303F9F; color: white; text-align: center; height: 500px; } .title-class { line-height: 100px; text-align: center; color: #303F9F; font-size: 50px; background-color: white; } p { line-height: 50px; } /* この下にコード追加 */ body { background-color: white; } /* リセットCSS。各ブラウザには、元から余白を作ってくれるので消去する */ * { margin: 0; padding: 0; } ``` ## HTMLでセレクトボックスの領域を作る ![](https://i.imgur.com/yHmskVY.png) ### HTML ```htmlmixed= <!-- セレクトボックスで要素を変える --> <div class="select-area"> <label class="label-text">あなたが学びたい事は、</label> <select class="select-box" id="select-box" onchange="select_box()"> <option value="1">HTML、CSS</option> <option value="2">JavaScript</option> <option value="3">デプロイ</option> </select> <div class="display-area"> <img id="select-img"> <div id="message_area"></div> </div> </div> ``` `div`で複数のタグをまとめられる。ー>領域を決める。 `label`で簡単に横付けできる。 `select`でセレクトボックスを作れる。 `class`、`id`で名前を付けられる。 `id`は1つしか名前を付けられないことに注意。 ### CSSで体裁を整える ```css= .select-area { text-align: center; /* HTMLを中央寄せ。rightと書くと右寄せ */ height: 500px; /* 領域の高さを設定 */ background-color: coral; /* 背景色 whiteと書くと白くなる */ } .label-text { font-size: 30px; /* 文字の大きさ */ font-weight: bold; /* 文字の太さ */ } .select-box { margin-top: 50px; /* 上の領域と隙間を空ける */ width: 20%; /* 幅 */ height: 40px; font-weight: bold; font-size: 20px; } .display-area { margin-top: 20px; font-size: 20px; } ``` ## JSでDOMを操作 ![](https://i.imgur.com/yHmskVY.png) ``` 関数 select_box 変数 img_area は、img-area 変数 select_number は、select-boxの値 変数 message は、空(なんでも投げ込める)を定義 切り替える、select_number 入力値 '1'、 img_area は、sample_1.png message は、'HTMLは、Webページの構造を作ります。CSSは、HTMLを装飾します。' 入力値 '2'、 img_area は、sample_2.png message は、'JavaScriptは、Webページに動的な処理を与えます。' 入力値 '3'の時、 img_area は、sample_3.png message は、'Webにおけるデプロイとは、Webページを実際に見れるようにする事です。' message_area に message を挿入 ``` `select_box`という関数を宣言します。 ```javascript= function select_box() { // この中に処理を書いていく } ``` `getElementById`プロパティでHTMLの`id`を指定できます。 [MDN Web docs:Document](https://developer.mozilla.org/ja/docs/Web/API/Document) には、Webページを操作できるプロパティ(設定)に関する情報が載っています。 ```javascript= let img_area = document.getElementById('img-area') let select_number = document.getElementById('select-box').value; ``` 今回は紹介しませんが、 addEventListener()でイベント処理が可能です。 Xボタンをクリックすると、メニューが閉じるのは、 addEventListener()で行われています。 ![](https://i.imgur.com/JlfYCJI.png) [【JavaScript入門】addEventListener()によるイベント処理の使い方!](https://www.sejuku.net/blog/57625) ### JS ```javascript= function select_box() { let img_area = document.getElementById('select-img') let select_number = document.getElementById('select-box').value; let message = ''; switch(select_number) { case '1': img_area.src = 'https://i.imgur.com/NyuLkeS.jpg'; message = 'HTMLは、Webページの構造を作ります。CSSは、HTMLを装飾します。'; break; case '2': img_area.src = 'https://i.imgur.com/XdxpTtV.jpg'; message = 'JavaScriptは、Webページに動的な処理を与えます。'; break; case '3': img_area.src = 'https://i.imgur.com/9jeeKuc.jpg'; message = 'Webにおけるデプロイとは、Webページを実際に見れるようにする事です。'; break; } document.getElementById('message_area').innerHTML = message; } ``` ## 全コード ### HTML ```htmlmixed= <!DOCTYPE html> <html> <head> <title>ググる!勉強会!</title> </head> <body> <div class="main"> <h1 class="title-class">ググる!勉強会!</h1> <p>Webページには、様々な技術が使われています。</p> <p>この勉強会では、HTML、CSS、JSなどの言語を使い、</p> <p>1からWebサイト公開までの工程を体験できます。</p> <img src="https://i.imgur.com/L11kB5t.jpg"> </div> <!-- セレクトボックスで要素を変える --> <div class="select-area"> <label class="label-text">あなたが学びたい事は、</label> <select class="select-box" id="select-box" onchange="select_box()"> <option value="1">HTML、CSS</option> <option value="2">JavaScript</option> <option value="3">デプロイ</option> </select> <div class="display-area"> <img id="select-img"> <div id="message_area"></div> </div> </div> </body> </html> ``` ### CSS ```css= .main { background-color: #303F9F; color: white; text-align: center; height: 500px; } .title-class { line-height: 100px; text-align: center; color: #303F9F; font-size: 50px; background-color: coral; } p { line-height: 50px; } /* この下に追加 */ .select-area { text-align: center; /* HTMLを中央寄せ。rightと書くと右寄せ */ height: 500px; /* 領域の高さを設定 */ background-color: white; /* 背景色 whiteと書くと白くなる */ } .label-text { font-size: 30px; /* 文字の大きさ */ font-weight: bold; /* 文字の太さ */ } .select-box { margin-top: 50px; /* 上の領域と隙間を空ける */ width: 20%; /* 幅 */ height: 40px; font-weight: bold; font-size: 20px; } .display-area { margin-top: 20px; font-size: 20px; } body { background-color: white; } * { margin: 0; padding: 0; } ``` ### JavaScript ```javascript= function select_box() { let img_area = document.getElementById('select-img') let select_number = document.getElementById('select-box').value; let message = ''; switch(select_number) { case '1': img_area.src = 'https://i.imgur.com/NyuLkeS.jpg'; message = 'HTMLは、Webページの構造を作ります。CSSは、HTMLを装飾します。'; break; case '2': img_area.src = 'https://i.imgur.com/XdxpTtV.jpg'; message = 'JavaScriptは、Webページに動的な処理を与えます。'; break; case '3': img_area.src = 'https://i.imgur.com/9jeeKuc.jpg'; message = 'Webにおけるデプロイとは、Webページを実際に見れるようにする事です。'; break; } document.getElementById('message_area').innerHTML = message; } ``` ## Webページに使われるライブラリ ## 「ライブラリ」とは 皆さんは、カレーを作ったことがありますか? じゃがいもやニンジンを煮込んで、カレールーを入れるだけでカレーが出来上がりますね。 何種類ものスパイスを調合する必要はありません。 ライブラリも同じです。 ライブラリを読み込み、自分の欲しい処理を決められた書き方で書いてあげるだけで、 本来は複雑かつ巨大なコードが必要な処理を簡単に実装できます。 ![](https://i.imgur.com/N6WKqml.png) 今回は時間の都合上、やりませんがライブラリの一つを紹介しています。 ![](https://i.imgur.com/ZacY7nd.jpg) 次回、第3回では、作ったWebページをURLから見れるようにします。 アプリケーションやシステムを使えるようにすることを「デプロイ」と言います。 昨今のデプロイでは、クラウドサービスを使うのがトレンドです。 お楽しみに! ## 最後にアンケートにお答えください ### [ググる!勉強会:第2回アンケート](https://forms.gle/Xky1nfDBzttoDY7Z6) 第2回は、これにて終わります。 ありがとうございました。 ## 画像スライダーを作る 現代のWebページに画像スライダーは必須です。 <details> <summary>画像スライダーを作る</summary> ### 「Swiper」を使ってみる Swiperは、画像スライダーを作るためのJSライブラリです。 首相官邸からディズニーの公式ホームページまで使われており、幅広い実績があります。 多くの人が使っているため、ググりやすく、比較的軽量な優秀なライブラリです。 ![](https://i.imgur.com/66fX0we.png)![](https://i.imgur.com/6GkV53f.png) ## 詳しい使い方は、下記のサイトを参考 [Swiper公式サイト](https://swiperjs.com/) [【実例12パターン】画像スライダーはSwiper使っておけば間違いない!実用的な使い方を紹介](https://haniwaman.com/swiper/) ### HTML #### head内にSwiperのCSSライブラリを読み込む ```htmlmixed= <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/Swiper/5.3.8/css/swiper.min.css"> ``` #### 最後のbodyの上にjsライブラリを置く ```htmlmixed= <!-- ライブラリ(Swiper)のJSを読み込み(bodyの最後) --> <script src="https://cdnjs.cloudflare.com/ajax/libs/Swiper/5.3.8/js/swiper.min.js"></script> ``` セレクトボックスの上に設置します。 ### HTML ```htmlmixed= <!-- 画像スライダー「Swiper」 セレクトボックスの上に追加 --> <div class="swiper-container"> <div class="swiper-wrapper"> <div class="swiper-slide"><img src="https://i.imgur.com/qZ7vRaT.png"></div> <div class="swiper-slide"><img src="https://i.imgur.com/2pjjBz0.png"></div> <div class="swiper-slide"><img src="https://i.imgur.com/qZ7vRaT.png"></div> </div> <div class="swiper-pagination"></div> <div class="swiper-button-prev"></div> <div class="swiper-button-next"></div> </div> ``` **CSS** ```css= .swiper-container { width: 100%; height: 400px; background-color: orange; } .swiper-slide { top: 20px; text-align: center; background-color: orange; } ``` **JS** ```javascript= var mySwiper = new Swiper ('.swiper-container', { loop: true }) ``` オプション付けてみる ```javascript= var mySwiper = new Swiper ('.swiper-container', { loop: true, autoplay: { delay: 3000, }, pagination: { el: '.swiper-pagination', type: 'bullets', clickable: true }, navigation: { nextEl: '.swiper-button-next', prevEl: '.swiper-button-prev' }, }) ``` ## jQueryで処理を書く jQueryは、JSを短く書ける事を目指したライブラリです。 数あるJSのライブラリの中でも、[最もWebページで使われているという調査](https://w3techs.com/technologies/history_overview/javascript_library/all)もあります。 デメリットとしては、 jQueryは、巨大なライブラリのため、Webページが遅くなります。 しかし、jQueryの書き方に似て、軽量なライブラリも存在するため、覚えておくと得します。 [Umbrella.js](https://ferret-plus.com/6447) [nanoJS](https://coliss.com/articles/build-websites/operation/javascript/dom-manipulation-library-nanojs.html) 短くかけます。(動きません) ```javascript= $(function(){ var box = $('select-box').value; $('#message_area').innerHTML = message; }); ``` ## 全コード **HTML** ```htmlmixed= <!DOCTYPE html> <html> <head> <title>ググる!勉強会!</title> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/Swiper/5.3.8/css/swiper.min.css"> </head> <body> <div class="main"> <h1 class="title-class">ググる!勉強会!</h1> <p>Webページには、様々な技術が使われています。</p> <p>この勉強会では、HTML、CSS、JSなどの言語を使い、</p> <p>1からWebサイト公開までの工程を体験できます。</p> <img src="https://i.imgur.com/L11kB5t.jpg"> </div> <!-- 画像スライダー「Swiper」 --> <div class="swiper-container"> <div class="swiper-wrapper"> <div class="swiper-slide"><img src="https://i.imgur.com/qZ7vRaT.png"></div> <div class="swiper-slide"><img src="https://i.imgur.com/2pjjBz0.png"></div> <div class="swiper-slide"><img src="https://i.imgur.com/qZ7vRaT.png"></div> </div> <div class="swiper-pagination"></div> <div class="swiper-button-prev"></div> <div class="swiper-button-next"></div> </div> <!-- セレクトボックスで要素を変える --> <div class="select"> <label class="label-text">あなたが学びたい事は、</label> <select class="select-box" id="select-box" onchange="select_box()"> <option value="1">HTML、CSS</option> <option value="2">JavaScript</option> <option value="3">デプロイ</option> </select> <div class="display-area"> <img src="https://i.imgur.com/qZ7vRaT.png" id="select-img"> <div id="message_area"></div> </div> </div> <!-- ライブラリ(Swiper)のJSを読み込み --> <script src="https://cdnjs.cloudflare.com/ajax/libs/Swiper/5.3.8/js/swiper.min.js"></script> </body> </html> ``` **CSS** ```css= .main { background-color: #303F9F; color: white; text-align: center; height: 500px; } .title-class { line-height: 100px; text-align: center; color: #303F9F; font-size: 50px; background-color: white; } p { line-height: 50px; } .swiper-container { width: 100%; height: 380px; background-color: orange; } .swiper-slide { top: 20px; text-align: center; background-color: orange; } .select { text-align: center; height: 500px; background-color: coral; } .label-text { font-size: 30px; font-weight: bold; } .select-box { margin-top: 50px; width: 20%; height: 40px; font-weight: bold; font-size: 20px; } .display-area { margin-top: 20px; font-size: 20px; } body { background-color: white; } * { margin: 0; padding: 0; } ``` **JS** ```javascript= var mySwiper = new Swiper ('.swiper-container', { loop: true, autoplay: { delay: 3000, },は pagination: { el: '.swiper-pagination', type: 'bullets', clickable: true }, navigation: { nextEl: '.swiper-button-next', prevEl: '.swiper-button-prev' }, }) function select_box() { var elem = document.getElementById('select-img') var box = document.getElementById('select-box').value; var message = ''; if(box === '1') { elem.src = 'https://i.imgur.com/2pjjBz0.png' message = 'HTMLは、Webページの構造を作ります。CSSは、HTMLを装飾します。'; } else if(box === '2') { elem.src = 'https://i.imgur.com/qZ7vRaT.png' message = 'JavaScriptは、Webページに動的な処理を与えます。' } else if(box ==='3') { elem.src = 'https://i.imgur.com/L11kB5t.jpg' message = 'Webにおけるデプロイとは、WebページをURLから見れるようにする事です。' } document.getElementById('message_area').innerHTML = message; } ``` </details>