Qui perferendis velit et

Eum vitae ut ut

  • In rerum saepe aut molestias
  • Eius distinctio ut sed aut
  • Rerum autem
  • Reprehenderit ea aut quia cumque et
  • Odit non quia veniam repellat sequi


Voluptas aut ut itaque est est et. Perspiciatis at velit optio ut assumenda non

  • Neque nesciunt et omnis ut
  • Tenetur
  • Minus eum

Voluptatem provident eligendi veniam incidunt possimus. Est voluptas culpa nihil nihil. Et nostrum qui ut aut


Nemo quasi laborum ad. Minima nihil quas quae est id aut non

Maxime et maxime temporibus quis illo. Culpa vitae ipsam in nihil magni. Et repellendus repellendus rerum corporis impedit. Et sit dicta molestias velit eos. Et sit a rerum soluta at sapiente. Nam quis omnis nihil deleniti. Dolores omnis vero odit molestiae quisquam alias fugit ea. Labore quaerat voluptatibus ut et iure qui. Vero libero laborum et iste asperiores dolores quod. Deleniti et eum nemo sit ut sequi officia. Qui impedit quo autem et in aut. Beatae nobis maxime iusto accusantium. Nesciunt voluptates quis amet adipisci excepturi. Error est neque debitis sed et error numquam. Ut rerum nemo tempora consequatur. Doloribus fugiat accusantium vero quas qui non ipsam.

Ut quo et at. Consequuntur praesentium ea et rerum voluptatem et dolorem. Iure est magnam est molestiae

Et beatae delectus temporibus odio quae. Laboriosam voluptas aperiam dignissimos consequatur omnis. maxime et ut laudantium Nihil doloremque hic veniam nihil hic. Dolor provident fugiat sed Saepe dolores a natus voluptatem. Molestias a aut veniam doloribus. minus earum earum recusandae sit. Ipsum iure quidem quia officiis Est repellat rerum Quo similique et id et ullam. rerum qui nihil minus. Iusto quo voluptatem doloribus repellat eos. Quaerat mollitia repudiandae. excepturi id aut accusantium est. Non rem ea perferendis harum aperiam. Amet natus rerum fugiat atque a. Voluptatem dicta consectetur dolorum explicabo impedit voluptatibus Et in ullam quis voluptas. Quam est id molestiae. Velit eius atque optio natus. beatae qui quaerat. excepturi eligendi et eius eius. Aliquid natus nulla asperiores vero voluptates. Numquam facere et dolorum. sunt consectetur non recusandae omnis. Harum est dolores. Voluptatem ducimus sapiente provident hic voluptas.

Quia aut modi expedita aut. Nulla officia ab porro praesentium

Reiciendis iure mollitia qui sed repellendus cupiditate sunt. Molestias dolores pariatur commodi omnis dolorem libero rerum beatae. Blanditiis animi voluptatibus tempora aut minus laborum. Mollitia dolor eos rerum ipsam est praesentium amet. Delectus officiis non suscipit dolor in. Rerum suscipit cupiditate optio repellendus sit velit qui. Necessitatibus in doloribus qui consequatur autem qui sed. Temporibus quibusdam reprehenderit consequatur ullam facilis. Voluptas esse magnam distinctio a totam. Doloremque suscipit ipsam ut ut enim. Aut ex aliquam autem saepe. Eos sit corrupti inventore consequuntur distinctio. Ut qui fuga quos et veniam. Et tenetur quia aut commodi et fuga nemo. Eum maiores voluptatem necessitatibus voluptatibus magni atque consequatur. Praesentium repellendus aut ut excepturi sint amet quibusdam. Pariatur et inventore libero et. Nihil et velit a eum sit et qui. Eius et beatae modi sit dolor harum magnam commodi. Unde nihil dignissimos omnis tempore quos consequuntur. Dolores quam quisquam tempora minima nihil esse nihil nesciunt. Doloremque distinctio earum voluptatem harum non aspernatur. Corporis quas ea et modi. Est voluptate adipisci earum. Modi quis veritatis hic ipsum. Dolore adipisci temporibus sapiente quia totam ut rerum. Aut incidunt blanditiis esse deserunt in asperiores. Nostrum corrupti expedita voluptates unde quis. Veniam voluptate debitis id et autem dolorum aut velit. Autem quam qui maiores illum beatae dolor porro laborum. Nemo veritatis quisquam quia dolorem quo voluptatem vitae at. Ipsam non perspiciatis ut. Ullam officia consectetur similique voluptatem maiores. Sed sunt eveniet velit.

  • Et sapiente odio
  • Consequatur praesentium enim corporis
  • Ducimus et aliquid ut quod
  • Optio quos sunt quidem
  • Vero aut quaerat cum qui
  • Non praesentium maxime qui vel autem
  • Molestiae ea

aaaaa

aaaa

あいうえお
かきくけこ
さしすせそ

あいうえお
かきくけこ
さしすせそ

あいうえお
かきくけこ
さしすせそ

あいうえお
かきくけこ
さしすせそ

あいうえお
かきくけこ
さしすせそ

あいうえお
かきくけこ
さしすせそ

あいうえお
かきくけこ
さしすせそ

あいえお
かきくけこ
さしすせそ

  • aaaa
  • ああああ
  • いいいい
  • aaaaa
  • gggg
  • ああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ
  • aiueo
  • かきくけこ
  • さしすせそあああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ
  • aaaa
  • ききき
  • かきこああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ
  • よよよ
  • aaaa
  • bbbb
  • aaaaaaaaaaaaaaaaaああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ
  • yyyyy
  • あああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ
ああああうううう
ささいうえ
aaaa
aaaaaaa
bbbbbああああううううう
ああああ
ううううあああああああああああああああああああああああああああああ
ああああいいいい
うううういいい
import { gsap } from "gsap";
import { ScrollTrigger } from "gsap/ScrollTrigger";
import { ScrollToPlugin } from "gsap/ScrollToPlugin";

// 定数読み込み
import { GSAP_DEFAULT } from "./constants";

/**
 * 全ページ共通のJavaScript
 */
document.addEventListener("DOMContentLoaded", () => {
  // // GSAPプラグインの登録
  gsap.registerPlugin(ScrollTrigger, ScrollToPlugin);

  /**
   * ハンバーガーボタン
   * @type {HTMLElement | null}
   */
  const hamburgerButton = document.querySelector(".l-header__hamburger-button");

  /**
   * SPナビゲーションメニューを閉じるボタン
   * @type {HTMLElement | null}
   */
  const spNavCloseButton = document.querySelector(".l-header__nav-close-button");

  /**
   * SP表示時のヘッダー内の検索ボタン
   * @type {HTMLElement | null}
   */
  const spSearchButton = document.querySelector(".l-header__sp-search-button");

  /**
   * 検索フォームラッパー
   * @type {HTMLElement | null}
   */
  const searchWrapper = document.querySelector(".l-header__search-wrapper");

  /**
   * SPナビゲーションメニューラッパー
   * @type {HTMLElement | null}
   */
  const spNavWrapper = document.querySelector(".l-header__sp-nav-wrapper");

  /**
   * カテゴリーラッパー
   * @type {HTMLElement | null}
   */
  const categoryWrapper = document.querySelector(".l-header__category-wrapper");

  /**
   * トップへ戻るボタン
   * @type {HTMLElement | null}
   */
  const pagetopButton = document.querySelector("#js-pagetop");

  /**
   * SPナビゲーションメニューを開く
   */
  const openSpMenu = () => {
    spNavWrapper?.classList.add("is-open");

    // メニューを開いた時にスクロールを禁止
    document.body.style.overflow = "hidden";
  };

  /**
   * SPナビゲーションメニューを閉じる
   */
  const closeSpMenu = () => {
    spNavWrapper?.classList.remove("is-open");

    // メニューを閉じた時にスクロールを元に戻す
    document.body.style.overflow = "";
  };

  /**
   * SP検索フォームを開く
   */
  const openSpSearchForm = () => {
    spSearchButton?.classList.add("is-open");
    searchWrapper?.classList.add("is-open");
  };

  /**
   * SP検索フォームを閉じる
   */
  const closeSpSearchForm = () => {
    spSearchButton?.classList.remove("is-open");
    searchWrapper?.classList.remove("is-open");
  };

  /**
   * SP検索フォームの開閉制御
   */
  const toggleSpSearchForm = () => {
    const isOpen = spSearchButton?.classList.contains('is-open');

    if (isOpen) {
      closeSpSearchForm();
    } else {
      openSpSearchForm();
    }
  };

  /**
   * ハンバーガーボタンのイベント初期化
   */
  const initHamburgerButton = () => {
    hamburgerButton?.addEventListener("click", openSpMenu);
  };

  /**
   * SPナビゲーションメニュー閉じるボタンのイベント初期化
   */
  const initSpNavCloseButton = () => {
    spNavCloseButton?.addEventListener("click", closeSpMenu);
  };

  /**
   * SP検索ボタンのイベント初期化
   */
  const initSpSearchButton = () => {
    spSearchButton?.addEventListener("click", toggleSpSearchForm);
  };

  /**
   * SPナビゲーションメニュー内のリンククリック時にメニューを閉じる
   */
  const initSpNavLinks = () => {
    const navLinks = document.querySelectorAll('.l-header__sp-nav-link');
    navLinks.forEach(link => {
      link.addEventListener('click', () => {
        if (spNavWrapper?.classList.contains('is-open')) {
          closeSpMenu();
        }
      });
    });
  };

  /**
   * デバウンス関数(連続して発火するイベントを間引きする)
   * @param {Function} func - 実行したい関数
   * @param {number} wait - 待機するミリ秒
   */
  const debounce = (func, wait) => {
    let timeout;
    return (...args) => {
      clearTimeout(timeout);
      timeout = setTimeout(() => {
        func(...args);
      }, wait);
    };
  };

  /**
   * ウィンドウリサイズ時の処理
   */
  const handleResize = () => {
    //  CSSのメディアクエリと判定が一致するように、matchMedia を使う
    if (window.matchMedia("(min-width: 1024px)").matches) {

      // SPメニューが開いていたら閉じる
      if (spNavWrapper?.classList.contains("is-open")) {
        closeSpMenu();
      }

      // SP検索フォームが開いていたら閉じる
      if (searchWrapper?.classList.contains("is-open")) {
        closeSpSearchForm();
      }
    }
  };

  /**
   * リサイズイベントの初期化
   */
  const initResizeEvent = () => {
    // 250ミリ秒(0.25秒)操作が止まったら handleResize を実行する
    window.addEventListener("resize", debounce(handleResize, 250));
  };

  /**
   * SPナビゲーションのメニュー外(背景部分)をクリックした時に閉じる
   */
  const initSpNavWrapperClick = () => {
    spNavWrapper?.addEventListener("click", (e) => {
      // クリックされた対象(e.target)が、spNavWrapper 自身(ぼやけている背景部分)だった場合のみ閉じる
      if (e.target === spNavWrapper) {
        closeSpMenu();
      }
    });
  };

  /**
   * スクロール時処理
   */
  const handleScroll = () => {
    // スクロール量
    const scrollAmount = window.scrollY;

    // 300px以上スクロールしている時に「トップへ戻るボタン」を表示させる
    if (scrollAmount >= 300) {
      pagetopButton?.classList.add("is-active");
    } else {
      pagetopButton?.classList.remove("is-active");
    }
  };

  /**
   * スクロールイベントの初期化
   */
  const initScrollEvent = () => {
    window.addEventListener("scroll", handleScroll);
  };

  /**
   * トップへ戻るボタンのクリックイベント
   * ScrollToPluginを使用して滑らかにスクロールさせる
   */
  const initBackToTop = () => {
    pagetopButton?.addEventListener('click', () => {
      gsap.to(window, {
        ...GSAP_DEFAULT,
        scrollTo: {
          y: 0,
          autoKill: true, // 途中でユーザーの操作があればスクロール動作を止める
        },
      });
    });
  };

  /**
   * 全体の初期化処理
   */
  const init = () => {
    initHamburgerButton();
    initSpNavCloseButton();
    initSpSearchButton();
    initSpNavLinks();
    initResizeEvent();
    initSpNavWrapperClick();
    initScrollEvent();
    initBackToTop();
  };

  init();
});

abcdefgaaaa

あいうえお

あああああ

Prev
Next