jQueryからVanilla JS（ピュアなJavaScript）に書き換える時によく使うもの

Vanilla JSとは素のJavaScript、すなわち純粋なJavaScriptのことを言います。
jQueryで記述していたコードをVanilla JSに書き換える時によく使うものをまとめてみました。

# セレクタ
## IDセレクタ
ID名で要素を指定する。

**構文**
```JavaScript:jQuery
jQuery('#id')
```

```JavaScript:JavaScript
document.getElementById(id)
```

**記述例**
ID名「`header`」の要素を指定する。
```JavaScript:jQuery
$('#header')
```

```JavaScript:JavaScript
document.getElementById('header')
```

<br>

## クラスセレクタ
クラス名で要素を指定する。

**構文**
```JavaScript:jQuery
jQuery('.class')
```

```JavaScript:JavaScript
document.getElementsByClassName(names)
```

**記述例**
クラス名「`listItem`」の要素を指定する。
```JavaScript:jQuery
$('.listItem')
```

```JavaScript:JavaScript
document.getElementsByClassName('listItem')
```
:::note info
上記例では`listItem`クラスを持つすべての要素を取得します。
:::

<br>

## 要素セレクター
タグ名で要素を指定する。

**構文**
```JavaScript:jQuery
jQuery('element')
```

```JavaScript:JavaScript
document.getElementsByTagName(name)
```

**記述例**
タグ名「`div`」の要素を指定する。
```JavaScript:jQuery
$('div')
```

```JavaScript:JavaScript
document.getElementsByTagName('div')
```

<br>

# Attributes
## attr
属性の値を設定する。

**構文**
```JavaScript:jQuery
.attr(attributeName, value)
```

```JavaScript:JavaScript
element.setAttribute(name, value)
```

**記述例**
ID名「`menu`」の要素の「`title`」属性に「`メニュー`」を指定する。
```JavaScript:jQuery
$('#menu').attr('title', 'メニュー')
```

```JavaScript:JavaScript
document.getElementById('menu').setAttribute('title', 'メニュー')
```

<br>

# 操作系
## 要素の追加
**構文**
```JavaScript:jQuery
.append(content [,content])
```

```JavaScript:JavaScript
appendChild(aChild)
```

**記述例**
ID名「`menu`」の要素内に「`div`」タグを追加する。
```JavaScript:jQuery
$('#menu').append($('<div/>'))
```

```JavaScript:JavaScript
document.getElementById('menu').appendChild(document.createElement('div'))
```

<br>

## 要素の削除
**構文**
```JavaScript:jQuery
.remove([selector])
```

```JavaScript:JavaScript
remove()
```

**記述例**
ID名「`menu`」の要素を削除、クラス名「`listItem`」の要素を削除する。
```JavaScript:jQuery
$('#menu').remove()
$('.listItem').remove()
```

```JavaScript:JavaScript
document.getElementById('menu').remove()
document.querySelectorAll('.listItem').forEach(element => element.remove())
```

<br>

## CSSクラスの追加
**構文**
```JavaScript:jQuery
.addClass(className)
```

```JavaScript:JavaScript
add(token)
```

**記述例**
ID名「`header`」の要素にクラス名「`scrolled`」を追加、クラス名「`item`」の要素全てにクラス名「`show`」を追加する。
```JavaScript:jQuery
$('#header').addClass('scrolled');
$('.item').addClass('show');
```

```JavaScript:JavaScript
document.getElementById('header').classList.add('scrolled');
document.querySelectorAll('.item').forEach(element => element.classList.add('show'));
```

<br>

## CSSクラスの削除
**構文**
```JavaScript:jQuery
.removeClass(className)
```

```JavaScript:JavaScript
remove(token)
```

**記述例**
ID名「`header`」の要素のクラス名「`scrolled`」を削除、クラス名「`item`」の要素全てからクラス名「`show`」を削除する。
```JavaScript:jQuery
$('#header').removeClass('scrolled');
$('.item').removeClass('show');
```

```JavaScript:JavaScript
document.getElementById('header').classList.remove('scrolled');
document.querySelectorAll('.item').forEach(element => element.classList.remove('show'));
```

<br>

## toggle
指定したクラス名のオン（設定）、オフ（削除）の切り替えを行う。

**構文**
```JavaScript:jQuery
.toggleClass(className)
```

```JavaScript:JavaScript
toggle(token)
```

**記述例**
ID名「`menu`」の要素にクラス名「`menu_show`」の追加と削除を交互に行う。
```JavaScript:jQuery
$('#menu').toggleClass('menu_show');
```

```JavaScript:JavaScript
document.getElementById('menu').classList.toggle('menu_show');
```

<br>

# イベント系
## DOMの読み込みが終わった時に発火するイベント
DOMの読み込みが終わったら何かをさせたい時の記述例

```JavaScript:jQuery
$(document).ready(function () {
    // 〜 処理 〜
});
```

```JavaScript:JavaScript
document.addEventListener('DOMContentLoaded', () => {
    // 〜 処理 〜
});
```

<br>

## 画像を含むすべての要素の読み込みが終わった時に発火するイベント
画像を含むすべての要素の読み込みが終わったら何かをさせたい時の記述例

```JavaScript:jQuery
$(window).on('load', function() {
    // 〜 処理 〜
});
```

```JavaScript:JavaScript
window.addEventListener('load', event => {
    // 〜 処理 〜
});
```

<br>

## クリックイベント
クリックした時に何かをさせたい場合の記述例

```JavaScript:jQuery
$('#button').on('click', function () {
    // 〜 処理 〜
});
```

```JavaScript:JavaScript
document.getElementById('button').addEventListener('click', () => {
    // 〜 処理 〜
});
```

<br>

## スクロールイベント
スクロールした時に何かをさせたい場合の記述例

```JavaScript:jQuery
$(window).scroll(function () {
    // 〜 処理 〜
});
```

```JavaScript:JavaScript
window.addEventListener('scroll', () => {
    // 〜 処理 〜
});
```

<br>

# 小技
## 親要素の取得
```JavaScript:jQuery
$('#menu').parent()
```

```JavaScript:JavaScript
document.getElementById('menu').parentNode
```

<br>

## スクロールしたピクセル数の取得
```JavaScript:jQuery
var scroll = $(window).scrollTop();
```

```JavaScript:JavaScript
let scroll = document.scrollingElement.scrollTop;
```

<br>

## ページ内リンクをクリックするとスクロールして移動する
```JavaScript:jQuery
$(document).on('click', 'a[href^="#"]', function (e) {
    e.preventDefault();

    var anchor = $(this).attr('href');
    var content = $(anchor == '#' || anchor == '' ? 'html' : anchor);
    var position = content.offset().top;

    $('html,body').animate({
        scrollTop: position
    }, 400, 'swing');
});
```

```JavaScript:JavaScript
const easing = {
  easeInOut: (t) => t < .5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1
}

const duration = 500;

document.querySelectorAll('a[href^="#"]').forEach(element => {
    element.addEventListener('click', (event) => {
        event.preventDefault();

        let anchor = event.target.hash;
        let content = document.querySelector(anchor == "#" || anchor == "" ? 'html' : anchor);
        let currentPos = document.documentElement.scrollTop || document.body.scrollTop;

        let startTime = performance.now();

        /**
         * loop function
         *
         */
        let loop = (nowTime) => {
            let time = nowTime - startTime;
            let normalizedTime = time / duration;

            if (normalizedTime < 1) {
                window.scrollTo(0, currentPos + ((content.offsetTop - currentPos) * easing.easeInOut(normalizedTime)));
                requestAnimationFrame(loop);

            } else {
                window.scrollTo(0, content.offsetTop);
            }
        }

        requestAnimationFrame(loop);
    });
});
```

<br>

## スクロール位置により要素（ページの先頭へリンク等）をフェードイン / フェードアウト表示
```JavaScript:jQuery
$(document).ready(function () {
    var $element = $('#pageTop');
    $element.hide();

    $(window).scroll(function () {
        $(this).scrollTop() > 1000 ? $element.fadeIn(500) : $element.fadeOut(500);
    });
});
```

```JavaScript:JavaScript
document.addEventListener('DOMContentLoaded', () => {
    /**
     * fadeIn function
     * フェードイン
     *
     * @param  {Element} element    セレクター（DOM要素を指定）
     * @param  {number}  duration   トランジッションの実行にかかる所要時間
     */
    const fadeIn = (element, duration) => {
        if (element.style.opacity == '1') return;

        element.style.cssText = 'display: block; opacity: 0; transition: opacity ' + duration + 'ms;';

        setTimeout(() => {
            element.style.opacity = 1;
        }, 1);
    }

    /**
     * fadeOut function
     * フェードアウト
     *
     * @param  {Element} element    セレクター（DOM要素を指定）
     * @param  {number}  duration   トランジッションの実行にかかる所要時間
     */
    const fadeOut = (element, duration) => {
        if (element.style.opacity == '0') return;

        element.style.cssText = 'opacity: 1; transition: opacity ' + duration + 'ms;';

        setTimeout(() => {
            element.style.opacity = 0;
        }, 1);

        setTimeout(() => {
            element.style.display = 'none';
        }, duration + 10);
    }


    // ページの先頭へリンクのスクロールイベント
    const element = document.getElementById('pageTop');
    element.style.display = 'none';

    window.addEventListener('scroll', event => {
        (document.documentElement.scrollTop || document.body.scrollTop) > 1100 ? fadeIn(element, 500) : fadeOut(element, 500);
    });

    // ページ描画時のスクロール位置によるリンクの表示設定のためスクロールイベントを強制発火
    window.dispatchEvent(new Event('scroll'));
});
```

<br>

## スクロール時のヘッダー表示を制御する
スクロールするとヘッダーを固定表示にしたりデザインを変更したい場合
```JavaScript:jQuery
$(document).ready(function () {
    var $element = $('#header');
    var className = 'scrolled';

    // スクロール位置によっては背景が透明になるので、初回時に実行
    headerChange();

    $(window).scroll(function () {
        headerChange();
    });

    function headerChange() {
        $(window).scrollTop() > 0 ? $element.addClass(className) : $element.removeClass(className);
    }
});
```

```JavaScript:JavaScript
document.addEventListener('DOMContentLoaded', () => {
    const header = document.getElementById('header');
    const className = 'scrolled';

    /**
     * headerChange function
     * 画面のスクロール位置によってヘッダーの表示方法を切り替える
     */
    const headerChange = () => document.scrollingElement.scrollTop > 0 ? header.classList.add(className) : header.classList.remove(className);


    // スクロール位置が0以外の場合もあるので初回時に実行
    headerChange();

    // スクロールイベント発生時に実行
    window.addEventListener('scroll', headerChange);
});
```

# まとめ
コード量が増えるもののjQueryを使わなくても純粋なJavaScriptのみで記述できる場合もありますので、他のライブラリへの移行やjQueryを使わずに既存コードを書き換える際の参考になりましたら幸いです。