new_releases v0.2.0 — MIT License

PCナビを
ハンバーガーメニュー
自動変換

既存のナビゲーション要素を指定するだけで、スマホ用のハンバーガーメニューを自動生成。HTML構造を変えず、依存ライブラリなし。


シンプルで柔軟な設計

PCのナビをそのまま活かしながら、スマホ用メニューを自動生成します。

merge
複数要素を統合
メインナビ・サブリンク・CTAボタンなど複数のHTML要素を指定順に結合してひとつのメニューを生成。
account_tree
ドロップダウン対応
li > ul 構造を自動検出してアコーディオン式のサブメニューに変換。元のDOM構造は変更しない。
animation
アニメーション
メニューは slide / fade の2種。ボタンは cross / spin / arrow の3種から選択可能。
devices
ブレイクポイントクラス
画面幅に応じて body にクラスを付与。CSS側でブレイクポイント別スタイルを自由に定義できる。
push_pin
ボタン固定の切り替え
button.fixed オプションで、ボタンを常時固定(fixed)するか、スクロールで流れる(absolute)かを選択。
code_blocks
CSS で自由にカスタマイズ
ns- プレフィックスのクラスで各要素を CSS から制御。ライブラリはページ構造に依存しない設計。
visibility_off
元要素の自動非表示
autoHide オプションを true にすると、スマホ表示時に元のナビ要素を自動で非表示。メディアクエリを書く必要なし。
accessibility_new
アクセシビリティ対応
inert 属性・フォーカストラップ・Escape キー・aria-controls など、スクリーンリーダーとキーボード操作に対応。

インストール

script タグ1行で導入できます。

HTML
<!-- CSS -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/navstow/navstow.min.css">

<!-- JS(body 閉じタグ前) -->
<script src="https://cdn.jsdelivr.net/npm/navstow/navstow.min.js"></script>
Terminal
npm install navstow
JavaScript
import NavStow from 'navstow';

NavStow.init({ /* options */ });

基本的な使い方

対象要素のセレクタを渡すだけで動作します。

HTML — PCナビをそのまま記述
<!-- PC用ナビ(そのまま残す) -->
<nav id="main-nav">
  <ul>
    <li><a href="#">ホーム</a></li>
    <li>
      <a href="#">サービス</a>
      <ul>  <!-- ドロップダウンも自動対応 -->
        <li><a href="#">Web制作</a></li>
      </ul>
    </li>
  </ul>
</nav>

<!-- サブリンク -->
<nav id="sub-links">
  <ul>
    <li><a href="#">ログイン</a></li>
    <li><a href="#">よくある質問</a></li>
    <li><a href="#">採用情報</a></li>
  </ul>
</nav>

<!-- CTAボタン -->
<div id="cta-area">
  <a href="#" class="cta-btn">お問い合わせ</a>
</div>
JavaScript — 初期化
NavStow.init({
  elements: [
    { selector: '#main-nav',  style: 'list-1col' },  // メインナビ
    { selector: '#sub-links', style: 'list-2col' },  // サブリンク
    { selector: '#cta-area',  style: 'button'    },  // CTAボタン
  ],
  burger: 767,  // ハンバーガー表示ブレイクポイント(px)
});

オプション一覧

NavStow.init() に渡すオブジェクトで動作をカスタマイズできます。

JavaScript — フルオプション
NavStow.init({
  elements: [
    { selector: '#nav', style: 'list-1col' },
  ],
  breakpoints: [
    { maxWidth: 767,  class: 'mobile'  },
    { maxWidth: 1024, class: 'tablet'  },
    { minWidth: 1025, class: 'desktop' },
  ],
  burger: 767,
  button: {
    position : 'right top',  // 'left top' / 'right top' / 'left bottom' / 'right bottom'
    animation: 'cross',     // 'cross' / 'spin' / 'arrow'
    fixed    : true,        // true: position fixed / false: position absolute
    el       : '#my-btn',   // 既存要素を使う場合(省略時は自動生成)
  },
  animation: {
    type    : 'slide',      // 'slide' / 'fade'
    origin  : 'top',        // 'top' / 'bottom' / 'left' / 'right'
    easing  : 'ease-in-out',
    duration: 300,
  },
  autoHide: true,      // burger表示時に元の要素を自動非表示(要素ごとに上書き可)
  overlay: true,
});

// cleanClone モード — class/id を除去してホスト CSS 干渉ゼロに
NavStow.init({
  elements: [
    { selector: '#nav', style: 'list-1col', cleanClone: true, autoHide: true },
  ],
});
オプション デフォルト 説明
elements [] 統合する要素の配列。各要素に selector(CSSセレクタ)と style(wrap スタイル名)を指定
breakpoints 画面幅に応じて body に付与するクラスの定義。maxWidth / minWidth と class を指定
burger 767 ハンバーガーボタンを表示するブレイクポイント(px)。この幅以下で表示
button.position 'right top' ボタンの配置。'left top' / 'right top' / 'left bottom' / 'right bottom'
button.animation 'cross' ボタンアニメーション。'cross'(×)/ 'spin'(回転)/ 'arrow'(矢印)
button.fixed true true: position fixed(常に表示)/ false: position absolute(スクロールで流れる)
button.el 既存のHTML要素をボタンとして使う場合、CSSセレクタまたはDOM要素を指定
animation.type 'slide' メニューの表示アニメーション。'slide' / 'fade'
animation.origin 'top' slide アニメーションの方向。'top' / 'bottom' / 'left' / 'right'
animation.duration 300 アニメーション時間(ms)
autoHide false true: burger表示時に元の要素を自動非表示。elements 個別に autoHide を指定すると上書き可能
cleanClone false elements 個別オプション。true にするとクローン時に class・id(子孫含む)をすべて除去。ホスト CSS の干渉をゼロにしたい場合に使用。スタイルは .ns-wrap-* クラスで設定する
overlay true メニュー背後の暗幕オーバーレイを表示するか

elements の style には list-1col(1カラムリスト)・list-2col(2カラムリスト)・links(div/span/a 直置き)・button(CTA用)を指定。任意の文字列も使用可能(.ns-wrap-{style} クラスが付与される)。

list-1col / list-2colul > li 以外に div > aspan > aa 直置きにも対応。


CSS カスタマイズ

ns- プレフィックスのクラスで自由にスタイルを上書きできます。

.ns-menu
メニュー本体。background・padding-top など外観を調整
.ns-button
ハンバーガーボタン。色・サイズ・位置を上書き
.ns-button-fixed
fixed: true 時に付与。position: fixed と z-index を管理
.ns-btn-{h}.ns-btn-{v}
ボタン位置クラス。h: right/left、v: top/bottom で角を指定
.ns-wrap-{style}
各要素のラッパー。elements の style 名が付与される
.ns-overlay
背後の暗幕。background で色・透明度を変更
.ns-dropdown-open
開いているドロップダウンに付与。CSS アニメーションのフックに使用可
body.ns-menu-open
メニューが開いている間 body に付与。スクロール制御などに活用
CSS — カスタマイズ例(固定ヘッダーあり)
/* ヘッダーをメニュー・オーバーレイより前面に */
header { z-index: 10001; }

/* ボタンをヘッダーに合わせる */
.ns-button {
  top: 0;
  right: 0;
  height: 64px;  /* ヘッダーと同じ高さ */
  width: 64px;
  border-radius: 0;
  background: #4a9eff;
}

/* メニューの上余白をヘッダー高さ分確保 */
.ns-menu { padding-top: 80px; }

公開 API

init() が返すインスタンスからメニューを制御できます。

NavStow.init(options)
NavStow を初期化してインスタンスを返す。ページ読み込み後に呼び出す
instance.open()
メニューをプログラムから開く
instance.close()
メニューをプログラムから閉じる
instance.destroy()
メニュー・ボタン・オーバーレイを削除し、body クラスも除去してリセット
JavaScript — インスタンスの使用例
const nav = NavStow.init({ /* options */ });

// 外部ボタンからメニューを開く
document.querySelector('#open-btn').addEventListener('click', () => {
  nav.open();
});

// ページ離脱時にリセット
nav.destroy();