<div class="utility-02" id="js-utility-02">
<div class="p-2 content has-text-centered">
<div class="field">
<div class="control"><label class="checkbox"><input class="utility-02__checkbox" id="js-utility-02-checkbox" type="checkbox" /><a class="js-utility-02-modal-open utility-02__link" href="#">利用規約</a>に同意します</label></div>
</div>
<p><button class="button is-primary" id="js-utility-02-button" disabled="disabled">申し込む</button></p>
</div>
</div>
<div class="modal" id="js-utility-02-modal">
<div class="modal-background js-utility-02-modal-close"></div>
<div class="modal-card">
<header class="modal-card-head">
<p class="modal-card-title">利用規約</p><button class="js-utility-02-modal-close delete" aria-label="close"></button>
</header>
<section class="modal-card-body">
<p>テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。<br>テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。<br>テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。</p>
</section>
</div>
</div>
.utility-02#js-utility-02
.p-2.content.has-text-centered
.field
.control
label.checkbox
input#js-utility-02-checkbox.utility-02__checkbox(type='checkbox')
a.js-utility-02-modal-open.utility-02__link(href=link) 利用規約
| に同意します
p
button#js-utility-02-button.button.is-primary(disabled) 申し込む
.modal#js-utility-02-modal
.modal-background.js-utility-02-modal-close
.modal-card
header.modal-card-head
p.modal-card-title 利用規約
button.js-utility-02-modal-close.delete(aria-label='close')
section.modal-card-body
p !{ text }
{
"link": "#",
"text": "テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。<br>テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。<br>テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。"
}
$BLOCK_NAME: '.utility-02';
// 変数
#{ $BLOCK_NAME } {
&__checkbox {
display: inline-block;
margin-right: 4px;
}
&__link {
color: #00f;
text-decoration: underline;
}
}
'use strict';
export const utility02 = () => {
const utility = new Utility02('js-utility-02');
utility.init();
}
class Utility02 {
el: HTMLElement;
checkboxEl: HTMLElement;
buttonEl: HTMLButtonElement;
modalEl: HTMLElement;
modalOpenEls: HTMLCollection;
modalCloseEls: HTMLCollection;
constructor(elId: string) {
this.el = document.getElementById(elId);
this.checkboxEl = document.getElementById('js-utility-02-checkbox');
this.buttonEl = <HTMLButtonElement>document.getElementById('js-utility-02-button');
this.modalEl = document.getElementById('js-utility-02-modal');
this.modalOpenEls = document.getElementsByClassName('js-utility-02-modal-open');
this.modalCloseEls = document.getElementsByClassName('js-utility-02-modal-close');
}
/**
* 初期化
*/
init() {
if (!this.el) return;
this.onChangeCheckbox();
this.onClickButton();
this.onClickModalOpen();
this.onClickModalClose();
}
/**
* チェックボックス変更時のイベント設定
*/
onChangeCheckbox():void {
this.checkboxEl.addEventListener('change', e => {
e.preventDefault();
const target = <HTMLInputElement>e.target;
if (target.checked) {
this.buttonEl.disabled = false;
} else {
this.buttonEl.disabled = true;
}
});
}
/**
* ボタンクリック時のイベント設定
*/
onClickButton():void {
this.buttonEl.addEventListener('click', e => {
e.preventDefault();
alert('ボタンクリック時の処理');
});
}
/**
* モーダル表示要素クリック時のイベント設定
*/
onClickModalOpen():void {
if (!this.modalOpenEls.length) return;
[...this.modalOpenEls].forEach(el => {
el.addEventListener('click', e => {
e.preventDefault();
this.modalOpen();
});
});
}
/**
* モーダル非表示要素クリック時のイベント設定
*/
onClickModalClose():void {
if (!this.modalCloseEls.length) return;
[...this.modalCloseEls].forEach(el => {
el.addEventListener('click', e => {
e.preventDefault();
this.modalClose();
});
});
}
/**
* モーダルを表示
*/
modalOpen():void {
this.modalEl.classList.add('is-active');
}
/**
* モーダルを非表示
*/
modalClose():void {
this.modalEl.classList.remove('is-active');
}
}
ユーザーが利用規約を確認したから申し込みを行えるようにするスクリプト。
「利用規約」リンクをクリックすると内容の詳細がモーダル表示される。
チェックボックスにチェックを入れないと申し込みを実行できない。