📑
【Shopify オリジナル構築②】 『ポップアップ(モーダル)表示』の実装
サイトにアクセスすると、画像のポップアップが表示されるものがあります。
「セールス情報」や「注意事項」などを、お客様に伝えることができます。
Web Storageについて
ポップアップ表示は、アクセスした際の1回のみ表示されれば良いです。
その仕様を実装するために、今回はアクセス記録をWeb Storage
を使用していきます。
Web Storage
は、JavaScript を用いてブラウザにデータを保存できるものです。
Web Storage
は、local Storage
とsession 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版、スマホ版ともにキレイに表示されていますね!
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うれし涙
本当に助かりました。
これからも沢山の記事拝見させて下さい。
ありがとうございました!!