分割そして挿入

Web


Warning: Attempt to read property "site_name" on bool in /home/goodhokkaido/sixwheel.net/public_html/muguruma/wp/wp-content/themes/frame/functions.php on line 208

Warning: Attempt to read property "title" on bool in /home/goodhokkaido/sixwheel.net/public_html/muguruma/wp/wp-content/themes/frame/functions.php on line 211

Warning: Attempt to read property "description" on bool in /home/goodhokkaido/sixwheel.net/public_html/muguruma/wp/wp-content/themes/frame/functions.php on line 217

Warning: Attempt to read property "site_name" on bool in /home/goodhokkaido/sixwheel.net/public_html/muguruma/wp/wp-content/themes/frame/functions.php on line 208

Warning: Attempt to read property "title" on bool in /home/goodhokkaido/sixwheel.net/public_html/muguruma/wp/wp-content/themes/frame/functions.php on line 211

Warning: Attempt to read property "description" on bool in /home/goodhokkaido/sixwheel.net/public_html/muguruma/wp/wp-content/themes/frame/functions.php on line 217

swiperの.swiper-slideを動的に追加する

案件で、カルーセルのような動きを実装する必要がありそうだったので、ネットで調べました。発見があったので、メモ。ヒーローエリアではない、ちょっとしたスライド項目があり、どう実装しようか思案。既にヒーローエリアで導入されていたので、カスタマイズも可能なswiperを使用することにしました。その際、.swiper-slideを動的に追加する必要があり、試行錯誤すること数日。下記を参考に配列を分割し、divに挿入して、なんとか動きました。

もっと見るボタンをつくったjsを流用して作成します。下記js以外にも、html、css、jsが必要ですが、それらは割愛。swiperが動く環境であれば、大丈夫なハズです。jsが長いので、編集の都合により、分割します。本来は下記すべて同じ、jsに記載されます。前半は.swiper-slideを格納する.swiper-wrapperの取得、外部からのデータ取り込みを行っています。numberは一つのdiv.swiper-wrapperにいくつ表示するかの設定です。

const listArea = document.querySelector(".swiper-wrapper");
const number = 3;

getData()
  .then((list) => {
    displayList(list);
  })
  .catch((err) => {
    console.log(err);
  });

async function getData() {
  const data = await fetch(
    "https://url"
  );
  return await data.json();
}

後半は表示の制御。参考にしたブログのように、配列をnumberの数にあわせて再構成し、[0]{1, 2, 3}[1]{1,2,3}・・・のような感じ整形します。その配列の数だけ、divを作り、クラスにswiper-slideを付与。1つの配列に3つのオブジェクトが入っているので、それらをhtml化し顕現させdivに追加、最後にswiper-wrapperにぶち込んでやるだけ。n個に分割するロジックを参考にすると、案外簡単にできました。あっ、displayListにawaitが無い。なんで、まともに動いているんだろう。そして、エスケープを今回も忘れました。

async function displayList(list) {
  const length = Math.ceil(list.length / number);
  const processingList = new Array(length).fill().map((_, i) => {
    return list.slice(i * number, (i + 1) * number);
  });

  processingList.forEach((items) => {
    const divTag = document.createElement("div");
    divTag.className = "swiper-slide";
    const box = items
      .map((item) => {
        return `
        <section class="list__box">
          <figure class="opacityTargets" class="listImg__wrap">
            <img src="${item.image}" alt="${item.title}" class="listImg__img" />
          </figure class="opacityTargets">
          <div class="listTxt__wrap">
            <h2 class="listTxt__ttl">${item.title}</h2>
            <p class="listTxt__txt">${item.text}</p>
          </div>
        </section>
      `;
      })
      .join("");
    divTag.innerHTML += box;
    listArea.appendChild(divTag);
  });
}

コメント