チュートリアル
ページ毎の制御

ページ毎の制御を実装しよう

各ページに異なるメッシュを配置し、それぞれに特定の制御を加えたい場合は多々あります。 そのような場合、ページごとの処理を個別のファイルに分けて記述します。

ページ毎に制御を変えたい場合は以下の手順で行ってください。

ページ毎に異なる制御を実装する手順

JS ファイルの作成と配置

src/scripts/page はページ毎に異なる処理を記述するための JS ファイルを格納するためのフォルダです。 例えば、ページの種類が2種類(トップページと下層ページ)ある場合は home.js と detail.js を上記のフォルダに作成します。

src/scripts/page/home.js
export default async function () {
  console.log("home.jsが実行されました。");
}
src/scripts/page/detail.js
export default async function () {
  console.log("detail.jsが実行されました。");
}
💡

page フォルダ内の JS で default export された関数が negl 内部で自動的に実行されます。この実行タイミングは negl 内部の初期化処理(three.js の初期化やエフェクトの作成など)が全て完了した後となります。

config.resolver.page の設定

先程作成した js ファイルを index.js から読み込みます。読み込むためには config.resolver.page プロパティに pageResolver 関数を設定(1-A)するか、オブジェクト(1-B)を設定します。1-Aを使うためには Vite で動かす必要があるため、注意してください。

index.js
// 1-A. ダイナミックインポートでページを読み込む関数を渡す場合
// * page フォルダに配置したJSファイルが自動的に読み込まれるため、Viteを使う場合はこちらがおススメです。
const pageResolver = (type) => import(`./page/${type}.js`);
 
// 1-B. 静的インポートで読み込む場合
// import * as home from "./page/home";
// import * as detail from "./page/detail";
 
(async () => {
  const { start } = setup({
    resolver: {
      // 1-Aの時は以下のように設定
      page: pageResolver,
      // 1-Bの場合は以下のように設定
      // page: { home, detail },
    },
  });
  const negl = await start();
  negl.renderStart();
})();
💡pageResolver 関数は何をしてるの?

.page-containerdata-pageに値を設定

ここまででページが読み込まれたタイミングで実行する処理を登録しました。あとは、どのページが読み込まれたのかを目印として HTML に埋め込みます。.page-containerクラスが付いている DOM 要素にページが読み込まれた時に実行したい js のファイル名を設定してください。

index.html
<!-- トップページでhome.jsを実行したい場合 -->
<div class="page-container" data-page="home"></div>
detail.html
<!-- detail.html(下層ページ)でdetail.jsを実行したい場合 -->
<div class="page-container" data-page="detail"></div>

これでページが読み込まれたタイミングで自動的にコードが実行されます。

これで一通り記述が完了しました。画面で/index.html を開くとコンソールにhome.jsが実行されました。とログが表示されているはずです。また、detail.html を作成し上記の通り設定すれば、同様にdetail.jsが実行されました。とログが表示されます。

💡ページ毎の処理実行前にneglを使用した処理を行いたい場合
💡html ファイルを追加した際のViteの設定