Contents
- 1 一般
- 2 変数・定数
- 3 データ型と演算子
- 4 配列
- 5 条件分岐
- 6 繰り返し処理
- 7 関数
- 8 オブジェクト
- 9 ブラウザオブジェクト
- 10 DOM(DocumentObject Model)
- 11 イベント
- 11.1 ◆イベントの設定(addEventListener)
- 11.2 ◆イベントの削除(removeEventListener)
- 11.3 ◆既定の動作の停止(preventDefault)
- 11.4 ◆イベント発生元の要素へのアクセス
- 11.5 ◆loadイベント
- 11.6 ◆clickイベント
- 11.7 ◆inputイベント
- 11.8 ◆chengeイベント
- 11.9 ◆transitionendイベント
- 11.10 ◆CSS Animations連動イベント
- 11.11 ◆keydown/keyupイベント
- 11.12 ◆mousemove/mousedown/mouseupイベント
- 11.13 ◆scrollイベント(scrollX/scrollY)
- 12 Web Animations API(animate)
- 13 Intersection Observer
一般
◆コメント
・1行ずつのコメント 「//」以降の文字列がコメント化。
console.log('hello');//コメントです。
//コメントです。
・複数行のコメント 「/*」と「*/」で囲んだ部分がコメント化。
◆コンソール表示
・undefined 未定義。初期値が設定されていない変数の表示。
・SyntaxError 構文エラー。
◆JavaScriptファイルの指定
・拡張子「.js」をつけたファイルに記述する。
・JavaScriptファイルはHTMLファイルの<script>タグで読み込む。
<script src="js/script.js" defer></script>
・<head>タグの中や<body>タグの中であればどの位置に書いてもかまわない。
・JavaScriptファイルの読み込み中は、HTMLの解析が停止するため、以前は<body>の最後尾に記述していた。
HTMLの解析前にJavaScriptファイルを読み込むとScriptエラーとなる。
並列処理できないため読み込みに時間がかかる。
・<head>内の<script>タグに「defer」属性をつけると、HTMLの解析とJavaScriptファイルの読み込みが同時進行されるて表示速度が上がる。
HTMLの解析が終了した後にJavaScriptが実行されるのでプログラムのエラーも発生しない。
・1つのHTMLファイルに複数のJavaScriptファイルを読み込ませることができる。
◆取得内容まとめ
■document.querySelector
・引数で指定したCSSセレクタの条件に複数の要素がマッチした場合は最初にマッチした要素を取得する。
・どの要素もマッチしない場合は「null」が返される。
・指定されたHTML要素を取得する。
consol.log(document.querySelector('.sample'));
⇒ 「<div class = "sample">Text</div>」
■document.querySelectorAll
・引数で指定したCSSセレクタの条件にマッチしたすべての要素を取得する。
・複数の要素を取得するため、戻り値は「NodeList」という特殊な配列形式のデータで返される。
・インデックスで指定した要素にアクセスする。
const elements = document.querySelectorAll('.sample');
consol.log(elements[0]));
⇒ 「<div class = "sample">Text1</div>」
・取得したすべての要素にそれぞれアクセスする。
const elements = document.querySelectorAll('.sample');
foe (const erement of elements) = {
consol.log(element);
}
⇒ 「<div class = "sample">Text1</div>」
「<div class = "sample">Text2</div>」
「<div class = "sample">Text3</div>」
■getElementsByClassName
・document.getElementsByClassName('クラス名')
const element = getElementsByClassName('name');
・引数にクラス名を指定して、合致するすべてのHTML要素を取得するメソッド。
・querySelectorAll()メソッドとは違い、引数にはセレクターではなくクラス名のみを指定する(「.」は付けない)。
・複数の要素を取得するため、戻り値は「HTMLCollection」という特殊な配列形式のデータで返される。
・配列の各要素を処理するにはfor文を使う。forEach()メソッドは存在しない。
const elements = document.getElementsByClassName('sample');
foe (let i = 0; i < elements.length; i++ ) = {
consol.log(element[i]);
}
⇒ 「<div class = "sample">Text1</div>」
「<div class = "sample">Text2</div>」
「<div class = "sample">Text3</div>」
■This(メソッド)
・メソッドを定義するとき、同じオブジェクト内のプロパティを直接参照することはできない。
・「this.プロパティ名」とすることで、同じオブジェクト内のプロパティ値を使用できる。
const person = {
name; 'Alice',
greet; function() {
console.log(`こんにちは、
わたしは${this.name}です`); },
}
parson.greet();
■イベントオブジェクト(event)
・予め指定した関数の引数としてイベントに関する情報が自動的にオブジェクト形式で渡される。
・イベント発生時に「クリックされた要素」や「入力されたテキスト内容」などの情報を取得できる。
・addEventListener()に登録する関数に引数を設定するだけで受け取ることができる。(引数に使用した「event」で取得)
button.addEventListener('mouseover', function (event) {
console.log(event);
}); ⇒ 「Mousevent{isTrusted: true, screenX: 1214, screenY: 650, clientX: 1034, clientY: 485, ...}」
■イベントが発生した要素の取得(currentTarget)
・currentTargetプロパティはイベントが発生した要素を取得する。
・取得内容は「document.querySelector」で取得した場合と同じ状態となる。
取得内容例:<button type="button">ボタン</button>
・ボタンクリックでボタンのテキストを変更する例
const button = document.querySelector('button');
button.addEventListener('click', function (event) {
const button = event.currentTarget;
button.textContent = '変更します';
});
■Intersection Observer(entries)
・監視対象のサイズや名前、監視エリアに入っているかなどの情報をすべて取得できる。
・Intersection Observerで指定した関数が呼び出されるとき、引数として交差状態に関する情報が含まれる引数が自動的に引き渡される。
・監視対象が複数のときもあるため、情報は配列方式で渡され、配列の各インデックスにオブジェクトとして交差情報が格納される。
・交差した要素の情報にアクセスしたい場合、引数のインデックス番号で指定する。
const showKirin = (entries) => {
console.log(entries[0]);
}
・取得される情報
・boundingClientRect 監視対象要素のサイズや位置。top, botoom, left, right, width, height, X, Yが参照可能。
・intersectionRect 監視対象要素の表示されている部分のサイズや位置。top, botoom, left, right, width, height, X, Y。
・intersectionRatio 監視対象要素が、監視している領域と交差している割合。0~1の数値。
・isIntersection 監視対象要素が、監視している領域に入っているかどうか。
・rootBounds 監視している領域のサイズや位置。top, botoom, left, right, width, height, X, Y。
・target 監視対象の要素。
・time 交差が記録された時刻(ミリ秒)。
・「terget」プロパティで要素の取得
const showKirin = (entries) => {
console.log(entries[0].target);
}
⇒ 「<img src="images/kirin.jpg" id="kirin" alt="キリン">」
変数・定数
◆変数・定数に使える文字列
・文字種 ・アルファベット
・_(アンダーバー)
・$(ドルマーク)
・数字(変数名の先頭には使用できない)
・大文字小文字が区別される。
・予約語は変数に使えない。(SyntaxError)
・同じ名前で宣言できない。(SyntaxError)
◆変数宣言
・letによる変数宣言 let 変数名 = 値;
let price = 100;
let name = 'Alice';
・constによる変数宣言 lconst 定数名 = 値;
const price = 100;
const name = 'Alice';
◆letの特徴
・再代入可能 変数名 = 値;
let price = 100;
price = 200;
・初期値で変数宣言可能 let 変数名;
let price;
◆letとconstの違い
let | const | |
---|---|---|
・初期値ありの変数宣言 | ○できる | ○できる |
・再代入 | ○できる | Xできない |
・初期値なしの変数宣言 | ○できる | Xできない |
データ型と演算子
◆データ型の種類
・数値型(Number) 100, Infinity(無限大), NaN(Not a Namber, 0で割った解)
・文字列型(String) '文字列'
・論理型(Booleran) true, false
・Null型 null
・Undefined型 undefine解
◆データ型の特徴
〇数値型(Number)
・数値をあらわすデータ型。
・「'(クォーテーション)」で囲んではいけない。「文字列」として認識される。
〇文字列型(String)
・文字列をあらわすデータ型。
・文字列を「'(シングルクォーテーション)」「"(ダブルクォーテーション)」で囲む。
・文字列を「''」の中の「" "」、「" "」の中の「''」は単なる文字列として扱われる。
"私の名前は'アリス'です。" → 私の名前は'アリス'です。
〇論理型(Booleran)
・真偽値(論理値)のみの値。
・「true(真)」と「false(偽)」の2つのみ。
・「'(クォーテーション)」で囲むと文字列型となるので注意。
・全ての値は真値(true)と偽値(false)に変換できる。
・偽値になるものはほとんどない。null, undefined, 数字の「0」,空の文字列「''」のみ。
〇Null型
・「null」の値のみ。
・値として存在はするが「空っぽ」であることを表す値。
〇Undefined型
・「Underfined」の値のみ。
・存在しないことを表す値。
◆算術演算子
・+ 足し算
・- 引き算
・* 掛け算
・/ 割り算
・% 余りを計算(17 % 5 → 2)
・** 累乗を計算(2 ** 4 → 16)
◆比較演算子
・< > 大きい、小さい場合は「true」
・<= >= 以上、以下の場合は「true」
・== 等しい場合は「true」
・!= 等しくない場合は「true」
・=== データ型を含めて厳密に等しい場合は「true」(1 === '1' → false)
・!== データ型を含めて厳密に等しくない場合は「true」
◆インクリメント演算子(++)
・変数++ 数値に「1」を足す。
let count = 10;
count++;
・「a++」は「a = a + 1」と同じ。
◆加算代入(+=)
・左辺の値に右辺の値を足した結果を左辺に再代入する。
・「a += b」は「a = a + b」と同じ。
◆論理積演算子(&&)と論理和演算子(||)
〇論理積演算子(&&)
・条件式A && 条件式B
・2つの条件式を被演算子(オペランド)として、ともに「true」のときに「true」を返す。
const a = 5;
console.log(a > 1 && a < 9); → 「true」
console.log(a > 1 && a < 3); → 「false」
〇論理和演算子(||)
・条件式A || 条件式B
・2つの条件式を被演算子(オペランド)として、どちらか1つの条件式が「true」であれば「true」を返す。
const b = 10;
console.log(b < 4 || b > 9); → 「true」
◆テンプレートリテラル(“)
・文字列を「(バックティック)」で囲む。
const name = 'Alice';
・文字列の中に変数などを挿入できる。
const text = `私の名前は${name}です。`);
・改行をそのまま使用できる。
配列
◆概要
・複数の値をひとまとまりとして持つことのできるデータ構造。
・要素 配列に格納される値。
・インデックス それぞれの要素に自動的に割り振られる数字。「0」から始まる。
◆書式
■const 配列名 = [要素1, 要素2, 要素3, ...];
const arr = ['Bob', 20, true];
◆要素へのアクセス
■配列名[インデックス];
const arr = ['Bob', 20, true];
const element0 = arr[0];
・アクセス先のインデックスが存在しない場合は「undefined」。
・「const」でも要素の上書はできる。
◆要素の上書
■配列名[インデックス] = 値;
const arr = ['Bob', 20, true];
arr[0] = 'Alice';
・アクセス先のインデックスが存在しない場合は「undefined」。
・もともと存在しない要素に上書した場合、指定したインデックスに新たな要素を格納する。
◆配列の操作
〇要素の数(.length)
・配列.length;
〇要素を最後尾に追加(.push)
・配列.push(追加する要素);
arr.push('Bob');
〇最後尾から要素を取り出す(.pop)
・配列.pop;
const last = arr.pop();
〇特定の要素が配列に含まれるか調べる(.includes)
・配列.includes(要素)
const check = arr.includes('リンゴ');
・結果は「true」または「false」の真偽値になる。
〇配列要素の結合(.join)
・配列.jopin(区切り文字)
const arr = ['読書', '料理', 'キャンプ'];
const a = interests.join('と');
consol.log(a); →「読書と料理とキャンプ」
〇文字列から配列の生成(.split)
・配列.split(区切り文字)
const string = '読書&料理&キャンプ';
const a = string.split('&');
consol.log(a); →「['読書', '料理', 'キャンプ']」
条件分岐
◆if文
■if (式) {
式が真値となる場合の処理;
} else {
式が偽値となる場合の処理;
}
const name = '';
if (name) {
console.log('名前が存在します');
} else {
console.log('名前がありません');
} →「名前がありません」
・「if」のみの記述も可能(「else」以降は省略)。
◆else if文
■if (式1) {
式1が真値となる場合の処理;
} else if (式2){
式2が偽値となる場合の処理;
} else {
どの条件式も真値にならない場合の処理;
}
・「式1」で条件を満たすと「式2」以降の処理は条件を満たしていても中止される。
◆三項演算子
・シンプルなif文を簡潔なコードに書き換える。
■const 変数名 = (条件式) ? 真値のときに返す値:偽値のときに返す値;
const size = 20;
const result = (size >= 30) ? '粗大ごみ':'不燃ゴミ';
◆swich文
・変数がどのような値かによって処理を分岐できる。
・if文より用途は限定的だが、if文よりも読みやすいコードが記述できる。
■swich (変数) {
case 値1:変数が値1となるときの処理;
break;
case 値2:変数が値2となるときの処理;
break;
default:その他の処理;
}
繰り返し処理
◆for文
・指定した回数だけ同様の処理を繰り返す処理。
■for (初期化式; 条件式; 加算式) {
処理;
}
for (let i = 0; i < 10; i++) {
console.log(`${i}回目の処理`);
}
・ループカウンター 任意の数値で初期化し、繰り返し処理を行うたびに加算される。指定の回数に達したら繰り返し処理全体を終了する。
・無限ループ 永久に「true」を返し続ける条件式の場合に、for文が終了せずに永久に処理を繰り返し続ける状態。デバイスがフリーズするため注意。
◆while文
・回数を指定できない繰り返し処理。
・条件式を評価して、「true」なら処理を実行、「false」なら処理を中止する。
■while (条件式) {
処理;
}
let number = 2;
while (number < 100) {
consol.log(${number}番);
number * 2;
}
◆配列の繰り返し処理
〇for文(.length)
■const fruits = ['りんご', 'みかん', 'バナナ'];
for (let i = 0; i < fruits.length; i++) {
console.log(fruits[i]);
}
〇for…of文
・自動的に配列の要素数の回数だけ繰り返し処理を行う。
・繰り返し処理のたびに変数には配列の要素が順番に格納されるので、各要素へのアクセスが簡単に行える。
・for文のように「配列[インデックス]」で各要素にアクセスする必要がない。
■for (変数 of 配列) {
処理;
}
const fruits = ['りんご', 'みかん', 'バナナ'];
for (const fruit of fruits) {
console.log(fruit);
}
〇forEachメソッド
・「配列.forEach()」の「()」の中に関数を記述して、関数の引数として配列の要素を指定した名前で繰り返し処理を実行する。
・指定する関数は関数名をつけて呼び出しこともできるが、多くの場合、無名関数・アロー関数で利用することが多い。
■アロー関数を使った例
配列名.forEach((各配列の要素) => {
処理;
});
const animals = ['猫', '牛', 'トラ', 'うさぎ'];
animals.forEach((animal) => {
console.log(animal);
}
■関数名(関数式)を使った例
const 関数名 = (各配列の要素) => {
処理;
}
配列名.forEach(関数名);
const animals = ['猫', '牛', 'トラ', 'うさぎ'];
const showAnimals = (animal) => {
console.log(animal);
}
animals.forEach(showAnimals);
◆break文(ループ処理の中止)
・指定回数の前にループ処理を途中で終了したいときに使用。
・for文、while文、for...of文のすべてに使用できる。
■for (i = 0; i < 10; i++) {
if (i == 3){
break;
}
console.log(`${i}回目の処理`);
}
関数
◆関数宣言
〇引数なし
■function 関数名() {
処理;
}
〇引数あり
■function 関数名(仮引数1, 仮引数2, 仮引数3) {
処理;
}
〇戻り値あり
・戻り値が設定されている関数を呼び出す場合、変数に代入して使うことが多い。
■function 関数名() {
処理;
return 戻り値;
}
function pi() {
return 3.14;
}
const a = pi(); //関数piを呼び出して、戻り値を「a」に代入する
console.log(a);
〇引数と戻り値あり
■function double(number) {
const result = number * 2;
return result;
}
const a = dowble(10);
console.log(a);
■function double(number) {
return number * 2;
}
〇デフォルト引数あり
・デフォルト引数 関数を呼び出す際に引数が引き渡されなかった際に呼び出されるデフォルト値に引数。
■function 関数名(仮引数 = デフォルト値) {
処理;
}
function hello(name = 'ゲスト') {
console.log(`こんにちは${name}さん`);
}
hello(); → 「こんにちはゲストさん」
◆関数の呼び出し
〇引数なし
■関数名();
〇引数あり
■関数名(実引数1, 実引数2, 実引数3);
function hello(name) {
consol.log(`こんにちは${name}さん`)
}
hello('Bob');
◆関数式(無名関数)
■const 変数名 = function (引数1, 引数2, 引数3....) {
処理;
rretrn 戻り値;
}
const sayHello = function() {
consol.log('こんにちは');
}
sayHello();
◆アロー関数式
〇書式
■const 変数名 = (引数1, 引数2, 引数3....) => {
処理;
}
const sayHello = () => {
consol.log('こんにちは');
}
sayHello();
〇省略形(1行)
・1行で書く場合は、さらに「{}」と「returnキーワード」を省略できる。
■const 変数名 = (引数1, 引数2, 引数3....) => 処理;
const doSonmething = (a) => a * 2; ← const doSonmething = (a) => {
return a * 2;
}
オブジェクト
◆書式
■const 変数名 = {
キー1: 値1,
キー2: 値2,
キー3: 値3
}
■const 変数名 = {
プロパティ名: 値,
メソッド名: 関数式,
}
◆プロパティ
・オブジェクトを構成する各データ。
・「プロパティ名(kye)」と「値(value)」のペアから成り立つ。
キー:値,
◆メソッド
・オブジェクトを構成する要素で、プロパティの値に関数が設定されたもの。
・キーと値(関数式)で構成される。
キー:関数式,
◆プロパティへのアクセス方法
〇ドット表記法
・オブジェクトに「.(ドット)」とプロパティ名を繋げて書く。
const book = {title; '吾輩は猫である'}
consol.log(book.title);
〇ブラケット表記法
・オブジェクトに「[](ブラケット)」をつけ、プロパティ名を文字列として書く。
const book = {title; '吾輩は猫である'}
consol.log(book['title']);
・ドット表記法と違い、「-(ハイフン)」を使用したていたり、数字から始まるプロパティにアクセスできる。
○ obj['first-name']
× obj.first-name
・ドット表記法と違い、変数を使ってプロパティにアクセスできる。
const book = {title; '吾輩は猫である'}
consol a = 'title';
○ consol.log(book[a]);
× consol.log(book.a);
〇ブラケット表記法の利点
・ドット表記法と違い、「-(ハイフン)」を使用したていたり、数字から始まるプロパティにアクセスできる。
○ obj['first-name']
× obj.first-name
・ドット表記法と違い、変数を使ってプロパティにアクセスできる。
const book = {title; '吾輩は猫である'}
consol a = 'title';
○ consol.log(book[a]);
× consol.log(book.a);
◆メソッドの呼び出し
・メソッドも関数と同様、定義しただけでは内部の処理は行われず、「呼び出す」ことによって処理を実行する。
・メソッドは関数の一種で、見た目上は関数の前に「.(ドット)」がついていればメソッド。
■オブジェクト名.メソッド名(実引数);
const person = {
name; 'アリス',
greet; function() {
console.log('こんにちは');},
}
parson.greet();
◆メソッドのThis
・メソッドを定義するとき、同じオブジェクト内のプロパティを直接参照することはできない。
・「this.プロパティ名」とすることで、同じオブジェクト内のプロパティ値を使用できる。
const person = {
name; 'Alice',
greet; function() {
console.log(`こんにちは、
わたしは${this.name}です`); },
}
parson.greet();
◆標準組み込みオブジェクト(Math)
メソッド | 機能 | 使用例 |
---|---|---|
・Math.PI | 円周率 | console.log(Math.PI); → 「3.1415926535」 |
・Math.abs(数字) | 絶対値 | console.log(Math.abs(-10)); → 「10」 |
・Math.round(数字) | 四捨五入 | console.log(Math.round(1.4)); → 「1」 |
・Math.floor(数字) | 切り捨て | console.log(Math.floor(10.3)); → 「10」 |
・Math.ceil(数字) | 切り上げ | console.log(Math.ceil(10.3)); → 「11」 |
・Math.random() | 0以上1未満のランダム数の生成 | console.log(Math.randam()); → 「0.6774349」 |
サイコロプログラム | console.log(Math.floor(Math.randam() * 6) + 1); | |
ブラウザオブジェクト
◆ウィンドウオブジェクト
〇アラート表示(alert)
・アラート文章の表示をする。
・window.alert('文章'); / alert('文章');
・「window」は省略可能。
〇確認ダイアログ表示(comfirm)
・window.confirm('文章'); / comfirm('文章');
・ユーザーに「OK」か「キャンセル」かの確認を求めるダイアログを表示する。
・ユーザーがどちらを選択したのかを戻り値として受け取れる。
・戻り値は「OK」なら「true」、「キャンセル」なら「false」のboolean型のためif条件式で利用できる。
const result = confirm('本当に削除してよいですか?');
if (result) {
consol.log('削除しました。');
} else {
consol.log('キャンセルしました。');
}
〇指定した秒数後に実行(setTimeout)
・指定したミリ秒数が経過した後に任意の関数を実行する。
・ブラウザを閉じるまで処理が続く。
■asetTimeout(関数名, ミリ秒数);
function delayTask () {
consol.log('1秒後に実行する')
}
setTimeout(delayTask, 1000);
・setTimeout()に渡す関数は関数の名前でなくてはならない。
関数名の後ろに「()」をつけてしまうと、読み込み時に関数を実行してしまう。
○ setTimeout(delayTask, 1000);
× setTimeout(delayTask(), 1000);
・タイマーのキャンセル(clearTimeout)
・setTimeout()を実行するとタイマーを識別する数字(タイマID)が戻り値として返される。
・setTimeout()の戻り値をclearTimeout()に渡すと繰り返し処理を中止できる。
function delayTask () {
consol.log('1秒ごとに繰り返し実行される')
}
const timerId = setInterval(delayTask, 5000);
clearTimeout(timerId);
〇指定した秒数ごとに繰り返し実行(setInterval)
・指定したミリ秒数ごとに任意の関数を繰り返し実行する。
■setInterval(関数名, ミリ秒数)
function delayTask () {
consol.log('1秒ごとに繰り返し実行する')
}
setInterval(delayTask, 1000);
・繰り返しを停止する(clearInterval)
・setInterval()を実行するとタイマーを識別する数字(タイマID)が戻り値として返される。
・setInterval()の戻り値をclearInterval()に渡すと予約実行をキャンセルできる。
function delayTask () {
consol.log('1秒ごとに繰り返し実行される')
}
const timerId = setInterval(delayTask, 1000);
clearInterval(timerId);
◆ウィンドウオブジェクトの種類
メソッド | 機能 | 使用例 |
---|---|---|
・alert | アラート表示 | window.alert(‘文章’); / alert(‘文章’); |
・confirm | 確認ダイアログ表示 | window.confirm(‘文章’); / comfirm(‘文章’); |
・setTimeout | ||
・Math.floor(数字) | 切り捨て | console.log(Math.floor(10.3)); → 「10」 |
・Math.ceil(数字) | 切り上げ | console.log(Math.ceil(10.3)); → 「11」 |
・Math.random() | 0以上1未満のランダム数の生成 | console.log(Math.randam()); → 「0.6774349」 |
サイコロプログラム | console.log(Math.floor(Math.randam() * 6) + 1); | |
・open | ウィンドウを開く | const 変数 = open(‘URL’, ‘ウィンドウ名’, オプション); |
・close | ウィンドウを閉じる(open()で開いたもの限定) | 変数.close(); |
・scrolleTo({位置}) | スクロール位置の操作(top, leftで位置指定) | window.scrolleTo({top: 0, behavior: ‘smooth’}); |
◆Locationオブジェクト
・URLを操作することができる。
・現在のページの再読み込み
location.reroad();
・指定のURLへの遷移
location.href = '任意のURL';
◆Historyオブジェクト
・閲覧履歴(ブラウザの「進む」「戻る」)を操作できる。
・前のページに戻る。
history.back();
・次のページに進む。
history.forward();
・2ページ先に進む。
history.go(2);
・2ページ前に戻る。
history.back(-2);
DOM(DocumentObject Model)
◆要素の指定
〇特定の要素(querySelector)
■document.querySelector('CSSセレクタ')
const element = document.querySelector('.sample');
・引数で指定したCSSセレクタの条件に複数の要素がマッチした場合は最初にマッチした要素を取得する。
・どの要素もマッチしない場合は「null」が返される。
・指定されたHTML要素を取得する。
consol.log(document.querySelector('.sample'));
⇒ 「<div class = "sample">Text</div>」
〇特定のすべての要素(querySelectorAll, NodeList)
■document.querySelectorAll('CSSセレクタ')
const elements = document.querySelectorAll('.sample');
・引数で指定したCSSセレクタの条件にマッチしたすべての要素を取得する。
・複数の要素を取得するため、戻り値は「NodeList」という特殊な配列形式のデータで返される。
・NodeListはlengthプロパティで配列内の数を取得できる。
const elements = document.querySelectorAll('.sample');
consol.log(elements.length));
⇒ 「3」
・インデックスで指定した要素にアクセスする。
const elements = document.querySelectorAll('.sample');
consol.log(elements[0]));
⇒ 「<div class = "sample">Text1</div>」
・取得したすべての要素にそれぞれアクセスする。
const elements = document.querySelectorAll('.sample');
foe (const erement of elements) = {
consol.log(element);
}
⇒ 「<div class = "sample">Text1</div>」
「<div class = "sample">Text2</div>」
「<div class = "sample">Text3</div>」
〇ID名に一致する要素(getElementById)
■document.getElementById('ID名')
const element = getElementsByClassName('name');
・引数にID名を指定して、HTML要素を一つ取得するメソッド。
・querySelector()メソッドとは違い、引数にはセレクターではなくID名のみを指定する(「#」は付けない)。
〇クラス名に一致するすべての要素(getElementsByClassName)
■document.getElementsByClassName('クラス名')
const element = getElementsByClassName('name');
・引数にクラス名を指定して、合致するすべてのHTML要素を取得するメソッド。
・querySelectorAll()メソッドとは違い、引数にはセレクターではなくクラス名のみを指定する(「.」は付けない)。
・複数の要素を取得するため、戻り値は「HTMLCollection」という特殊な配列形式のデータで返される。
・配列の各要素を処理するにはfor文を使う。forEach()メソッドは存在しない。
const elements = document.getElementsByClassName('sample');
foe (let i = 0; i < elements.length; i++ ) = {
consol.log(element[i]);
}
⇒ 「<div class = "sample">Text1</div>」
「<div class = "sample">Text2</div>」
「<div class = "sample">Text3</div>」
◆要素の作成・追加
〇要素の作成(createElement)
・document.createElement('タグの名前');
const element = document.createElement('p');
console.log(element); ⇒ 「<p></p>」
・引数にタグ名を指定するして要素を生成するメソッド。
・.createElement()メソッドを使って要素を生成しても画面上には何も現れない。
・append()メソッドなどを使ってHTMLに追加することではじめてDOM上の要素として扱うことができる。
・InnerHTMLプロパティで中身のHTMLを追加したり、classListプロパティでクラスを操作したりできる。
〇img要素の作成(new Image())
・const 定数名 = new Image();
const container = document.createElement('.container');
for (let i = 0; i < 10; i++) {
const img = new Image();
img.src = `images/photo-${i}.jpg`;
container.appendChild(img);
}
・img要素を生成するメソッド。
・「src」プロパティで画像ファイルの参照元を追加する。
・「new Image();」は「document.createElement('img');」と同じ処理である。
・append()メソッドなどを使ってHTMLに追加することではじめてDOM上の要素として扱うことができる。
〇HTMLコードを要素として追加(insertAdjacentHTML)
・親要素.insertAdjacentHTML('挿入位置', 文字列);
const container = document.querySelector('.container');
const newBox = `<div class="new-box box">.new-box要素</div>`;
setTimeout(() => {
container.insertAdjastHTML('afterbegin', newBox);
}, 3000);
・第1引数の位置に第2引数の文字列をHTMLとして挿入するメソッド。
・挿入先の要素は破壊されない。
■挿入位置
・beforebegin 親要素の直前
・afterbegin 親要素内の先頭
・beforeend 親要素内の末尾
・afterend 親要素の直後
〇子要素の末尾に要素を追加(append)
・親要素.append(追加する要素);
const newElement = document.createElement('p');
newElement.textContent = '新しく追加しました';
const content = document.querySelector('.content');
content.append(newElement);
〇子要素の先頭に要素を追加(prepend)
・親要素.prepend(追加する要素);
const newElement = document.createElement('p');
newElement.textContent = '先頭に追加します';
const content = document.querySelector('.content');
content.prepend(newElement);
〇指定要素の前後に要素を追加(befor, after)
・指定要素.befor(追加する要素);
・指定要素.after(追加する要素);
〇要素の削除(remove)
・削除したい要素.remove();
const firstElement = document.querySelector('.first');
firstElement.remove();
〇要素の置換(replaceWith)
・置換したい要素.replaceWith(置き換える要素);
const newElement = document.createElement('p');
newElement.textContent = '置き換える要素です';
const content = document.querySelector('.content');
content.replaceWith(newElement);
◆要素・属性の変更
〇要素内のテキストの取得・変更(textContent)
■要素.textContent = 'テキスト';
const p = document.querySelector('p');
p.textContent = '変更します';
・要素内のテキストの取得や変更を行うプロパティ。
・要素内のテキストを取得する際、HTMLタグは無視される。
<p id="text">晴れ<soan>(23℃)</span><?div>
⇒ 「晴れ (23℃)」
・textContentにHTMLタグを含んだ文字列を渡しても、文字列としてしか扱われない。
Element.textContent = '気温は<strong>24℃</strong>の予想です。';
⇒ 「気温は<strong>24℃</strong>の予想です。」
〇要素内のHTMLの取得・変更(innerHTML)
■要素.innerHTML = 'HTML';
const p = document.querySelector('p');
p.innerHTML = '気温は<strong>24℃</strong>の予想です。';
⇒ 「気温は24℃の予想です。」
・要素内のHTMLの取得や変更を行うプロパティ。
・テキストだけでなく、タグの書き換えが必要な際に使用する。
〇textContentとinnerHTMLの違い
・textContent 内容のテキストのみをテキスト形式で取得。
・innerHTML 内容のHTMLコンテンツ(タグ・テキスト・HTML要素自体)を全て取得。
〇innerHTMLとinsertAdjacentHTMLの違い
・innerHTML 特定の要素のHTMLコンテンツ全体を置き換えるために使用するプロパティ。
・insertAdjacentHTML 要素に新しいHTMLを追加するためのメソッド。元のコンテンツは保持される。
〇要素の属性の変更
・要素.属性名 = '変更したい値';
const img = document.querySelector('img');
img.width = 300;
〇要素の属性の追加(setAttribute)
・要素.setAttribute('属性名', 値);
const img = document.querySelector('img');
img.setAttribute('data-nav-index', i);
〇カスタムデータ属性(HTML記述)
・date-任意の名前 = "値";
<div data-id="100" data-user-name="zaru"></div>
〇カスタムデータ属性の参照(dataset)
・date-任意の名前 = "値";
<div class="profile" data-id="100" data-user-name="zaru"></div>
const element = document.querySelector('.profile');
consol.log(profile.dataset.id); ⇒ 「100」
consol.log(profile.dataset.userName); ⇒ 「zaru」
・HTMLで「-(ハイフン)」で区切られた単語は、JavaScriptではハイフンを取り除いて、2語目以降の単語の1文字目を大文字に変換する。
「(HTML)user-name」 ⇒ 「(JavaScript)userName」
〇画像ソースの読み込み(src)
・要素名.src = "値";
<img id="myImage" />
const img = document.querySelector('#myImage');
img.src = 'images/photo_a.jpg';
◆CSSの変更
〇要素のスタイルの変更(style)
・要素.style.CSSプロパティ名 = '値';
const p = document.querySelector('p');
p.style.fontSize = '36px';
・CSSで「-(ハイフン)」で区切られたCSSプロパティ名は、JavaScriptではハイフンを取り除いて、2語目以降の単語の1文字目を大文字に変換する。
「(CSS)font-size」 ⇒ 「(JavaScript)fontSize」
〇要素の複数のスタイルの変更(style.cssText)
・要素.style.cssText = 'プロパティ1:値1; プロパティ2:値2; プロパティ3:値3;';
・CSSプロパティ名のハイフンもそのまま使用できる。
〇classの追加(classList.add)
・要素.classList.add('クラス名1', 'クラス名2', 'クラス名3');
const element = document.querySelector('p');
element.classList.add('warning');
〇classの削除(classList.remove)
・要素.classList.remove('クラス名1', 'クラス名2', 'クラス名3');
const element = document.querySelector('p');
element.classList.remove('nomal');
〇classの置換(classList.replace)
・要素.classList.replace('対象クラス名', '置換クラス名');
const element = document.querySelector('p');
element.classList.replace('nomal', 'warning');
〇classの追加or削除(classList.toggle)
・要素.classList.toggle('対象クラス名');
const element = document.querySelector('p');
element.classList.toggle('nomal');
イベント
◆イベントの設定(addEventListener)
〇関数名で指定
■要素.addEventListener('イベント名', 関数名);
element.addEventListener('click', alertMessage);
・関数名を渡す際に「()」をつけない。「()」をつけるとイベント発生時ではなく、イベント定義時に関数が実行される。
・第2引数で渡した関数は「イベントリスナー」や「イベントハンドラ」と呼ばれる。
〇関数式で指定
■要素.addEventListener('イベント名', function () {
関数;
});
◆イベントの削除(removeEventListener)
■要素.removeEventListener('イベント名', 関数名);
element.addEventListener('click', alertMessage);
element.removeEventListener('click', alertMessage);
・関数名に「()」をつけない。
・削除対象の関数名を渡すため、無名関数で定義したaddEventListener()は削除できない。
◆既定の動作の停止(preventDefault)
■イベントオブジェクト.preventDefault()
event.preventDefault();
・<a>タグのクリック時のページ遷移などを停止できる。
・リンクをクリック時に確認ダイアログを表示して、キャンセルした場合はページ遷移を中止する例
const confirmLink (event) {
if (confirm('ページ遷移しますか')) {
console.log('実行しました');
} else {
event.preventDefault();
console.log('キャンセルしました');
}
}
const Link = document.querySelector('a');
Link.addEventListener('click', confirmLink);
◆イベント発生元の要素へのアクセス
〇イベントオブジェクト(引数event)
・予め指定した関数の引数としてイベントに関する情報が自動的にオブジェクト形式で渡される。
・イベント発生時に「クリックされた要素」や「入力されたテキスト内容」などの情報を取得できる。
・addEventListener()に登録する関数に引数を設定するだけで受け取ることができる。(引数に使用した「event」で取得)
button.addEventListener('mouseover', function (event) {
console.log(event);
}); ⇒ 「Mousevent{isTrusted: true, screenX: 1214, screenY: 650, clientX: 1034, clientY: 485, ...}」
〇イベントが発生した要素の取得(currentTarget)
・currentTargetプロパティはイベントが発生した要素を取得する。
・取得内容は「document.querySelector」で取得した場合と同じ状態となる。
取得内容例:<button type="button">ボタン</button>
・ボタンクリックでボタンのテキストを変更する例
const button = document.querySelector('button');
button.addEventListener('click', function (event) {
const button = event.currentTarget;
button.textContent = '変更します';
});
〇currentTargetとtargetの違い
・「currentTarget」は、addEventListenerを設定した要素を取得する。
・「target」は、設定したイベントが発生した要素を取得する。
・通常はcurrentTargetの方が使いやすい。
・buttonタグにspanタグを入れた場合の例(buttonにaddEventListenerを設定)
<button><span>「span要素」</span>「button要素」</button>
○「button要素」をクリックした場合
・currentTarget:<button>要素
・target:<button>要素
○「span要素」をクリックした場合
・currentTarget:<button>要素
・target:<span>要素
〇イベント対象の画像のsrc属性へのアクセス(event.target.src)
・「event.target.src」でimg要素のsrc属性を取得できる。
・取得したsrc属性の変更
mainImage.src = event.target.src;
◆loadイベント
・HTMLのローディングが終わった時に発生する。
■button.addEventListener('load', () => {
console.log('ローディングが終わりました');
});
◆clickイベント
・要素のクリック時に発生する。
■button.addEventListener('click', function () {
console.log('クリックしました');
});
◆inputイベント
・フォームの入力欄にデータが入力されたときに発生する。
・テキスト入力欄、チェックボックス、ラジオボタン、セレクトボックスなどでも使用できる。
■テキスト欄の例
const input = document.querySelector('input');
input.addEventListener('input', function (event) {
const value = event.currentTarget.value;
console.log(`入力内容:${value}`);
});
■ラジオボタンの例(各<input>タグに「.radio」を設定・チェックボックスの場合も同様)
const radios = document.querySelectorAll('.radio');
for (let radio of radios) {
radio.addEventListener('input', function (event) {
const value = event.currentTarget.value;
console.log(`${value}がチェックされました`);
});
■セレクトボックスの例(<select>タグに「.select」を設定)
const select = document.querySelector('.select');
select.addEventListener('input', function (event) {
const value = event.currentTarget.value;
console.log(`${value}が選択されました`);
});
◆chengeイベント
・チェックボックスに変化があったときに発生する。
const isAgreed = document.querySelector('#check');
isAgreed.addEventListener('chenge', function () {
console.log(`チェックされました`);
});
◆transitionendイベント
・CSS Transitionでアニメーションの完了時に発生する。
const element = document.querySelector('.rect');
element.addEventListener('transition', (event) {
console.log(`終了しました`);
});
◆CSS Animations連動イベント
・CSS Animationのイベントに連動して発生する。
■種類
・animationstart アニメーションが開始したときのイベント
・animationiteration アニメーションの繰り返しが発生したときのイベント
・animationend アニメーションが完了したときのイベント
const element = document.querySelector('.rect');
element.addEventListener('animationend', (event) {
console.log(`終了しました`);
});
◆keydown/keyupイベント
・keydownイベントはキーを押したとき、keyupはキーを押してから離したときに発生する。
・引数のイベントオブジェクトのkyeプロパティに押下されたキーの種類が格納される。
・JavaScriptで独自のショートカットを定義する際に使用される。
◆mousemove/mousedown/mouseupイベント
〇mousemoveイベント(offsetX/offsetY)
・マウスを動かしたときに発生するイベント。
・イベントオブジェクトの「offsetX」と「offsetY」プロパティで画面左上を始点とした座標データを取得できる。
・div要素内でのみマウスの位置情報を検知する例
const div = document.querySelector('div');
div.addEventListener('mousemove', function (event) {
console.log(`Move : x = ${event.offsetX}, y = ${event.offsetY}`);
});
〇mousedown/mouseupイベント
・マウスボタンのクリック時に発生するイベント。
・mousedownはマウスボタンを押下したとき、mouseupは押下して離したときに発生する。
◆scrollイベント(scrollX/scrollY)
〇概要
・画面がスクロールするたびに発生するイベント。
・画面全体に関するため「Windowオブジェクト」にイベントを設定する。
〇スクロール量の取得
・スクロール量は「window.scrollY」プロパティで取得できる。
window.addEventListener('scroll', () => {
console.log(`スクロール量は${window.scrollY}pxです`);
});
〇ページサイズの取得
■表示されていない部分も含めたページ全体の高さの取得(scrollHeight)
const pageHeight = document.documentElement.scrollHeight;
■表示されていない部分も含めたページ全体の横幅の取得(scrollWidth)
const pageWidth = document.documentElement.scrollWidth;
■スクロールバーを含まない表示領域の高さの取得(clientHeight)
const viewHeight = document.documentElement.clientHeight;
■スクロールバーを含まない表示領域の横幅の取得(clientWidth)
const viewWidth = document.documentElement.clientWidth;
Web Animations API(animate)
◆書式
・動かす要素.animate(動かす内容, 再生時間);
・動かしたい要素にanimete()メソッドを指定する。
・第1引数に動かす内容(キーフレーム)、第2引数に再生時間を指定して「,(カンマ)」で区切る。
◆キーフレーム(第1引数)の書き方
〇オブジェクト方式
・JavaScriptの文法に合わせて、CSSの「-(ハイフン)」が付くプロパティは「-」を除いて大文字表記(キャメル表記法)にする。
font-size ⇒ fontSize
・値は、基本的には、開始点と終了点の2つを配列方式で指定する。
■animate()メソッドに直接指定
動かす要素.animate({
キー(プロパティ名): ['開始の値', '終了の値'],
}, 再生時間);
■定数に指定して、animate()メソッドに呼び出す
const keyframes = {
キー(プロパティ名): ['開始の値', '終了の値'],
};
動かす要素.animate(keyframes, 再生時間);
〇配列方式
・配列の各要素をアニメーションが動作する位置として、キーフレームごとにオブジェクト形式で記述する。
・一度に動く内容が多い場合に分かりやすい。
■配列方式の書式
const keyframes = [
{
プロパティ1: '開始の値',
プロパティ2: '開始の値',
},
{
プロパティ1: '終了の値',
プロパティ2: '終了の値',
}
];
動かす要素.animate(keyframes, 再生時間);
■配列方式の書式例
const keyframes = [
{ transform: 'rotate(0) scale(1)'},
{ transform: 'rotate(360deg) scale(0)'},
];
text.animate(keyframes, 1000);
〇タイミングの調整(offsetプロパティ)
・デフォルトでは指定したアニメーションは等間隔のタイもイングで実行される。
・「offset」プロパティを指定すると、任意のタイミングで実行できる。
・値は「0.0(実行開始)」から「1.0(終了時)」までの数値で指定する。
・配列方式で記述する方がタイミングが把握しやすい。
const keyframes = [
{
opacity: 1,
offset: 0.8, ← 80%のタイミングから開始する
},
{
opacity: 0,
offset: 1, ← 100%のタイミングで終了する
},
];
text.animate(keyframes, 1000);
◆再生時間(第2引数)の書き方
・オブジェクト形式で指定する。
・アニメーションの再生時間を指定する。
・単位は「ミリ秒」で、1秒の場合は「1000」と指定する。
・繰り返し回数や遅延時間など、再生時間以外のオプション指定ができる。
const keyframes = {
キー(プロパティ名): ['開始の値', '終了の値'],
};
const options = {
キー(プロパティ名): '値',
};
動かす要素.animate(keyframes, options);
・指定できるプロパティ
・duration アニメーションの再生時間。必須項目。ミリ秒で記述する。
・delay アニメーションの開始を遅らせる時間。ミリ秒で記述する。
・direction アニメーションを実行する方向。
・nomal 通常方向で再生(初期値)。
・alternate 奇数回で通常、偶数回で反対方向に再生。
・reverse 逆方向に再生。
・alternate-reverse alternateの逆方向。
・easing アニメーションが変化する速度。
・linear 一定速度。(初期値)。
・ease 開始時と終了時は緩やかに変化。
・ease-in 最初は遅く、だんだん早く変化。
・ease-out 最初は早く、だんだん遅く変化。
・ease-in-out 開始時と終了時はかなり遅く変化。
・steps() 段階ごとに変化。
・cubic-bezier() ベジェ曲線の座標に沿って変化。
・fill アニメーションの再生前後の状態。
・none なし(初期値)。
・forwards 再生後、最後のキーフレームの状態を保持。
・backwards 再生後、最初のキーフレームの状態を適用。
・both forwardsとbackwardsの両方を適用。
・iterations アニメーションを繰り返す回数。初期値は「1」。
・Infinity 無限ループ。Infinityは予約語のため、クォーテーションで囲まず、1文字目は大文字で記述する。
◆querySelectorAllで複数の要素に適用
・querySelectorAll()で取得した要素はNodeListという配列形式で取得される。
・「length」と「for文」で各要素にそれぞれanimeteを指定する。
■すべての「.item-img」要素に適用する例
const itetms = document.querySelectorAll('.img-item');
for (let i = 0; i < items.length; i++) {
const keyframes = {
opasity: [0, 1]
};
const options = {
duration: 600,
fill: 'forwards',
};
items[i].animate(keyframes, options);
};
■すべての「.item-img」要素に適用する例(forEach()メソッド)
const itetms = document.querySelectorAll('.img-item');
items.forEach((item) => {
const keyframes = {
opasity: [0, 1]
};
const options = {
duration: 600,
fill: 'forwards',
};
item.animate(keyframes, options);
});
■すべての「.item-img」要素に適用して1つずつ遅延させる例
const itetms = document.querySelectorAll('.img-item');
for (let i = 0; i < items.length; i++) {
const keyframes = {
opasity: [0, 1]
};
const options = {
duration: 600,
delay: i * 300,
fill: 'forwards',
};
items[i].animate(keyframes, options);
};
◆アニメーション例
〇2秒/opacity
const keyframes = {
opacity: [0, 1],
};
heading..animate(keyframes, 2000);
〇1秒/opacity・transrate
const keyframes = {
opacity: [0, 1],
transrate: ['0 50px', 0],
};
heading..animate(keyframes, 1000);
〇2秒・ease/opacity・transrate
const keyframes = {
opacity: [0, 1],
transrate: ['0 50px', 0],
};
const options = {
duration: 2000,
easing: 'ease',
};
heading..animate(keyframes, options);
〇8秒・無限/4色変化
const keyframes = {
color: ['#f66', '#fc2', '#0c6', '#0bd'],
};
const options = {
duration: 8000,
direction: 'alternate',
iterations: Infinity,
};
heading..animate(keyframes, options);
〇1秒/背景が伸びる見出し
h1 {color: #fff;
display: inline-block;
background-image: liner-gradient(90deg, #0bd, #0bd 50%, #fff 50%, #fff 100%);
background-size: 200% 100%;
padding: .5rem 1rem;
}
const keyframes = {
color: ['transparent', '#fff'],
backgroundPosition: ['100% 0 ', '0 0'],
};
const options = {
duration: 1000,
easing: 'ease',
};
heading..animate(keyframes, options);
Intersection Observer
◆概要・書式
・特定の要素が指定領域に入ったこと(交差)を検知する機能。
・交差を検知すると、事前に指定した関数を呼び出して実行する。
■指定方法の4ステップ
1.実行する関数の定義。
const showKirin = () => {
console.log('キリンさんです')
}
2.新しいIntersection Observerの作成。
const kirinOvserver = new IntersectionObserver();
3.「2」に「1」の関数名を指定する。
const kirinOvserver = new IntersectionObserver(showKirin);
4.observe()メソッドで「2」に監視対象を設定する。
kirinOberver.observe(document.querySelector('#kirin'));
■基本書式
const 関数名 = () => {
(関数)
};
const オブザーバー名 = new IntersectionObserver(関数名, オプション(省略可能));
オブザーバー名.observe(監視対象);
■アニメーション適用書式
const 関数名 = (entries) => {
const keyframes = {
キー1: 値1,
キー2: 値2,
};
const options = {
duration: 時間,
};
entries[0].terget.animate(keyframes, options);
};
const オブザーバー名 = new IntersectionObserver(関数式, オプション(省略可能));
オブザーバー名.observe(監視対象);
◆監視対象の情報取得(引数entries)
・監視対象のサイズや名前、監視エリアに入っているかなどの情報をすべて取得できる。
・Intersection Observerで指定した関数が呼び出されるとき、引数として交差状態に関する情報が含まれる引数が自動的に引き渡される。
・監視対象が複数のときもあるため、情報は配列方式で渡され、配列の各インデックスにオブジェクトとして交差情報が格納される。
・交差した要素の情報にアクセスしたい場合、引数のインデックス番号で指定する。
const showKirin = (entries) => {
console.log(entries[0]);
}
・取得される情報
・boundingClientRect 監視対象要素のサイズや位置。top, botoom, left, right, width, height, X, Yが参照可能。
・intersectionRect 監視対象要素の表示されている部分のサイズや位置。top, botoom, left, right, width, height, X, Y。
・intersectionRatio 監視対象要素が、監視している領域と交差している割合。0~1の数値。
・isIntersection 監視対象要素が、監視している領域に入っているかどうか。
・rootBounds 監視している領域のサイズや位置。top, botoom, left, right, width, height, X, Y。
・target 監視対象の要素。
・time 交差が記録された時刻(ミリ秒)。
・「terget」プロパティで要素の取得
const showKirin = (entries) => {
console.log(entries[0].target);
}
⇒ 「<img src="images/kirin.jpg" id="kirin" alt="キリン">」
◆交差判定のオプション(第2引数)
・要素の交差判定の条件を「new IntersectionObserver()」の第2引数に指定する。
const options = {
root: document.querySelector('#scrollArea'),
rootMargin: '10px',
threshould: 0.8,
};
const observer = new intersectionObserver(callback, options);
・オプションはデフォルト値であれば記述する必要はなく省略できる。
■root
・ターゲットの要素が見えるかどうかを判定するためのベース部分を指定する。
・デフォルトはブラウザの画面(ビューポート)となる。
■roorMargin
・「root」からの距離を指定して、イベントを発生させる位置を調整できる。
・プラスの値の場合、rootの要素が指定値分だけ拡大する(早く発生させたい場合に使用)。
・マイナスの値の場合、rootの要素が指定値分だけ縮小する(遅く発生させたい場合に使用)。
・単位は「px」と「%」のみ使用可能。
・CSSと違い、「0」の場合も「0px」と記述する必要あり。初期値は「0px」。
■threshould
・関数を実行するタイミング(監視対象が見えている割合)を「0~1」で指定する。
・監視対象の見え始めと見え終わりの瞬間が「0」、監視対象の半分通過した時点が「0.5」、すべて見えている状態が「1」となる。
・交差量が「0、50%、100%」のときにそれぞれ関数を呼び出したい場合、「[0, 0.5, 1]」のように配列形式で記述する。
◆監視要素へのアニメーションの適用
・entries[0]のtergetプロパティでHTML要素にアクセスして、animateメソッドを指定する。
const showKirin = document.querySelector('#kirin');
const showKirin = (entries) => {
const keyframes = {
opasity: [0, 1],
translate: ['200px 0', 0],
};
entries[0].terget.animate(keyframes, 600);
};
const kirinOvserver = new IntersectionObserver(showKirin);
kirinOberver.observe(document.querySelector('#kirin'));
◆複数の監視要素へのアニメーションの適用
・querySelectorAllで取得したNodeListの各インデックスへforEach()メソッドでアクセスし、
entry.tergetプロパティでHTML要素にアクセスして、animate()メソッドを指定する。
■フェードインアニメの適用例
const animateFade = (entries, obs) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
entry.target.animate(
{
opacity: [0, 1],
translate: ['0 4rem', 0],
}, {
duration: 2000,
easing: 'ease',
fill: 'forwards',
}
);
obs.unobserve(entry.target);
};
);
};
const fadeObserver = new IntersectionObserver(animateFade);
const fadeElements = document.querySelectorAll('.fadein');
fadeElements.forEach((fadeElement) => {
fadeObserver.observe(fadeElement);
};
◆監視の停止(unobserve)
・監視要素が1度表示されたあとに監視を停止するメソッド。
・コールバック関数の第2引数には、実行しているオブザーバー(定数名)を渡すことができる。
・unobserve()メソッドは、監視開始の「fadeObserver.observe(fadeElement)」のコードと逆の意味となる。
・慣例的にovserverを短くした「obs」が使われる。
■unobserve()メソッドの使用例
const animateFade = (entries, obs) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
entry.target.animate(
{
opacity: [0, 1],
translate: ['0 4rem', 0],
}, {
duration: 2000,
easing: 'ease',
fill: 'forwards',
}
);
obs.unobserve(entry.target);
};
);
};
const fadeObserver = new IntersectionObserver(animateFade);
const fadeElements = document.querySelectorAll('.fadein');
fadeElements.forEach((fadeElement) => {
fadeObserver.observe(fadeElement);
};