📑

【Shopify オリジナル構築②】 『ポップアップ(モーダル)表示』の実装

2023/03/08に公開3

サイトにアクセスすると、画像のポップアップが表示されるものがあります。
「セールス情報」や「注意事項」などを、お客様に伝えることができます。

Web Storageについて

ポップアップ表示は、アクセスした際の1回のみ表示されれば良いです。

その仕様を実装するために、今回はアクセス記録をWeb Storageを使用していきます。
Web Storageは、JavaScript を用いてブラウザにデータを保存できるものです。
Web Storageは、local Storagesession Storageの2種類があります。
local Storage:ブラウザを閉じても持続(サイトを閉じても記録が残る)
session Storage:ブラウザを開いてる間のみ記録される(サイトを閉じれば記録が切れる)
Web Storageは、保存・取得・削除・初期化の4種類あります。
※具体的なコードは省略します。

仕様について

今回は、サイトにアクセスしてサイトの画像などの読み込みがすべて終わった1秒後に表示させる仕様です。

1秒後に表示させる仕様
  window.addEventListener('load', () => {
    setTimeout(() => {
      //処理
    }, 1000);
  });

ファイルの作成

今回は、新しいセクションファイルとして作成します。
コードを編集 > セクション > 新しいセクションを追加する
ファイル名をmodal-display.liquidとします。

コードについて

HTML、CSS、JavaScript、Liquid(schema)のコードはこちらです。

HTMLコード
<div class="modal-display-wrapper">
  <div class="image-wrapper">
    <img
      src="{{ section.settings.image | image_url: width: 1000 }}"
      loading="lazy"
      alt="{{ section.settings.image.alt | escape }}"
    >
    <span class="close-btn">×</span>
  </div>
</div>
CSS
  .modal-display-wrapper {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background-color: rgba(0, 0, 0, 0.5);
    z-index: 3;
    display: flex;
    justify-content: center;
    align-items: center;
    opacity: 0;
    visibility: hidden;
    transition: all 0.3s ease;
  }
  
  .modal-display-wrapper.active {
    opacity: 1;
    visibility: visible;
  }

  .modal-display-wrapper > .image-wrapper {
    position: relative;
    height: 70%;
  }
  
  @media screen and (max-width: 750px) {
    .modal-display-wrapper > .image-wrapper {
      height: unset;
      width: 85%;
    }
  }

  .modal-display-wrapper > .image-wrapper > img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    vertical-align: bottom;
  }
  
  .modal-display-wrapper > .image-wrapper > .close-btn {
    position: absolute;
    width: 30px;
    height: 30px;
    top: -15px;
    right: -15px;
    line-height: 30px;
    background-color: #ffffff;
    border-radius: 50%;
    text-align: center;
    cursor: pointer;
    font-size: 30px;
  }
JavaScriptのコード
  const targetmodal = document.querySelector('.modal-display-wrapper');
  const sessionStrageKey = 'modal-display';
  const sessionStrageValue = 'on';
  const closeBtn = document.querySelector('.close-btn');

  window.addEventListener('load', () => {
    if (!sessionStorage.getItem(sessionStrageKey)) {
    //sessionStrageに記録されているかで分岐
      sessionStorage.setItem(sessionStrageKey, sessionStrageValue);
      setTimeout(() => {
        targetmodal.classList.add('active');
      }, 1000);
    }
  });
  closeBtn.addEventListener('click', () => {
    targetmodal.classList.remove('active');
  });
Liquid(schema)
{
  "name": "モーダル表示",
  "settings": [
    {
      "type": "image_picker",
      "id": "image",
      "label": "画像"
    }
  ]
}

動作確認

PC版、スマホ版ともにキレイに表示されていますね!
https://youtu.be/_RWf1kc4siY

Shopifyの構築を承ります!

Shopifyで実装したいデザインなどがござましたら、お気軽にご相談、お問い合わせくださいませ!

Discussion

北ロク北ロク

こうすけさん、はじめまして。
北ロクと申します。よろしくお願いします。
Zenn&shopifyともに初心者なもので、、
以下、失礼お許しください。
もしよろしければ、、
ご教示いただけますと幸いです。

さて、
shopifyにモーダルをつけたいと思って
ググっておりましたところ、こちらにたどり着きました。
記事非常に参考になります。ありがとうございます。

私もDawnで試してみるのですが、
テーマのカスタイマイズで、セクションの選択肢に
「モーダル表示」を出すことができず、、、

そもそもliquidに対する理解が浅いもので、
上記記事内でご紹介頂いているソースで
html,script,schemaを以下のように「modal-display.liquid」に書き込んで、
〜〜〜〜
<div class="modal-display-wrapper">
<div class="image-wrapper">
<img src="{{ section.settings.image | image_url: width: 1000 }}" loading="lazy" alt="{{ section.settings.image.alt | escape }}">
<span class="close-btn">×</span>
</div>
</div>

<script>
const targetmodal = document.querySelector('.modal-display-wrapper');
const sessionStrageKey = 'modal-display';
const sessionStrageValue = 'on';
const closeBtn = document.querySelector('.close-btn');

window.addEventListener('load', () => {
if (!sessionStorage.getItem(sessionStrageKey)) {
//sessionStrageに記録されているかで分岐
sessionStorage.setItem(sessionStrageKey, sessionStrageValue);
setTimeout(() => {
targetmodal.classList.add('active');
}, 1000);
}
});
closeBtn.addEventListener('click', () => {
targetmodal.classList.remove('active');
});
</script>

{% schema %}
{
"name": "モーダル表示",
"settings": [
{
"type": "image_picker",
"id": "image",
"label": "画像"
}
]
}
{% endschema %}
〜〜〜〜
cssはbase.cssに追加してみました。

これでは、うまくいかず、、、
根本的に、誤っているところが理解できませんで
当コメントを書き込んでおります。

お手すき、お時間よろしければ
ご教示の程、よろしくお願い致します。

こうすけこうすけ

北ロク様

コメントありがとうございます。

この記事が少しでもお役に立てますと幸いです。

さて、セクションの追加一覧に表示させる件ですが、
"presets"の記述が必須です。

schemaタグを、このように記述すれば表示されると思います。

{% schema %}
 {
  "name": "モーダル表示",
  "settings": [
   {
    "type": "image_picker",
    "id": "image",
    "label": "画像"
   }
  ],
  "presets": [
   {
    "name": "モーダル表示"
   }
  ]
}
{% endschema %}

ぜひご確認ください!

北ロク北ロク

こうすけさま
本当にありがとうございます!!
実装に成功することができました!(TTうれし涙
本当に助かりました。
これからも沢山の記事拝見させて下さい。
ありがとうございました!!