shortBulma ライブラリ

shortBulma$$.jsshortBulma.js

このサイト独自の Bulma用ライブラリです

解説

~~ 自作ライブラリ shortBulma$$.js または shortBulma.js ~~
  • BulmaでJavascriptを利用するために、このWebサイトでは
     shortBulma$$.js または shortBulma.js
    というライブラリを使います。

    特徴

    BulmaでJavascriptを短い名前で利用します
    これらのエイリアス(ショートカット名)はできるだけ少数に限定
    Bulmaの特定の機能を実現する関数も追加
    ( 例:$$bulmaMenu、$$bulmaTabs、$$bulmaModal等 )

    使い分け

    shortBulma$$.js

    • globalで使える環境で利用
    • 使い方の例:<script src="/src/js/shortBulma$$.js"></script>
    • headタグ内に挿入。但し、pathは状況によって変わります。
    • $$de = (f) => { ...'DOMContentLoaded', f)
      ロード時にイベントリスナーを設定
      $$qAll('.notification .delete')
      各notificationの削除ボタンを全て取得
      $$oe = (o, f)
      オブジェクトにイベントリスナーを設定
      $$Id('n1')
      idが'n1'である要素を取得

    shortBulma.js

    • moduleとして利用
    • 使い方の例:import * as $$ from './js/shortBulma';
    • 但し、pathは状況によって変わります。
    • $$.de(f)
      ロード時にイベントリスナーを設定
      $$.qAll('.notification .delete')
      各notificationの削除ボタンを全て取得
      $$.oe = (o, f)
      オブジェクトにイベントリスナーを設定
      $$.Id('n1')
      idが'n1'である要素を取得

  • shortBulma$$.js等は、筆者がタイピングが苦手で、長い名前に弱いため使っています。

    ( Bulma や Javascript に標準であったらいいな~ )

shortBulma$$.jsのソースコード

// shortBulma$$.js

// ss: String, not selector
const $$Id0 = (id) => {
  return document.getElementById(id);
};
const $$Id = (id) => {
  id = id.substring(0, 1) === '#' ? id.substring(1) : id;
  return document.getElementById(id);
};

// selector
const $$q = (sel) => document.querySelector(sel);
const $$qAll = (sel) => document.querySelectorAll(sel);
const $$oq = (o, sel) => o.querySelector(sel);
const $$oqAll = (o, sel) => o.querySelectorAll(sel);

const $$de = (f) => {
  document.addEventListener('DOMContentLoaded', f);
};

const $$oe = (o, f, evNa = 'click') => {
  o.addEventListener(evNa, f);
};

const $$qoe = (sel, f, evNa = 'click') => {
  $$oe($$q(sel), f, evNa);
};

const $$dqoe = (sel, f) => {
  $$de(() => $$qe(sel, f));
};

const $$qecL = (sel, selT, cN = 'is-active', mN = 'toggle') => {
  $$qe(sel, (e) => {
    e.stopPropagation();
    $$qcL(sel, cN, mN);
    $$qcL(selT, cN, mN);
  });
};

const $$qe = (sel, f, evNa = 'click') => {
  $$oe($$q(sel), f, evNa);
};

const $$doe = (o, f) => {
  $$de(() => $$oe(o, f));
};

const $$qAe = (sel, f) => {
  $$qAll(sel).forEach((o) => $$oe(o, f));
};

const $$qcL = (sel, cN = 'is-active', mN = 'toggle') =>
  $$q(sel).classList[mN](cN);

const $$ocL = (o, cN = 'is-active', mN = 'toggle') => o.classList[mN](cN);

const $$DF = () => new DocumentFragment();

const $$oes = (o, f) => {
  o.addEventListener('submit', f);
};

//  <template> 要素は、そのHTMLTemplateElement.contentプロパティにDocumentFragmentを含みます。
const $$tC = (id) => {
  return $$Id(id).content;
};

const $$tCc = (id, b = true) => {
  return document.importNode($$tC(id), b);
};

const $$tCco = (o, b = true) => {
  return document.importNode(o, b);
};

const $$mkTemplate = (id, v) => {
  const template = document.createElement('template');
  template.id = id;
  template.innerHTML = v;
  $$q('body').appendChild(template);
};

const $$da_t = (id) => document.body.appendChild($$tCc(id));
const $$oa_t = (o, id) => o.appendChild($$tCc(id));

const $$ogA = (o, ss) => o.getAttribute('data-' + ss);
const $$ogD = (o, ss) => o.dataset[ss];
const $$qogA = (sel, ss) => $$q(sel).getAttribute('data-' + ss);
const $$qogD = (sel, ss) => $$q(sel).dataset[ss];

const $$na = (ss) => document.getElementsByName(ss); // form radio

const $$qcLm = (
  sel,
  { selT, cN = 'is-active' },
  mN = 'toggle',
  stopP = true
) => {
  $$ocLm($$q(sel), { trgt: $$q(selT) });
};

const $$ocLm = (o, { trgt, cN = 'is-active' }, mN = 'toggle', stopP = true) => {
  $$oe(o, (e) => {
    if (stopP) e.stopPropagation();
    trgt.classList[mN](cN);
  });
};

const $$oAcLm = (
  o,
  { trgts, cN = 'is-active' }, // trgts: array
  mN = 'toggle',
  stopP = true
) => {
  $$oe(o, (e) => {
    if (stopP) e.stopPropagation();
    trgts.forEach((t) => t.classList[mN](cN));
  });
};

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
const $$bulmaMenu = (ss, ssT) => {
  $$qecL(ss, ssT);
  $$dqoe('body', (e) => {
    e.stopPropagation();
    const b = $$q(ss);
    if (b.classList.contains('is-active')) {
      $$ocL(b);
      $$qcL(ssT);
    }
  });
};

const $$bulmaTabs = (ssTabs, ssContent) => {
  const tabs = $$qAll(ssTabs);
  const boxes = $$qAll(ssContent);

  tabs.forEach((tab) => {
    const target = $$Id(tab.dataset.target);

    $$oe(tab, () => {
      $$bulmaTab(tabs, tab);
      $$bulmaTabR(boxes, target, 'is-hidden');
    });
  });
};

// $$bulmaTabs('.tabs li', '#tab-content > div');

const $$bulmaTab = (items, target, cN = 'is-active') => {
  items.forEach((item) => {
    if (item === target) {
      $$ocL(item, cN, 'add');
    } else {
      $$ocL(item, cN, 'remove');
    }
  });
};

const $$bulmaTabR = (items, target, cN = 'is-active') => {
  items.forEach((item) => {
    if (item === target) {
      $$ocL(item, cN, 'remove');
    } else {
      $$ocL(item, cN, 'add');
    }
  });
};

const $$bulmaModal = (sel, selB, selM) => {
  $$qcLm(sel, { selT: selM });
  $$qcLm(selB, { selT: selM });
};

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Bulmaとは直接関係ありません。
const $$codeS = (id) => { // クリックしたテキストをすべて選択
  const pre1 = $$Id(id);
  if (!pre1) return;

  $$oe(pre1, () => {
    document
      .getSelection()
      .setBaseAndExtent(pre1, 0, pre1, pre1.childNodes.length);
    // console.log('pre1.childNodes.length', pre1.childNodes.length);
  });
};
                

解説

~~ Bulmaの ショートカットライブラリ ~~
  • BulmaでJavascriptを利用するとき、このWebサイトでは
     shortBulma$$.js または shortBulma.js
    というライブラリを使います。
  • 使い方の例:<script src="/src/js/shortBulma$$.js"></script>
    headタグ内に挿入。但し、pathは状況によって変わります。
  • 例えば、Dropdown$$.htmlとshortBulma$$.jsが同じフォルダにある時は
    <script src="./shortBulma$$.js"></script> または
    <script src="shortBulma$$.js"></script> となります。

  • 以下に、いくつかの例を解説をしますが、基本的には標準のJavascriptのショートカットです。

  • $$Id0(id)、$$Id(id)
    idを持つ最初の要素を取得します。
    $$Id(id)は、idに#が付いていても構いません。
    $$q(sel)
    セレクターselを持つ最初の要素を取得します。
    $$qAll(sel)
    セレクターselを持つ全ての要素を取得します。
    $$oq(o, sel)
    要素oの中で、セレクターselを持つ最初の要素を取得します。
    $$de(f)
    ページがロードされた時点で、イベントリスナーfを設定します。
    $$oe(sel, f, evNa = 'click')
    要素oがクリックされたとき、イベントリスナーfを設定します。
    'click'イベントがデフォルトです。
    $$qAe(sel, f)
    セレクター'sel'を持つ全ての要素を取得し、それぞれにイベントリスナーfを設定する。
    $$ocLm(o, { trgt: target }, 'remove');
    oをクリックすると
     「要素targetのクラスリストから'is-active'クラスを削除する」
    というイベントリスナーを設定
    ('is-active'、'toggle'がデフォルト)
    $$bulmaMenu('#burger', '#nav-links');
    狭い画面で表示されるBulmaのburgerメニューのコントロール