20210415のJavaScriptに関する記事は24件です。

Vue.js+Vuetifyでロードバイクのブランド辞典を作る② ~実装編~

はじめに この記事は「Vue.js+Vuetifyでロードバイクのブランド辞典を作る① ~Vuetify導入編~」の続きとなっております。 前回の記事では、VueプロジェクトにVuetifyを導入して、公式ドキュメントのカードコンポーネントからよさげなサンプルを見つけてくるところまでやりました。今回は、その続きからやっていきたいと思います。 先に全体のソースコードが見たいという方は、「Listコンポーネントを作成して効率よくコードを書く」の項目へ飛んでください。 カードを作る では、前回見つけたサンプル2つを組み合わせて1枚のカードを作る所から始めましょう。 左のカードからは ・EXPLOREを押すと、隠れていたテキストが表示される機能 右のカードからは ・画像にテキストを重ねるデザイン ・SAHRE、EXPLOREのボタン(今回はこれを公式サイトへのリンクにする) を採用しました。 結果、こうなりました。 見やすいように、ブランド名のところに背景色を設定しています。 template部分のソースコードはこちらになります。 自転車の画像やブランド名といった情報はscriptのdataに格納しデータバインディングしています。(今はわかりやすさのために日本語で書いています) <v-card class="mx-auto" max-width="350" > <v-img class="white--text align-end" height="200px" src=ロードバイクの画像URL > <!-- ブランド名の背景色を灰色に設定 --> <v-card-title style="background-color: rgba(125, 125, 125, 0.6); padding: 10px 20px;">{{ ブランド名 }}</v-card-title> </v-img> <v-card-subtitle class="pb-0"> {{ モデル名 }}<br> {{ 価格 }} </v-card-subtitle> <v-card-actions> <v-btn color="orange lighten-2" text > Explore </v-btn> <v-spacer></v-spacer> <v-btn icon @click="show = !show" > <v-icon>{{ show ? 'mdi-chevron-up' : 'mdi-chevron-down' }}</v-icon> </v-btn> </v-card-actions> <v-expand-transition> <div v-show="show"> <v-divider></v-divider> <v-card-text class="text--primary"> {{ ブランドの説明 }} </v-card-text> </div> </v-expand-transition> <v-card-actions> <a href=公式サイトへのリンク style="text-decoration: none;"> <v-btn color="orange" text > 公式サイトへ </v-btn> </a> </v-card-actions> </v-card> リストレンダリングで国別に描画する さて、前項でカードの見た目は完成しました。今度はこれをリストレンダリングを用いて国ごとにデータを描画していきましょう。今回は例として、アメリカに本社を置くブランドを集めた"USbikes"という配列にデータを格納していきたいと思います。 配列に格納するデータは以下の通りです。 ・国名(英語) ・国名(日本語) ・ロードバイクの画像URL ・ブランド名 ・フラグシップモデル名 ・フラグシップモデルの価格 ・ブランドの説明(公式サイトから適当に引っ張ってきました) ・公式サイトのURL ・EXPLOREが開かれているかどうかを判定するフラグ リストレンダリングするには、v-forディレクティブを使用して"bike in USbikes"の形式で要素を描画していけばいいですね。v-imgとv-btnを囲むaタグにはv-bindを用いてURLを動的に渡している点には注意してください。(ただし、今回は":"を用いた省略記法で書いています) v-rowやv-colといったVuetifyのグリッドシステムについては公式ドキュメントをご参照ください。→Vuetify公式ドキュメントGridSystem App.vue <template> <v-container> <div class="country"> <hr /> <h1>{{ this.USbikes[0].country }}</h1> <p>{{ this.USbikes[0].countryJa }}</p> </div> <v-row justify="start"> <v-col v-for="bike in USbikes" :key="bike.brand" md="4"> <v-card class="mx-auto" max-width="350"> <v-img class="white--text align-end" height="200px" :src="bike.img"> <v-card-title style=" background-color: rgba(125, 125, 125, 0.6); padding: 10px 20px; " >{{ bike.name }}</v-card-title > </v-img> <v-card-subtitle class="pb-0"> {{ bike.model }}<br /> {{ bike.price }} </v-card-subtitle> <v-card-actions> <v-btn color="orange lighten-2" text> Explore </v-btn> <v-spacer></v-spacer> <v-btn icon @click="bike.show = !bike.show"> <v-icon>{{ bike.show ? "mdi-chevron-up" : "mdi-chevron-down" }}</v-icon> </v-btn> </v-card-actions> <v-expand-transition> <div v-show="bike.show"> <v-divider></v-divider> <v-card-text class="text--primary"> {{ bike.example }} </v-card-text> </div> </v-expand-transition> <v-card-actions> <a :href="bike.url" style="text-decoration: none"> <v-btn color="orange" text> 公式サイトへ </v-btn> </a> </v-card-actions> </v-card> </v-col> </v-row> </v-container> </template> <script> export default { name: "App", data: ()=> ({ USbikes:[ { country:'USA', countryJa:'アメリカ', img: 'https://embed.widencdn.net/img/dorelrl/b3aolw3spj/2000px@1x/C21_C11251M_SuperSix_EVO_HM_LAV_PD.png', name:'cannondale', model:'SuperSix EVO Hi-MOD Disc Red eTap AXS', price:'¥1,155,000', example:'cannondaleは本社をアメリカに置くバイクブランドです。', url:'https://www.cannondale.com/ja-jp', show: false, }, { country:'USA', countryJa:'アメリカ', img:'https://s7d5.scene7.com/is/image/Specialized/?layer=0&wid=1920&hei=640&fmt=jpg&src=is{Specialized/pdp-product-bg-dark?wid=1920&hei=640}&layer=1&src=is{Specialized/90620-05_TARMAC-SL7-SW-DI2-SAGAN-COLL-DECON-GRN-YEL_HERO?wid=920&hei=600&$hybris-pdp-hero$}', name:'SPECIALIZED', model:'S-Works Tarmac SL7 - Sagan Collection', price:'¥1,507,000', example:'スペシャライズドは先進技術を駆使したサイクリング機材を提案し、トップレーサーから情熱的なホビー・サイクリストまで、ライダーの生活を向上し、革新するアメリカの自転車ブランドです。', url:'https://www.specialized.com/jp/ja', show: false, }, { country:'USA', countryJa:'アメリカ', img:'https://trek.scene7.com/is/image/TrekBicycleProducts/EmondaSLR9Disc_21_33141_A_Primary?$responsive-pjpg$&cache=on,on&wid=1920&hei=1440', name:'TREK', model:'Émonda SLR 9', price:'¥1,316,700', example:'TREKです', url:'https://www.trekbikes.com/jp/ja_JP/', show: false, } ] }) }; </script> <style scoped> /*国名の英語と日本語表記を横並びにするためにdisplay:inline-block;を指定*/ .country h1 { display: inline-block; } .country p { display: inline-block; } hr { margin: 10px 0; } </style> Listコンポーネントを作成して効率よくコードを書く 前項でアメリカブランドについては一覧を作ることが出来ました。他の国のブランドについても同様に作成していけばよいのですが、イチイチ国ごとにtemplateを書いていてはコード量が膨大になり大変です。なので、リストレンダリングを行うListコンポーネントを作成し、それを再利用して効率よくコードを書いていきましょう。イメージとしてはこんな感じです。 App.vueに国ごとに配列を作成し、そのデータを子コンポーネントであるList.vueに渡してあげます。親コンポーネントから子コンポーネントにデータを渡す方法を軽くおさらいしましょう。 1.子コンポーネントを親コンポーネントにimportする。 2.親コンポーネントのcomponents:{}に子コンポーネントを指定する。 3.子コンポーネントのタグを用意して、送りたいdataをv-bindで指定する。 4.子コンポーネントのpropsに受け取り口を作成する。 5.子コンポーネントでdataのように使用する。 です。 詳しくは公式ドキュメントをご参照ください。 そのようにして今回は、App.vueにJPbikes,TWbikes...といったように国ごとに配列を作成し、Listコンポーネントにv-bindを用いて動的にデータを渡しました。そしてListコンポーネントでそれを受け取り、thisを用いてそのデータにアクセスして描画しています。簡略化のために、下のコードではブランドの情報は省略しています。 App.vue <template> <v-app> <v-main> <div class="contents"> <List :bikes="this.JPbikes"></List> <List :bikes="this.TWbikes"></List> <List :bikes="this.USbikes"></List> <List :bikes="this.CAbikes"></List> <List :bikes="this.UKbikes"></List> <List :bikes="this.ITAbikes"></List> <List :bikes="this.FRbikes"></List> <List :bikes="this.ESbikes"></List> <List :bikes="this.BELbikes"></List> <List :bikes="this.SWbikes"></List> <List :bikes="this.GEbikes"></List> <List :bikes="this.NZbikes"></List> </div> </v-main> </v-app> </template> <script> import List from './components/List'; export default { name: 'App', components: { List, }, data: () => ({ JPbikes:[], TWbikes:[], USbikes:[], CAbikes:[], UKbikes:[], ITAbikes:[], FRbikes:[], ESbikes:[], BELbikes:[], SWbikes:[] GEbikes:[], NZbikes:[], }) }; </script> <style> .contents{ background-color: rgb(250, 250, 250); } h1{ margin-top: 50px; margin-left: 10px; font-size: 45px; font-family: 'Lucida Sans', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif } p{ font-size: 15px; margin-left: 10px; color: rgb(107, 107, 107); } </style> List.vue <template> <v-container> <hr> <div class="country"> <h1>{{ this.bikes[0].country }}</h1> <p>{{ this.bikes[0].countryJa }}</p> </div> <v-row justify="start"> <v-col v-for="bike in bikes" :key="bike.title" md="4"> <v-card class="mx-auto" max-width="350"> <v-img class="white--text align-end" height="200px" :src="bike.img"> <v-card-title style=" background-color: rgba(125, 125, 125, 0.6); padding: 10px 20px; " >{{ bike.name }}</v-card-title > </v-img> <v-card-subtitle class="pb-0"> {{ bike.model }}<br /> {{ bike.price }} </v-card-subtitle> <v-card-actions> <v-btn color="orange lighten-2" text> Explore </v-btn> <v-spacer></v-spacer> <v-btn icon @click="bike.show = !bike.show"> <v-icon>{{ bike.show ? "mdi-chevron-up" : "mdi-chevron-down" }}</v-icon> </v-btn> </v-card-actions> <v-expand-transition> <div v-show="bike.show"> <v-divider></v-divider> <v-card-text class="text--primary"> {{ bike.example }} </v-card-text> </div> </v-expand-transition> <v-card-actions> <a :href="bike.url" style="text-decoration: none"> <v-btn color="orange" text> 公式サイトへ </v-btn> </a> </v-card-actions> </v-card> </v-col> </v-row> </v-container> </template> <script> export default { name: "List", props: ["bikes"], }; </script> <style scoped> .country h1 { display: inline-block; } .country p { display: inline-block; } hr { margin: 10px 0; } </style> これでサイトは完成です。 おわりに 「Vue.js+Vuetifyでロードバイク辞典を作る」をここまで読んでいただきありがとうございました。 私もこのサイトの作成を通じて初めてVuetifyに触れたので、もし間違っている点などがございましたらコメントで指摘していただけると幸いです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Chart.js]セッション変数を用いて、ボタンクリックでグラフ種類を切り替える方法

はじめに Chart.jsを用いてグラフを作成する機会がありましたので、備忘録がてら記載します。 初投稿になるため、見苦しい部分が多々あると思います。 何卒よろしくお願いします。 使用するライブラリ Chart.js 目次 ボタンの設置 ボタンクリックによるイベント実行 セッション変数を使う理由 実際に完成したもの 参考文献 ボタンの設置 html上に切り替えに使用するボタンを配置 この際、idにグラフ種類をつけておく ※line=折れ線グラフ、bar=棒グラフ、pie=円グラフ <button id="line" onclick=tpchange(this.id) >折れ線</button> <button id="bar" onclick=tpchange(this.id) >棒</button> <button id="pie" onclick=tpchange(this.id) >円</button> ボタンクリックによるイベント実行 まず、グラフ種類の初期値を最初に決めておかないと上手く表示されません var Change_G_type = "line";//初回時のグラフ種類 そして、onClickで実行 クリックしたボタンのidをセッション変数に格納して取得。 function tpchange(clicked_id) { window.sessionStorage.setItem(['gtype'],[clicked_id]); var Change_G_type = window.sessionStorage.getItem(['gtype']); セッション変数を使う理由 実際、そのままid取ってきて変更すれば良くね?と思うかもしれませんがこれだと動的に数値とかを変えてグラフを更新する際、 毎回グラフの種類がリセットされてしまいます。 グラフを更新しないよ!って人はそのままidから取ってきても大丈夫です。 実際に完成したもの See the Pen eYgKzgm by NNNN (@NoNameNewNoise) on CodePen. 後、グラフ種類を切り替える際にキャンバスを一旦リセットしないと前のグラフが残ってチラチラ映ります。 なので種類を切り替える度にキャンバスを綺麗にしておきましょう try { myChart.destroy();//キャンバスをリセット } catch { //万が一イベント実行時にグラフが存在しなかった場合 } 質問等ございましたら気軽にどうぞ 参考文献 Chart.js · Chart.js 日本語ドキュメント
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

復習 Javascript きほんの 「き」 初心者 変数編  1

変数の宣言と代入 // 変数hpを定義 var hp; // 変数hpに値を代入 hp = 200; // 変数mpを定義し値に代入 var mp = 80; // HPとMPを表示 document.write('<p>現在のHPは' + hp + '現在のMPは' + mp + '</p>'); Javascriptの変数は、利用する前に  宣言  をする必要があります。 var のうしろは 半角スペース 変数の名前を書いていく ↓ //変数hpを定義 var hp; 【varの宣言して何できるの?】 A ・変数を定義できる ・変数はデータを入れるような箱のような物で、宣言はこの箱を作ってあげるイメージです。 ========================================================== //変数hpに値を代入 hp = 200; ↑hpって箱に200という値を入れてます。 「=」イコール・・・算数なら等しいって意味だけど        プログラムだと右にある値を、左に書かれた名前の変数に入れる って意味になる。   ここまでのまとめ //変数hpを定義 ↓ var hp; //変数hpに値を代入 ↓ hp = 200; ========================================================== さらに! 変数の宣言と代入は同時に行うことも可能 それがこれ ↓ //変数mpを定義し値を代入 var mp = 80; 変数 「mp」 はvar宣言と 「80」 という値の代入を同時に行っています
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

js domから要素を取得して、必要な値のみ取得する

複数のradioボタンから情報を抜き出し、どこが選択されているかを調べる処理を行う。 radioボタンから、必要なvalueのみを取得する。 この時3パターンできることに気がつき書いてみた。 1はforeachで回す 2はfilterで取得する 3はfor of で回す A<input id="text1" name="sample" type="radio" value="https://media/1"> B<input id="text2" name="sample" type="radio" value="https://media/2"> C<input id="text3" name="sample" type="radio" value="https://media/3"> <input id="btn" type="button" value="test" onClick="link()"> let sample = function(){ let link_ids = document.getElementsByName('sample'); //#sample1 link_ids.forEach(element => { if (element.checked == true){ location.href = element.value //radioボタンが選択されているurlに飛ぶ } }); //#sample2 let array_ids = Array.from(link_ids) let data = array_ids.filter(link => link.checked == true) for (let i of data){ if (i.checked){ location.href = i.value } } //#sample3 for (let i of link_ids){ if(i.checked){ location.href = i.value } } radioボタンの要素を取得すればnodelistとして取得できる。 link_idsは[object NodeList]として扱われる。 その時、foreachで回すことが可能 filterを使う際にはArrayに一度変換しなければならないようです。 filterは配列限定みたいですね。 for ofであれば、nodelistも回すことができるようです。 filterのみ、純正なarray(配列)しか回せないことが判明し勉強になりました。。。 //豆知識 let toString = Object.prototype.toString; console.log(toString.call(link_ids)) //valueの型を調べてくれる link_idsは"[object NodeList]" //配列は"[object Array]" let ele = Array.from(link_ids) //配列に変換 objectがNodelistの場合にも可能 参考資料: nodelist foreach https://developer.mozilla.org/ja/docs/Web/API/NodeList/forEach filter https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter 型確認 https://techacademy.jp/magazine/35968 配列に変換 https://lab.syncer.jp/Web/JavaScript/Snippet/53/
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

TypeScript まとめ2(ユーティリティ型)

TypeScriptまとめ集 型について ユーティリティ型 モジュール化(未作成) インストール〜コンパイル方法(未作成) 目次 ユーティリティ型とは? ユーティリティ型早見表 ユーティリティ型サンプルコード 1.ユーティリティ型とは? 既存の型を元にした新規型を手軽に生成できる。 2.ユーティリティ型早見表 書き方 変換結果 Partial<T> 任意型に変換 Readonly<T> 読み取り専用に変換 Required<T> 必須型に変換 Record<K,T> 指定の型を持つプロパティ群を生成 Pick<T,K> 既存の型から特定のプロパティだけを抽出 Omit<T,K> Pickと同じ Exclude<T,U> 既存の型から特定の型を除外 Extract<T,U> Excludeと同じ NonNullable<T> null|undefinedを除外 Parameters<T> 関数型の引数を元にタプル型を生成 ReturnType<T> 関数型の戻り値型を生成 ConstructorParameters<T> コンストラクターの引数型を元にタプル型を生成 ThisType<T> 関数の中で使用されるthisの型を指定 ThisParameterType<T> 関数型のthis引数の型を抽出 OmitThisParameter<T> 関数型のthis引数の型を除外した型 Uppercase<Stringtype> 大文字に変換 Lowercase<Stringtype> 小文字に変換 Capitalize<Stringtype> 1文字目を大文字に変換 Uncapitalize<Stringtype> 1文字目を小文字に変換 3.ユーティリティ型サンプルコード Partial<T> 型Tのプロパティを任意型(省略可能)に変換 typescript() //インターフェイスを定義 interface sample{ name: string, age: number } //sampleの全プロパティを任意型(~?)に変換 type sampleOp = Partial<sample>; //これと同義 interface sampleOp { name?: string, age?: number } Readonly<T> 型Tのプロパティを読み取り専用に変換 typescript(Readonly) //インターフェイスを定義 interface sample{ name: string, age: number } //sampleの全プロパティを読み取り専用に変換 type sampleOp = Readonly<sample>; //これと同義 interface sampleOp { readonly name: string, readonly age: number } Required<T> 型Tのプロパティを必須プロパティに変換する typescript(Required) //インターフェイスを定義 interface sample{ name: string, age: number } //sampleの全プロパティを必須プロパティに変換 type sampleOp = Required<sample>; Record<K,T> 型Kのプロパティ名で、型は型Tのプロパティ群を生成する。 typescript(Record) //インターフェイスを定義 interface sample{ name: string, age: number } //{'AAA':sample, 'BBB':sample}のプロパティを持つ型を生成 type sampleOp = Record<'AAA'|'BBB', sample>; //これと同義 interface sampleOp { AAA: sample BBB: sample } Pick<T,K> / Omit<T,K> 型Tから型Kを抽出する typescript(Pick,Omit) //インターフェイスを定義 interface sample{ name: string, age: number } //sampleのnameプロパティだけを抽出 type sampleOp = Pick<sample, 'name'>; //これと同義 interface sampleOp { name: string } Exclude<T,U> / Extract<T,U> 型Tから型Uを除外する typescript(Exclude,Extract) //インターフェイスを定義 interface sample{ name: string, age: number } //sampleのnameプロパティを除外 type sampleOp = Extract<sample, 'name'>; //これと同義 interface sampleOp { age: number } NonNullable<T> 型Tからnull | undefinedの方を持つプロパティを除外する typescript(NonNullable) //インターフェイスを定義 interface sample{ name: string, nul: null, unde: undefined } //sampleのnull|undefinedの型を持つプロパティを除外 type sampleOp = NonNullable<sample>; //これと同義 interface sampleOp { name: string, } Parameters<T> / ReturnType<T> / ConstructorParameters<T> 与えられた関数型の引数を元にタプル型を生成する 。 ReturnTypeは関数型の戻り値型をタプル型として返す。 ConstructorParametersはコンストラクターの引数型を元にタプル型として返す。 typescript(Parameters,ReturnType,ConstructorParameters) //引数付きの関数を定義 function sample(name:string, age:number){ ... } //sampleの引数を元にタプル型を生成 type sampleOp = Parameters<typeof sample>; ThisType<T>, ThisParameterType<T>, OmitThisParameter<T> ThisTypeは関数の中で使用されるthisの型をTに指定できる。(-noImplicitThisを設定する必要あり) ThisParameterTypeは関数型Tのthis引数の型を抽出した型を生成する。(--strictFunctionTypesを設定する必要あり) OmitThisParameterは関数型Tのthis引数の型を取り除いた型を生成する。(--strictFunctionTypesを設定する必要あり) typescript(ThisType,ThisParameterType,OmitThisParameter) //ThisType interface A { name: string; } interface B { hello(): void; } //thisの型を指定する const obj: B & ThisType<A> = { hello() { console.log(`Hello, ${this.name}`); }, }; //ThisParameterType function sample(this: number) { return this.toString() } type TypeA = ThisParameterType<typeof sample> //number //OmitThisParameter function sample(this: number) { return this.toString() } type TypeA = OmitThisParameter<typeof sample> //string Uppercase<StringType> / Lowercase<StringType> TypeScript 4.1で追加。 Uppercaseは全てstring型のプロパティのプロパティ名を大文字にする。 Lowercaseは全てstring型のプロパティのプロパティ名を小文字にする。 typescript(Uppercase,Lowercase) //Uppercase //sampleを大文字に変換 type sample = Uppercase<'sample'>; //これと同義 type sample = 'SAMPLE'; //Lowercase //sampleを小文字に変換 type sample = Lowercase<'SAMPLE'>; //これと同義 type sample = 'sample'; Capitalize<StringType> / Uncapitalize<StringType> TypeScript 4.1で追加。 Capitalizeは全てstring型のプロパティのプロパティ名の1文字目を大文字にする。 Uncapitalizeは全てstring型のプロパティのプロパティ名の1文字目を小文字にする。 typescript(Capitalize,Uncapitalize) //Capitalize //sampleの1文字目を大文字に変換 type sample = Capitalize<'sample'>; //これと同義 type sample = 'Sample'; //Uncapitalize //sampleの1文字目を小文字に変換 type sample = Uncapitalize<'Sample'>; //これと同義 type sample = 'sample';
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

超感覚C3講座 hackコミュニティー 初めてのWEB

超感覚C3講座 hackコミュニティー 初めてのWEB  超感覚C3講座ということで今回はhtml、CSS、JavaScriptを用いてWEBページを書いていきます。講座の時間が限られているのでこちらが用意したファイルにコードを加えるもしくは変更する形で進めていきます。また、この講座で扱う内容はHTML、CSS、JavaScriptを用いてWEB制作のほんの一部です。ですので、この講座をきっかけに興味を持ってくれた人はこの記事に貼られているリンクやgoogle等で各自調べてみてください。 WEBとは Webとは、インターネット上で標準的に用いられている文書の公開・閲覧システム。文字や図表、画像、動画などを組み合わせた文書を配布することができます。文書内の要素に別の文書を指し示す参照情報(ハイパーリンク)を埋め込むことができる「ハイパーテキスト」(hypertext)と呼ばれるシステムの一種です。 引用元:Web(ウェブ)とは - IT用語辞典 e-Words  WEBサイトを、WEBサーバーが提供し、WEBクライアントが提供されたものを表示し、利用可能にしてくれているおかげで、私たちはWEBサイトを利用することができています。ちなみに、あなたが今この記事を見ているPCがWEBクライアントです。  また、WEBサイトはバックエンドとフロントエンドで構成されています。バックエンドはWEBサーバー側でデータの処理等を行う部分であり、フロントエンドはWEBクライアント側で表示やサーバーとのやり取りを行う部分です。バックエンドの開発言語はJava、JavaScript、PHP、Python、Rubyといったプログラム言語であり、フロントエンドの開発言語は主にHTML、CSS、JavaScriptです。 今回はWEBサイトのフロントエンドを触っていきます。 開発環境 Windows10: 最新版 git: 最新版 VSCode: 最新版 事前準備 vscodeをインストール。 gitをインストール。 作業用のフォルダーの作成。 *作成場所や名前は自由 本編 必要なものを用意する github.comにアクセスし、ログインします。 今回、用いるリポジトリがシモのGitHubにあるので、リンクにアクセスします。 画面の右上にForkボタンがあるので、それを押します。すると、あなたのGitHubアカウントが出るのでそれを選択します。これであなたのGitHubに今回使うリポジトリが複製されました。リポジトリはフォルダーをイメージしてもらえればいいと思います。 次に、コマンド プロンプトを開きます。開き方の例:タスクバーの検索ボックスに「コマンド プロンプト」と入力し、Enterを押します。 cdコマンドを使い、事前準備で作成した作業用フォルダーに移動します。 先ほどForkしたリポジトリをローカルにcloneします。簡単に言うと今回使う資料をあなたのPCのローカル環境に複製します。今、自分が作業用フォルダーにいることを確認し、以下のコマンドを実行します。$ git clone https://github.com/あなたのGitHubのユーザーネーム/tyoukankakuC3-2021-hack.git  初めてgit cloneコマンドを使った際におそらくログイン要求が出ると思うので自分のGitHubアカウントでログインしてください。 次に以下のコマンドで先ほどクローンしたリポジトリをvscodeで開きます。$ code tyoukankakuC3-2021-hack コードを書いていくぅぅぅううううううう!!!の前に今回WEBページを書くのに必要なことを説明します。 HTML編 コードを書く前に基礎知識(一部)の説明を行います。 ・HTML(HyperText Markup Language)とは WEBページ内の各要素の意味や構造の定義を行うマークアップ言語です。 ・基礎知識の説明 HTMLではタグと呼ばれる< >で囲まれた言葉を使って、書いていきます。 では、index.htmlの中身を見ながら説明します。 最初の行に<html lang="ja">とあるが、これは<html>タグであり、このタグで囲まれた範囲がhtmlであることを宣言しています。書き方は以下です。 <html lang="ja"> <!--htmlのコード--> <head> ... </head> <body> ... </body> </html> <html lang="ja">のlang="ja"はこのWEBページの言語が主に日本語であることを示しています。 ちなみに、<!--htmlのコード-->はコメントであり、コードとしては認識されず、表示されないものである。使い方としては書いているコードの説明などに使います。書き方は<!--と-->でテキストを囲みます。 次に、2行目にある<head>タグについて説明します。 <head>タグはWEBページには表示されないがWEBページに必要な情報を入れておくのに使います。WEBページのタイトルや説明、言語、著作者、ファビコン、読み込むスタイルファイルなどの情報を記述します。 <head>タグも<html>タグと同じようにタグで挟み使います。 繰り返しになりますが基本的にタグは文字やコードを挟んで使います。 次に、12行目にある<body>タグはWEBページの本文であることを宣言することに使われます。WEBページの本文とは実際にWEBブラウザーに表示される部分のことです。 ここまでで説明したタグを用いた以下がhtmlファイルの基本構造になります。 <html lang="ja"> <!--htmlのコード--> <head> ... </head> <body> ... </body> </html> では、この基本構造の本文にあたる<body>タグの間に書く際に使うタグについて今回使う5つを紹介します。 1. <div>タグについて  <div>タグはそれ自体に意味はなく、囲んだ範囲をひとかたまりのブロック要素として扱います。 イメージとしては外骨格や枠を想像してもらえればいいと思います。 以下の図の色枠で囲まれた範囲がブロック要素で画面の構成を作っていきます。 2. <h1>~<h6>タグについて  <h1>~<h6>タグは見出しを付けるのに使います。ちなみにhはheadingのことです。 数字は1が最上位で6が最下位を表し、ブラウザーでのサイズが変化し、太文字になり、前後に改行が入ります。 3. <li>タグについて  <li>タグはリストの項目を記述するのに使います。 4. <script>タグについて  <script>タグはJavaScriptコードをhtmlコードの中に埋め込むのに使われます。 5. <img>タグについて  <img>タグは画像を表示するのに使うタグです。画像のURLはsrc属性の値として指定します。以下のように記述します。このタグは基本的なタグの使い方と異なり、タグで囲む必要はありません。 <img src="画像URL" alt="イラスト1"> alt属性は画像が表示されない際に代わりに表示するテキストを指定します。 これで説明は終わりです! ・実践 では、さっそく書いていきましょう!!! ここではindex.htmlを編集します。 #編集したWEBページを確認する方法について HTMLファイルをブラウザーにドラッグアンドドロップすると確認できます。 HTML等のファイルを変更し、確認する際はリロードすると変更が反映されます。F5を押すとリロードされます。 1.<h1>タグを使う ・ ・ ・ <!--自己紹介シート--> <div class="self-sheet"> <!--タイトル--> <div class="title"> <!--ここ--> <!--タイトル--> </div> <!--自分の基本情報--> <div class="self-inf"> ・ ・ ・ コードの中のタイトルと書かれたところに自己紹介シートのタイトルを記入します。先ほど説明したタグの<h1>タグを使います。ほかの人と相談しながらやってみよう! コメントは消してもいいです。 出来ましたか? 答え合わせ、解説はその場で行います。 これでタイトルが表示されるようになりました。 2.<img>タグを使う ・ ・ ・ <!--自分の基本情報--> <div class="self-inf"> <!--画像の埋め込み--> <div class="image-tile"> <!--ここ--> <!--画像の埋め込み--> </div> <!--テキスト情報--> <div class="intro1"> <!--ここ--> <!--自己紹介--> </div> </div> ・ ・ ・ コードの画像の埋め込みと書かれたところに自分のdiscordアイコンの画像を埋め込みます。先ほど説明したタグの<img>タグを使って埋め込んでみましょう!! ファイルの置く場所やURLの書き方をほかの人と相談しつつ、考えてください。 出来ましたか? 答え合わせ、解説はその場で行います。 これで画像を埋め込むことが出来ました。 3.<li>タグを使う ・ ・ ・ <!--自分の基本情報--> <div class="self-inf"> <!--画像の埋め込み--> <div class="image-tile"> <!--ここ--> <!--画像の埋め込み--> </div> <!--テキスト情報--> <div class="intro1"> <!--ここ--> <!--自己紹介--> </div> </div> ・ ・ ・ コードの自己紹介と書かれたところにあなたの情報を箇条書きします。先ほど説明したタグの<li>タグを使って自己紹介を書いてみよう!! 自己紹介の項目例を以下に示します。 名前:(必須) アカウント名:(必須) 出身: 所属: 好きな食べ物: 趣味: 好きな歌手:   ・   ・   ・ 必須項目以外は自由に! 文字の大きさ等はこのあとCSSで変更できるので、分量等は気にせず書いていいよ!! 出来ましたか? 答え合わせ、解説はその場で行います。 これで箇条書きで自己紹介を書くことが出来ました。 ・慣れていこう!! <!--1コ目の趣味・好きなことについて--> <div class="hobby1"> <!--テキスト情報--> <div class="intro2"> <!--ここ--> <!--趣味、好きなことの詳細--> </div> <!--画像の埋め込み--> <div class="image-tile"> <!--ここ--> <!--画像の指定--> </div> </div>  趣味、好きなことの詳細には自己紹介同様に箇条書きで趣味や好きなことの詳細を書こう。  画像の指定には趣味や好きなことに関連する画像を自己紹介同様に埋め込もう。 <!--2コ目の趣味・好きなことについて--> <div class="hobby2"> <!--好きな動画の埋め込み--> <div class="image-tile"> <!--ここ--> <!--動画の埋め込み--> </div> <!--テキスト情報--> <div class="intro3"> <!--ここ--> <!--好きな動画の詳細--> </div> </div>  動画の埋め込みには好きなyoutyubuの動画を埋め込んでみよう!埋め込み方は以下の手順でURLをコピーし、貼り付けます。コピーした内容は変更せず、そのまま貼り付けます。 これでYouTubuの動画を埋め込むことが出来ました。 ここで、この動画埋め込みに対してのCSSを付与するためにclass="video"を追加します。  詳細のところには箇条書き(<li>タグを使って)で動画の詳細等自由に書いてください。 これで、HTMLで書くところは終わりました。 次はCSSについてです! CSS編 では、CSSの基礎知識の説明をしていきます。 ・CSS(Cascading Style Sheets)とは WEBページのスタイリングを行うためのプログラミング言語です。文章をスタイリングする技術をスタイルシートを呼び、CSSはスタイルシートの一つとしてHTMLと一緒に用いられ、WEBページのスタイリングで一般的に使われています。例えば、色やサイズ、レイアウトなどのレイアウトに関することや出力などのスタイルも指定することが出来ます。 ・基礎知識(一部)について では、基礎知識の一部をindex.cssを見ながら説明します。 CSSはHTMLを装飾する役割があります。装飾する際にどの部分を装飾するのかをしてしなければなりません。そこで、CSSには装飾を適用する対象を指定するセレクタがいくつかあります。今回はその中でよく使う2つのセレクタを説明します。 要素型セレクタ  要素型セレクタはHTMLのタグ名(要素名)を指定する方法です。使い方を以下に示します。 body { margin: 0; padding: 0; /*↓ここ*/ background-color: rgb(226, 226, 226); }  index.cssの最初に書かれているのが要素型セレクタを使った指定方法を使った書き方です。要素名としてbodyを指定し、HTMLタグの<body>タグを指定しています。{ }で挟まれているものに関してはあとで説明します。 classセレクタ .self-sheet { margin: 5px auto; width: 1000px; height: 1390px; /*↓ここ*/ background-color: #fff; overflow: hidden; }  classセレクタはHTMLの属性としてclassを定義し、そのクラス名を用いてcssの付与を行います。 index.htmlの中にclass = "self-sheet"と定義しているHTMLタグがあるので、index.cssでセレクタ名として.self-sheetが指定されています。 ちなみに、HTMLタグにクラスを追加するには<body class = "class-dayo">というように記述します。 では、実際に手を動かしましょう。 body { margin: 0; padding: 0; /*↓ここ*/ }  /*↓ここ*/の部分にバックグラウンド色を指定するプロパティーと値を書きます。 プロパティーとしてbackground-colorを使い、値として#fffを指定します。書き方は以下のように書きます。 プロパティー名: 値; では、書いてみてください 出来ましたか? 多分できたと思うので、つづいていってみよう! .self-sheet { margin: 5px auto; width: 1000px; height: 1390px; overflow: hidden; /*↓ここ*/ } さっきと同じようにbackground-colorを使って背景色を指定します。 .intro1, .intro2, .intro3 { list-style-type: none; width: 50%; height: 100%; /*↓ここ*/ } font-size: 20px;を書いてみよう!これでフォントサイズが指定できます。 .spinner { width: 500px; height: 500px; margin: calc(50vh - 250px) auto; background-repeat: no-repeat; border-radius: 100%; animation: sk-scaleout 1.0s infinite ease-in-out; /*↓ここ*/ } background-image: url(C3logo.png);でローディングの際の画像を指定できます。C3logo.pngの部分を自分のアイコンに変えることもできます。後でやってみてください。 次にbackground-size: 500px;で、先ほどの画像の大きさを指定できます。 これで、cssの説明を終わります。 JavaScript編 JavaScriptはプログラミング言語のひとつです。 今回はコードの詳細を省きます。簡単に説明するとページがローディングされると一定の間、指定したCSSがローディング用のHTMLタグに付与されます。 window.onload = function() { const spinner = document.getElementById('loading'); // タイムアウト時間の指定 setTimeout(addCss, 0, spinner); } function addCss(spinner) { // Add .loaded to .loading spinner.classList.add('loaded'); } ここではindex.jsファイルの中のタイムアウト時間の指定の部分が0になっているので、そこを好きな時間に変更してください。この値はローディング時間を指定します。 これで今回作る自己紹介WEBページができました。 ここまでの変更を、GitHubに上げることでデプロイ(公開)することが出来ます。では、最後にデプロイする作業をしましょう。 以下のコマンドをコマンドプロンプトで実行してください。 git add index.html index.css index.js git commit -m '[add] 完成版' git push origin HEAD デプロイしたページは今回使った自分のGitHubのリポジトリページの右側にEnvironmentsがあるので、その下のgithub-pagesをクリックし、一番上のView deploymentをクリックすると見れます。 最後に、ページのリンクをhackコミュニティーのテキストチャンネルに張ってください。 以上で「超感覚C3講座 hackコミュニティー 初めてのWEB」を終了します。 今日やったことはほんのごく一部ですので、気になったことややりたいことがあるのならぜひ調べてみてください。もちろん、先輩に聞いてくれてかまいません。 参考ページ ページを参考としていくつか候補を挙げておきます。もっと知りたい方は以下のリンクを参考にしてみてもいいかもしれません。 Web(ウェブ)の意味とは。語源や歴史などを簡単に説明します Web(ウェブ)とは - IT用語辞典 e-Words Webの仕組みとWebサーバの構造:ApacheによるWebサーバ構築(2)(1/2 ページ) - @IT HTMLクイックリファレンス 【CSS】displayの使い方を総まとめ!inlineやblockの違いは? 今さら聞けない!CSSとは【初心者向け】現役Webデザイナーが解説 ウェブ開発を学ぶ | MDN サル先生のGit入門〜バージョン管理を使いこなそう〜【プロジェクト管理ツールBacklog】 【GitHub超初心者入門】この前初めてGitHubを使い始めたエンジニア見習いが書くGitHubの使い方と実践~とりあえず一緒に動かしてみようぜ!~ - Qiita 講座後にチャレンジしてみるといいかもと思ったこと 講座時間中に、もうすでにWEB触ったことがあるから余裕!!な人やさっさと終わってしまった人は講座内容を終わらせたうえで、以下のこともやってみて やる際には講座内容以外のものがたくさん出てくるので各自調べながらやってみてください! やりたいことがあったら、方法を調べる。分からないことやエラーがあったら、調べる。これを習慣づけて行うことで、確実に実力が付くので、面倒やけど調べることやってみてください!!!!!!もちろん、人に聞くことも大事なので、同回生でも上回生でもいいので聞いてください!!!!! では、チャレンジ頑張ってね!!!!!!!!! 背景色を好きな色にい変更する。 文字の色を指定する。 <head>タグの中身を変更する。 アイコン画像をクリックすると自分のGitHubのページに飛ぶようにする。 ページのフォントをフォントファイルを使って変更する。 ローディングアニメーションを自分の好きなものに変更する。 ホバーアニメーションなど、何かアニメーションを追加する。 ファビコンを変更する。 ページ全体のレイアウトを変更する。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Promise を返す window.open()

非同期に window.open して Promise を返す関数を作りました。 日本語がめちゃくちゃですが、伝わりますかね……? async function openNewWindowAsync(urlOrForm) { const windowName = + new Date(); const subWindowRef = window.open('_blank', windowName); if (urlOrForm instanceof HTMLFormElement){ urlOrForm.target = windowName; urlOrForm.submit(); }else{ window.open(urlOrForm, windowName); } return new Promise(resolve => { function _loadCheck() { if (subWindowRef.document.readyState == "complete") { return resolve(subWindowRef); } setTimeout(_loadCheck, 1000); } setTimeout(_loadCheck, 1000); }); }; 別タブにページを開いて、開いた先で何かする URLを渡すと、別ウィンドウ(タブ)に開いて Promise を返し、ロードが終わった感じになったら開いた先の Window オブジェクトで解決します。 当然ですが、同一オリジン前提です。(開くだけならできますが) openNewWindowAsync('http://example.com/').then(w=>w.alert('元ページからこんにちは。')) 別タブでフォームを送信して、開いた先で何かする たとえば、https://www.google.com/ にキーワードを入れたのちに実行すると、別タブで検索結果を表示して、ロードが終わった感じになったら、そこで何かをすることができないこともないです。 openNewWindowAsync(document.querySelector('form')).then(w=>w.alert('検索は終わりましたか?')) なお 当たり前ですがポップアップブロックにばっちり引っかかります。 自分用のブックマークレットとかユーザースクリプトとか、そういうの向け?みたいな? Firefox87とChrome89でしか確認していません。      
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

なぜTypeScriptが流行っているのか?

どんな人が使っている?  JavaScript使える勢が多く使っている JSユーザーから見たメリット 高度なオートコンプリート リファクタリングしやすい 大規模なプロジェクトに向いている 型があると安全・安心 学習コストが低い 時代にあっている 「型を厳密に扱う」言語に対する関心が高まっている Vue,ReactなどがTSサポートしだしている いろんなエディターも対応している Microsoft製なのでVSCodeで補完が強力 Nullable
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

復習 Javascript 初心者

作成したプログラムの hp と mp が変数です。 表示した感じ
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

復習 Javascript 初心者

変数ってどんなもの? A・データを入れる箱のような物。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ShangriLa Anime APIを使ってみた

はじめに ShangriLa Anime APIを使ってみたので簡単な使い方と紹介をしたいと思います。 僕がJavaScriptを学習中にAPIを使ってみたいなと思い、どうせなら自分の好きなアニメ関係のAPIがないかと探していたら見つけました。 あくまで簡単な説明なので詳しい情報はこちらの本家様のgitで確認いただけたらと思います。 使用しているもの JavaScript ShangriLa Anime API ShangriLa Anime APIとは 簡潔に言えばアニメの情報が受け取れるAPIです。 2014年から現在までの放送しているアニメのデータを年号別、季節別に指定して受け取ることができます。 受け取れるデータ アニメのタイトル アニメ公式URL Twitterアカウント   等々 他にもいろいろなデータが受け取れるので様々な使い道がありそうです。 データ形式 [ { "id": 1, "title": アニメタイトル1} { "id": 2, "title": アニメタイトル2} { "id": 3, "title": アニメタイトル3} . . . ] 使用例 2021年のアニメデータを受け取ってみる //変数apiUrlに入れてるのがapiデータを受け取るURLになります const apiUrl = "http://api.moemoe.tokyo/anime/v1/master/2021"; fetch(apiUrl) .then(response => { return response.json(); }) .then(data => { console.log(data); }) これで2021年のアニメデータが受け取れます 2020年のデータが欲しければURLの最後の2021のところを2020に変えてあげるだけで受け取れます。 2021年の冬アニメのデータを受け取ってみる const apiUrl = "http://api.moemoe.tokyo/anime/v1/master/2021/1"; fetch(apiUrl) .then(response => { return response.json(); }) .then(data => { console.log(data); }) 指定してあげるURLの最後に /1 を入れてあげるだけですね。 冬 春 夏 秋 1 2 3 4 この表に書いてある通りの番号と季節が対応しています。 春にしたかったら 2 夏がよかったら 3 を入れてあげると受け取れます。 ちなみに、当たり前なのかもしれませんが 2021年のデータを受け取る時は const apiUrl = "http://api.moemoe.tokyo/anime/v1/master/2021/"; にすると取得できません const apiUrl = "http://api.moemoe.tokyo/anime/v1/master/2021"; / をちゃんと消して上げないと取得できないので、僕と同じ勉強途中というかたはお気をつけて 僕はこのAPIを使ったアプリを作っているときにこれに苦しめられた模様、、、 buttonを使って受け取るデータを変えたい時とかね。 2021年冬アニメのタイトル情報を受け取ってみる 上の二つは全てのデータを受け取っていましたが、最後にタイトルデータだけを受け取ってみます。 const apiUrl = "http://api.moemoe.tokyo/anime/v1/master/2021/1"; fetch(apiUrl) .then(response => { return response.json(); }) .then(data => { //[]の中には受け取りたい配列の番号 console.log(data[].title); }) 受け取っていたdataの後ろに.titleとしてあげるとタイトルデータを受け取れます。 配列の番号を指定してあげないとタイトルデータだけを受け取ることはできないので、全てのタイトルデータを受け取りたい時はfor文とかを使って受け取る必要があります。 他にも受け取れるデータに書いたアニメの公式ホームページやらTwitterやらのデータも受け取ることができます。 季節まで指定してあげないと title しか受け取れないみたいなので公式ホームページURLとかのデータを受け取りたい人は季節まで指定してあげてください。 最後に 初心者の方や勉強中の方でもなるべくわかりやすいように書いたつもりですので,apiを使ってみたいなと思ってる方はぜひ使ってみてください。 特にアニメが好きな人は使ってて楽しいと思いますよ〜。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

JavaScriptでの複数キー入力受付

はじめに ブラウザ上で動くゲームを作りたい!という時に必要になる、複数キー入力受け付けコードサンプルです。備忘録として載せておきます。 コード controllerを連想配列として用意しているのはキーの同時押し等に柔軟に対応するためです。 controller.js const controller = {}; const showController = () => { const elem = document.getElementById("debug-controller"); let controllerStr = ""; Object.keys(controller).forEach(key => { controllerStr += `${key}:${controller[key]} \n`; }); elem.innerText = controllerStr } document.addEventListener('keydown', (event) => { console.log(`keydown:${event.code}`); controller[event.code] = true; showController(); }); document.addEventListener('keyup', (event) => { console.log(`keyup:${event.code}`); controller[event.code] = false; showController(); }); controller.html <!DOCTYPE html> <html> <head> <title>アクションゲーム-controller-</title> <script src="/static/js/controller.js"></script> </head> <body> <h1>キーの状態が表示されます</h1> <div id="debug-controller"></div> </body> </html> 実際に動かしたサンプルサイトはこちら 後はsetInterval等でフレームごとにcontrollerを参照すればゲームを作ることができると思います。 解説 document.addEventListener()でキー入力の受け付けを行っています。("keydown"がキーが押された時、"keyup"がキーから指が離れたときになります) 追記(2021/04/15) コメントでevent.keyよりもevent.codeを使ったほうが良いとのご指摘を受け、該当部分を修正しました、ありがとうございます!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

promise 与 await 的互换

Rewriting promise code with async/await Let's look back at a simple fetch example that we saw in the previous article: fetch('coffee.jpg') .then(response => { if (!response.ok) { throw new Error(HTTP error! status: ${response.status}); } return response.blob(); }) .then(myBlob => { let objectURL = URL.createObjectURL(myBlob); let image = document.createElement('img'); image.src = objectURL; document.body.appendChild(image); }) .catch(e => { console.log('There has been a problem with your fetch operation: ' + e.message); }); By now, you should have a reasonable understanding of promises and how they work, but let's convert this to use async/await to see how much simpler it makes things: async function myFetch() { let response = await fetch('coffee.jpg'); if (!response.ok) { throw new Error(HTTP error! status: ${response.status}); } let myBlob = await response.blob(); let objectURL = URL.createObjectURL(myBlob); let image = document.createElement('img'); image.src = objectURL; document.body.appendChild(image); } } myFetch() .catch(e => { console.log('There has been a problem with your fetch operation: ' + e.message); }); It makes code much simpler and easier to understand — no more .then() blocks everywhere!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Next.jsでかるーく画面実装する pt.3

初めに 前回の記事からの続きです。 対応する内容は以下です。 コンポーネントにpropsを渡す 簡単な画面遷移 APIから値を取得してなんか表示する 最後にAPIから値を取得してなんか表示してみます 画面実装 過去に実装した画面を使い回し・・・。 外部からデータを取得する 今回使用させていただくAPIは、アクセスするだけで犬の画像urlがランダムで返ってくるというAPIです https://dog.ceo/api/breeds/image/random サーバー側からデータを取得する方法に関しましてはいくつかあるようですが、 今回はgetServerSidePropsという方法を使います。 詳しくはこちらを参照ください。 前回の画面で実装した[name].jsの中にgetServerSidePropsを追加して記述します [name].js import { useRouter } from "next/router"; import styles from "../../styles/Home.module.css"; const Name = ({ img }) => { console.log(img); // {message: "https://images.dog.ceo/breeds/malinois/n02105162_5983.jpg", status: "success"} const router = useRouter(); return ( <div> <h1 className={styles.link}>{router.query.name}のPageです</h1> {/* 取得したurlを絶対パスとして指定 */} <img src={img.message} /> </div> ); }; export default Name; // getServerSidePropsの中でfetchを利用してデータの取得を行う。 export async function getServerSideProps() { const res = await fetch(`https://dog.ceo/api/breeds/image/random`); const img = await res.json(); return { props: { img } }; } propsとしてもらったimgをconsoleに出力した結果はどうなっているでしょう? messageとstatusというプロパティが返ってきているはずです。 画面遷移して確認 http://localhost:3000/ からtanakaに画面遷移して画像が表示されるか確認します。 正常にデータを取得できていればこのように画像が表示されるはずです! 最後に 細かい説明をところどころで端折っているのが申し訳ないですがNext.jsで簡単な実装をしてみました。 今後また上手なやり方など見つけた際は新たに投稿したいと思います! 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

JSの全貌

今回は、Javascriptの概念を深ぼってみたのでまとめていきます!! 1) JS ①ブラウザ内 1.ブラウザに表示された画面に動きを与えることができます。 2.ザーバーと通信を行い、情報の送受信を行うことができます。  例えば、郵便番号を入力すると住所をサーバーから受信してフォームに表示する(お問い合わせフォーム)、他人が送信したチャット情報を自分の画面に表示させる事ができる(インスタグラム、フェイスブック)、検索フォームに入力した単語に関連するキーワード候補を(Google検索、ヤフー検索)表示させることができます。 ②ブラウザの外 1.React(スマホアプリ用のフレームワーク)を使うと、スマホアプリを作ることができます。 2.Node.js(サーバーサイド言語)を使うと、サーバーで動くアプリケーションを作ることができます。 3.Google Apps Script(GAS)これは、Googleが独自に開発した言語ですが、これを使うことでGoogleが提供するサービス(Googleスプレッドシート)などを効率化することができます。 Jqueryとの違い  ここで、Jqueryとの違いについて説明します。 結論から言うと、JqueryはJSのライブラリーになります。つまり、JavaScriptを簡単に書くことができるということです。なので、前提条件として、JSがないと存在することができないということです。記述方法も似ているので、気になった人は調べてみてください。 初心者に向いていると言われています。 それでは、本題のJSのできることについてです。 結論から言うと、できないことあるのかな?ってくらいにたくさんあります。 *制御とは、自由勝手に振る舞わせない、支配する。機械装置などの望む通りの運転状態にすることです。 HTML制御 別の文字に変更、新しい文字に変更、すでにある文字の削除などを行います。 CSS制御 CSSで表示されていた文字の変更などを行います。 フォーム制御 1.選択したボタンによって表示内容を変える 2.入力された内容を制御する  単価×数量=〇〇円とか 3.入力フォーム内容チェック  フォームに入力された値をリアルタイムに読み込む。 4.入力文字数のカウント アニメーション制御 1.表示・非表示の切り替え 2.フェードイン・フェードアウトの切り替え 3.サイズの拡大・縮小 4.画像の回転 5.移動 写真制御 1.サムネ写真の切り替え(楽天、アマゾンの商品の切り替えとか) 2.スライド 3.ヘッターを表示 その他 1.スクロール制限 2.ヘッターを上部に固定する JS自体ができること 1) 現在時刻の取得,ポップアップウィンドウの表示,フォームに入力させた値をもとにメッセに返す 2)非同期通信  Ajaxを使用して行います。  通常、HTTP通信を同期通信と言います。HTTP通信の場合、リクエストを出してから、レスポンスを受け取るまで処理を実行することはできません。しかし、Ajaxを使うことで、リクエストを出してから、レスポンスを受け取るまでに処理を完了することができます。 メリットは、以下のようになります。 ・操作性の向上 ・パフォーマンスの向上(ページの一部のみの更新)  逆にデメリットに関しては以下のようになります。 ・クロスブラウザ処理の発生(異なるドメインへのアクセス) ・サーバー負担 ・コードの量の増加 Ajaxの構成要素については後ほど。 3)ユーザーの動きに応じて表示内容を変えることができます 4)Node.jsを使うことでサーバーサイドからOSの機能にアクセスすることができるため、ネットワークシステムをJSでかくことができます。 Ajaxの構成要素  ・XMLHttpRequesut ・javascript ・DOM ・JSON(XML) DOM ドキュメントをものとして扱うものです。 ツリー構造をしています。 WEbページとJSをつなぐ役割をしています。 例えば、IDからノードを取得して操作します。 今回の内容は以下のサイトを参考にしていただくとわかりやすいかと思います。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Next.jsでかるーく画面実装する pt.2

初めに 前回の記事からの続きです。 対応する内容は以下です。 コンポーネントにpropsを渡す 簡単な画面遷移 APIから値を取得してなんか表示する 簡単な画面実装をこの記事で対応します (1記事に全て書くと自分自身が見辛いのです笑) 画面実装 こちらで実装した画面を使い回します 必要なファイルの作成 pages配下にAbout.jsを作成します(pages下のindex.jsからここに画面遷移させる予定です) 簡素なもので大丈夫です About.js import styles from "../styles/Home.module.css"; const AboutScreen = () => { return <p className={styles.link}>AboutのPage</p>; }; export default AboutScreen; CSSはご自由に調整してください Home.module.css .header { display: flex; flex-direction: column; align-items: center; border-bottom: 1px solid; } .link { display: block; text-align: center; color: red; margin: 50px; font-size: 50px; } 静的に画面遷移させる 最初の画面から、Aboutのページに遷移させる処理を記述します! index.js // Linkをimport import Link from "next/link"; import { Header } from "../components/"; import styles from "../styles/Home.module.css"; const Home = () => { return ( <div> <Header title="Next.js" /> {/* Linkのhrefを指定するだけでOK */} <Link href="/About"> <a className={styles.link}>Aboutのページに遷移</a> </Link> </div> ); }; export default Home; Linkコンポーネントをimportし、その中にhrefの形で遷移先を記述するだけでOKです。 React単体だとライブラリを入れたり独自の法則に従って記述が必要ですがこれなら画面遷移が楽ですね! 動的に画面遷移させる 先ほどは静的に画面に遷移させる方法を書きました。 次はダイナミックルーティングという手法を使って動的に遷移先を切り替えます pages配下にusersというディレクトリを作成し、その中に[name].jsを作成しましょう [name].jsの中身は以下のようにします userRouterの意味や使い方はこちらを参照ください。(丸投げで申し訳ないです) [name].js import { useRouter } from "next/router"; import styles from "../../styles/Home.module.css"; const Name = () => { const router = useRouter(); return ( <div> <h1 className={styles.link}>{router.query.name}のPageです</h1> </div> ); }; export default Name; index.jsで適当な配列を作成し、そこから[name].jsに遷移させ、 かつ動的にページの内容を変化させます [name].js import Link from "next/link"; import { Header } from "../components/"; import styles from "../styles/Home.module.css"; const Home = () => { // 適当な配列を作成 const users = [ { id: 1, name: "tanaka" }, { id: 2, name: "yamada" }, { id: 3, name: "watanabe" }, ]; return ( <div> <Header title="Next.js" /> <Link href="/About"> <a className={styles.link}>Aboutのページに遷移</a> </Link> {/* 配列の中身をmapし、urlに含まれる文字列を動的に変更 */} {users.map((user) => { return ( <li className={styles.link} key={user.id}> <Link as={`/users/${user.name}`} href="/users/[name]"> <a>{user.name}</a> </Link> </li> ); })} </div> ); }; export default Home; そしたらこんな画面になりました Aboutに画面遷移してみます http://localhost:3000/About というurlになっているはずです 次にtanaka([name].js)に遷移してみます http://localhost:3000/users/tanaka というurlに遷移できましたでしょうか? こんな感じでNext.jsを使うとページの動的な変更を簡単に実装できます? 駆け足になりましたが次はAPIを取得して何かを表示するところをやってみます!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Vue.jsのCLI利用

Vue.jsでの開発を学んでいるので、その時の過程をまとめておきます。 Nodeとnpmの導入を済ませた状態から記述しています。 VueCLIのインストール 下記のコマンドでVue.jsの開発ツール@vue/cliのインストールを行います。 % npm install -g @vue/cli 次のコマンドでバージョンの確認を行います。 % vue --version @vue/cli 4.5.12 新規のプロジェクト % vue create my-project ? Your connection to the default yarn registry seems to be slow. Use https://registry.npm.taobao.org for faster installation? (Y/n) 今回はnで継続。 ? Please pick a preset: (Use arrow keys) ❯ Default ([Vue 2] babel, eslint) Default (Vue 3 Preview) ([Vue 3] babel, eslint) Manually select features 「Default ([Vue 2] babel, eslint) 」を選択したままEnter。 ? Please pick a preset: Default ([Vue 2] babel, eslint) ? Pick the package manager to use when installing dependencies: (Use arrow keys) ❯ Use Yarn Use NPM 今回はyarnを使うのでそのまま継続。 $ cd my-first-vue-app $ yarn serve 上記の2つを実行して、ローカル環境の - Local: http://localhost:8080/ にアクセスできて、Welcome to Your Vue.js Appが表示されると環境構築完了です。 ありがとうございました。 参考 https://it-web-life.com/vue_environment_setup/ https://qiita.com/C_HERO/items/318fe65871f8e53e8c80
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Next.jsでかるーく画面実装する pt.1

初めに 最近になってようやくNext.jsを触り始めたのですが、まだまだ未熟のためメモ書き程度の実装をしていきます。 対応しようとすることは以下です。 コンポーネントにpropsを渡す 簡単な画面遷移 APIから値を取得してなんか表示する コンポーネントにpropsを渡すところまでをこの記事で対応します (長くなると僕自身が見辛いので笑) SSRとかに関してはこちらを参考にさせていただきました ビルドする コマンドを叩いてビルドします。 npx create-next-app 任意のプロジェクト名 yarn dev 環境構築の仕方はこちらを参考にさせていただきました こんな感じの画面が出てきますね コンポーネントを作る componentsディレクトリを作成して、中にHeader.jsとindex.jsを作成します Header.jsの中身はtitleというpropsを受け取る前提で記述していきます(まだ何ももらってません) Header.js import React from "react"; import styles from "../styles/Home.module.css"; const Header = ({ title }) => { return ( <div className={styles.header}> <h1>Hello {title}</h1> </div> ); }; export default Header; CSSはよしなに調整。こんな感じにしました Home.module.css .header { display: flex; flex-direction: column; align-items: center; border-bottom: 1px solid; } index.jsでexportしましょう (コンポーネントが増えた時用にindex.js内でexportします) index.js import Header from "./Header"; export { Header }; 画面を確認 ここまでで作ったHeader.jsをpages配下のindex.jsで表示してみたいと思います。 Headerコンポーネントのpropsとしてtitleを渡します index.js import { Header } from "../components/"; const Home = () => { return ( <div> <Header title="Next.js" /> </div> ); }; export default Home; そしたらこんな感じに表示されました。 propsも正しく表示されているっぽいですね。 次は簡単な画面遷移を実装していきます それでは次の記事でお会いしましょう 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[記事紹介] 正規表現クロスワードを遺伝的アルゴリズムで解こうとしてあきらめた話

@qualitia_cdevの中の一人、@hirachanさんが書いた記事がおもしろいのでみなさまにご紹介します。 正規表現クロスワードを遺伝的アルゴリズムで解こうとしてあきらめた話
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[一人暮らしの男性に向けて]非同期処理とは?

はじめに 非同期処理について再確認するために記事をまとめました。 結構馴れ馴れしい感じの説明になっておりますが、ご愛嬌ということで、お許しください。 非同期処理とは? 一般的な説明 通常のプログラムって実行すると、コードを上から順に1行ずつ実行していきますよね。重いfunctionだったり、sleep(5000);とかだったら待たないと処理が終わることができません。非同期で処理をした方が効率が良い時があっても同期で処理がされていきます。それを解決してくれる処理が非同期処理です。 非同期処理は、文字通り非同期に処理ができます。例えば、10秒かかるfunctionがあったとしてそのレスポンスを待っている間に違うfunction処理を実行することができます。 レンチンが基本の一人暮らしの男性の自炊に例えると 「セブンイレブンのレンチンでできるホルモン焼き丼・豚汁」という献立だとします。 まず一番時間がかかるのは炊飯する白米ですよね。40分ぐらいかかるので、一番最初に処理を開始いたします。その間、豚汁を作ります。人参きったり、豚肉きったり...味付けしたり。 で、豚汁作業中に白米が終わりセブンのレンチンホルモンをレンジに入れます。豚汁終了とタイミングにホルモンを白米の上にのせ丼が完成、豚汁をよそい食卓に並べれば完成。 わざわざ炊飯中になにもやらないでじっと待つことはないですよね... コードに例えると 律儀に炊飯中はじっと待つタイプの方のコード console.log("start"); function chouri(name ,milliSeconds) { var startTime = new Date().getTime(); while (new Date().getTime() < startTime + milliSeconds); console.log(name + "終了"); } chouri('炊飯', 2400); // 白米を炊飯するのに40分かかる chouri('豚汁', 1200); // 豚汁を作るのに20分かかる chouri('レンチンホルモン', 120); // レンチンホルモンに2分かかる console.log("end"); これは通常通り、上から下に実行されます。 ログは以下の通りです。 start // 40分後 炊飯終了 // 20分後 豚汁終了 // 2分後 レンチンホルモン終了 end 全ての調理が終わるのに、1時間2分かかります。 今度は効率の良い調理コード console.log("start"); function suihan() { return new Promise(resolve => { setTimeout(() => { console.log('炊飯終了'); }, 2400); }); } function tonjiru() { return new Promise(resolve => { setTimeout(() => { console.log('豚汁終了'); }, 1200); }); } function horumon() { return new Promise(resolve => { setTimeout(() => { console.log("レンチンホルモン終了") }, 120); }); } async function chouri() { await Promise.all([suihan(), tonjiru(), horumon()]); } console.log("start"); chouri() console.log("end"); こちらのコードは同タイミングで処理がされていきます ログは以下の通りです。 start end // 2分後 レンチンホルモン終了 // 20分後 豚汁終了 // 40分後 炊飯終了 これを処理すると、40分で調理が終わります。 ただ、注意としてはレンチンホルモンは冷めてます。 まとめ 手際の良い主婦の調理フローをコードに落とし込むのは至難の技ということにしましょう。 これが非同期処理です。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Javascript 備忘録8<モジュール>

■モジュールについて →モジュールには2種類存在する →ESMとCJS ■ESMとCJSの比較 →ESMはimport/exportを使用 →CJSはrequire/exportsを使用 ■EMでモジュールを使用する moduleA.js export let hello = 'hello'; export function helloFn() { console.log('hello') } moduleB.js // 別のモジュールからimportする import { hello, helloFn } from './moduleA.js'; // 下のように as を使用して別の変数名にすることが可能 import { hello as ya, helloFn as fn }from './moduleA.js'; // 変数と関数が使用できるようになる console.log(hello); helloFn();
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Javascript 備忘録7<非同期処理>

■同期処理と非同期処理 →同期処理とは、1スレッドの中で上から下へとソースコードが実行されること →同期処理では一つの処理が終了するまで、他の処理は行われない →非同期処理は、メインスレッドから外れて別の処理を裏で実行する →完了後、再度メインスレッドに戻ってくる →非同期処理を裏で行っている際に、メインでは別の処理を行うことができる ■非同期処理について →非同期処理はタスクキューにファーストイン・ファーストアウトの形で処理される →コールスタック(メインスレッド)に処理が残っている間は、タスクキューに積まれた処理は実行されない →コールスタックが空になると、やっとタスクキューの処理が実行されれる ■Promiseについて(ES6以降) function sleep(callback, val) { setTimeout(function() { console.log(val++); callback(val); }, 1000) } sleep(function(val) { sleep(function(val) { console.log('callback done') }, val) }, 0) →sleepを何回も呼び出すことで、非同期処理のチェーンを作成することができる →しかし、今は2回で住んでいるが100回となるとソースが助長的になり、ネストも深くなってしまう →その際にPromiseを使用する // promiseの構文 new Promise(function() { }).then(function(data) { // 非同期処理 }).catch(function(data) { // 非同期処理 }).finally(function(){ // 非同期処理 });
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

IntersectionObserverを使ってフローティングボタンをエリアごとに変更する

スクロールをして特定の要素エリアに入ったら フローティングボタンを変更するという実装を行いました。 IntersectionObserverを使用することで効率的に書くことができました。 もっと良い書き方もあるとは思いますが、基本的な書き方で 対応できたので紹介したいと思います。 IntersectionObserverの概要 IntersectionObserverは「基準の要素」と「監視される要素」が交差するときに callback関数を返してくれるAPIです。 基準要素に対して監視要素が見えている割合=交差と考えるとわかりやすいと思います。 実装方法 let options = { root: null, rootMargin: '50px', threshold: 1.0 }; let observer = new IntersectionObserver(callback, options); root 基準の要素。nullはviewport(ブラウザ画面) rootMargin 基準要素となるrootにこのrootMarginの値を足して基準の要素にできる。 上記の例だとroot要素の周囲に50px拡大していることになる。 正の値、負の値を設定でき負の値を設定した場合、基準要素を値分縮める。 注意点としてpxや%といった単位が必ず必要。 rootMargin: "50px 0"のようには設定できずrootMargin:"50px 0px"とする。 threshold コールバックを実行する交差の閾値。 交差の閾値を0~1の間で指定する。 フローティングボタンをエリアごとに変更する HTML <div class="wrapper"> <div class="box box1" data-id="A"></div> <div class="box box2" data-id="B"></div> <div class="box box3" data-id="C"></div> <div class="box box4" data-id="D"></div> <div class="box box5" data-id="E"></div> <div class="float_button"> <a href="#" id="A" class="page-top is-show">A</a> <a href="#" id="B" class="page-top">B</a> <a href="#" id="C" class="page-top">C</a> <a href="#" id="D" class="page-top">D</a> <a href="#" id="E" class="page-top">E</a> </div> </div> box1 ~ box5にスクロールしてboxごとにフローティングボタンを変更させるようにしました。 スクロールに応じて変更するフローティングボタンはfloat_buttonの中に入れています。 box1ならid="A"のボタン、box2ならid="B"のボタンが表示されます。 JavaScript let options = { root: null, rootMargin: "-85% 0px -15px 0px", threshold: 0 } let observer = new IntersectionObserver(callback, options); // 監視するboxを取得 let boxes = document.querySelectorAll(".box"); // それぞれのboxを監視する boxes.forEach(box => { observer.observe(box); }); 基準となるroot要素はビューポートつまりブラウザ画面全体を設定。 rootMarginは上下の設定をしています。 下へスクロールするときは次の要素が15%見えたらフローティングボタンを変更、 上へスクロールするときは上の要素が85%見えてからフローティングボタンを変更するため上記のような値に設定しています。 ちなみにrootMargin: "-50% 0px"とすると要素の中心にきたときに切り替わるようにできます。 閾値のthresholdはすぐに切り替えるように0に設定しています。 function callback(entries) { entries.forEach(entry => { // 監視要素が閾値を超えるとtrueになる if (entry.isIntersecting) { isShowFloatButton(entry.target); } }); } // フローティングボタンを全て取得 let buttons = document.querySelectorAll(".page-top"); // フローティングボタン表示 function isShowFloatButton(target) { // targetには「box」の処理 const targetId = target.dataset.id; switch (targetId) { case "A": hiddenButton(); document.getElementById("A").classList.add("is-show"); break; case "B": hiddenButton(); document.getElementById("B").classList.add("is-show"); break; case "C": hiddenButton(); document.getElementById("C").classList.add("is-show"); break; case "D": hiddenButton(); document.getElementById("D").classList.add("is-show"); break; case "E": hiddenButton(); document.getElementById("E").classList.add("is-show"); break; } } function hiddenButton() { buttons.forEach(button => { button.classList.remove("is-show"); }); } 監視している要素のdata属性を取得し、switch文で該当するidを持つフローティングボタンのclassを付け外しすることで表示・非表示を切り替えています。 これでフローティングボタンをエリアごとに変更することができました。 コメントにて上記のコードより良い書き方を教えていただきました!ありがとうございます!!(4/15) 要素の増減によって書き換えが発生しないのでこちらのほうが断然良いですね!! 勉強になりました。ありがとうございます。 function isShowFloatButton(target) { // targetには「box」の処理 const targetId = target.dataset.id; const targetElement = document.getElementById(targetId); if(targetElement !== null) { hiddenButton(); targetElement.classList.add("is-show"); } } function hiddenButton() { buttons.forEach(button => { button.classList.remove("is-show"); }); } 最後に フローティングボタンをスクロールによって切り替えることになったときスクロールイベントでの切り替えを初めは考えていましたがIntersectionObserverを知ることができたおかげでかなり楽にコーディングをすることができました。 今回の例以外にも要素が表示されたらカルーセルを動かす、YouTubeを再生する、アニメーションを開始するなど色々な用途に使えるので今後も使っていきたいと思います。 参考 ICS.media MDN Polyfill
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【JavaScript基礎】文字列を検索するメソッド

JavaScriptにおける「文字列を検索する」メソッドについて、自己の忘備録としてまとめています。 参考URL 参考著書 文字列の検索① 〜インデックスを調べる〜 文字列がどの位置にあるかを調べたい時に使用するメソッドです。 indexOf() indexOf()メソッドは、「対象の文字列」から「検索する文字列」が最初に現れたインデックス(位置)を返します。 インデックスは0から始まり、値が見つからない場合は−1を返します。 const myStr = 'JavaScriptの基礎'; // 検索した文字が含まれる場合 const result1 = myStr.indexOf('JavaScript'); console.log(result1); // 結果:0 const result2 = myStr.indexOf('基礎'); console.log(result2); //結果:11 //検索した文字が含まれない場合 const result3 = myStr.indexOf('CSS'); console.log(result3); //結果:-1 const result4 = myStr.indexOf('j') console.log(result4); //結果:-1 => 大文字と小文字が区別されるため lastIndexOf() lastIndexOf()メソッドは、「対象の文字列」から「検索する文字列」が最後に現れたインデックス(位置)を返します。 const myStr = 'JavaScriptの基礎'; const result1 = myStr.lastIndexOf('a'); console.log(result1); //結果:3 検索開始インデックスを指定すると、指定されたインデックスから検索します。 インデックスを省略した場合は、検索開始のインデックスは0となります。 const myStr = 'JavaScriptの基礎'; const result1 = myStr.indexOf('JavaScript', 3) console.log(result1); //結果:-1 search() search()メソッドは、正規表現で一致するかどうかを調べるメソッドです。 const myStr = 'JavaScriptの基礎'; const result1 = myStr.search(/JavaScript/) console.log(result1); //結果:0 const result2 = myStr.search(/CSS/) console.log(result2); //結果:1- 文字列の検索② 〜含まれているかを調べる〜 文字列が含まれているか調べたい時や、入力フォームなどで不適切な語句が含まれていないかを調べるときに使用します。 includes() includes()メソッドは、文字列がどこかに含まれている場合にtrueとなります。 const myStr = 'JavaScriptの基礎'; const result = myStr.includes('JavaScript') console.log(result); //結果:true startsWith() startsWith()メソッドは、文字列の最初が引数と同じであるかどうかを調べます。 const myStr = 'JavaScriptの基礎'; const result1 = myStr.startsWith('JavaScript'); console.log(result1); //結果:true const result2 = myStr.startsWith('基礎'); console.log(result2); //結果:false endsWith() endsWith()メソッドは、文字列の末尾が引数と同じであるかどうかを調べます。 const myStr = 'JavaScriptの基礎'; const result1 = myStr.endsWith('JavaScript'); console.log(result1); //結果:false const result2 = myStr.endsWith('基礎'); console.log(result2); //結果:true
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む