目次を開く(全 6 章)
01
HTML
文書のひな形と、よく使う要素・属性です。要素は、見た目ではなく、意味で選びます。
文書のひな形
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<title>ページの題名</title>
<meta name="description" content="ページの説明">
<link rel="stylesheet" href="stylesheets/style.css">
<script src="javascripts/main.js" defer></script>
</head>
<body>
<h1>見出し</h1>
<p>本文</p>
</body>
</html>
| 書き方 | 役割 |
|---|---|
<!DOCTYPE html> | HTML の文書であることを伝える |
<html lang="ja"> | 文書全体を囲む。日本語の文書だと伝える |
<meta charset="UTF-8"> | 文字コードを伝える。文字化けを防ぐ |
<meta name="viewport" content="width=device-width"> | スマートフォンでも、画面の幅に合わせて表示する |
<link rel="stylesheet" href="…"> | CSS のファイルを読み込む |
<script src="…" defer> | JavaScript のファイルを、HTML を読み終えてから実行する |
<script type="module" src="…"> | モジュールとして読み込む。ローカルサーバーで開く |
<link rel="manifest" href="…"> | PWA のマニフェストを読み込む |
<!-- … --> | コメント。画面には表示されない |
骨組みと文章の要素
| 用途 | 要素 | ひとこと |
|---|---|---|
| ページの区画 | header・nav・main・section・article・aside・footer | main は一つのページに一つだけ |
| 見出し | h1〜h6 | 目次のように使い、段を飛ばさない |
| 段落 | p | 意味のまとまりで区切る |
| 重要・強調 | strong・em | strong は重要、em は強調 |
| 改行 | br | 住所や詩など、行の区切りに意味があるときだけ |
| 補足の小さな文字 | small | 注記や著作権の表示 |
| 順序のないリスト | ul・li | 項目の順番に意味がないとき |
| 順序のあるリスト | ol・li | 手順のように、順番に意味があるとき |
| 名前と説明の組 | dl・dt・dd | 営業時間や用語集など |
| 表 | table・caption・thead・tbody・tr・th・td | 行と列の関係があるデータ |
| リンク | a | href に行き先。文言で行き先が分かるように |
| 画像 | img | alt・width・height を付ける |
| 図と説明文 | figure・figcaption | 画像や表に説明を添える |
| 汎用のまとまり | div・span | ほかに合う要素がないときだけ |
フォームの要素
| 要素 | 役割 |
|---|---|
form | 入力欄をまとめ、送信する |
label | 入力欄の名前。for と入力欄の id を同じにして結ぶ |
input | 一行の入力欄。type で種類を選ぶ(text・email・tel・number・radio・checkbox・file・color・range など) |
textarea | 複数行の入力欄 |
select・option | 選択肢から選ぶ |
fieldset・legend | 関係する入力欄をまとめ、見出しを付ける |
button | ボタン。フォームの中では type="button" か type="submit" を書く |
output | 計算の結果を表示する |
便利な要素
| 要素 | 役割 |
|---|---|
details・summary | 押すと開く欄。JavaScript を書かずに作れる |
dialog | 確認や拡大表示に使うダイアログ。showModal() で開く |
audio | 音を鳴らす。preload で読み込み方を決める |
canvas | JavaScript の命令で絵を描く白紙。width・height は点の数 |
svg・symbol・use | アイコンを一か所に定義し、使い回す |
よく使う属性
| 属性 | 役割 |
|---|---|
class | 見た目を付けるための名前。同じ役割の要素に同じ名前を付ける |
id | ページの中で一つだけの名前。ページ内リンクや label の for で使う |
data-* | 自分用の情報や、JavaScript の目印(data-ui・data-action・data-hand など) |
hidden | 要素を隠す |
alt | 画像の代わりの文字。画像が見えない人にも内容を伝える |
loading="lazy" | 画面の外の画像を、近づいてから読み込む |
required | 入力しないと送信できない |
autofocus | 開いたときに、その要素を選んだ状態にする |
tabindex="0" | ボタンやリンクでない要素も、Tab キーで選べるようにする |
inert | 中の要素を、押すこともフォーカスすることもできなくする |
aria-label | 見た目の文字がない部品に、読み上げ用の名前を付ける |
role="img" | 一枚の絵として、読み上げソフトに伝える。aria-label で内容を書く |
aria-expanded | 開閉する部品が、今開いているか(true・false) |
aria-pressed | 切り替えのボタンが、今押されているか(true・false) |
aria-live="polite" | 中身が変わったら、読み上げソフトに伝える |
aria-hidden="true" | 飾りの要素を、読み上げの対象から外す |
aria-controls | 開閉するボタンが、どの部品を操作するか(部品の id) |
aria-labelledby | ほかの要素(見出しなど)の文字を、その部品の名前にする |
scope="col"・scope="row" | th が、列と行のどちらの見出しかを伝える |
method="dialog" | dialog の中のフォーム。ボタンを押すと、ダイアログを閉じる |
autocomplete | 名前やメールアドレスなどを、ブラウザに補ってもらう |
maxlength | 入力できる文字数の上限 |
02
CSS
よく使う CSS の書き方です。大きさや位置は、上下左右ではなく、文章の流れに沿った名前(論理プロパティ)で書いています。
書き方の基本
/* コメント */
.card {
padding: 1.5rem; /* プロパティ: 値; */
background-color: white;
h3 { font-size: 1.25rem; } /* .card の中の h3 */
&:hover { translate: 0 -4px; } /* .card 自身に、条件を足す */
}
| 書き方 | 役割 |
|---|---|
@layer reset, tokens, base, layout, components, utilities; | 層の順番を決める。後ろの層の指定ほど強い |
@layer components { … } | 指定をその層に入れる |
@import url("…") layer(reset); | ほかの CSS ファイルを、層を指定して読み込む |
:root { --accent: #c2410c; } | 色などに名前を付ける(カスタムプロパティ) |
color: var(--accent); | 名前を付けた値を使う |
入れ子の中の h3 { … } | 外側の要素の中にある h3 を選ぶ |
入れ子の中の &:hover { … } | 外側の要素自身に、条件を足す |
入れ子の中の .is-dark & { … } | 外側の要素が、.is-dark の中にあるとき |
セレクタ
| 書き方 | 選ばれるもの |
|---|---|
p | すべての p 要素 |
.card | class="card" を持つ要素 |
#price | id="price" を持つ要素 |
[data-state="open"] | 属性の値が一致する要素 |
nav a | nav の中にある a 要素(子孫) |
ul > li | ul のすぐ下の li 要素(子) |
h1, h2, h3 | どれか一つに当てはまる要素 |
* | すべての要素 |
a:hover | マウスを乗せている間 |
:focus-visible | キーボードで選ばれている間。見た目を消さない |
:checked | 選ばれているラジオボタンやチェックボックス |
:has(…) | 中に、指定したものを含む要素 |
:where(…) | 中のどれかに当てはまる要素。詳細度を 0 にする |
::before・::after | 要素の中身の前と後ろに、飾りを足す |
大きさと余白
| 書き方 | 役割 |
|---|---|
margin: 1rem; | 外側の余白(四方) |
padding: 1rem 2rem; | 内側の余白。値が二つなら上下・左右、四つなら上・右・下・左 |
margin-block: 2rem;・padding-block: 1rem; | 上下の余白 |
margin-inline: auto;・padding-inline: 1rem; | 左右の余白。margin-inline: auto で中央に寄せる |
margin-block-end: 1rem; | 下だけの外側の余白 |
box-sizing: border-box; | 幅に、内側の余白と線の太さを含める |
大きさや位置は、上下左右ではなく、文章の流れに沿った名前(論理プロパティ)で書きます。
| 論理プロパティ | 以前の書き方 | 意味(横書きのとき) |
|---|---|---|
inline-size | width | 幅 |
block-size | height | 高さ |
max-inline-size | max-width | 幅の上限 |
min-block-size | min-height | 高さの下限 |
margin-inline | margin-left・margin-right | 左右の外側の余白 |
margin-block-end | margin-bottom | 下の外側の余白 |
padding-block | padding-top・padding-bottom | 上下の内側の余白 |
padding-inline | padding-left・padding-right | 左右の内側の余白 |
border-block-end | border-bottom | 下の線 |
inset-block-start | top | 上からの位置 |
inset-block-end | bottom | 下からの位置 |
inset-inline-start | left | 左からの位置 |
inset-inline-end | right | 右からの位置 |
色・文字・飾り
| 書き方 | 役割 |
|---|---|
color: #22333c; | 文字の色 |
background-color: rgb(31 98 128 / .16); | 背景の色。/ の後ろは不透明度 |
color-mix(in srgb, var(--accent) 20%, white) | 二つの色を、割合を決めて混ぜる |
font-family: "Hiragino Sans", "Noto Sans JP", sans-serif; | 書体。前から順に、使えるものが選ばれる |
font-size: clamp(1.5rem, 4vw, 2.5rem); | 文字の大きさ。画面の幅に合わせて、上限と下限の間で変える |
line-height: 1.8; | 行の高さ(行間) |
font-weight: bold; | 文字の太さ |
text-align: center; | 行の中での文字の揃え方 |
text-decoration: none; | 下線などの線。リンクの下線を消すときに使う |
list-style: none; | リストの行頭の記号を消す |
font-variant-numeric: tabular-nums; | 数字の幅をそろえる |
border: 1px solid var(--line); | 線。太さ・種類・色の順 |
border-color: var(--accent); | 線の色だけを変える |
outline: 2px solid var(--accent); | 要素の外側の線。:focus-visible の見た目に使う |
outline-offset: 2px; | outline と要素の間を空ける |
border-radius: 50%; | 角を丸める。50% で円になる |
box-shadow: 0 12px 32px -12px rgb(12 50 68 / .2); | 影 |
opacity: .5; | 要素全体の不透明度 |
background-image: url("…"); | 背景の画像 |
background-size: cover; | 背景の画像を、比を保ったまま枠いっぱいに広げる |
background-position: center; | 背景の画像の位置 |
overflow: hidden; | 枠からはみ出した部分を隠す。auto なら、はみ出すときだけスクロールできる |
並べる:Grid と Flexbox
| 書き方 | 役割 |
|---|---|
display: grid; | 子の要素を、格子に並べる |
grid-template-columns: repeat(3, 1fr); | 同じ幅の列を三つ作る |
grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr)); | 画面の幅に合わせて、列の数を自動で変える |
grid-column: 1 / -1; | 最初の列の線から、最後の列の線まで広げる |
grid-template-areas: "header header" "menu main"; | 区画に名前を付けて、配置を絵のように書く |
grid-area: main; | 名前を付けた区画に置く |
place-items: center; | 中身を、上下左右の中央に置く |
display: flex; | 子の要素を、一列に並べる |
display: inline-flex; | 自分は文字と同じ流れに置き、中を一列に並べる |
flex-direction: column; | 縦に並べる |
flex-wrap: wrap; | 入りきらない要素を、次の行へ送る |
justify-content: space-between; | 並ぶ向きの、間隔の取り方 |
align-items: center; | 並ぶ向きと交わる方向の、揃え方 |
gap: 1rem; | Grid や Flexbox の要素の間隔 |
列や行に分けて面を組むときは Grid、一列に並べるときは Flexbox を使います。
位置・重なり・動き
| 書き方 | 役割 |
|---|---|
position: relative; | 中の要素を重ねるときの基準にする |
position: absolute; | 基準の要素の中で、位置を決めて重ねる |
position: fixed; | 画面に対して位置を決める。スクロールしても動かない(固定ヘッダーなど) |
position: sticky; | スクロールしても、決めた位置に留まる |
z-index: 10; | 重なりの順番。大きいほど手前 |
aspect-ratio: 4 / 3; | 縦横の比を決める |
touch-action: none; | 指でなぞったときに、画面をスクロールさせない |
object-fit: cover; | 画像を、比を保ったまま枠いっぱいに収める |
translate: 0 -4px; | 位置をずらす |
rotate: 45deg; | 回す |
backdrop-filter: blur(8px); | 要素の後ろに見える部分を、ぼかす |
transition: translate .2s; | 値が変わるときに、なめらかに変える |
@keyframes と animation | 動きを定義して、繰り返す |
visibility: hidden; | 場所を残したまま見えなくする |
scroll-margin-block-start: var(--header-h); | ページ内リンクで移ったとき、固定ヘッダーの下に隠れないようにする |
値と単位
| 書き方 | 意味 |
|---|---|
rem | ページの基準の文字の大きさ(通常 16px)の何倍か |
em | その要素の文字の大きさの何倍か |
px | 画面の 1 点 |
% | 親要素の大きさに対する割合 |
fr | Grid の残りの幅を分ける割合 |
vw・dvh | 画面の幅・高さの 1% |
cqi | コンテナの幅の 1% |
ch | 文字一つ分の幅 |
min(100% - 2rem, 70rem) | 小さいほうを使う |
max(…, …) | 大きいほうを使う |
clamp(下限, 望む値, 上限) | 下限と上限の間に収める |
画面と設定に合わせる
| 書き方 | 当てはまるとき |
|---|---|
@media (width >= 60rem) { … } | 画面の幅が 60rem 以上 |
@media (prefers-color-scheme: dark) { … } | OS がダークモード |
@media (prefers-reduced-motion: reduce) { … } | OS で、動きを減らす設定にしている |
container: record / inline-size; | その要素を、record という名前のコンテナにする |
@container record (width >= 19rem) { … } | record のコンテナの幅が 19rem 以上。コンテナ自身ではなく、中の要素に効く |
color-scheme: light dark; | ライトとダークの両方の表示に対応すると伝える |
決まった書き方
/* 横方向の中央に、最大の幅を決めて置く */
.wrap {
inline-size: min(100% - 2rem, 70rem);
margin-inline: auto;
}
/* 上下左右の中央に置く */
.center {
display: grid;
place-items: center;
}
/* hidden 属性を付けた要素は、一番後ろの層で必ず隠す */
@layer utilities {
[hidden] { display: none; }
/* 動きを減らす設定のときは、動きをすぐに終わらせ、繰り返さない */
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: .01ms;
animation-iteration-count: 1;
transition-duration: .01ms;
}
}
}
03
JavaScript
よく使う JavaScript の書き方です。文字列は二重引用符 "…" で囲み、中に " を含むときだけ単一引用符にします。
値と変数
| 書き方 | 意味 |
|---|---|
const price = 1200; | 値に名前を付ける。名前に別の値を入れ直せない |
let count = 0; | あとで値を入れ直す名前 |
"ひだまり" | 文字列 |
`${name} さん` | 値を埋め込んだ文字列(テンプレートリテラル) |
42・3.14 | 数 |
true・false | 真偽値 |
null・undefined | 値がないこと |
typeof x | 値の型を、"number"・"string" などの文字列で返す |
Number("42")・String(42) | 数に直す・文字列に直す |
["guu", "choki", "paa"] | 配列 |
{ label: "グー", winsAgainst: "choki" } | オブジェクト |
// …・/* … */ | コメント |
"use strict"; | 厳格モードで実行する。ファイルの初めに書く |
演算子
| 書き方 | 意味 |
|---|---|
+・-・*・/ | 足す・引く・掛ける・割る |
% | 割った余り |
count++・total += 300 | 1 増やす・足して入れ直す |
===・!== | 等しい・等しくない(型も比べる) |
<・<=・>・>= | 大小を比べる |
&& | かつ |
|| | または |
! | でない |
条件 ? a : b | 条件が真なら a、偽なら b(条件演算子) |
a ?? b | a が null か undefined なら b |
shop.address?.city | address がなければ、エラーにせず undefined |
[...items]・{ ...totals } | 配列やオブジェクトを広げて、写しを作る |
const { win, lose } = totals; | オブジェクトから取り出して、名前を付ける(分割代入) |
delete scores.player | オブジェクトから、プロパティを取り除く |
選択と反復
if (score >= 80) {
console.log("合格");
} else if (score >= 60) {
console.log("もう少し");
} else {
console.log("再挑戦");
}
for (let i = 0; i < 3; i++) {
console.log(i);
}
for (const hand of HAND_IDS) {
console.log(hand);
}
| 書き方 | 意味 |
|---|---|
while (条件) { … } | 条件が真の間、繰り返す。回数が決まっていないときに使う |
break; | 繰り返しを途中でやめる |
continue; | その回の残りを飛ばして、次の回へ進む |
return; | 関数を抜ける。関数の初めで、続ける必要がないときに抜ける書き方(早期の return)をよく使う |
if と for は、中身が一行でも { } で囲みます。
関数
| 書き方 | 使う場面 |
|---|---|
function judge(player, computer) { … } | 名前を付けて使う関数 |
return "win"; | 関数の結果を返して、関数を抜ける |
(hand) => hand !== "guu" | ほかの関数に渡す処理(アロー関数) |
button.addEventListener("click", playGame); | 関数を渡すときは、カッコを付けない |
(() => { … })(); | その場で呼び出す関数(即時関数) |
配列とオブジェクトのメソッド
| 書き方 | 結果 |
|---|---|
items.length | 要素の数 |
items.push(x) | 最後に足す |
items.shift() | 最初の一つを取り除く |
items.pop() | 最後の一つを取り出す |
items.length = 0 | 中身を空にする |
items.includes(x) | 含まれていれば true |
items.indexOf(x) | 何番目か。なければ -1 |
items.slice(-100) | 一部を切り出した、新しい配列 |
items.splice(i, 1) | i 番目から一つ取り除く。元の配列が変わる |
items.forEach((x) => …) | 一つずつ処理する |
items.map((x) => …) | 一つずつ変換した、新しい配列 |
items.filter((x) => …) | 条件に合うものだけの、新しい配列 |
items.find((x) => …) | 条件に合う最初の一つ |
items.every((x) => …) | すべてが条件に合えば true |
items.some((x) => …) | 一つでも条件に合えば true |
items.reduce((sum, x) => sum + x, 0) | 一つの値にまとめる(合計など) |
items.join("、") | つないだ文字列 |
items.toReversed() | 逆順にした、新しい配列 |
items.toSorted((a, b) => a.y - b.y) | 並べ替えた、新しい配列。比べる関数の結果が負なら a が前 |
Object.keys(obj) | キーの配列 |
数・文字列・日付
| 書き方 | 結果 |
|---|---|
Math.random() | 0 以上 1 未満の乱数 |
Math.floor(x)・Math.round(x) | 小数を切り捨てる・四捨五入する |
Math.min(a, b)・Math.max(a, b) | 小さいほう・大きいほう |
Number.isInteger(x) | 整数なら true |
(1200).toLocaleString() | "1,200" のように、桁を区切った文字列 |
new Intl.NumberFormat("ja-JP") | 数を日本の書き方で表示する書式。format(5300) で "5,300" |
text.trim() | 前後の空白を取り除く |
text.includes("花")・text.startsWith("http") | 含むか・その文字で始まるか |
String(7).padStart(2, "0") | "07" のように、前に "0" を足して 2 文字にそろえる |
now.getHours()・now.getMinutes()・now.getSeconds() | const now = new Date(); の時・分・秒 |
now.getMonth() + 1・now.getDate()・now.getDay() | 月(0 から数えるので 1 を足す)・日・曜日(0 が日曜) |
new Date().toISOString() | 今の日時を、"2026-10-17T01:23:45.678Z" の形の文字列で |
performance.now() | ページを開いてからの時間(ミリ秒) |
クラス
class ScoreBoard {
#scores = { player: 0, computer: 0 }; // # はクラスの外から触れない
static from(value) { … } // ScoreBoard.from(…) とクラスから呼ぶ
add(winner) { // メソッド
this.#scores[winner]++;
}
get scores() { // board.scores と読める(ゲッター)
return { ...this.#scores };
}
toJSON() { // JSON.stringify(board) で使われる
return this.scores;
}
}
const board = new ScoreBoard();
| 書き方 | 意味 |
|---|---|
constructor(name) { … } | new で作るときに、最初に実行する |
set name(value) { … } | 代入で呼ばれる(セッター) |
class HintQuizMaker extends QuizMaker | ほかのクラスを受け継ぐ |
super.makeQuestion() | 受け継いだ元のメソッドを呼ぶ |
ページを操作する(DOM)
| 書き方 | 役割 |
|---|---|
document.querySelector('[data-ui="message"]') | 最初に当てはまる要素。なければ null |
document.querySelectorAll("[data-hand]") | 当てはまるすべての要素 |
element.textContent = "…" | 中の文字を書き換える |
element.innerHTML = "…" | 中を HTML として書き換える。外から来た文字には使わない |
input.value | 入力欄の値(文字列) |
checkbox.checked・button.disabled | 選ばれているか・押せないか |
img.src・img.alt | 画像の場所・代わりの文字 |
input.files[0] | ファイルを選ぶ入力欄で、選ばれた最初のファイル |
input.validity.valid | 入力が、required などの条件に合っているか |
dialog.returnValue | ダイアログを閉じたボタンの value |
element.classList.add("is-open") | class を付ける(remove で外す) |
element.classList.toggle("is-chosen", 条件) | 条件が真なら付け、偽なら外す |
element.dataset.state = "playing" | data-state 属性を読み書きする |
element.getAttribute("href") | 属性の値を読む |
element.setAttribute("aria-expanded", "true") | 属性を書き換える |
element.style.setProperty("--hand-color", color) | カスタムプロパティの値を、その要素に設定する |
element.hidden = true | 要素を隠す |
document.createElement("li") | 新しい要素を作る |
list.append(item) | 最後に加える |
element.focus() | その要素を選んだ状態にする |
element.getBoundingClientRect() | 画面の上での位置と大きさ(left・top・width・height) |
element.click() | 押したことにする |
dialog.showModal()・dialog.close() | ダイアログを開く・閉じる |
input.setCustomValidity("…")・form.reportValidity() | 入力の誤りの文を決める・誤りを画面に示す |
window.matchMedia("(width >= 60rem)").matches | メディアクエリに当てはまるか |
element.closest("dialog") | 自分か、外側で、当てはまる最初の要素 |
document.documentElement.classList.remove("no-js") | JavaScript が動いたことを CSS に伝える |
イベント
| 書き方 | 役割 |
|---|---|
button.addEventListener("click", () => { … }) | 押されたときの処理を登録する |
"click"・"input"・"change"・"submit"・"keydown" | 押された・入力された・選択が変わった・送信された・キーが押された |
"scroll"・"resize" | ページがスクロールされた・画面の大きさが変わった |
"close" | ダイアログが閉じた |
"pointerdown"・"pointermove"・"pointerup"・"pointercancel" | マウス・指・ペンで、押した・動かした・離した・ブラウザが取りやめた |
"load" | 画像の読み込みが終わった |
"storage" | 別のタブで、localStorage が変わった |
event.currentTarget | 処理を登録した要素 |
event.target | 実際に押された要素 |
event.key === "Escape" | 押されたキー |
event.ctrlKey・event.metaKey | Ctrl キー・Command キーを押しているか |
event.clientX・event.clientY | 押した位置。画面の左上から数える |
element.setPointerCapture(event.pointerId) | 要素の外へ出ても、離すまでイベントを届け続ける |
event.preventDefault() | ブラウザの決まった動き(送信など)を止める |
{ once: true } | 一度呼ばれたら、登録を外す |
保存とエラー
| 書き方 | 役割 |
|---|---|
localStorage.setItem("key", text) | 文字列を保存する |
localStorage.getItem("key") | 保存した文字列。なければ null |
localStorage.removeItem("key") | 保存したものを消す |
JSON.stringify(value) | オブジェクトを、JSON の文字列にする |
JSON.parse(text) | JSON の文字列を、オブジェクトに戻す |
try { … } catch (error) { … } | 失敗したときの処理を書く |
try { … } finally { … } | 失敗してもしなくても、最後に必ず行う処理を書く |
throw new Error("…") | 自分でエラーを起こし、処理を止める |
console.log(x)・console.warn(x)・console.table(x) | コンソールに表示する |
new Blob([json], { type: "application/json" }) | ファイルの中身になるデータを作る |
URL.createObjectURL(blob) | データを指す一時的な URL を作る。使い終えたら revokeObjectURL() |
await file.text() | 選ばれたファイルの中身を、文字列として読む |
時間と非同期処理
| 書き方 | 役割 |
|---|---|
setTimeout(() => { … }, 1000) | 1000 ミリ秒後に一度だけ実行する |
requestAnimationFrame(shuffle) | 次に画面を描く直前に実行する |
async function load() { … } | 中で await を使える関数 |
const response = await fetch(url); | 時間のかかる処理の終わりを待つ |
const data = await response.json(); | 受け取った JSON を、オブジェクトに直す |
new Promise((resolve) => { … }) | 終わりを知らせる約束を作る |
audio.play().catch(…) | 音を鳴らす。失敗するかもしれない Promise に備える |
audio.pause()・audio.currentTime = 0 | 音を止める・頭に戻す |
モジュール
| 書き方 | 意味 |
|---|---|
export const HANDS = { … }; | ほかのファイルに渡す |
export function judge() { … }・export class JankenRecord { … } | 関数やクラスを渡す |
import { HANDS, judge } from "./rules.js"; | ほかのファイルから受け取る。./ と .js は省かない |
import { judge as judgeHands } from "./rules.js"; | 名前を変えて受け取る |
import * as rules from "./rules.js"; | まとめて受け取る |
await import("./javascripts/rules.js") | コンソールで、モジュールを読み込んで試す |
Service Worker と PWA
| 書き方 | 役割 |
|---|---|
navigator.serviceWorker.register("./sw.js") | Service Worker を登録する(ページの側) |
self.addEventListener("install", …) | 初めて登録されたときと、sw.js が変わったとき |
self.addEventListener("activate", …) | 新しい版が働き始めるとき |
self.addEventListener("fetch", …) | ページがファイルを求めるたび |
caches.open(CACHE_NAME) | キャッシュを開く |
cache.addAll(APP_FILES) | 一覧のファイルを、まとめて保存する |
cache.match(request) | 保存したファイルを探す |
event.respondWith(…) | ページへの返事を決める |
event.waitUntil(…) | 渡した処理が終わるまで、その段階を終えない |
self.skipWaiting() | 待たずに、新しい版を働かせる |
よく見るエラー
Firefox のコンソールに出る主なエラーです。
| エラー | よくある原因 |
|---|---|
ReferenceError: … is not defined | 名前の綴りの間違い。宣言していない。import に書き忘れた |
TypeError: invalid assignment to const '…' | const の名前に、値を入れ直そうとした |
TypeError: can't access property "…", … is null | querySelector で要素が見つからず、null のまま使った |
TypeError: can't access property "…", … is undefined | ないプロパティの、さらに先を読もうとした |
SyntaxError: return not in function | モジュールの一番外側に return を書いた |
SyntaxError: The requested module '…' doesn't provide an export named: '…' | export の付け忘れか、名前の綴りの違い |
04
Canvas
よく使う Canvas の命令です。描く命令は、getContext("2d") で受け取ったコンテキスト ctx に対して出します。後から描いたものが、上に重なります。
準備と座標
| 書き方 | 役割 |
|---|---|
<canvas id="card" width="360" height="440" role="img" aria-label="…"> | 白紙を置く。width・height は点の数。描いた内容は aria-label で伝える |
const ctx = canvas.getContext("2d"); | 描くための道具(コンテキスト)を受け取る |
canvas.width・canvas.height | 点の数。値を入れると、描いた絵と設定が消える |
(0, 0) | 左上。x は右へ、y は下へ増える |
図形とパス
| 書き方 | 描くもの |
|---|---|
ctx.fillRect(x, y, 幅, 高さ) | 塗りつぶした四角形 |
ctx.strokeRect(x, y, 幅, 高さ) | 線だけの四角形 |
ctx.clearRect(x, y, 幅, 高さ) | その範囲を消して、透明に戻す |
ctx.beginPath() | 新しいパスを始める。図形ごとに書く |
ctx.moveTo(x, y) | 線を引かずに、ペンを移す |
ctx.lineTo(x, y) | そこまで、まっすぐな線を伸ばす |
ctx.quadraticCurveTo(cx, cy, x, y) | 制御点 (cx, cy) へ引っぱられる曲線を伸ばす |
ctx.arc(x, y, 半径, 始め, 終わり) | 円の弧。角度はラジアンで、0 から Math.PI * 2 までなら円 |
ctx.ellipse(x, y, 横の半径, 縦の半径, 傾き, 始め, 終わり) | 楕円の弧。半径を横と縦で別にした arc() |
ctx.roundRect(x, y, 幅, 高さ, 半径) | 角の丸い四角形 |
ctx.closePath() | 始めの点まで線を戻して、閉じる |
ctx.fill()・ctx.stroke() | パスの中を塗る・パスに沿って線を引く。ここで初めて描かれる |
ctx.clip() | これより後は、今のパスの内側にだけ描く |
色・線・文字・影
| 書き方 | 役割 |
|---|---|
ctx.fillStyle = "#e2b65e" | 塗る色。グラデーションも入れられる |
ctx.strokeStyle・ctx.lineWidth | 線の色・太さ |
ctx.lineCap = "round" | 線の端を丸くする |
ctx.setLineDash([6, 4]) | 6px 描いて 4px 空ける破線にする。[] で実線に戻す |
ctx.createRadialGradient(x1, y1, r1, x2, y2, r2) | 内側の円から外側の円へ色が変わるグラデーション |
ctx.createLinearGradient(x1, y1, x2, y2) | 直線に沿って色が変わるグラデーション |
gradient.addColorStop(0, "…") | グラデーションの位置(0〜1)に色を置く |
ctx.font = "bold 24px sans-serif" | 文字の太さ・大きさ・書体。書体は省けない |
ctx.textAlign = "center"・ctx.textBaseline = "middle" | fillText() に渡した位置を、文字の中央にする |
ctx.fillText("…", x, y) | 文字を描く |
ctx.measureText("…").width | 今の font で描いたときの文字の幅 |
ctx.globalAlpha = 0.6 | これから描くものの不透明度(0〜1)。1 で不透明 |
ctx.shadowColor・ctx.shadowBlur・ctx.shadowOffsetY | 影の色・ぼかし・下へのずれ。shadowColor = "transparent" で影を消す |
設定は、変えるまで残り、その後に描くすべてのものに効きます。
座標を動かす
| 書き方 | 役割 |
|---|---|
ctx.translate(x, y) | 原点を (x, y) へ移す |
ctx.rotate(角度) | 原点を中心に、座標を回す(ラジアン。時計回り) |
ctx.scale(横, 縦) | 座標を拡大・縮小する。線の太さも変わる |
ctx.save()・ctx.restore() | 座標と設定を覚える・覚えた状態に戻す。必ず対で書く |
Math.PI | 180 度。度からは 度 * Math.PI / 180 |
Math.cos(角度) * r・Math.sin(角度) * r | 原点から、その角度の向きに r 進んだ点の x・y |
画像
| 書き方 | 役割 |
|---|---|
const img = new Image(); | ページに置かない画像を作る。load を待ってから描く |
ctx.drawImage(img, x, y) | そのままの大きさで描く |
ctx.drawImage(img, x, y, 幅, 高さ) | 幅と高さに合わせて、伸び縮みさせて描く |
ctx.drawImage(img, sx, sy, sw, sh, x, y, 幅, 高さ) | 画像の一部を切り出して描く |
ctx.getImageData(0, 0, canvas.width, canvas.height) | 点の色を、まとめて取り出す |
ctx.putImageData(data, 0, 0) | 取り出した点の色を、書き戻す |
canvas.toBlob((blob) => { … }) | 描いた絵を、PNG の画像のデータにする |
決まった書き方
// 消して、描いて、次の回を予約する
function frame(now) {
ctx.clearRect(0, 0, canvas.width, canvas.height);
// now(ページを開いてからのミリ秒)から、位置や大きさを求めて描く
requestAnimationFrame(frame);
}
requestAnimationFrame(frame);
// 押した場所を、Canvas の座標に直す
canvas.addEventListener("pointerdown", (event) => {
const rect = canvas.getBoundingClientRect();
const x = (event.clientX - rect.left) * (canvas.width / rect.width);
const y = (event.clientY - rect.top) * (canvas.height / rect.height);
});
// 高精細な画面でぼやけないようにする。座標は SIZE × SIZE のまま書ける
const ratio = window.devicePixelRatio || 1;
canvas.width = SIZE * ratio;
canvas.height = SIZE * ratio;
ctx.scale(ratio, ratio);
05
Git とターミナル
公開編で使う Git のコマンドと、ローカルサーバーの起動です。ターミナルで、作業フォルダに移ってから実行します。
| コマンド | 役割 |
|---|---|
cd ~/Documents/my-site | 作業フォルダに移る(場所は自分のものに置き換える) |
git init | 今のフォルダを、Git のリポジトリにする |
git status | 変えたファイルと、記録の準備の様子を見る |
git add ファイル名 | 次の記録に入れるファイルを選ぶ |
git commit -m "メッセージ" | 選んだ変更を記録する |
git diff | 記録していない変更を見る。-w で字下げの違いを除く |
git log --oneline | 記録の一覧を、一行ずつ見る |
git restore ファイル名 | 記録していない変更を捨てる |
git restore --staged ファイル名 | git add を取り消す |
git revert 番号 | 記録した変更を打ち消す、新しい記録を作る |
git switch -c 名前 | ブランチを作って移る |
git switch main | ブランチを移る |
git branch | ブランチの一覧。* が今いるブランチ |
git merge 名前 | 指定したブランチの変更を、今のブランチに取り込む |
git branch -d 名前 | 取り込んだブランチを消す |
git remote add origin URL | GitHub のリポジトリとつなぐ |
git push -u origin main | 初めて GitHub に送る。次からは git push |
ruby -run -e httpd . -p 8000 | 今のフォルダを配信するローカルサーバーを起動する。Control + C で止める |
06
キーボードの操作
エディタとブラウザで、よく使うキーの操作です。Mac と Windows のキーを並べました。Linux は、Windows と同じです。
| キー(Mac) | Windows | 動作 |
|---|---|---|
| Command + S | Ctrl + S | 保存する |
| Command + R | Ctrl + R | 再読み込みする |
| Shift + Command + R | Shift + Ctrl + R | 古いデータを使わずに再読み込みする |
| Command + Option + I | Ctrl + Shift + I | 開発者ツールを開く |
| Command + Option + M | Ctrl + Shift + M | レスポンシブデザインモードに切り替える(Firefox) |
| Command + Z / Shift + Command + Z | Ctrl + Z / Ctrl + Shift + Z | 元に戻す / やり直す |
| Command + F | Ctrl + F | 開いているファイルやページの中を探す |
| Command + / | Ctrl + / | 選んだ行をコメントにする(エディタ) |
| Command + P | Ctrl + P | ファイルの名前で探して開く(Zed) |
| Tab / Shift + Tab | 同じ | 次の部品 / 前の部品を選ぶ(ブラウザ) |
| Esc | 同じ | ダイアログやパネルを閉じる |