タイルのレイアウト Layout: Tiles
Javascript を使って、Tilesを自動生成します。
<!-- tilesLayout$$.html -->
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8" />
<title>Bulma Project Javascript Tiles</title>
<meta name="description" content="Bulma Tiles are created automatically" />
<meta
name="viewport"
content="width=device-width, initial-scale=1, shrink-to-fit=no"
/>
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/bulma@0.9.1/css/bulma.min.css"
/>
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/bulma-extensions@6.2.7/dist/css/bulma-extensions.min.css"
/>
<link
rel="icon"
type="image/png"
href="/assets/img/favicon-c2.png"
sizes="16x16"
/>
<script
defer
src="https://use.fontawesome.com/releases/v5.7.1/js/all.js"
></script>
<script src="/src/js/shortBulma$$.js"></script>
<!-- <script src="../../js/shortBulma$$.js"></script> -->
<style>
.box {
min-height: 50px;
}
.box-max {
min-height: 200px;
}
</style>
</head>
<body>
<section class="section">
<div class="container">
<div class="columns is-mobile has-background-white-bis">
<div class="column"></div>
<div class="column is-8 content">
<article class="message is-primary">
<div class="message-header">
<p>タイルのレイアウト Layout: Tiles</p>
</div>
<div
class="message-body has-background-white-bis"
style="border-bottom: inset 2px #aaaa88"
>
<p>
<strong>Javascript</strong>
を使って、Tilesを自動生成します。
</p>
</div>
</article>
<main>
<form>
<!-- -->
<div class="box mb-2 py-2">
<nav class="level">
<div class="level-item mb-3">
<div class="field">
<!-- <div class="field is-grouped"> -->
<label class="label" title="count of tiles">枚数</label>
<div class="control">
<div class="select">
<select id="sel">
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
</select>
</div>
</div>
</div>
</div>
<div class="field mt-3">
<div class="control" id="rGroup">
<input
type="radio"
class="is-checkradio"
id="rad1"
name="question"
value="1"
/>
<label for="rad1" class="radio" title="ascending"
>昇順
</label>
<input
type="radio"
class="is-checkradio"
id="rad2"
name="question"
value="2"
/>
<label for="rad2" class="radio" title="random order"
>ランダム
</label>
<input
type="radio"
class="is-checkradio"
id="rad3"
name="question"
value="3"
/>
<label for="rad3" class="radio" title="descending"
>降順
</label>
</div>
</div>
<div class="level-item">
<div class="field">
<div class="control">
<button
id="refresh"
class="button is-medium is-danger is-light mt-4 mb-3"
title="update button"
>
更新
</button>
</div>
</div>
</div>
</nav>
</div>
</form>
<div class="box">
<div
class="has-text-centered mb-5 has-text-grey-dark"
title="layout pattern"
>
並び方パターン:
<span
id="pat1"
class="has-text-primary-dark has-text-weight-semibold is-size-5"
></span>
</div>
<!-- // Ancestor -->
<div class="tile is-ancestor is-mobile">
<div class="tile is-parent">
<div class="tile is-child box"></div>
</div>
<div class="tile is-parent">
<div class="tile is-child box"></div>
</div>
</div>
<template id="t0">
<div class="tile is-parent">
<div class="tile is-child box"></div>
</div>
</template>
<template id="t1">
<div class="tile">
<div class="tile is-parent">
<div class="tile is-child box"></div>
</div>
<div class="tile is-parent">
<div class="tile is-child box"></div>
</div>
</div>
</template>
<div
class="has-text-centered mb-2 has-text-grey-dark"
title="layout pattern"
>
並び方パターン:
<span
id="pat2"
class="has-text-primary-dark has-text-weight-semibold is-size-5"
></span>
</div>
</div>
</main>
<div class="box">
<div class="box">
<h2 class="is-size-4 has-background-white-ter p-2 km">解説</h2>
<div class="content">
<ul>
<li>
Tilesにも
<span class="has-text-danger-dark">is-mobile</span
>等が機能すると面白いのですが。
</li>
<li>
BulmaでJavascriptを利用するために、このWebサイトでは<br />
<a href="shortBulma.html"
><strong>shortBulma$$.js</strong> または
<strong>shortBulma.js</strong></a
><br />
というライブラリを使います。
</li>
<li class="pt-2">
使い方の例:<script
src="/src/js/shortBulma$$.js"></script><br />
headタグ内に挿入。但し、pathは状況によって変わります。
</li>
<li class="pt-2">
上記のpathの設定の確認をしておいてください。
<p class="pt-3 px-3">
例えば、notification$$.htmlとshortBulma$$.jsが同じフォルダにある時は<br />
<script
src="./shortBulma$$.js"></script>
または<br />
<script
src="shortBulma$$.js"></script>
となります。
</p>
</li>
<li>
より詳しくは<a href="shortBulma.html"
><strong> shortBulma$$.js </strong> </a
>をご覧ください。
</li>
<hr />
<li class="pt-1">
<dl>
<dt>$$de = (f) => { ...'DOMContentLoaded', f)</dt>
<dd class="py-2">ロード時にイベントリスナーfを設定</dd>
<dt>$$qAll('div.tile')</dt>
<dd class="py-2">
セレクター'div.tile'を持つ全ての要素を取得
</dd>
<dt>$$qe('#sel', f)</dt>
<dd class="py-2">
セレクター'#sel'を持つ要素にイベントリスナーfを設定
</dd>
<dt>$$qAe('#rGroup input', f)</dt>
<dd class="py-2">
セレクター'#rGroup
input'を持つ全ての要素にイベントリスナーfを設定
</dd>
<dt>$$Id('#sel')</dt>
<dd class="py-2">idが'sel'である要素を取得</dd>
<dt>$$ocL(o, cL, 'add')</dt>
<dd class="py-2">要素oのクラスリストに、cLを追加</dd>
<dt>$$oqAll(o, 'div.traceF')</dt>
<dd class="py-2">
要素oの子孫で、セレクター'div.traceF'を持つ全ての要素を取得
</dd>
<dt>$$DF()</dt>
<dd class="py-2">DocumentFragmentを作成</dd>
<dt>$$tCc('t0')</dt>
<dd class="py-2">
idが't0'であるテンプレート要素からクローンを作成します。(複製)
</dd>
</dl>
</li>
</ul>
</div>
</div>
<hr />
</div>
</div>
<div class="column"></div>
</div>
</div>
</section>
<!-- <script src="/src/sub/js/bgColors.js"></script> -->
<!-- <script src="bgColors.js"></script> -->
<script type="text/javascript">
let tilesN = 9;
let patternNo = 3; // '00000000'; // 降順
let patternSS;
let lastANode = null;
const bgColors = [
'has-background-primary',
'has-background-info',
'has-background-success',
'has-background-warning',
'has-background-danger',
'has-background-primary-dark',
'has-background-success-dark',
'has-background-warning-dark',
'has-background-danger-dark',
];
$$de(() => {
// 画面初期表示
$$Id('#sel').value = tilesN;
$$Id('#rGroup').children[2 * patternNo - 2].checked = true;
// tree生成 {色・ランダム}
update();
// event ~~~
$$qe('#sel', (e) => (tilesN = e.target.value), 'change');
// 重要 tilesN
$$qAe(
'#rGroup input',
(e) => {
patternNo = +e.target.value;
},
'change'
);
$$qe('#refresh', (e) => {
e.target.disabled = true;
e.preventDefault();
tilesN = +$$q('#sel').value;
patternNo = +getRadioValue('question');
update();
e.target.disabled = false;
});
});
// functions ~~~~~~~~~~~~~~~~~~~~~~~~~~~
const update = () => {
const Ancestor = $$q('.is-ancestor');
// let stepBss = zeroPadding_2();
// let stepBss = '00000000'; // 降順
// let stepBss = '10101010';
// let stepBss = '01010101';
// let stepBss = '11111111'; // 昇順
patternSS = getPattern();
dispPattern();
// dummy for a classList.add() trouble
if (patternSS.charAt(0) === '1') {
Ancestor.replaceChild(mkF0(), Ancestor.children[1]);
setColor0(Ancestor.children[1].children[0]);
Ancestor.replaceChild(mkF(), Ancestor.children[0]);
// swapTwo(Ancestor);
} else {
Ancestor.replaceChild(mkF0(), Ancestor.children[0]);
setColor0(Ancestor.children[0].children[0]);
Ancestor.replaceChild(mkF(), Ancestor.children[1]);
}
};
const setColor0 = (o) => {
$$ocL(o, bgColors[getRNum(bgColors.length)], 'add');
};
const getPattern = () => {
switch (patternNo) {
case 1:
return '111111111111111'.slice(-(tilesN - 2)); // 昇順
case 2:
return zeroPadding_2();
case 3:
return '000000000000000'.slice(-(tilesN - 2)); // 降順
default:
console.log('getPattern -> patternNo=1~3', patternNo);
}
};
const dispPattern = () => {
$$Id('pat1').textContent = patternSS;
$$Id('pat2').textContent = patternSS;
};
const swapTwo = (parent) => {
let child1 = parent.firstElementChild;
let child2 = child1.nextElementSibling;
if (!child1 || !child2) {
throw new Error("Can't get child!");
}
parent.insertBefore(child2, child1); // 置換
};
const mkF0 = () => {
// dummy
if (tilesN <= 2) return null;
let DF0 = $$DF(); // new DocumentFragment()
let tCc = $$tCc('t0'); // document.importNode($$tC(id), b)
DF0.appendChild(tCc);
return DF0;
};
const mkF = () => {
if (tilesN <= 2) return null;
let DF = $$DF(); // new DocumentFragment()
let traceTile = null;
for (step = 2; step <= tilesN - 1; step++) {
// setup tCclone
const tCclone = $$tCc('t1'); // document.importNode($$tC(id), b)
const cloneTop = tCclone.firstElementChild;
if (step % 2 === 0) cloneTop.classList.add('is-vertical');
const i = patternSS.charAt(step - 2) === '1' ? 1 : 0;
setColor0(cloneTop.children[0].firstElementChild);
setColor0(cloneTop.children[1].firstElementChild);
$$ocL(cloneTop.children[1 - i], 'anchorF');
if (step === tilesN - 1) {
setColor0(cloneTop.children[1 - i].firstElementChild);
}
if (step === 2) {
DF.appendChild(tCclone);
traceTile = DF.firstElementChild;
} else {
traceTile.replaceChild(tCclone, traceTile.children[1 - i]);
traceTile = traceTile.children[1 - i];
}
$$ocL(traceTile, 'traceF');
}
return DF;
};
const getTraceTile = (o) => {
let tiles = $$oqAll(o, 'div.traceF');
console.log('getTraceTile -> tiles.length - 1', tiles.length - 1);
return tiles[tiles.length - 1];
};
const setColor = () => {
let tiles = $$qAll('div.tile');
let i = 0;
tiles.forEach((t) => {
const x = bgColors[getRNum(bgColors.length)];
if (i === tiles.length - 1) {
$$ocL(t, x, 'add');
return;
}
if (i % 3 === 2) {
$$ocL(t, x, 'add');
// if (i <= 5) console.log('setColor -> x', x);
}
i++;
});
};
const getRNum = (n) => {
return Math.floor(Math.random() * n);
};
const zeroPadding = (num, length) => {
return ('000000000000000' + num.toString(2)).slice(-length);
};
const zeroPadding_2 = () => {
const steps = tilesN - 1;
const rnd = Math.floor(Math.pow(2, steps) * Math.random());
return ('000000000000000' + rnd.toString(2)).slice(-(steps - 1));
};
const getRadioValue = (na) => {
let ret = '';
$$na(na).forEach((elm) => {
if (elm.checked) {
ret = elm.value;
}
});
return ret;
};
</script>
</body>
</html>例えば、TilesLayout$$.htmlとshortBulma$$.jsが同じフォルダにある時は
<script src="./shortBulma$$.js"></script> または
<script src="shortBulma$$.js"></script> となります。